Speakr v0.10.20-alpha
In this release, the interface has six themes, the recording chat and Inquire become one assistant named Ambrose, folders can be nested, and a summary can be regenerated from a prompt you can see and edit.
New
- Interface themes. Six themes are available under Account settings → Preferences → Appearance: Standard, Classic, Workspace, Focus, Desk and Cards. Each works with every color scheme and with light or dark mode. A theme is applied without a reload and saved with the account. New accounts start with Cards, the Forest Emerald color scheme and the audio player at the top of a recording; existing accounts keep their look and player position. Administrators set these for new accounts with
default_ui_theme,default_color_schemeanddefault_audio_player_positionin System Settings (DEFAULT_UI_THEME,DEFAULT_COLOR_SCHEME,DEFAULT_AUDIO_PLAYER_POSITIONin.env); the same look is shown on the sign-in pages in a browser with no saved choice. - Ambrose, the assistant. The recording chat and Inquire are now one assistant, Ambrose, which each user can rename under Account settings → Preferences → Assistant. The library page is Ask Ambrose (
/inquireor/ask). In the recording chat, answers cite numbered passages of the transcript: click a number to play from that moment, and see each passage's time, speaker and quoted words in the Sources list below the answer. With the agent on (ENABLE_INQUIRE_MODE=trueandENABLE_INQUIRE_AGENT=true), Ambrose also has the library tools in the recording chat: text search, search by meaning, tag and folder filters, similar recordings, and reading transcripts, details, summaries and notes. With the agent off, Ambrose answers there from the open recording only. The admin guide has a new Ambrose settings page. - Chats per recording. Each recording has its own chat, kept in the browser tab for up to 20 recordings; chats survive a reload and are removed when the tab is closed. A chat icon on a recording's row marks a recording with a chat and pulses while an answer is arriving. When an answer finishes while you are in another recording, a message with that recording's name is shown. Incognito chats are never stored.
- Nested folders (PR #585, contributed by @ljq29 and @aantior). A folder can have a parent folder of the same user or group, chosen with Parent folder in the folder dialog. Subfolders are indented in folder lists, and folder selects show the full path, such as "Projects / 2026". Include subfolders next to the folder filter, off by default, adds the recordings of all subfolders. When a folder is deleted, its subfolders move up to its parent. In the API, folders have
parent_id, folder endpoints includetotal_recording_count, andinclude_children=truewithfolder_idonGET /api/v1/recordingsincludes descendant folders. - Regenerate summary dialog (#584). One dialog replaces the summary reprocess and custom prompt dialogs. The prompt that applies to you is shown in an editable box, with a chip naming its source: a tag, the folder, your default, the admin default or the built-in default. With Start from, you fill the box from another of your prompts, and with Save to …, you write an edited prompt back to its source; Add instructions (optional) takes context for this run only. On a recording shared with you, your own tags and default prompt are used, also when you regenerate the summary through the API or the bulk action.
POST /api/v1/recordings/{id}/summarizeacceptsadditional_instructions. - Translation progress. The processing queue and the Translation tab show how far a translation has come, for example "Translating · 12 of 18". A request to translate a transcript into its own language, or a recording already being translated, is answered at once without a new job.
- Downloads (#584, discussions #554 and #555). A summary can be downloaded as Markdown as well as Word, and the Ask Ambrose conversation as a Word document with each answer's Sources list. Every answer on the Ask page and in the recording chat has its own Copy and Download buttons. The Word downloads use Arial with consistent spacing, and their links are real hyperlinks.
- Transcript templates. A template can have a Header, written once above the transcript (for example
WEBVTT), and the|vttfilter writes WebVTT times.GET /api/v1/recordings/{id}/transcriptacceptstranslation=trueandtemplate_id. - What's new after an update. After an update, each user sees a short list of the release's new features once. Once closed with Got it, it is not shown again on any of the user's devices. New accounts do not see it for the release they were created in. With the
show_whats_newsetting, you can turn it off for everyone. - Files without a recording. With
scripts/clean_unreferenced_files.py, you can list the media files no recording refers to, and delete them or move them to a quarantine folder (see Retention → Files Without a Recording). WithSPEAKR_SKIP_BACKGROUND_TASKS=true, no job workers or schedulers are started when a one-off command imports the app.
Changed
.envsettings in System Settings (#567, contributed by @devkit415). Settings that were read from.envat startup only, such as registration, sharing, auto-deletion and video retention, can now be changed in System Settings and take effect without a restart. Until an admin saves a value, the.envvalue applies and the setting is marked Set in .env; Use .env value returns it to.env. System Settings are sorted alphabetically, and the internal voice profile settings are no longer listed. In the code, these settings are registered with one helper (idea from PR #574 by @devkit415).- Admin users list (#566, contributed by @devkit415). The list is paginated and searched on the server, and current members are left out of the add-member search.
- Group shares follow the group (#570, #582). A share made by a group tag or group folder lasts only while the recipient has a reason for it: the group's tag on the recording or the recording in the group's folder, and membership of the group. It ends when the member leaves, the group is deleted, the tag is removed, or the recording leaves the folder, unless another group tag or folder still gives it. After a role change, edit access on these shares follows the new role. Shares made by hand are not changed.
- Deleted users (#572). Deleting a user deletes each of the user's recordings completely. Recordings that earlier versions left without an owner are removed by a daily step at 2:00 AM: marked on one run and deleted at least 20 hours later, unless a job, recording session or upload part is still in progress.
- Fragmented MP4 (#539). With
VIDEO_RETENTION=true, a retained fragmented MP4, as OBS records it, is remuxed into a regular MP4 at its first transcription, for fast seeking (local storage only; on failure, the original is kept). - Failed summaries (#583). When a summary fails, its job is marked failed with the error message, so it can be retried; a transient error is retried automatically. The transcript is kept, and
error_messageis filled in for every permanent job failure. - Interface text. Labels, buttons and headings use sentence case and plainer wording in all seven languages. Highlight is now Star (filter Starred), the Shared filter is From others, Inquire Mode in the admin pages is Library search, and the user menu reads Shared recordings, Account settings, Groups and Sign out. No-speech errors have their own message and guidance (PR #577, contributed by @ljq29 and @aantior).
- Chat timestamp settings. Include timestamps in chat and its format are removed from Account settings, since citations carry the times. Saved values are kept; Include timestamps when summarizing is unchanged.
- Player spacing in Cards. The audio player at the bottom of a recording has the same space above it as at the top.
- Processing queue. The queue stays at the bottom left, clear of the bottom player when the sidebar is collapsed and of the chat button.
- Uploads under load. An upload now holds one database connection at a time while its job is queued. Before, many concurrent uploads in one process could fail with connection pool errors or wait 30 seconds.
- Code organization (PRs #558, #559, #560, #561, #565, #573 and #575, contributed by @devkit415): job error classification, queue checks, job dispatch and recording status filters are in their own functions or modules, and the test database runs faster. Upload ingestion is in one module. Behavior is unchanged.
- Dependencies: FFmpeg is pinned to the month-end BtbN build
autobuild-2026-10-31-12-59(n8.1.3-27-g8dca1586f4), since the earlier daily build was removed. The Focus theme includes the Source Serif 4 font (SIL Open Font License), loaded only with that theme. No Python packages changed.
Fixed
- Sharing and authorization (#571, #578, #579, #581). Moving a recording into a group folder after a revoked share no longer fails with a 500 (#571). A view-only recipient can no longer turn a personal tag into a group tag on another user's recording, which shared it with the group (#578) and gave the group's admins edit access (#579); the owner-or-admin rule now applies to the bulk tag routes too. A recording without an owner can no longer be read or deleted through the web delete and remove-audio routes (#581).
- Ask Ambrose without embeddings (#563). With no embedding backend, search chunks are stored without vectors for keyword search, and the index job completes; before, it failed and was retried three times.
- Video durations (#580). A WebM without a container duration, as browser recorders write it, is measured from its audio packets, and the deleted temporary audio is no longer probed.
- Webhook timeout (#568). The delivery timeout applies to every webhook request made without one.
- Notes and reprocess dialog (#584). The notes download is saved as
.docx, its actual format, and the reprocess dialog is as wide as the upload dialog. - Watch folder. A watched video is no longer set aside when its extracted audio exceeds the upload limit.
- Lists and editor. The next page is loaded when a page of recordings does not fill the list, and the transcript editor shows every sentence in full.
- Accessibility and narrow panes. Controls in the transcript editor and Account settings have names, scroll panes can be reached with the keyboard, badges, chips and speaker times have more contrast, and controls stay inside narrow panes and screens.
- Documentation. Speakr as an Open WebUI tool server is described in the API reference (#569), and the documented default of
ENABLE_PUBLIC_SHARINGis corrected totrue.
Upgrading
Pull the new image and start as usual. The following are added at startup; no manual migration is needed:
- Columns:
user.ui_theme,user.assistant_name,user.whats_new_seen,folder.parent_id(with a foreign key and the indexix_folder_parent_id),recording.ownerless_since,processing_job.progress_done,processing_job.progress_totalandtranscript_template.header. - Settings:
show_whats_new(on), and the.env-backed settings listed in Admin guide → System Settings, without a value, so the.envvalues keep applying. - A one-time cleanup of group tag and group folder shares without a reason (see Changed). Users can lose access to recordings that earlier versions kept shared with them.
A few changes are visible to existing users, administrators and API clients:
- What's new. Every existing user sees the What's new list once. To prevent it, switch off
show_whats_newin System Settings right after the update. - Defaults of new accounts. Accounts created after the update start with Cards and Forest Emerald, also on existing servers. To keep the previous defaults, set
default_ui_themetodefault,default_color_schemetoblueanddefault_audio_player_positiontobottom. - Deleted data. Recordings already without an owner are deleted by the daily step from the day after the update.
- Summaries requested by an editor. When an editor of a shared recording requests a summary without a prompt of their own, through
POST /api/v1/recordings/{id}/summarize, the bulk action or Generate summary, the editor's tag prompts and default prompt are used. Before, the owner's prompt was used. Automatic summaries still use the owner's prompt. - Labels. Scripts and browser tests that match interface labels, such as the user menu entries, need updating.
- Saved settings override
.env. Once an admin saves one of the.env-backed settings, later changes to its variable in.envare ignored until Use .env value is selected. The auto-deletion thread is always started, andenable_auto_deletionandglobal_retention_daysare read at each run. - API. The response of
GET /admin/usersis{"users": [...], "pagination": {...}}, 15 users per page by default (page,per_pageup to 1000,search), in place of a plain list. A translation request for the transcript's own language is answered withsame_language: trueandjob_id: null, and one for a recording already being translated withalready_running: trueand the existing job. Queue job entries includeprogress_doneandprogress_total.recording.summary.failedis sent once per final failure, not once per attempt. Library search error messages are reworded, with the same codes. - Going back to v0.10.19. The new columns and the values saved for the
.env-backed settings are ignored: subfolders appear as top-level folders, every user sees the standard theme, and template headers are not written. Shares removed by the one-time cleanup and recordings deleted by the ownerless cleanup are not restored.
Full Changelog: v0.10.19-alpha...v0.10.20-alpha