Release Notes
Introduction
This page tracks what changes between Reepolee releases. Each entry covers the version's user-facing additions, the bug fixes worth knowing about, and any breaking changes that need follow-up in your project (cross-linked to the Upgrade Guide when an upgrade isn't a no-op).
Reepolee uses calendar versioning, Ubuntu-style. A release is YY.MM.N - two-digit year, two-digit month, and the release number within that month. 26.07.1 is the first release shipped in July 2026. The version tells you when a release shipped, not what kind of change it carries; there is no semver-style major/minor/patch signal and no eventual "1.0". The shape:
- Month releases (
26.07.1→26.08.1) - the first release of a new month is a feature release. It may carry a breaking change, always documented with a one-step migration in the entry below. Read the entry before upgrading across months. - Point releases (
26.07.1→26.07.2) - later releases within the same month are bug fixes and documentation only. Always safe to upgrade in place.
The scheme is stable - it won't switch to semver later. Treat each entry below as the contract for what that release contains.
Versioning and Distribution
Reepolee isn't published to a package registry. There's no npm install reepolee. During closed alpha, invited participants receive tagged release archives directly by email, and the version that archive was cut from is the one they are working with. package.json tracks the version for diagnostic purposes (it appears in props.version and on the production logs); bun pm version patch --no-git-tag-version bumps the YY.MM.N version in package.json.
To move to a specific Reepolee version during alpha, request that release archive through the alpha channel and merge its changes into your project - the Upgrade Guide walks through the archive-based flow.
How to Stay Informed
Three ways to know when a new release ships:
- GitHub releases - every release tag publishes notes on
github.com/reepolee/reepolee/releases. Watching the repository (with the "Releases only" option) sends an email per release. - The
productionbranch on this docs repo - when these release notes are updated, that's a release. Subscribing to the RSS feed of the docs site changelog covers it. - Following @reepolee on Twitter - release announcements with one-paragraph summaries, no other noise.
For deeper "what's about to ship" visibility, the Roadmap tracks larger initiatives in flight.
26.07 - Current
The 26.07 line is the current release. Highlights:
- Server-rendered Ree templating with layouts, partials, and components (ReeTags). See ReeTags.
- Bun's native SQL for SQLite and MySQL with a single
dbinstance imported fromconfig/db.ts. The driver is a one-line file copy. See Database. - A complete CRUD generator that introspects your database and produces routes, queries, validation, templates, and translations from the schema alone. See Generators.
- Invite-only authentication with sessions in the database, a small KV abstraction so the session store is swappable, and tags for authorization. See Authentication.
- Tailwind v4 styling with design tokens in
@theme, semantic utilities (primary/secondary/tertiary), and form-control defaults that mean templates rarely need per-input class lists. See Styling. - Full internationalisation - database-backed translations and localised URLs generated automatically from
route_nametranslation keys. See Internationalization. - Optional client-side enhancements - fine-grained reactivity with
alien-deepsignalsfor object reactivity (paired with a small self-containedsignals-ui.jshelper module for DOM bindings), an SPA-style page loader, and a small set of shipped web components. See Client-Side. - Production-ready deployment with a systemd unit, GitHub Actions workflow, and Nginx configuration documented end-to-end. See Deployment.
Everything in the documentation reflects what the current 26.07 release ships.
Also included
The rest of what this release ships:
- Redis-backed SQL cache - opt-in caching of generated
search_recordsqueries with automatic dependency-set invalidation and a/system/cacheadmin view. Enable withCACHE_ENABLED=true+REDIS_URL. See Caching. - Rate limiting - sliding-window request limiting as the first global middleware, with per-scope tiers in
config/rate_limit.ts. Enable withRATE_LIMITING=true+REDIS_URL. See Rate Limiting. - CSRF protection - always-on double-submit-cookie protection on state-changing requests; generated forms already include the token. See CSRF Protection.
- DB-first translations - the
translationstable is the source of truth, edited live through the/system/translationsadmin module and seeded per-language fromsql/<dialect>/02-init-translations-<lang>.sql.sync:languagesAI-fills gaps directly in the DB; the Prune unused / Sync missing reeman tools keep the table aligned with templates. Missing keys render as their braced key path. See Translations. - Pluralization -
plural()selects CLDR plural forms viaIntl.PluralRulesfrom pipe-separated translation strings. - More AI translation providers - Ollama (local, highest priority) and Hugging Face Inference join OpenRouter. See Dynamic Translations.
- Global (row-level) scopes - admin-defined, named
WHEREfilters per table via/system/global_scopes, folded into list queries and the cache key. See Authorization. - Nested CRUD (master-detail) -
--parent <table>generates parent-scoped child resources with inline child lists on the parent's edit form. A parent can have multiple children. See Generators. - Generator improvements -
ICU/CUcolumn-visibility flags, plain-word and JSON column-comment field types,--refresh-fieldsto regenerate field sections only, sort options from indexed columns, fulltext search vialib/sql_dialect.ts, and thecrud-ignoretable tag. - Pagination strategies & streaming - generated list views choose offset (default) or cursor pagination via
--pagination/ thepagination_strategyschema export, and can stream records as Declarative Partial Updates (DPU) viarender_strategy: "stream". See Pagination and Streaming. - Domain types - a canonical column-type vocabulary in
config/domain_types/{mysql,sqlite}.ts, with a Check domain compliance reeman tool that audits a schema against it. See Schema & Initialization. - Agent mode -
--agentruns the dev server headless, impersonating a user via theX-Agent-User-Emailheader orAGENT_USER_EMAIL(dev + localhost only). See Authentication. - CSS design system - the
@themeblock expands into a full token set (brand/surface/primary/semantic colours, typography, radii), and generated list views gain a right slide-in filter panel (css/filters.css). See Theming & Tokens. - Add/remove language - both are one-step reeman actions that seed or strip a language's rows directly in the
translationstable. See Adding a New Language. - SQL layout & dialect isolation - schema/seed SQL moved to per-dialect folders (
sql/sqlite/,sql/mysql/) with numbered files; engine-specific SQL is isolated inlib/sql_dialect.ts. {#with}template directive - scopes bare variable names against a nested object, used widely in generated templates. See Displaying Data.- Translation-lookup tags
{_ }/{- }/{@ }- read strings fromprops.translationsby dotted key path (escaped, raw, and rendered through markdown), rendering a{last_segment}marker on a missing key instead of a crash or a silent blank.{@ }runs the resolved value throughBun.markdown.html, for a translation authored as markdown source.create_ctx()now resolvesctx.translationsonce per request - replacing the standalonetranslated_from_request()helper - andrender()exposes it to templates asprops.translations. Existing{= props.labels.x }-style reads become{_ labels.x }. See Translation Lookups. - libvips installer -
bun scripts/cli.ts vipsfetches a prebuilt libvips for the image-processing pipeline. See Installation.
Reporting Issues
Found something broken? Open an issue at github.com/reepolee/reepolee/issues. Include the Reepolee version (the version field in package.json), the Bun version (bun --version), and the smallest reproduction you can manage.
For security issues, email security@reepolee.com directly rather than opening a public issue.