Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
Versions follow CalVer: YY.Quarter.Build β e.g. 26.2.1 = year 2026, quarter 2, build 1.
Beta releases append .beta (e.g. 26.2.1.beta); production releases have no suffix.
[26.4.5] β 2026-11-01¶
Forms can now respond to what's entered and show answers back: conditional fields, field groups and grid widths in one model, read-only review pages, and text and consent blocks between fields. There are no breaking changes for apps using the public API.
β¨ Added¶
Field(ui_group="Contact")puts fields under a titled section without nesting the data, and a group can be its own tab, accordion panel or wizard step.ui_cols=6(1-12) sets a field's width so consecutive fields share a row.ui_group_collapsible,ui_group_collapsedandui_group_show_whenapply to a whole group. (#241)Field(ui_show_when={"field": "contact", "equals": "phone"})hides a field until another field has a given value, within,truthyandnot_emptyas well. A hidden field submits nothing and isn't validated, and"required": Truemakes a field required only while it shows. It works inside sub-forms andmodel_listitems, and display mode leaves hidden fields out. (#237)FormModel.render_display(data, framework=..., layout=..., edit_urls=...)shows validated data read-only, as a review or confirmation page, with the form's labels, order and sections. Selects show their label, booleans Yes or No, andmodel_lista table. Passwords are masked, card and social security numbers show only their last four digits, and content blocks are left out. (#238)Field(ui_element="content", ui_content=...)puts text between fields. It submits nothing and is left out of validation and the returned data. (#274)Field(ui_element="consent", ui_content=...)pairs text with a checkbox, withui_options={"scrollable": True}for long text. (#274)
ποΈ Removed¶
- The internal
FRAMEWORKSdict,get_framework_config()and the renderer'sconfigattribute. Each style's classes now live on its theme, and rendered output is unchanged. (#281)
π Fixed¶
- Bootstrap select, multiselect, combobox, radio and checkbox group fields no longer
render a second
mb-3wrapper. Spacing is unchanged. (#280)
[26.4.4] β 2026-10-31¶
The Material style is rebuilt on Material Design 3 and shares one rendering path
with Bootstrap and plain HTML. A checkbox can now be required with Literal[True].
This is a breaking release for apps that customize Material forms.
π₯ Breaking Changes¶
framework="material"is rewritten on Material Design 3 and now renders through the same path as Bootstrap and plain. Every input gets a Material field: outlined with a floating label and a real notch, with error, disabled and icon states. The CSS uses design tokens (--md-sys-color-*) and has no!important. CSS written against the old Material markup needs updating. (#265)MaterialEmbeddedThemeis renamedMaterialTheme. Update any import or subclass of it. (#265)
π Changed¶
- Star rating stars are now buttons in every style, in a
radiogroupwith arrow-key support, so the widget works from the keyboard. The default colors are darker, to meet contrast requirements. (#265)
β¨ Added¶
Field(unchecked_message="...")sets the error shown when a required checkbox is left unticked. (#273)- Radio
variant="segmented"and checkbox groupvariant="button_group"now ship their own CSS instead of leaving it to the app. (#265) docs/advanced/material.mddocuments the Material style. (#265)material_variant="filled"selects filled text fields (the default is"outlined"). (#265)- Opt-in dark mode for Bootstrap forms: under
data-bs-theme="dark"the library's widgets, tabs, accordion and wizard now follow Bootstrap's dark colors. (#265) --sf-*CSS tokens re-color those same parts under Bootstrap. (#265)- Opt-in dark scheme for Material:
data-md-theme="dark"on the form or an ancestor, or the page'scolor-scheme. (#265)
π Fixed¶
- A checkbox typed
Literal[True]can now pass validation: ticking it used to fail with "Input should be True". This is the way to require a box to be ticked, such as accepting terms. (#273) - Material forms now submit to the server and show every error at once, like
Bootstrap. They used to drop
novalidate, so the browser stopped a single-page form at its first invalid field. (#265) - A model list item's title no longer goes through
innerHTMLas the user types, so markup in a title field can't run in the page. (#265) - Material: invalid fields now get a red outline, and textareas, radios, multiselects, comboboxes and data tables are no longer unstyled. (#265)
ποΈ Removed¶
- Materialize is no longer vendored or referenced. The Material style has
long used its own self-contained theme and never loaded Materialize, but the
package still shipped Materialize 1.0.0 (about 320 KB), a
vendor-update-materializemake target, and a Materialize config behindframework_css_tag/framework_js_tag. They're gone: both functions now return nothing for"material", andget_theme_for_framework("material")returns the Material theme the renderer actually uses. (#265)
[26.4.3] β 2026-10-29¶
FormModel is now the only way to build a form: the builder API, the
prebuilt forms, @form_validator and the React/Vue adapters are removed.
Five Agent Skills ship inside the package, and a long list of form bugs is
fixed. This is a breaking release; see docs/upgrading.md.
π₯ Breaking Changes¶
- React and Vue adapters removed.
ReactJSONSchemaFormAdapter,VueFormulateAdapter, and their modules (integration.json_schema_form_adapter,integration.vue_formulate_adapter, and theintegration.react/integration.vueshims) are deleted, along with the React/Vue-only helpersmap_ui_element_to_frameworkandconvert_validation_rules. They produced config blobs for client-side form libraries, outside this library's server-rendered scope, and had no examples or docs. For a JSON Schema of a form, useFormModel.get_json_schema(); for a plain Pydantic model, useFormModel.as_api_model(). (#248) - The builder API is removed;
FormModelis the only way to build a form.FormBuilder,AutoFormBuilder,create_form_from_model,create_login_form,create_registration_form,create_contact_form,render_form_page,FormIntegration,handle_formandhandle_form_asyncare deleted, along withModernFormRenderer,FormDefinitionandFormSection(which only existed to render builder forms) and theintegration.builder/adapters/sync/async_supportmodules. The builder rendered through its own path, so it never gotlayout=, the wizard, nested sub-forms,model_listorDataTableLayout. To upgrade: declare aFormModel(or build one at runtime with Pydantic'screate_model(..., __base__=FormModel)), render it withrender_form_html()and handle submissions withFormModel.validate()andresult.render_with_errors(). Seedocs/upgrading.md. Importing any removed name raises anImportErrorthat names its replacement. (#255) @form_validatoris removed. It never ran: nothing called the methods it decorated, so cross-field checks written with it were silently skipped. Use Pydantic's@model_validator(mode="after")(its message lands in the form-wide_errors) orFormValidator.add_cross_field_rule. (#254)DataTableLayoutinput names are namespaced by the embedding field. Cells, the CSV file input and the Load/Submit buttons used to have fixed names (rows[i].col,csv_file,datatable_action), so two tables on one page overwrote each other. They are now named under the field the table is embedded in (anemployeesfield submitsemployees.rows[i].col,employees.csv_file,employees.datatable_action), and the default table id comes from the field name instead of the row model's class name.handle_import_post()andparse_submitted_rows()find their table in the submission themselves, so app code using them doesn't change. Code that reads those form keys directly, or builds test submissions by hand, must use the new names. When two tables share a row model, pass the newfield=argument to say which one to read. (#253)
β¨ Added¶
- Agent Skills ship inside the package.
uvx library-skills --claudeinstalls five skills into an app project, linked to the installed version:pydantic-schemaforms(build and fix forms, with references for inputs, complex forms, validation, data tables, security, rendering and extending),schemaforms-create(a new form from a description such as "create a login form", commented like a tutorial),schemaforms-convert(from Pydantic, dataclasses, JSON Schema, WTForms or Django),schemaforms-upgrade(from removed APIs) andschemaforms-document(docstrings, help text and a Markdown page for an app's forms). The single-file instructions fromget_app_instructions()and the CLI are now built from the same sources, and their examples come from tested files. (#264) - Accessibility gate. The Playwright suite runs axe-core 4.14 against
WCAG 2.0, 2.1 and 2.2 A and AA rules plus axe best practices on every
example page under Bootstrap and Material, plus the validation page's error
state, and fails on any serious or critical violation. axe-core is vendored
for tests only (
tests/playwright/vendor/, pinned by version and SHA-256); it is not shipped in the package. What is tested, the baseline the inputs meet, and what automated testing does not cover are in the newdocs/reference/accessibility.mdpage and the README. This is testing, not a claim of ADA, Section 508 or WCAG conformance. (#246)
π Fixed¶
- Two tabbed or accordion forms on one page no longer collide. Tab and
accordion ids were numbered from
tab-0/accordion-0in every form, so the second form's tabs and panels controlled the first form's. Each layout now gets its own id prefix, and tab and accordion scripts only act inside their own layout (which also stops an outer tab hiding a nested tabbed sub-form). (#252) - Accordion fixes: under Bootstrap the open section rendered closed, and under plain HTML and Material clicking a section header submitted the form. (#252)
- Invalid fields are announced. After a failed submit, a field's control
gets
aria-invalid="true"and anaria-describedbypointing at its error message, and at its help text whenever it has one, under Bootstrap, Material and plain HTML. Help and error elements now carry matching<id>-help/<id>-errorids. (#246) DataTableLayoutcells have accessible names. Each editable cell gets anaria-labelsuch as "Email, row 3", since its column header is not a<label>. (#246)- The tags input's label names its text box. The visible text box now
takes the field's id, so
<label for=...>points at it, and it receives thearia-*wiring above. (#246) - The code editor's highlight layer no longer takes keyboard focus. It is
aria-hidden, but Prism made it tabbable. (#246) - Contrast meets WCAG AA (4.5:1) for tag chips, the code editor's property/tag syntax color and the "Rendered in" timing line. (#246)
- The date picker toggle is a 24Γ24 px target (WCAG 2.2 target size). (#246)
- Inputs are inferred from more field types. Without a
ui_element,date,datetime,time,EmailStrandAnyUrlfields render as date, datetime-local, time, email and URL inputs;EnumandLiteralfields render as a select with their values; and alistof either renders as a multiselect.Optionalfields keep their input type instead of falling back to a text box. Previously anEnumfield rendered an empty section (or a select with no options), so its choices had to be built by hand. (#258) - A fresh form shows the model's defaults. When no
form_datais passed, every field starts at its default (anint = 1shows 1, an Enum orLiteraldefault is selected, abool = Truecheckbox is ticked,default_factoryvalues included). Passed data, such as a submission being re-rendered or an edit form, is still used as is. Previously defaults were never rendered, so they had to be passed inform_databy hand. (#258) - Validator messages are shown as written. A
ValueErrorraised in a@field_validatoror@model_validatorshows its own message, without Pydantic's "Value error, " prefix. (#258) - Optional selects can be left empty. An
Optionalselect gets an empty first choice, and submitting it validates toNone, including forstr-based enums. (#258) - An
Enumfield keeps its title when it matches the Enum class's name (Field(title="Size")on aSizeenum), including inside list items; it used to fall back to the field name. (#258) - Material renders datetime fields as
datetime-local, not the invaliddatetimeinput type. (#258) - Pre-filling an
Enumfield selects its option.form_dataholding an Enum member, as a database row ormodel_dump()does, used to leave the select (or radio) with nothing chosen. (#258) - A checkbox that defaults to
Truecan be unticked. An unticked checkbox sends nothing, sovalidate()used to fill in the default and returnTrue. In a form submission, a missing checkbox that has a default is nowFalse; one without a default is still required, and nested JSON that omits it still gets the default. (#258) - An optional sub-form (
Address | None) can be left empty. Its inputs are no longerrequired, and when every one of them is blank or still at its default,validate()returnsNonefor it instead of field errors. (#258) - A
currencyinput works on aDecimal,floatorintfield. The input formats what is typed as$1,234.50, which used to fail validation as "Input should be a valid decimal". In a form submission the symbol and thousands separators are now stripped first. (#258) - A
floatfield accepts decimals in the browser. Number inputs always hadstep="1", so the browser refused 39.50. Afloatfield now getsstep="any", andmultiple_ofsets the step. (#258) - Material inputs carry the field's constraints.
min_length,max_length,ge,leandpatternnow becomeminlength,maxlength,min,maxandpatternattributes under Material too, as they already did under Bootstrap and plain HTML. (#258) MinLengthRuleskips an empty value, like every other rule exceptRequiredRuleand like its own client-side check. It used to reject"", so an optional field with a minimum length couldn't be left blank. (#258)
[26.4.1] β 2026-10-12¶
Complex forms are now built one way: nest FormModels as fields of a parent
FormModel and pick a layout=. Data in and out is nested JSON. This is a
breaking release; see docs/upgrading.md.
π₯ Breaking Changes¶
- Form-orchestration classes removed.
TabbedLayout,ListLayout,SectionDesign,FormDesign,FormLayoutBase, and theform_layoutsVerticalLayout/HorizontalLayoutwrappers now raiseFormLayoutRemovedError(aTypeError) when subclassed or called. The message contains the upgrade steps and points to the new "Upgrading to nested forms" section of the AI instructions. - Top-level
VerticalLayout/HorizontalLayoutnow name the flex layout primitives fromrendering/layout_engine.py, which the removed wrappers used to shadow. pydantic_schemaforms.layouts(the deprecated re-export shim) is deleted.FormModel.validate(flatten=...)removed.result.datais always nested like the model. Passingflattenraises aTypeErrorexplaining this.ValidationResult.errorsis a nested error tree shaped like the data (errors["pets"][1]["name"]) instead of string-path keys (errors["pets[1].name"]). Container and form-wide messages use the reserved"_errors"key instead of"general".layout="tabbed"/"side-by-side"group sub-forms. The field-name keyword heuristic and the two-fields-per-row pairing are gone; on a form with no sub-form fields these layouts raiseValueError. Severalinput_type="layout"fields no longer auto-render as tabs; passlayout="tabbed".- Unknown
layout=values raiseValueErrorinstead of rendering vertically. - Non-validation exceptions propagate from
validate()instead of being shown on the form aserrors["general"]. - Renderer internals:
RenderContext.all_errorsis replaced bychild_errors(the field's own error sub-tree), andrender_field()takes the field's error node aserrorwith noall_errorsargument.get_nested_form_data,EnhancedFormRenderer._humanize_error_field, andFieldRenderer.extract_nested_errors_for_fieldare removed. handle_form/handle_form_asyncwith a model return nested data and a nested error tree.FormValidator.validate_pydantic_model()(which kept only the first segment of each error path) is removed.
β¨ Added¶
- Sub-form fields. A field typed as another
FormModel(orOptionalof one) renders as a titled section with inputs namedaddress.city, with noui_elementneeded.ui_collapsible/ui_collapsedrender it as a<details>section that opens when it holds an error. - Grouped layouts:
layout="tabbed","side-by-side", and the new"accordion"arrange the parent's plain fields plus one group per sub-form, in declaration order (ui_orderoverrides). Re-rendering after a failed submit opens the first group that contains an error. - Step wizard:
layout="wizard"shows the same groups one step at a time with a progress header and Back/Next. All steps are in one<form>, so one POST submits everything. Next runs the browser's validation on the current step; a re-render opens the first step with an error and marks the others. Options:wizard_options={"linear", "show_progress", "back_label", "next_label"}andField(ui_step_title=...). Without JavaScript all steps show stacked. - Examples cover every layout, input, and validation, enforced by
tests/test_examples_coverage.pyand a browser test that loads every example page: the widget gallery shows every input type and alias with each of its options plus field-level options (ui_disabled,ui_readonly,icon, ...);/validationshows every Pydantic constraint, validator, rule class, and a cross-field rule failing on one form;/layoutstakes the wizard options as query parameters;/employees/directoryshows the read-onlyDataTableLayoutoptions. validate()takes the raw request form (StarletteFormData, WerkzeugMultiDict,(name, value)pairs) as well as nested dicts, keeping repeated values as lists.render_form_html(form_data=...)accepts the same.render_with_errors(errors=...)re-renders with a different error tree, e.g. the result's own errors merged with a rule-basedFormValidator's.- AI instructions now list every
ui_optionskey per widget with its default, every field-level option, the rule classes and cross-field rules, theFormModel/ValidationResultAPI, every render option, and the asset helpers. ValidationResult.error_list()(flat[{"loc": [...], "msg": ...}]) andValidationResult.instance(the validated model).list[FormModel]fields render as repeating sub-forms withoutui_element="model_list".LiveValidator.register_model_validator()registers sub-form and list-item fields under their input names (address.city,pets[].name).validate_form_datais exported from the top-level package, as the validation guide already documented.docs/complex_forms.md, a guide to composing forms and upgrading.
π Fixed¶
- Decoding a submission compacts list indices instead of padding gaps with
None:pets[0]andpets[2]decode to a two-item list, so an item removed without re-indexing still validates, and one field named likepets[500000000].nameno longer makes the server allocate a list that long. validation_response_headers,wrap_with_schemaforms_markers,read_asset_text,bootstrap_icons_css_contentandbootstrap_icons_css_tagare exported from the top-level package; the docs and examples imported them from internal modules.- Removing every item of a repeating sub-form now fails its
min_lengthinstead of passing as the field's default (form submissions only; nested JSON that omits the key still gets the default). - Under
layout="tabbed"/"accordion"/"wizard", Material forms no longer let the browser block submission on a required input in a hidden group with no visible message; the server re-renders with that group open. - A layout field's
default_factorythat raises is no longer silently swallowed (the table rendered empty); the error propagates. radioandcheckbox_groupnever showed the current value: a re-rendered form lost the user's choices. Acomboboxlost its value the same way.- A field declared
ui_element="hidden"rendered a visible label (onlyui_hidden=Trueproduced a bare hidden input). - Custom
date_format/time_format/datetime_formatwere not applied to ISO string values (JSON data), which showed as2024-06-15instead of the format. - The file input's preview script failed to parse (a
#comment in JavaScript), so no preview appeared; it now shows file names as text, never as markup. - Material: the colour picker's hex readout (
show_value) was missing, and aselectwith a placeholder had its label overlapping the placeholder text. - Switching tabs left the
activeclass on the first panel. Field(icon=...), like other non-Pydantic keywords, was silently dropped when anyui_*option was also passed.- Material forms' inline script failed to parse (a
#comment in JavaScript), so its floating-label and field enhancements never ran. Field()silently dropped anyui_*option it doesn't name as a parameter (such asui_collapsible) when anotherui_*option likeui_help_textwas also passed. Allui_*options are now kept.- Validation errors now reach fields inside sub-forms and are namespaced per sub-form, so two sub-forms with the same field name no longer collide.
- Library code no longer imports from the
examples/package or hard-codes the demo app's field names. DataTableLayout.parse_submitted_rows()no longer turns cell values like"1"or"yes"into booleans before validation.- The documented
FormConfig/TabbedLayout((...))andHorizontalLayout(label_cols=...)recipes, which never worked, are replaced. - Several documentation examples that interpolated submitted values into
HTML with f-strings now use
html(t"...").
[26.2.3] β 2026-06-28¶
π Fixed¶
-
LiveValidator.register_model_validatorpartial-validation bug β previously calledmodel_class.model_validate({field: value})with only one field's data; if the model had other required fields, Pydantic raisedValidationErrorfor them, causing all unrelated fields to produceis_valid=Falsewith no errors even when the value was valid. Now uses__pydantic_validator__.validate_assignment(model_construct(), field_name, value)to validate each field in isolation, independent of sibling required fields. -
LiveValidator.render_field_with_live_validationsingle-trigger limitation β theif/elif/elifchain forvalidate_on_blur/validate_on_input/validate_on_changesilently dropped every trigger after the first truthy one. Changed to independentifchecks so all enabled triggers combine into a singlehx-triggerattribute (e.g.hx-trigger="blur, change"when both areTrue).
β¨ Added¶
- Live-validation example β
GET /live-validationdemo route in the FastAPI example app shows a contact form with per-field HTMX validation on blur. IncludesPOST /validate/{field_name}HTMX endpoint usingvalidation_response_headers()andGET /vendor/htmx.min.jsto serve the vendored HTMX asset.
[26.2.2] β 2026-06-28¶
β¨ Added¶
FormModel.as_api_model()β new class method that returns a pure PydanticBaseModelwithui_*rendering metadata stripped fromjson_schema_extra. Allows the same model class to serve both as an HTML form and as a typed FastAPI body /response_modelwithoutui_element,ui_placeholder, etc. appearing in the OpenAPI/Swagger docs.Field(title=...),Field(examples=[...]), descriptions, and all validation constraints (min_length,ge,pattern, β¦) are fully preserved. Result is cached per subclass and safe to assign at module level (ContactSchema = ContactForm.as_api_model()).
π Changed¶
- Reduced SonarCloud code smells: extracted duplicate magic strings to named constants,
prefixed unused parameters with
_, renamed methods that shadowed class attributes, and merged nestedifstatements into compound conditions across multiple modules.
[26.2.1] β 2026-05-17¶
First production release. All public Quick Start code paths verified working end-to-end.
π₯ Breaking Changes¶
submit_urlis now explicit across public form render APIs and no longer defaults silently. Calls that omitsubmit_urlraise a clearValueError, enforcing app-owned routing boundaries.
β¨ Added¶
- HTMX live validation β
LiveValidator,HTMXValidationConfig, andvalidation_response_headers()provide server-side field validation triggered by blur/input events via HTMX without page reloads. - Branch coverage β
branch = trueadded to coverage configuration for deeper test quality. - HTML structural validation β
tests/test_html_structural.pyvalidates tag balance across all frameworks and field types. - HTTP integration tests β FastAPI
TestClientand Flasktest_clientround-trip tests. - Property-based tests β Hypothesis suite covering arbitrary field names, labels, and frameworks.
- Performance benchmarks β
pytest-benchmarksuite for small, medium, and large form rendering. - Playwright browser tests β End-to-end HTMX validation tests against a live FastAPI server
(
tests/playwright/), running in CI on Chromium. - macOS in CI matrix β Tests now run on ubuntu-latest, windows-latest, and macos-latest.
py.typedmarker for PEP 561 compatibility.- Vendored assets (htmx, Bootstrap, Materialize, iMask) with sha256 manifest verification.
.gitattributesforcing LF line endings on vendored assets for cross-platform checksum stability.
π Fixed¶
create_form_from_modelcrashed with any Pydantic model βAutoFormBuilder._build_from_modelused the wrong parameter name (default_valueinstead ofvalue) and compared against...instead ofPydanticUndefined; the sentinel leaked intojson_schema_extra, causingPydanticSerializationErroron every render call.- Windows path separator in test assertion caused CI failure on win32.
- Dependabot config used unsupported
interval: "cron"β silently ignored, causing weekly runs. Replaced withinterval: "monthly". - HTMX live validation JS used
JSON.parse(responseText)on HTML responses; replaced with the idiomaticHX-Trigger: validationResultheader pattern so CSS classes are applied correctly. except A, B:tuple syntax preserved via# fmt: skipto prevent ruff from removing parentheses that pyright requires.
π Changed¶
- Layout rendering internals refactored for maintainability and reduced cognitive complexity.
- Reliability and maintainability improvements to satisfy SonarCloud quality gate.
- Improved nested/collapsible form behavior when multiple forms are rendered on a page.
- Pre-commit ruff version pinned to match
requirements.txtto eliminate local/CI formatting drift. - Pyright added to
make testsso type errors surface before commit.
β¬οΈ Dependencies¶
fastapi[all]:0.121.2β0.128.4ruff:0.14.14β0.15.0tqdm:4.67.1β4.67.3pytest-html:4.1.1β4.2.0packaging:25.0β26.0black:25.12.0β26.1.0mkdocstrings[python]:1.0.0β1.0.1pymdown-extensions:10.20β10.20.1
Latest Changes¶
π Production Releases¶
π 26.4.2 Β· Support for Python 3.15¶
π Published 2026 October 24, 21:09
π Changes¶
π Documentation¶
- Documentation: Clarify Python Requirement, Asset Modes, Examples, and Testing Workflow (#234) (@devsetgo)
- Documentation: Remove Stale 26.4.1 Release-Notes Draft From Repo Root (#232) (@devsetgo)
π§ Maintenance¶
- Chore: Bump Version To 26.4.2 For Python 3.15 Support (#233) (@devsetgo)
- Documentation: Remove Stale 26.4.1 Release-Notes Draft From Repo Root (#232) (@devsetgo)
π Contributors¶
π 26.3.7 Β· Enhancement: Collapse and Select Improvements¶
π Published 2026 August 29, 22:05
π Changes¶
β¨ Features¶
- Add collapsible option groups and menu order example for checkboxes/radios (#221) (@devsetgo)
- Add optional forced-selection placeholder to select dropdowns (#220) (@devsetgo)
π Bug Fixes¶
π Documentation¶
- Bump version to 26.3.7 (#223) (@devsetgo)
- Dev (#222) (@devsetgo)
- Add collapsible option groups and menu order example for checkboxes/radios (#221) (@devsetgo)
π§ Maintenance¶
- Bump version to 26.3.7 (#223) (@devsetgo)
- Dev (#222) (@devsetgo)
- Add collapsible option groups and menu order example for checkboxes/radios (#221) (@devsetgo)
π Contributors¶
π 26.3.6 Β· Browser Cache Bug¶
π Published 2026 August 23, 21:17
π Changes¶
π Bug Fixes¶
π Documentation¶
π§ Maintenance¶
π Contributors¶
π 26.3.5 Β· Bug Fix: CSV Import¶
π Published 2026 August 23, 20:54
π Changes¶
π Bug Fixes¶
π Documentation¶
π§ Maintenance¶
π Contributors¶
π 26.3.4 Β· Enhancement: CSV Import¶
π Published 2026 August 23, 19:08
π Changes¶
π Documentation¶
- Deep documentation pass across library, examples, and docs (#213) (@devsetgo)
- Add DataTableLayout composite control for CSV import to table (#212) (@devsetgo)
- Demo Application and MonoRepo (#207) (@devsetgo)
π§ Maintenance¶
- Bump of Version to 26.3.4 (#214) (@devsetgo)
- Deep documentation pass across library, examples, and docs (#213) (@devsetgo)
- Add DataTableLayout composite control for CSV import to table (#212) (@devsetgo)
- Demo Application and MonoRepo (#207) (@devsetgo)
π Contributors¶
π 26.3.3 Β· Enhancements to JSON output and new input types¶
π Published 2026 August 07, 21:33
π Changes¶
β¨ Features¶
π Documentation¶
- Add code/data mode to TextArea: format + optional syntax highlighting (#205) (@devsetgo)
- Refactoring Live Validation to Simplify (#204) (@devsetgo)
- Add option for DNS and MX email deliverability validation (#203) (@devsetgo)
- Fix register_input_class registry and expand AI-assistant instructions (#202) (@devsetgo)
- 187 enhance date datetime and time (#192) (@devsetgo)
- 189 enhancement json schema model output (#191) (@devsetgo)
- Dev (#185) (@devsetgo)
π· GitHub Actions¶
- Refactoring Live Validation to Simplify (#204) (@devsetgo)
- github-actions(deps): bump SonarSource/sonarqube-scan-action from 8.2.0 to 8.2.1 (#193) (@dependabot[bot])
- github-actions(deps): bump actions/labeler from 6 to 7 (#194) (@dependabot[bot])
- github-actions(deps): bump release-drafter/release-drafter from 7.5.1 to 7.7.0 (#195) (@dependabot[bot])
- github-actions(deps): bump actions/setup-python from 6 to 7 (#196) (@dependabot[bot])
- Dev (#185) (@devsetgo)
π§ Maintenance¶
- Bump version to 26.3.3 (#206) (@devsetgo)
- Add code/data mode to TextArea: format + optional syntax highlighting (#205) (@devsetgo)
- Refactoring Live Validation to Simplify (#204) (@devsetgo)
- Add option for DNS and MX email deliverability validation (#203) (@devsetgo)
- Fix register_input_class registry and expand AI-assistant instructions (#202) (@devsetgo)
- github-actions(deps): bump SonarSource/sonarqube-scan-action from 8.2.0 to 8.2.1 (#193) (@dependabot[bot])
- github-actions(deps): bump actions/labeler from 6 to 7 (#194) (@dependabot[bot])
- github-actions(deps): bump release-drafter/release-drafter from 7.5.1 to 7.7.0 (#195) (@dependabot[bot])
- github-actions(deps): bump actions/setup-python from 6 to 7 (#196) (@dependabot[bot])
- 187 enhance date datetime and time (#192) (@devsetgo)
- pip(deps): bump pymdown-extensions from 11.0 to 11.0.1 (#201) (@dependabot[bot])
- pip(deps): bump hatchling from 1.30.1 to 1.31.0 (#200) (@dependabot[bot])
- 189 enhancement json schema model output (#191) (@devsetgo)
- Dev (#185) (@devsetgo)
π Contributors¶
@devsetgo, @dependabot[bot] and @claude
π 26.3.2 Β· New Input Types and Bug Fixes¶
π Published 2026 July 19, 18:46
π Changes¶
π Bug Fixes¶
- Feature: Fix ui_element registry collisions; expand AI assistant docs with a verified example (#180) (@devsetgo)
π Documentation¶
- Dev (#183) (@devsetgo)
- Add Tier-2 input widgets and Widget Gallery example, fix Material bugs (#181) (@devsetgo)
- Feature: Fix ui_element registry collisions; expand AI assistant docs with a verified example (#180) (@devsetgo)
π· GitHub Actions¶
- github-actions(deps): bump SonarSource/sonarqube-scan-action from 8.1.0 to 8.2.0 (#172) (@dependabot[bot])
- github-actions(deps): bump actions/checkout from 5 to 7 (#169) (@dependabot[bot])
- github-actions(deps): bump release-drafter/release-drafter from 7.3.1 to 7.5.1 (#170) (@dependabot[bot])
π§ Maintenance¶
- Dev (#183) (@devsetgo)
- Dev (#182) (@devsetgo)
- Add Tier-2 input widgets and Widget Gallery example, fix Material bugs (#181) (@devsetgo)
- Feature: Fix ui_element registry collisions; expand AI assistant docs with a verified example (#180) (@devsetgo)
- github-actions(deps): bump SonarSource/sonarqube-scan-action from 8.1.0 to 8.2.0 (#172) (@dependabot[bot])
- pip(deps): bump pytest-asyncio from 1.3.0 to 1.4.0 (#173) (@dependabot[bot])
- pip(deps): bump fastapi from 0.138.1 to 0.139.0 (#171) (@dependabot[bot])
- pip(deps): bump pytest from 9.0.3 to 9.1.1 (#174) (@dependabot[bot])
- github-actions(deps): bump actions/checkout from 5 to 7 (#169) (@dependabot[bot])
- github-actions(deps): bump release-drafter/release-drafter from 7.3.1 to 7.5.1 (#170) (@dependabot[bot])
π Contributors¶
@dependabot[bot], @devsetgo and dependabot[bot]
π 26.3.1 Β· America 250 Release: Adding AI Help Instructions and Clean Up.¶
π Published 2026 July 03, 23:12
π Changes¶
Happy 250th Birthday USA!!!!
β¨ Features¶
- Enhancement: Adding AI Helper Documentation (#177) (@devsetgo)
- Fix: Live Validation (#167) (@devsetgo)
π Bug Fixes¶
π Documentation¶
- Enhancement: Adding AI Helper Documentation (#177) (@devsetgo)
- Documentation Fix (#168) (@devsetgo)
- Fix: Live Validation (#167) (@devsetgo)
- Production Release - Final Edits (#166) (@devsetgo)
π· GitHub Actions¶
π§ Maintenance¶
- Enhancement: Adding AI Helper Documentation (#177) (@devsetgo)
- Fix: Live Validation (#167) (@devsetgo)
- Production Release - Final Edits (#166) (@devsetgo)
π Contributors¶
π 26.2.4 Β· Live Validation Fix, Example, and Doc Updates¶
π Published 2026 June 28, 14:32
π Changes¶
β¨ Features¶
π Bug Fixes¶
π Documentation¶
π§ Maintenance¶
π Contributors¶
π 26.2.1.beta Β· CSRF Feature Release¶
π Published 2026 April 26, 19:26
π Changes¶
β¨ Features¶
π§ Maintenance¶
- feat(csrf): add CSRFMode enum with backward-compatible mode handling (#115) (@devsetgo)
- pip(deps): bump tox from 4.52.0 to 4.52.1 (#104) (@dependabot[bot])
- pip(deps): bump python-multipart from 0.0.24 to 0.0.26 (#106) (@dependabot[bot])
- github-actions(deps): bump actions/upload-pages-artifact from 4 to 5 (#107) (@dependabot[bot])
- pip(deps): bump mike from 2.1.4 to 2.2.0 (#108) (@dependabot[bot])
- pip(deps): bump fastapi from 0.134.0 to 0.135.3 (#97) (@dependabot[bot])
- pip(deps): bump pytest-cov from 7.0.0 to 7.1.0 (#98) (@dependabot[bot])
- pip(deps): bump pydantic-extra-types from 2.11.1 to 2.11.2 (#99) (@dependabot[bot])
- pip(deps): bump python-multipart from 0.0.22 to 0.0.24 (#100) (@dependabot[bot])
- pip(deps): bump pytest from 9.0.1 to 9.0.3 (#101) (@dependabot[bot])
- github-actions(deps): bump actions/github-script from 7 to 9 (#102) (@dependabot[bot])
- github-actions(deps): bump release-drafter/release-drafter from 6.2.0 to 7.2.0 (#103) (@dependabot[bot])
- dependency update and tests (#96) (@devsetgo)
- update of dependencies (#87) (@devsetgo)
- pip(deps): bump hatchling from 1.28.0 to 1.29.0 (#73) (@dependabot[bot])
- pip(deps): bump tox from 4.44.0 to 4.46.3 (#74) (@dependabot[bot])
- pip(deps): bump fastapi[all] from 0.128.4 to 0.134.0 (#75) (@dependabot[bot])
- pip(deps): bump mkdocs-material from 9.7.2 to 9.7.3 (#76) (@dependabot[bot])
- pip(deps): bump ruff from 0.15.1 to 0.15.4 (#77) (@dependabot[bot])
π Contributors¶
@dependabot[bot], @devsetgo and dependabot[bot]
π 26.1.8.beta Β· Removing External Validation Logic¶
π Published 2026 February 27, 21:32
π Changes¶
π Bug Fixes¶
π Contributors¶
π 26.1.7.beta Β· Bug fix and cleanup.¶
π Published 2026 February 22, 19:56
π Changes¶
π Bug Fixes¶
π Contributors¶
π 26.1.6.beta Β· Many fixes, enhancements, and increasing code coverage¶
π Published 2026 February 22, 16:35
π Changes¶
- bumping version to 26.1.6.beta (#68) (@devsetgo)
- feat(examples,docs): add plain HTML style support and document render⦠(#67) (@devsetgo)
- improving documents (#59) (@devsetgo)
- improving test coverage (#58) (@devsetgo)
- improving reliability rating (#57) (@devsetgo)
- working on sonarcloud issue (#41) (@devsetgo)
- fixing examples (#33) (@devsetgo)
β¨ Features¶
- working on example. (#65) (@devsetgo)
- Improvements - docs, examples, and bug fixes (#43) (@devsetgo)
- 34 add timing (#42) (@devsetgo)
- adding start line and end line for HTML sent to browser (#32) (@devsetgo)
π Bug Fixes¶
- working on material design render issues (#66) (@devsetgo)
- working on example. (#65) (@devsetgo)
- Improvements - docs, examples, and bug fixes (#43) (@devsetgo)
π§ Maintenance¶
- pip(deps): bump tox from 4.36.0 to 4.44.0 (#60) (@dependabot[bot])
- pip(deps): bump mkdocs-material from 9.7.1 to 9.7.2 (#61) (@dependabot[bot])
- pip(deps): bump isort from 7.0.0 to 8.0.0 (#62) (@dependabot[bot])
- pip(deps): bump flask from 3.1.2 to 3.1.3 (#63) (@dependabot[bot])
- pip(deps): bump autoflake from 2.3.1 to 2.3.3 (#64) (@dependabot[bot])
- pip(deps): bump pytest-html from 4.1.1 to 4.2.0 (#45) (@dependabot[bot])
- pip(deps): bump ruff from 0.14.14 to 0.15.0 (#44) (@dependabot[bot])
- pip(deps): bump tqdm from 4.67.1 to 4.67.3 (#47) (@dependabot[bot])
- pip(deps): bump fastapi[all] from 0.121.2 to 0.128.4 (#48) (@dependabot[bot])
- pip(deps): bump mkdocstrings[python] from 1.0.0 to 1.0.1 (#39) (@dependabot[bot])
- pip(deps): bump pymdown-extensions from 10.20 to 10.20.1 (#36) (@dependabot[bot])
- github-actions(deps): bump release-drafter/release-drafter from 6.1.0 to 6.2.0 (#35) (@dependabot[bot])
- pip(deps): bump black from 25.12.0 to 26.1.0 (#37) (@dependabot[bot])
- pip(deps): bump ruff from 0.14.11 to 0.14.14 (#38) (@dependabot[bot])
- pip(deps): bump packaging from 25.0 to 26.0 (#40) (@dependabot[bot])
π Contributors¶
@dependabot[bot], @devsetgo and dependabot[bot]
π 26.1.2.beta Β· Bug fixes and Improvements¶
π Published 2026 January 09, 21:46
π Changes¶
- Publishing Improvements (#17) (@devsetgo)
- Doc (#16) (@devsetgo)
- GitHub Actions Improvements (#10) (@devsetgo)
- first release (#9) (@devsetgo)
- working on documentation (#5) (@devsetgo)
- working on coverage (#4) (@devsetgo)
β¨ Features¶
π Bug Fixes¶
- 18 bootstrap not included in self contained example (#24) (@devsetgo)
- Fix model-list delete for dynamically added items (#23) (@devsetgo)
- working on coverage issue (#3) (@devsetgo)
- working on publishing issue (#2) (@devsetgo)
π§ Maintenance¶
- github-actions(deps): bump actions/upload-pages-artifact from 3 to 4 (#19) (@dependabot[bot])
- updating release drafter (#11) (@devsetgo)
- Pre-Release Checks (#6) (@devsetgo)
π Contributors¶
@dependabot[bot], @devsetgo and dependabot[bot]
π§ͺ Pre-releases¶
π§ͺ 26.1.1.beta Β· Initial Beta Release¶
π Published 2026 January 02, 19:13
π Changes¶
- GitHub Actions Improvements (#10) (@devsetgo)
- first release (#9) (@devsetgo)
- working on documentation (#5) (@devsetgo)
- working on coverage (#4) (@devsetgo)