NOTICE.md.
Monorepo overview
The repository is a pnpm monorepo (pnpm-workspace.yaml: apps/*, packages/*, plugins/*) paired with a Cargo workspace (Cargo.toml: apps/cli, apps/desktop/src-tauri, crates/*, plugins/*). It contains only two applications: the desktop client and the CLI.
Main flow
- Capture.
crates/listener-corecaptures the microphone and the system audio separately. You choose the output captured as system audio in Settings → Meetings → Audio; with no choice, Syntheo captures the default output (crates/audio-device,crates/audio-actual). One STT connection is opened per channel, which gives a first separation of speakers (you and the other participants). A muted channel sends silence of the same length (crates/listener-core/src/actors/source/pipeline): the STT connection stays open. - Transcription.
crates/owhisper-clientcontains only on-premise adapters: the OpenAI protocol (Realtime and/v1/audio/transcriptions, inadapter/openaiandadapter/openai_compatible_batch.rs) and NVIDIA NIM (adapter/nvidia.rs). No URL is provided by default: you enter your server’s. The same client serves dictation (plugins/dictation) and audio file imports: through/v1/audio/transcriptionswith the OpenAI protocol, through the/v1/realtimereal-time stream with NVIDIA NIM. - Live transcript. Received segments are assembled, then saved in SQLite. If the STT stream drops, the session reconnects without restarting the capture.
- Enhance. At the end of the meeting, the interface merges the notes and the transcript (
apps/desktop/src/store/zustand/ai-task/). Prompts are rendered on the Rust side byplugins/templatefrom the Jinja templates incrates/template-app/assets(enhance.*,title.*,chat.*…). Summary templates are stored in the database (migration20260413020000_templates.sql). The LLM call goes through theaiSDK and@ai-sdk/openai-compatible, to the single configured endpoint. - Final note and export. The result is saved in the database, then can be exported: PDF through
crates/export-core, and Markdown or JSON from the CLI.
Local storage
- SQLite database:
app.dbfile (apps/desktop/src-tauri/src/db.rs), accessed through sqlx (crates/db-core). The schema and its SQL migrations are incrates/db-app/migrations, applied bycrates/db-migrate. - Full-text search:
plugins/tantivymaintains asearch_indexindex in the data folder. SQLite triggers feed asearch_index_dirtyqueue, which the app consumes to reindex modified sessions, documents, and transcripts. - Data location: the
syntheofolder in the user’s data directory, for example~/.local/share/syntheoon Linux (crates/storage, application identifierfr.willisback.syntheo). - API keys: never in the database or in the binary.
plugins/store2stores them in the system keychain through thekeyringcrate: Secret Service on Linux, Credential Manager on Windows.
Architecture guarantees
These guarantees are enforced in the code and protected by tests. The tests inapps/desktop/src/ run with Vitest on every pull request.
The network flows unrelated to inference that are still present in the code are listed on the GDPR page.
Interfaces for agents
- CLI (
apps/cli): thesyntheobinary reads theapp.dbdatabase directly, read-only for browsing and export. Changes go through proposals, which you then review in the app. See the CLI reference. - MCP server:
syntheo mcpstarts an MCP server over stdio (apps/cli/src/mcp/,rmcplibrary). It exposes the list of meetings, transcripts, export, importing a recording, and edit proposals. On the app side,plugins/local-apicarries the related commands;plugins/mcp, inherited from Anarlog, declares no commands.
Build, CI, and release
The workflows are in.github/workflows/.
- Pull request gates:
ci-test(Vitest),ci-code-quality(formatting, lint, type checking, consistency of commits and lockfiles; clippy andcargo testonmain),ci-security(dependency analysis, secret detection),ci-codeql, andci-traceability(linked issue, PR type, semver impact). - Release (
release.yml, on every push tomain): the version is computed from Conventional Commits.featgives a minor version,fixandperfa patch, and a!a major version. A commit marked[skip release]publishes nothing. - Packages: AppImage and
.debfor Linux. For Windows,build-windows.ymlproduces an NSIS installer (.exe) and a.msi, signed through Azure Artifact Signing when the Azure secrets are provided. - Integrity: an SPDX SBOM (Syft),
SHA256SUMSandSHA256SUMS-windowsfiles, a provenance attestation you can check withgh attestation verify, then a release on GitHub Releases.