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.126.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.126.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 production branch 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 db instance imported from config/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_name translation keys. See Internationalization.
  • Optional client-side enhancements - fine-grained reactivity with alien-deepsignals for object reactivity (paired with a small self-contained signals-ui.js helper 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_records queries with automatic dependency-set invalidation and a /system/cache admin view. Enable with CACHE_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 with RATE_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 translations table is the source of truth, edited live through the /system/translations admin module and seeded per-language from sql/<dialect>/02-init-translations-<lang>.sql. sync:languages AI-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 via Intl.PluralRules from 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 WHERE filters 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/CU column-visibility flags, plain-word and JSON column-comment field types, --refresh-fields to regenerate field sections only, sort options from indexed columns, fulltext search via lib/sql_dialect.ts, and the crud-ignore table tag.
  • Pagination strategies & streaming - generated list views choose offset (default) or cursor pagination via --pagination / the pagination_strategy schema export, and can stream records as Declarative Partial Updates (DPU) via render_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 - --agent runs the dev server headless, impersonating a user via the X-Agent-User-Email header or AGENT_USER_EMAIL (dev + localhost only). See Authentication.
  • CSS design system - the @theme block 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 translations table. 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 in lib/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 from props.translations by 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 through Bun.markdown.html, for a translation authored as markdown source. create_ctx() now resolves ctx.translations once per request - replacing the standalone translated_from_request() helper - and render() exposes it to templates as props.translations. Existing {= props.labels.x }-style reads become {_ labels.x }. See Translation Lookups.
  • libvips installer - bun scripts/cli.ts vips fetches 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.