Immutable
release. Only release title and notes can be modified.
[27.0.0] — 2026-07-27
Breaking: This release replaces the plaintext
data.jsonstore with an encrypted SQLite database and is not backward compatible with previous versions. There is no automatic import; a fresh database is created on first run and the first account to sign in becomes the owner.
Version naming update: Beginning with version 27, releases will use a year-based naming scheme instead of the previous year.month.quarter format. This clears up confusing on when updates will come out.
Added
- Encrypted database - all data now lives in an encrypted SQLite database (
better-sqlite3-multiple-ciphers, AES-256 / SQLCipher) instead of a plaintext JSON file. Runs in WAL mode with foreign keys, prepared statements, and indexes on the hot paths for faster, safer reads as data grows. - Encryption key management - the database key is read from the
DB_ENCRYPTION_KEYenvironment variable, or auto-generated and stored atserver/data/.dbkey(permissions0600). The key must stay paired with the database to open it. - Consolidated data directory - the database, encryption key, uploads, and sandbox now all live under a single
server/data/folder (git-ignored), keeping the server directory clean. - Exporting/Importing of User Chats - allows users to export or import their chats properly.
- Spaces - allows users/admins to share a chat with an assistant, collaborating on projects locally.
- Session management - logins now create a tracked session bound to the auth token. A new Sessions tab under Settings lists every signed-in device with its browser, OS, IP, and last-active time, and lets you revoke any individual session or sign out everywhere else. Revoking a session immediately disconnects its live websocket.
- Sliding 30-day session expiry - a session stays valid as long as it is used. Each authenticated request refreshes its activity timestamp; after 30 days of inactivity the session expires and the user is asked to sign in again.
- Admin audit log - a new Audit Log tab in the admin panel records sensitive actions (model create, update, and delete, model publish, provider create, update, and delete, settings changes, user role changes, and user deletions) with the actor, timestamp, affected target, and originating IP. Entries are paginated and load on demand.
- Audit retention - audit entries older than 120 days are pruned automatically at startup and once per day.
- Recognized model pricing presets - a built-in price table covers common hosted models (GPT, Claude, Gemini, DeepSeek, Mistral, Kimi, Grok, and Llama families). When a new model's ID matches a known name, its input and output prices are filled in automatically. Local or unrecognized models stay blank.
- Pricing override controls - the model editor now shows when an ID is recognized and offers a one-click "Apply preset" action plus a "Clear price" link, so admins can accept, override, or remove the suggested price at any time. Manual prices are never overwritten by a preset.
- Usage time windows - the personal Usage tab can now be filtered to the last 7, 30, or 90 days, or all time, and reports how many generations fall in the selected window.
- Usage budgets - admins can set monthly spend caps per role (users and admins) and per individual user, based on each model's configured price. A warning banner appears in the composer once a configurable fraction of the budget is used, and an optional enforcement mode pauses new messages for anyone at or over their cap until the start of the next month. Admins are never blocked. The budget banner reuses the model-unavailable banner style and stacks above it.
- Two-factor authentication - users can enable TOTP-based two-factor from a new Security tab in Settings. Setup shows a secret key and an otpauth setup URL for any authenticator app, verifies a code before turning on, and issues one-time recovery codes. Login gains a second step that accepts either an authenticator code or a recovery code. The entire implementation is local and uses no external services or new dependencies; codes are computed with Node's built-in crypto.
- Password change - the Security tab lets a signed-in user change their password after confirming the current one. Changing the password signs out all of that user's other sessions.
- Configurable session policy - admins can set how many days of inactivity end a session and cap the number of concurrent sessions per user (oldest sessions are signed out beyond the cap).
- Admin usage dashboard - a new Usage & Pricing tab in the admin panel shows account-wide token and cost totals over 7, 30, or 90 days, broken down by user and by model.
- Editable price presets - admins can add custom price presets (a model-name fragment plus input and output prices) or override built-in ones from the Usage & Pricing tab. Custom presets are layered over the built-in table used for automatic price suggestions.
- Audit log filtering and export - the audit log can be filtered by action, actor email, and time range, and exported to CSV.
- Per-user admin controls - the Users tab now shows each user's two-factor status, month-to-date spend, and an inline monthly budget override.
- Projects - place to store entire projects at and chat with.
- OpenAI Theme - Change the entire UI to match OpenAI's chat interface with just one click of a button!
Changed
- Password hashing - switched from bcrypt to argon2id (OWASP-recommended), with tuned memory/time parameters. Existing bcrypt hashes are not carried over (see breaking note above).
- Complete chat deletion - deleting a chat now also removes its uploaded attachment files from disk, in addition to the chat, its messages, and its sandbox (artifacts and version history). Applies to single-chat delete, "delete all my chats," and account deletion.
- Admin user deletion - removing a user now also deletes that user's sandboxes and uploaded attachments, matching the other deletion paths.
- Starburst Icon - fully centered all icons.
- Usage cost accuracy - each usage record now stores the price that was in effect at generation time. Models with no configured price are shown as "no price" rather than a misleading $0.00, and account totals indicate when a cost figure is incomplete because some models were unpriced.
- Spaces assistant replies - the in-space assistant now uses a short cooldown to avoid double-replies and detects when it is addressed by name or asked a direct question, making its decision to speak or stay silent more reliable.
- Spaces invitations - re-inviting a user who previously declined now re-sends the invite cleanly, duplicate and self-invites are rejected with clear messages, and spaces are capped at 25 members.
- Session cleanup on deletion - deleting a user (by an admin or via self-serve account deletion) now also removes that user's sessions.
- Models panel - the model list is now filterable once you have more than six models, and the core per-model toggles (default, extended thinking, hidden) are grouped into a single card for a calmer, less cluttered editor.
- Session lifetime - the signed token lifetime was raised to 90 days so the sliding inactivity window (default 30 days, now admin-configurable) is the real expiry, rather than the token expiring first.
Security
- Encryption at rest - the database file is encrypted with AES-256; a leaked
data.dbis unreadable without the key. - Restrictive file permissions - the database file and key file are created with
0600(owner read/write only). - Referential integrity -
ON DELETE CASCADEforeign keys guarantee a chat's messages cannot outlive it at the storage layer. - Path-traversal guard - attachment cleanup resolves filenames with
basename()and verifies the resolved path stays inside the uploads directory before deleting.
Removed
- Legacy JSON store - the
data.jsonfile, its debounced full-file rewrites, and corrupt-file backup handling are gone. - bcryptjs dependency, replaced by argon2id.
Performance
- Reduced write amplification - session activity timestamps are only written when at least 60 seconds have passed since the last update, avoiding a database write on every single request.
- Bounded in-memory maps - the spaces reply-cooldown map is capped to prevent unbounded growth on long-running servers.
What's Changed
- First prototype version info by @Smoffyy in #13
- Project cascade by @Smoffyy in #12
- OpenAI and anthropic theme by @Smoffyy in #15
- Project Cascade 2 by @Smoffyy in #14
- Remove em dashes by @Smoffyy in #24
- Database renaming and storing by @Smoffyy in #47
Full Changelog: v2026.2.4...v27.0.0