This release includes 4 security fixes for security teams reviewing exposed deployments.
Affected surfaces
ReleasePort's take
Moderate signalThe release eliminates the insecure default secret key and enforces strong random generation on first start. It also hardens password‑reset flows with single‑use tokens.
Why it matters: Affects session cookies, password‑reset tokens; apps must ensure SECRET_KEY is set or accept auto‑generated strong keys, and handle single‑use reset links to prevent replay attacks.
Summary
AI summaryUpdates Session and token security, Access control, and derived across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Critical |
Insecure built-in secret key is no longer used; app refuses default and generates a strong random key on first start if SECRET_KEY unset. Insecure built-in secret key is no longer used; app refuses default and generates a strong random key on first start if SECRET_KEY unset. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Security | High |
Password-reset links are now single-use; used or superseded tokens are immediately rejected. Password-reset links are now single-use; used or superseded tokens are immediately rejected. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Security | Medium |
Security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions‑Policy, CSP, HSTS) are now emitted by default on every response. Security headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions‑Policy, CSP, HSTS) are now emitted by default on every response. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Security | Medium |
Markdown‑rendered content is sanitized with DOMPurify before display, preventing HTML injection in chat and admin texts. Markdown‑rendered content is sanitized with DOMPurify before display, preventing HTML injection in chat and admin texts. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Security | Medium |
Logout operation is now a POST action, making it CSRF‑protected. Logout operation is now a POST action, making it CSRF‑protected. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Medium |
Admin user list now limits visibility to only members of groups the group administrator manages, preventing over‑sharing. Admin user list now limits visibility to only members of groups the group administrator manages, preventing over‑sharing. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Medium |
Bulk tagging of recordings now enforces that the actor is a member of the target group’s membership. Bulk tagging of recordings now enforces that the actor is a member of the target group’s membership. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Feature | Low |
New optional environment variables (`SECURITY_HEADERS_ENABLED`, `CONTENT_SECURITY_POLICY`, `HSTS_HEADER`, `SECRET_KEY_FILE`) provide fine‑grained control over security headers, CSP, HSTS, and secret‑key storage location. New optional environment variables (`SECURITY_HEADERS_ENABLED`, `CONTENT_SECURITY_POLICY`, `HSTS_HEADER`, `SECRET_KEY_FILE`) provide fine‑grained control over security headers, CSP, HSTS, and secret‑key storage location. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Dependency | Medium |
Third‑party CDN dependencies (Chart.js, DOMPurify) are now bundled locally instead of loaded from external CDNs. Third‑party CDN dependencies (Chart.js, DOMPurify) are now bundled locally instead of loaded from external CDNs. Source: llm_adapter@2026-07-15 Confidence: high |
— |
Full changelog
Release Notes - v0.10.1-alpha
A security-hardening release. Upgrading is recommended for all deployments. It is backwards compatible with the v0.10.x line and involves no database migrations. There are no functional changes to recording, transcription, or summarization.
Session and token security
- The insecure built-in secret key is no longer used. Previous versions fell back to a hardcoded, publicly known key when
SECRET_KEYwas unset. That key signs session cookies and password-reset tokens, so any deployment that never setSECRET_KEYcould have its cookies and reset links forged. The application now refuses that default and, whenSECRET_KEYis unset, generates a strong random key on first start and persists it under the instance directory (captured by a normal data-volume backup). SettingSECRET_KEYexplicitly is still recommended for multi-host deployments and key rotation; see the installation guide. The key does not encrypt stored data, so upgrading only requires users to log in again once. - Password-reset links are single-use. Reset tokens are now bound to server-side state, so a used or superseded link is rejected immediately instead of remaining valid for its full lifetime. Changing the password also invalidates any outstanding reset link.
Response headers and content security
- Security headers are set by the application.
X-Frame-Options,X-Content-Type-Options,Referrer-Policy,Permissions-Policy, aContent-Security-Policy, and (over HTTPS)Strict-Transport-Securityare now emitted on every response, so a deployment without a hardening reverse proxy is still protected. These can be tuned or disabled withSECURITY_HEADERS_ENABLED,CONTENT_SECURITY_POLICY, andHSTS_HEADER. - Markdown-rendered content is sanitized. Chat answers, Inquire answers, and admin banner/disclaimer text are sanitized with DOMPurify before display, so HTML embedded in model output or settings cannot execute in the browser.
- Third-party CDN dependencies removed. Chart.js (admin dashboard) and DOMPurify are now bundled locally with the other vendored assets instead of being loaded from a third-party CDN at runtime.
Access control
- The admin user list no longer over-shares. A group administrator who is not a site administrator now sees only the members of the groups they administer, rather than the entire user directory.
- Bulk tagging enforces group membership. Applying a group tag to multiple recordings now requires membership in that tag's group, matching the single-tag endpoints.
- Logout is CSRF-protected. Signing out is now a POST action, so a cross-site request can no longer force a logout.
Configuration
New optional environment variables, all with safe defaults:
| Variable | Default | Purpose |
|---|---|---|
| SECURITY_HEADERS_ENABLED | true | Set false if your reverse proxy already sets all security headers. |
| CONTENT_SECURITY_POLICY | built-in policy | Override the entire Content-Security-Policy. |
| HSTS_HEADER | max-age=63072000; includeSubDomains | Tune or disable (empty string) the HSTS header. |
| SECRET_KEY_FILE | (derived) | Path to the persisted auto-generated key, if you want to relocate it. |
Compatibility
Backwards compatible with the v0.10.x line; no database migrations. On first start after upgrade, deployments that never set SECRET_KEY will generate and persist one automatically, which logs existing users out once. To avoid the one-time re-login and to control the key across hosts, set SECRET_KEY explicitly before upgrading.
Breaking Changes
- Built‑in insecure default `SECRET_KEY` removed; application now refuses to start without a secret key or auto‑generates one on first run, causing existing sessions to become invalid.
Security Fixes
- Removal of insecure built‑in secret key prevents forged session cookies and password‑reset tokens; new `SECRET_KEY_FILE` handling ensures secure storage.
- Password‑reset token reuse vulnerability fixed by making links single‑use.
- Admin user list now respects group administrator scope, preventing over‑exposure of all users.
- Logout endpoint now CSRF‑protected via POST requirement.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About speakr
Speakr is a personal, self-hosted web application designed for transcribing audio recordings
Related context
Related tools
Earlier breaking changes
- v0.10.0-alpha Unauthenticated API requests now return a JSON 401 instead of a 302 redirect.
Beta — feedback welcome: [email protected]