Speakr v0.10.4-alpha
This release introduces an opt-in agentic mode for Inquire that researches across your recordings with tools and answers with timestamped, click-to-play citations, alongside a substantial reorganization of tag and folder management, quality-of-life improvements to the upload dialog, a new community-contributed local transcription connector, and a batch of fixes shaped by community reports. Every instance upgrades with a plain image pull; database columns migrate automatically and no configuration change is required.
New features
-
Agentic Inquire (opt-in beta). With
ENABLE_INQUIRE_AGENT=true, Inquire questions are answered by an agent that plans its own research: it searches semantically or by keyword, lists and filters recordings, and reads transcripts, summaries, and notes with the user's permission, iterating until it has enough evidence. A live activity timeline shows each step as it happens, long conversations are compacted automatically with the working context preserved, and tool calling uses the provider's native mechanism where available with a prompted-JSON fallback for endpoints without tool support. Answers cite their sources as compact numbered markers with the recording title on hover and a deduplicated Sources list at the end; follow-up questions can refer to citations by bare number. Each user controls whether their summaries and notes are available to the agent from account settings (transcripts are always available; notes are off by default). Loop limits, timeouts, and context budgets are configurable, and the classic single-shot pipeline remains both the default and the automatic fallback. -
Timestamped citations with click-to-play. Inquire citations now link to the exact moment in the recording: clicking a citation opens the recording and starts playback at the cited timestamp. Chips render as "3 @ 12:45" with hours shown past sixty minutes, and the displayed numbering is carried through conversation history so a follow-up like "tell me more about 5" resolves to what was actually on screen.
-
Clickable timestamps in recording chat. The per-recording chat now cites moments from the transcript as clickable chips: when your chat timestamps setting is on, the assistant references times like [7:35], and clicking one starts playback at that moment. Unlike Inquire there is no numbering or source list, since chat always concerns the single recording in view.
-
Segment-aware search chunking. Search indexing now chunks diarized transcripts along whole speaker turns instead of fixed character windows, storing the dominant speaker and start timestamp with each chunk; this is what makes citation deep links land on the right moment. Embedding requests are batched for large re-index runs, and
CHUNKING_STRATEGY=legacyrestores the previous behaviour. Changing embedding models still requires a re-embed from the admin panel, which the documentation now explains. -
Tags and folders, one place. Tag and folder management now live in a single "Tags & Folders" account tab with subtabs, and both are rendered by one shared card design: color, group badges, retention, language and speaker defaults, naming template, watch folder, and a recording count on every card, with the custom prompt collapsible. The two management pages previously duplicated several hundred lines of parallel code that had visibly drifted apart; they now share one implementation.
-
Create tags and folders while uploading. The upload dialog gains "New tag" and "New folder" buttons beside the section headers, and searching for a tag that does not exist offers to create it with the name prefilled. Both open the full editor with every setting available (colors, prompts, ASR defaults, retention, sharing, templates), and on save the new tag is applied to the selection and the new folder is selected, without leaving the dialog. The recording view's Upload Settings now share the same picker component, so they gain the same buttons and localization and can no longer drift from the upload dialog.
-
Default Language as a proper dropdown. The tag and folder editors' Default Language field is now the same localized dropdown used elsewhere, offering the full Whisper set of roughly one hundred languages by name with the short code alongside, instead of a free-text code field. Previously saved free-text values are preserved and continue to round-trip.
-
Upload, or upload and add more. The upload dialog's primary button now queues the selected files and closes the dialog. A new "Upload & Add More" button keeps it open for queuing further batches, which was the previous behaviour of the primary button.
-
Alibaba FunASR connector (community contribution by @ikelvingo). A new
TRANSCRIPTION_CONNECTOR=funasrintegrates Alibaba Cloud's FunASR/DashScope transcription with diarization, including OSS-compatible object storage handling and an optional intranet endpoint for in-cloud deployments. -
OpenASR connector (community contribution by @ikelvingo). A new
TRANSCRIPTION_CONNECTOR=openasrintegrates OpenASR, an open-source local-first speech-to-text app with a local OpenAI-compatible API, including diarization, initial prompt and hotword forwarding, and natural speaker ordering. -
Recorder ASR hints (#375). The in-app recorder's advanced options gain the initial prompt and hotwords fields already available on upload, including the saved-template picker and the transcription model override, wired through all recording paths including incognito. The recorder and the upload dialog now render these options from one shared template, so the two surfaces stay identical.
-
Username watch folders (#365). In
user_directorieswatch mode, a folder named after the username (raw or sanitized form) is now matched in addition to email-based names, consistent with how export folders already worked. -
Configurable Help Center link (#371).
HELP_CENTER_URLadds a link to your own help or FAQ page in the user menu, with an optionalHELP_CENTER_LABEL; the default label is localized. -
GPT-5 handling on gateways (#367).
GPT5_FORCE_MODE(andCHAT_GPT5_FORCE_MODEfor a separately configured chat model) forces GPT-5 parameter handling for deployments behind Azure AI Foundry or other gateways whose URLs the automatic detection cannot recognize. -
Exact speaker count (#362). The speaker fields on upload, recording, and reprocess gain a Range / Exact toggle, remembered per user: Exact shows a single "number of speakers" field instead of min/max. Connectors that only accept an exact count (OpenASR's
speakers=N) now show the single field automatically and receive the value; previously the speaker controls were hidden entirely for them. Tag and folder defaults get the same toggle. A single count is stored as min equals max, so nothing changes for existing data, settings, or other transcription providers. -
Theme toggle in the menu. The light/dark toggle now sits inline on the Color Scheme row of the user menu as a sun/moon pill, in both the main app and Inquire.
Fixes
-
Explicit httpx dependency (community contribution by @lhpereira). The httpx library Speakr imports directly was only available as a transitive dependency of the openai package, which dropped it in its 3.x line; fresh installations would have failed at startup. It is now declared explicitly.
-
Locked-screen recording timer (#341). iOS suspends JavaScript timers while the screen is locked, so the displayed duration could fall behind the actual recording. The timer now advances by wall-clock delta and stays correct through suspensions.
-
Merged audio on ASR pipelines (#372). Merged, stitched, and video-extracted m4a files are now written with the moov atom first (faststart), so ASR webservices that decode from a pipe can process them.
-
Media playback through the service worker (#374 hardening). Audio, video, and range requests now bypass the service worker entirely, and previously cached media responses are purged; proxying them through the Cache API breaks HTML5 range playback in some browsers.
-
Identify Speakers save button (#373). Save Names is enabled when only per-segment speaker or text edits are staged, not just when top-level name fields change.
-
Email deliverability (#364). Outbound email now includes Date and Message-ID headers, improving spam scoring and threading.
-
SSO with minimal ID tokens (#377). When an OIDC ID token lacks email, name, or username claims, they are now resolved from the provider's UserInfo endpoint, with a subject match check.
-
Inquire keyword search ranking. Common words could bury real matches because ranking happened after the row limit; ranking now happens in SQL before limiting. The agent's search tool gains an explicit keyword mode and an automatic keyword fallback, and a failing embedding API triggers a cooldown instead of repeated slow failures.
-
Citation rendering robustness. Citation timestamps are derived from the link's seek parameter rather than the model's link text, so a model that writes raw seconds still renders a formatted time, and stray timestamp fragments no longer leak into source titles. The prompt and history plumbing also prevent duplicate model-written Sources sections and keep internal bookkeeping notes out of answers.
-
Admin vector store panel. The panel now reports the actual chunking strategy and target size instead of hardcoded values.
-
Threaded web workers (#374). The image's gunicorn command now uses threaded workers (3 processes x 8 threads) instead of 3 single-request workers. Streaming responses (chat, Inquire, audio and video playback) previously each pinned one of only three request slots, so a few concurrent streams could make the whole app unresponsive for everyone. Deployments overriding the container command can adopt
--worker-class gthread --threads 8. -
Assorted interface fixes. The transcription hints popover stays within the viewport at screen edges; the processing-queue popup no longer covers modal action buttons; the folder editor's footer buttons use standard modal spacing; the voice-suggestion pill is readable in all dark color schemes; the speaker modal footer wraps on phone widths.
Database
Two new columns are added automatically on first start: inquire_allow_summaries and inquire_allow_notes on the user table. Both are nullable with environment-configurable defaults, and the migrations are SQLite and PostgreSQL compatible.
Configuration
All new settings are optional and documented in the example environment files: ENABLE_INQUIRE_AGENT with INQUIRE_AGENT_TOOL_MODE, loop and budget limits, and INQUIRE_DEFAULT_ALLOW_SUMMARIES / INQUIRE_DEFAULT_ALLOW_NOTES; CHUNKING_STRATEGY and CHUNK_TARGET_CHARS with EMBEDDING_API_BATCH_SIZE and EMBEDDING_API_COOLDOWN_SECONDS; HELP_CENTER_URL and HELP_CENTER_LABEL; GPT5_FORCE_MODE and CHAT_GPT5_FORCE_MODE; and the OpenASR connector settings.
Credits
Thanks to @ikelvingo for contributing the OpenASR and FunASR connectors, to @lhpereira for the httpx dependency fix, and to everyone who filed the detailed reports behind this release's fixes.