Changelog — gws_core v0.23.0Features Custom domains for apps — Apps (Reflex/Streamlit dashboards) can now be published on a custom domain, with a choice between public and authenticated access modes, including a fallback to the system user for public apps and a dedicated action to configure the domain (bc491d32, 85c711cc) F5 reload fix — Reloading (F5) on a sub-domain path of a Reflex app now works as intended (491d934c) AI-assisted form templates — Form templates can now be created with the help of AI: new routes generate template specs, and generating returns a preview instead of saving directly so you can review before committing (ee463494, 2c0b79cc, 9bc939a3) Duplicate a template version — New route to duplicate a version of a form template (ac80c599) Bulk tagging — You can now add tags to multiple items at once via a bulk action (18b46ff5) Technical Breaking Changes BoolParam no longer optional/typed loosely — is_optional was removed from BoolParam and the value is now forced to a strict bool type; is_optional is forced to True for compatibility (33b2fd8c, 1311e1c7) ExternalLab zip route renamed to compress — The new zip route was renamed to compress (d128e039) Credentials decorator — New decorator to define credential types, with a converter from the old credential type to the new one to keep DB migrations working (16312e29, b4feec68) Technical Features Reflex theming & internationalization — Reflex apps gain a new theme configuration and built-in internationalization support (d0ab80c0, 2976e7b4) Parameter validation improvements — Regex validation for string parameters (8f679ff6); minimum number of rows and default rows for parameter sets (bf77bf43) Disk space check before upload — New route to verify available disk space before an upload (32c47f4f) Parquet support for dataframes — DataFrame RField now supports the Parquet format (63bb8a31) Resource list task — New task to produce a list of resources (ea5f665f) Configurable action buttons — Entity action buttons can now provide config specs, and app resource actions accept a domain regex (c060be0a, 85c711cc) Typed database fields — Introduced custom typed DB fields (typed/nullable char, datetime UTC, date, decimal, self-referencing foreign keys) replacing raw Peewee fields, enabling static type checking across the model layer (96b55a92, c1c7f749, d703711f, 5ba8d76c, 58025353) Project-wide type cleanup — Large pass to improve typing and fix Pylance errors across protocol, task, process, scenario, resource, RField, page, and lab model code, plus making several columns non-null (a1aee0cf, 4b351c7a, 92d57e20, 95afa2f9, 622f381b, 1055648c, bc5690dd, 057b70c6, 52217425) CLI: database query command — New db command to run read-only SELECT queries from the CLI (ffb626bd) CLI: scenario & resource inspection — New commands to inspect scenarios and navigate through resources (71bd4f95, b961a56c) Async scenario run — The route that runs a scenario now uses the async runner (e7c7c0f8) Lab model routes — New routes to manipulate the lab model (bc5690dd) Migration 0.22.2 → 0.23 — Migration code moved into the 0.23 release, including non-null migration of created_by / last_modified_by columns (c4e7c424, d61f9067) Pyright in dev env — dev-env configure now sets up Pyright, and conftest loads gws_core from the .sys folder (3ebb3e09, 45a3ccf4) Other Changes FormDialog improvements — Added a dismissable option (with a non-dismissable example), a max_height parameter with better scrolling, and removed outer dialog padding to prevent page scroll (a33dd353, 0661fbbb, c81d6375) Logging to support — Logs sent to support now include the date and a stack trace; MessageDispatcher supports exception traces (d634dce1, 1607bbcf) Skills & docs — Updated Reflex and main skills (incl. explicit CSS length-unit guideline and Reflex version doc link), referenced Streamlit/Reflex skills in main instructions, and moved docs to a sub-folder (894f7534, db6961f1, 82ee695a, 25a3fca2, 276f03ed) Task marked RUNNING on start — Task model is now marked as RUNNING when it starts (14f0fd42) Protocol fixes — Fixed interface/outerface auto-propagation and handling of a missing protocol model (8784c0bb, a84931cd) FsNode protection — Prevent modifying a folder generated by a scenario; fixed export folder output name (9677cd3b, fb94c715) Misc fixes — python-multipart dependency conflict, Reflex translate check, ParamSet occurrence error message, DynamicParam invalid-key reading, system user creation robustness, CLI % handling in SQL and brick-doc push, app log level, Ruff config (5d57d185, fca06364, c41e9f27, f0441697, 932a5136, f04a7327, 087b2f6c, 51a15836, 8c30399c)