Releases: sgaduuw/bragi
Releases · sgaduuw/bragi
v1.36.0
v1.35.0
Added
- SQLite write-contention hardening:
PRAGMA synchronous=NORMAL(shorter
write-lock hold), a tunable busy_timeout (BRAGI_SQLITE_BUSY_TIMEOUT_MS,
default raised to 10s), aheld=Nmsslow-write WARNING on the
bragi.db.slow_writelogger (thresholdBRAGI_SLOW_WRITE_WARN_MS,
default 2000) so write contention is visible in logs, and a
retry-on-database is lockedhelper applied to the redirect hit-count
bump.
v1.34.3
Fixed
- Changing a page's parent (in the list or the edit form) failed with a
"database is locked" error on multi-worker deployments and the change
did not persist. The redirect that records the moved URL was being
written on a second database connection that deadlocked against the
page save; it now shares the request's connection.
v1.34.2
Fixed
- Pages admin: the Parent column is now an always-live dropdown that
saves as soon as you pick a value, matching the Status column.
Previously it tried to save on Enter and cancel on Escape, but a
dropdown does not submit on Enter and swallows Escape, so after
picking a parent neither key did anything.
v1.34.1
Fixed
- Inline editing in the Pages list: pressing Enter to save a title,
slug, or parent no longer reverts the value. The cell's
focused-Enter "enter edit mode" trigger was also firing while
editing, racing the save request and re-rendering the old value
under multi-worker deployments. The trigger now applies in view
mode only.
v1.34.0
Added
- Pages admin: edit a page's parent inline from the list (double-click
the Parent cell, pick from the dropdown, Enter to save / Escape to
cancel), matching the existing inline title/slug/status editing.
Changed
- Moving a published page to a new parent now inserts a 301 covering
the page and its whole subtree, so the old URLs keep resolving. This
applies to both the inline list edit and the full page edit form.
Fixed
- The page parent picker (inline and edit form) no longer offers the
page itself or its descendants, and a descendant parent is rejected
server-side, preventing a cyclic page tree.
v1.33.1
Fixed
- Page list: the full-URL-path line is no longer shown for root
pages, where it merely repeated the slug as/<slug>/and, stacked
under the slug, read as the page being nested under itself. The
path now renders only where it adds information: nested pages
(the ancestor chain) and the home page. Cosmetic only, no data or
URL change.
v1.33.0
Added
- Recompute a page's slug from its title across the page admin: a
"Recompute from title" button on the edit form (previews the
resulting URL, ticks "skip redirect"), an inline recompute in the
page-list slug cell, and a bulk "Recompute slugs" action over
selected pages. Recompute skips the auto-301 by default and is
undoable via page revision history. The page list now shows each
page's full URL path.
v1.32.0
Added
- Datasets (#42): per-site registry of uploaded data files
(DuckDB / CSV / Parquet / SQLite) queried via DuckDB. Admin
explore console with saved queries;::: dataset :::markdown
directive bakes tables, Vega-Lite charts (client-side hydration,
no-JS table fallback), and inline scalar values into post and
page bodies at save time; re-upload re-renders referencing
content. New settings:BRAGI_DATASET_MAX_UPLOAD_BYTES,
BRAGI_DATASET_QUERY_TIMEOUT_SECONDS,
BRAGI_DATASET_QUERY_MAX_ROWS,
BRAGI_DATASET_QUERY_MEMORY_LIMIT,
BRAGI_DATASET_QUERY_TEMP_LIMIT. New CLI:bragi datasets rerender.
Changed
- Release pipeline hardening (follow-up to the v1.31.0 PyPI
propagation incident, PRs #406-#410):release.yml's
publish-docker propagation gate now pins Python 3.14 so the
pip downloadprobe satisfies the package's requires-python,
extends the propagation budget, and carries aworkflow_dispatch
recovery handle that produces a v-prefixed image tag and fires
the theme-notify step. Adds a standalone_diagnose-pypi.yml
workflow for diagnosing future routing incidents. No runtime or
deployment-behaviour change for operators.
v1.31.0
Changed
- Runtime dependency bumps.
gunicorn23 → 26,argon2-cffi
23 → 25,markdown-it-py3 → 4,mdit-py-plugins0.4 → 0.6,
markdownify0.13 → 1.2. The full test suite (rendering
pipeline, importers, auth verification) passes against the new
versions without behaviour-change surface; argon2-cffi 25 still
verifies hashes produced by 23.x. Operators with deeply
customised gunicorn configs should skim the gunicorn 24/25/26
release notes; the in-tree compose defaults work unchanged. - Python floor raised to 3.14.
requires-pythonis now
>=3.14,<4(was>=3.12,<4). Installs against Python 3.12 and
3.13 will fail atpip install bragi-cmsresolution time. The
[tool.ruff] target-versionand[tool.mypy] python_versionare
bumped in lockstep with the floor, and CI now exercises 3.14
instead of 3.12. Operators on the published Docker images
(bragi-admin/bragi-delivery) are unaffected; those have
always runpython:3.14-slim. Direct PyPI installers on the
older interpreters need to upgrade.