Skip to content

Releases: sgaduuw/bragi

v1.36.0

15 Jun 10:13
0881f2b

Choose a tag to compare

Added

  • Table authoring in the admin editor: insert and edit GFM pipe tables
    with full structural editing (add/remove rows and columns, toggle
    header row), persisted as pipe-table markdown.

v1.35.0

15 Jun 05:12
1b1c3ea

Choose a tag to compare

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), a held=Nms slow-write WARNING on the
    bragi.db.slow_write logger (threshold BRAGI_SLOW_WRITE_WARN_MS,
    default 2000) so write contention is visible in logs, and a
    retry-on-database is locked helper applied to the redirect hit-count
    bump.

v1.34.3

14 Jun 18:16
c996153

Choose a tag to compare

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

14 Jun 14:42
e064d78

Choose a tag to compare

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

14 Jun 08:24
0ef6544

Choose a tag to compare

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

13 Jun 23:33
d12d693

Choose a tag to compare

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

13 Jun 20:18
5f18272

Choose a tag to compare

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

13 Jun 17:57
05002b2

Choose a tag to compare

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

12 Jun 22:29
fae2a42

Choose a tag to compare

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 download probe satisfies the package's requires-python,
    extends the propagation budget, and carries a workflow_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

10 Jun 20:30
7f8ed39

Choose a tag to compare

Changed

  • Runtime dependency bumps. gunicorn 23 → 26, argon2-cffi
    23 → 25, markdown-it-py 3 → 4, mdit-py-plugins 0.4 → 0.6,
    markdownify 0.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-python is now
    >=3.14,<4 (was >=3.12,<4). Installs against Python 3.12 and
    3.13 will fail at pip install bragi-cms resolution time. The
    [tool.ruff] target-version and [tool.mypy] python_version are
    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 run python:3.14-slim. Direct PyPI installers on the
    older interpreters need to upgrade.