Releases: AccentCMS/accent
Release list
Accent CMS v0.23.1
A bugfix release for the v0.23 static-build and deployment surface. The
unifying theme is serve/build parity: several links and assets that worked
under accent serve were missing from accent build output and 404ed only
on deployed sites, invisibly to accent validate.
Added
accent build --strict-links: a build-output link sweep resolves every
emitted internal href against the output tree (at anybase_path,
including none). It warns by default and fails the build under the flag;
the docs and website deploy workflows now build with it, so a broken-link
regression fails the deploy instead of shipping 404s.
Fixed
- Default theme under
site.base_path: the top menu and the docs sidebar
(both its versioned and non-versioned branches) rendered empty on every
sub-path deployment, because the templates encoded root-relative URL
shape in their depth heuristics and theversion.roottemplate context
value never carried the base path. Nav depth is now measured against
url('/')andversion.rootis prefixed like every other context URL;
a regression fixture builds the embedded docs theme with and without a
base path. - Static-build link parity for three link classes that worked in
serve
and 404ed on deployed sites: versionless URLs now get a meta-refresh stub
at every default-version page (previously only the versioning root);
internal relative links are absolutized at render time against both
authoring bases, so emitted hrefs no longer depend on the host's
trailing-slash behavior; andaccent validatenow flags all unresolvable
relative links, not just.md-suffixed ones (page-local file references
stay exempt). One long-broken source-tree-path link in the docs was
corrected across buckets, with frozen-bucket errata. - Page-local media in static builds:
accent buildnow emits page-local
media files at their bare page URLs, mirroring the serve-time alias
exactly -- rendered pages win collisions, per-pagemedia.expose: false
is honoured, sectioning directories and root-level orphan files are
covered, andmedia.serve_at_page_url: falsedisables both surfaces
consistently. The static-asset resolver now also rejects dot-prefixed
path components on both surfaces, and serve and build share a single
extension allowlist. - Copy-code button: copying a code block no longer prepends the button's
own label (Copy/Copied!) to the copied text. - install.sh now warns when a stale
accentearlier inPATHshadows the
freshly installed binary, naming both paths and the remediation. - Release/deploy pipeline, no released-binary impact: the site deploy
workflows no longer race the release binary after a tag, and the release
publish job survives partial re-runs of the build matrix.
Verifying your download
curl -fsSLO https://raw.githubusercontent.com/AccentCMS/accent/main/release-signing-key.asc
gpg --import release-signing-key.asc
gpg --verify checksums-v0.23.1.txt.asc checksums-v0.23.1.txt
sha256sum -c --ignore-missing checksums-v0.23.1.txtAccent CMS v0.23.0
Sub-path deployment support lands: a static build (or a proxied accent serve) now works correctly when the site lives under a path prefix
such as a GitHub Pages project site or a reverse-proxy mount point.
Alongside it, the two-release-old docs promotion checklist becomes a
tool with a fail-closed release gate behind it, and the workspace picks
up a Rust toolchain bump plus the CI/dependency fixes that came with
validating it.
Added
- Base path support for sub-path deployments (f255):
site.base_path
config field plus--base-pathonaccent buildand
accent serve-static. Every internal URL (page links, theme assets,
media, search fetch paths and result URLs,llms.txtlinks,.md
redirect stubs, pagination, tag links) is emitted under the prefix, so a
static build works when served from a sub-path such as a GitHub Pages
project site. The prefix auto-derives from the path component of
site.url/--base-url, making the documented
accent build --base-url https://user.github.io/reporecipe work as
written; an explicitbase_pathwins, and if it diverges from the
URL's own path a startup/build warning names both values and the
affected absolute-URL surfaces (sitemap, feeds, canonicals, JSON-LD).
Absolute artifacts compose the prefix exactly once. Newurl(path)
template function/filter for themes; in-tree themes no longer hardcode
root-absolute paths, andaccent buildwarns about hardcoded
root-absolute URLs in theme templates and fails the build if any
emitted file still contains an unprefixed internal URL.accent serve
andaccent serve-staticserve the site under the prefix -- reserved
infrastructure routes, now including/_healthand/.well-known,
stay at the server root -- so local serving reproduces the deployed URL
space. Post-review hardening: DocFind's native search index (the JSON
API/MCP consumers) is built from its own root-relative document set
instead of reusing prefixed browser-index bytes, so startup search
under a base path returns results again; the version-scoped-search
(f225) "/" catch-all is preserved instead of being joined into the
prefix; andfont_css_url()now joins the prefix likecdn_url(),
with proxied font CSS emitting relative../files/references so
cached stylesheets stay correct under any mount prefix. - Docs promotion tool and fail-closed release gate (f254):
cargo run -p docs-promote -- promote --release X.Yexecutes the versioned-docs
release promotion (freeze thevX.Y-devbucket tovX.Y, relabel both
bucket roots, seedvX.(Y+1)-dev, regenerate the frozen-content
manifest) as a single idempotent, non-committing tool instead of a
manual checklist -- closing both the omission failure class (b101:
v0.22.0 shipped without the docs ever being promoted) and the
incompleteness failure class (b108: the stale "0.22-dev" breadcrumb).
scripts/check-docs-promotion.shbacks it with an independent gate
wired into bothscripts/release.shandrelease.yml: a stable-tag
release now fails closed if the docs corpus was never promoted,
matching the existingLICENSE_PUBLIC_KEY_PEMfail-closed precedent
(pre-release tags are exempt). Repo-internal tooling with no render
surface or product-facing behavior. This release's own docs were
promoted with it:v0.23is now the frozen release bucket and
v0.24-devthe writable one.
Fixed
- Frontmatter redirects no longer poison browser redirect caches
(b107): a simpleredirect: /target(and the detailed form without
an explicitcode:) now emits302 FoundwithCache-Control: no-cacheinstead of a permanent301. An author-editable "moving
pointer" redirect cached as permanent by the browser was surviving
server restarts and content changes, producing convincing
"the docs are broken" reports on shared dev ports.code: 301remains
the explicit opt-in for deliberate permanent migrations;
canonicalization redirects (trailing slash,.mdcleanup,
permalink-pattern maps) are unaffected and stay 301. - Version-bucket breadcrumb showed the wrong version after promotion
(b108): a released version bucket'smenu.titlefrontmatter kept
reading "X.Y-dev" after promotion, so the breadcrumb and prev/next
navigation disagreed with the version switcher. Fixed for the shipped
v0.22 docs and closed permanently going forward by the docs-promote
tool's relabel step (f254). - Mermaid diagram layout: the vendored
accent-mmdrrenderer
advanced through three patch releases (0.3.0 -> 0.3.2), fixing edges
that crossed through subgraph titles, edges into adjacent terminal
markers (flowchart((Done))circles, state[*]end rings) that
routed as clipped hooks or squeezed diagonal staircases, and terminal
markers that overlapped their source node. - Fresh dependency resolution could fail the build:
lightningcss
bumped to1.0.0-alpha.72-- the previous pin's loose
parcel_selectorsrequirement let any build that re-resolves
dependencies instead of honoringCargo.lock(cargo installwithout
--locked, a build aftercargo update) pick an incompatible
parcel_selectors/cssparserpair and fail to compile inside
lightningcss. Locked and fresh resolutions now agree. - Toolchain and CI hardening, no released-binary impact: the
workspace toolchain moved to Rust 1.97.1 (rust-toolchain.toml), which
also made an unattributedclippy --lib --testsfalse positive on the
lib test target stop reproducing (b110); every test-sidegitfixture
helper now disables commit signing, so the integration-test suite no
longer fails on a developer machine with a locked signing agent (b111);
and the Windows CI runner's persistent target directory now self-cleans
below 40 GB free, fixing a disk-exhaustion failure that the
toolchain/dependency bump triggered (b112).
Verifying your download
curl -fsSLO https://raw.githubusercontent.com/AccentCMS/accent/main/release-signing-key.asc
gpg --import release-signing-key.asc
gpg --verify checksums-v0.23.0.txt.asc checksums-v0.23.0.txt
sha256sum -c --ignore-missing checksums-v0.23.0.txtAccent CMS v0.22.1
A bugfix release. It completes the trial-license code removal that 0.22.0
announced at the policy level, corrects how an expired legacy trial key is
reported at startup, and folds in two developer-profile fixes that no
released binary was ever affected by.
Removed
accent license trialsubcommand (f249): the code removal that the
0.22.0 "Trial licenses" note forward-referenced. The subcommand, its
dispatch wiring, and theTRIAL_DAYSconstant are gone, and no upsell,
startup banner, oraccent license statusline references trials anymore.
Evaluation remains the free build/dev-serve tier (Policy A2) or a
low-commitment monthly license. Previously issuedkind: "trial"keys
still validate and expire under the time-constrained (monthly/rental)
rules -- there is no retroactive invalidation -- so a legacy trial key now
renders asMonthly (rental).
Fixed
- Expired legacy trial key mislabelled at
serve --productionstartup
(f249): the expired-license nudge now branches on the owned-vs-rental
lifecycle rather than the rawcadenceclaim, so a legacy trial key
(which carries no cadence) is correctly treated as time-constrained -- it
is reported as running as Core instead of falsely claiming perpetual
ownership, and the spurious "Trial license active" banner is gone. - Developer-profile only, no released-binary impact: the plugin-runtime
fuel-cap test no longer flakes under host CPU load (b096), and ad-hoc
single-file serving under theedition-corecompile profile (media
compiled out -- never a released build) no longer 404s sibling static
assets (b100). Every released binary compilesmediain and already
served these correctly.
Verifying your download
curl -fsSLO https://raw.githubusercontent.com/AccentCMS/accent/main/release-signing-key.asc
gpg --import release-signing-key.asc
gpg --verify checksums-v0.22.1.txt.asc checksums-v0.22.1.txt
sha256sum -c --ignore-missing checksums-v0.22.1.txtAccent CMS v0.22.0
The launch release: Accent CMS becomes publicly downloadable. One
license-unlocked binary per platform, published with mandatory signing to
github.com/AccentCMS/accent, plus
the first release of the built-in content agent.
Added
- Public single-binary distribution (f247): releases are now published
to the public download repositoryAccentCMS/accent-- six platform
archives (accent-v<version>-<target>), a SHA-256 checksums file, and a
mandatory GPG signature (checksums-v<version>.txt.asc; the release
signing key is published asrelease-signing-key.asc). Install scripts
(install.sh/install.ps1) download, checksum-verify, and (with gpg
present) signature-verify automatically; every release additionally
receives a publication attestation in the Sigstore transparency log.
There are no per-edition artifacts: every download contains the full
feature set and the license key sets the runtime tier. - Content agent (f242, free in every edition):
accent agentruns a
budgeted, human-in-the-loop LLM session over the site's content with
explicit provider/endpoint/model arguments and stdin approval for
writes. - Agent admin chat (f244, f246): the admin UI gains a chat panel
driving the same agent over/_admin/agent/*SSE with approval and
steering; flippingagent.enabledchanges nothing but the agent routes
and panel markup. - Agent audit stamping (f245): agent sessions stamp an audit hash that
cross-references the session log with git history. - Public plugin registry:
github.com/AccentCMS/plugin-registryis
live (empty for now); default-configaccent plugin installresolves it
and reports missing plugins cleanly (b099). - Relative markdown links now just work (b092): intra-site links written
the portable, GitHub-compatible way --[E001](e001-example.md),
[up](../guide/setup.md)-- are rewritten at render time to the target
page's clean URL, resolved against the linking page's source file exactly
as GitHub and IDE previews resolve them. Applies toaccent serveand
accent buildalike; unresolvable destinations are left untouched, and
accent validatenow flags them (newBrokenRelativeLinkwarning) instead
of letting them ship as silent 404s. Absolute.mdlinks to existing pages
are rewritten too (skipping the redirect hop) and are no longer
false-positived byaccent validate.
Changed
- Version output drops the compile-time edition tag (f247):
accent --versionnow prints<version> (<hash>) [license: <tier>]and the page
footer'saccent.version_stringprints<version> (<hash>). Under
single-binary distribution every release binary compiles the same feature
superset, so the old[edition: ...]tag would have readproon every
installation regardless of license. The admin Settings "Edition" row now
shows the runtime license tier (Core (free) / Core+ / Standard / Pro). - Feature-invariant config schema (f234): the
config.yamlschema is now
identical in every build of Accent CMS. Config sections for subsystems that
are not compiled into a binary (for examplecdn:ormcp:on a Standard
binary) are now parsed, type-checked, and retained instead of being silently
ignored, and a startup warning names each such section so the omission is
visible. As a consequence, a malformed section for a compiled-out
subsystem now fails config load with a parse error (previously it was
skipped as an unknown key). Well-formed configs are unaffected. - Canonical URLs without trailing slashes (b092):
/section/now 301s to
/sectioninaccent serveandaccent serve-static(the redirect fires
only for URLs that actually serve; unknown paths stay single-request 404s),
andsitemap.xmlemits the same canonical no-slash form as every other URL
surface instead of appending a trailing slash. - Shared content kernel (f231): the content-critical state (index,
cache, config) moved into aContentKernelshared by the server and the
MCP command, unifying the two content indexes.
Removed
- Trial licenses: the 10-day per-edition trial is withdrawn. Evaluation
is the free build/dev tier (no key, no time limit) plus a low-commitment
monthly license for production. Documentation no longer offers trials;
removal of theaccent license trialcommand is tracked as f249.
Fixed
- Static builds of versioning roots (b098):
accent buildrendered a
versioning root's shell page (for example/docs) as a dead-end page,
whileaccent serve302s it to the default version; the build now emits
the equivalent redirect stub. accent validatefile-serving-route false positives (b094): absolute
links under/media/,/content-media/,/theme/assets/,
/.well-known/, and/assets/plugins/are no longer reported as broken
pages.- Agent hangs (b090, b091):
accent agentno longer hangs on exit when
stdin never EOFs, and an approval pause can no longer outlive the session
budget when the requesting client disconnects. - Serve-spawn test flakes on macOS (b095) and the 500-line rule breach
that turned CI red for unrelated PRs (b097).
Security
- CDN license gate now covers config reload and live requests (f247):
the Pro-only CDN integration was license-checked only at serve startup, so
a SIGHUP orPOST /_admin/reloadwithcdn.enabled: truecould activate
asset rewriting, outbound cache purges, and the proxied-font routes
without a Pro key. Reloads now re-gatecdn.enabled(mirroring the admin
UI re-gate), and the/_fonts/*and purge-webhook handlers re-check it
per request. Groundwork for single-binary distribution, where MCP and CDN
are compiled into every release binary and the license key alone unlocks
them. - Release supply chain: GPG signing of the release checksums is now
mandatory (publishing fails without a verified signature), third-party
deploy tooling was removed from the release path, and every published
release is attested at publication time. - Bumped
crossbeam-epoch0.9.18 -> 0.9.20 (RUSTSEC-2026-0204: invalid
pointer dereference in thefmt::Pointerimpl forAtomic/Shared).
Transitive dependency; lockfile-only patch bump.
Verifying your download
curl -fsSLO https://raw.githubusercontent.com/AccentCMS/accent/main/release-signing-key.asc
gpg --import release-signing-key.asc
gpg --verify checksums-v0.22.0.txt.asc checksums-v0.22.0.txt
sha256sum -c --ignore-missing checksums-v0.22.0.txtAccent CMS v0.22.0-rc.1
Pre-release for testing. See CHANGELOG.md on the upcoming stable release.
Verifying your download
curl -fsSLO https://raw.githubusercontent.com/AccentCMS/accent/main/release-signing-key.asc
gpg --import release-signing-key.asc
gpg --verify checksums-v0.22.0-rc.1.txt.asc checksums-v0.22.0-rc.1.txt
sha256sum -c --ignore-missing checksums-v0.22.0-rc.1.txt