github murtaza-nasir/speakr v0.10.20-alpha

59 minutes ago

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_scheme and default_audio_player_position in System Settings (DEFAULT_UI_THEME, DEFAULT_COLOR_SCHEME, DEFAULT_AUDIO_PLAYER_POSITION in .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 (/inquire or /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=true and ENABLE_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 include total_recording_count, and include_children=true with folder_id on GET /api/v1/recordings includes 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}/summarize accepts additional_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 |vtt filter writes WebVTT times. GET /api/v1/recordings/{id}/transcript accepts translation=true and template_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_new setting, 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). With SPEAKR_SKIP_BACKGROUND_TASKS=true, no job workers or schedulers are started when a one-off command imports the app.

Changed

  • .env settings in System Settings (#567, contributed by @devkit415). Settings that were read from .env at 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 .env value 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_message is 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_SHARING is corrected to true.

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 index ix_folder_parent_id), recording.ownerless_since, processing_job.progress_done, processing_job.progress_total and transcript_template.header.
  • Settings: show_whats_new (on), and the .env-backed settings listed in Admin guide → System Settings, without a value, so the .env values 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_new in 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_theme to default, default_color_scheme to blue and default_audio_player_position to bottom.
  • 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 .env are ignored until Use .env value is selected. The auto-deletion thread is always started, and enable_auto_deletion and global_retention_days are read at each run.
  • API. The response of GET /admin/users is {"users": [...], "pagination": {...}}, 15 users per page by default (page, per_page up to 1000, search), in place of a plain list. A translation request for the transcript's own language is answered with same_language: true and job_id: null, and one for a recording already being translated with already_running: true and the existing job. Queue job entries include progress_done and progress_total. recording.summary.failed is 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

Don't miss a new speakr release

NewReleases is sending notifications on new releases.