NOTICE.md.
Vue d’ensemble du monorepo
Le dépôt est un monorepo pnpm (pnpm-workspace.yaml : apps/*, packages/*, plugins/*) doublé d’un workspace Cargo (Cargo.toml : apps/cli, apps/desktop/src-tauri, crates/*, plugins/*). Il ne contient que deux applications : le client desktop et la CLI.
Flux principal
- Capture.
crates/listener-corecapture séparément le micro et l’audio système. L’utilisateur choisit la sortie captée comme audio système dans Paramètres → Réunions → Audio ; sans choix, Syntheo capte la sortie par défaut (crates/audio-device,crates/audio-actual). Une connexion STT est ouverte par canal, ce qui fournit une première séparation des locuteurs (vous et les autres participants). Un canal coupé envoie du silence de même durée (crates/listener-core/src/actors/source/pipeline) : la connexion STT reste ouverte. - Transcription.
crates/owhisper-clientne contient que des adaptateurs on-premise : le protocole OpenAI (Realtime et/v1/audio/transcriptions, dansadapter/openaietadapter/openai_compatible_batch.rs) et NVIDIA NIM (adapter/nvidia.rs). Aucune URL n’est fournie par défaut : l’utilisateur saisit celle de son serveur. Le même client sert la dictée (plugins/dictation) et l’import de fichiers audio : par/v1/audio/transcriptionsavec le protocole OpenAI, par le flux temps réel/v1/realtimeavec NVIDIA NIM. - Transcription en direct. Les segments reçus sont assemblés puis enregistrés dans SQLite. Si le flux STT s’interrompt, la session se reconnecte sans redémarrer la capture.
- Enhance. À la fin de la réunion, l’interface fusionne les notes et la transcription (
apps/desktop/src/store/zustand/ai-task/). Les prompts sont rendus côté Rust parplugins/templateà partir des modèles Jinja decrates/template-app/assets(enhance.*,title.*,chat.*…). Les templates de compte rendu sont stockés en base (migration20260413020000_templates.sql). L’appel au LLM passe par le SDKaiet@ai-sdk/openai-compatible, vers l’unique endpoint configuré. - Note finale et export. Le résultat est enregistré en base, puis exportable : PDF via
crates/export-core, et Markdown ou JSON depuis la CLI.
Stockage local
- Base SQLite : fichier
app.db(apps/desktop/src-tauri/src/db.rs), accédé via sqlx (crates/db-core). Le schéma et ses migrations SQL sont danscrates/db-app/migrations, appliquées parcrates/db-migrate. - Recherche plein texte :
plugins/tantivymaintient un indexsearch_indexdans le dossier de données. Des déclencheurs SQLite alimentent une filesearch_index_dirty, que l’application consomme pour réindexer les sessions, documents et transcriptions modifiés. - Emplacement des données : le dossier
syntheodu répertoire de données de l’utilisateur, par exemple~/.local/share/syntheosous Linux (crates/storage, identifiant d’applicationfr.willisback.syntheo). - Clés d’API : jamais en base ni dans le binaire.
plugins/store2les range dans le trousseau du système via la cratekeyring: Secret Service sous Linux, Credential Manager sous Windows.
Garanties d’architecture
Ces garanties sont appliquées dans le code et protégées par des tests. Ceux deapps/desktop/src/ tournent avec Vitest à chaque pull request.
Les flux réseau sans rapport avec l’inférence, encore présents dans le code, sont listés dans la page RGPD.
Interfaces pour les agents
- CLI (
apps/cli) : le binairesyntheolit directement la baseapp.db, en lecture seule pour la consultation et l’export. Les modifications passent par des propositions, que l’utilisateur relit ensuite dans l’application. Voir la référence de la CLI. - Serveur MCP :
syntheo mcplance un serveur MCP en stdio (apps/cli/src/mcp/, bibliothèquermcp). Il expose la liste des réunions, les transcriptions, l’export, l’import d’un enregistrement et les propositions de modification. Côté application,plugins/local-apiporte les commandes associées ;plugins/mcp, hérité d’Anarlog, ne déclare aucune commande.
Build, CI et publication
Les workflows se trouvent dans.github/workflows/.
- Gates de pull request :
ci-test(Vitest),ci-code-quality(formatage, lint, typage, cohérence des commits et des lockfiles ; clippy etcargo testsurmain),ci-security(analyse des dépendances, détection de secrets),ci-codeqletci-traceability(issue liée, type de PR, impact semver). - Release (
release.yml, à chaque push surmain) : la version est calculée depuis les Conventional Commits.featdonne une version mineure,fixetperfun correctif, et un!une version majeure. Un commit marqué[skip release]ne publie rien. - Paquets : AppImage et
.debpour Linux. Pour Windows,build-windows.ymlproduit un installeur NSIS (.exe) et un.msi, signés via Azure Artifact Signing lorsque les secrets Azure sont fournis. - Intégrité : un SBOM SPDX (Syft), des fichiers
SHA256SUMSetSHA256SUMS-windows, une attestation de provenance vérifiable avecgh attestation verify, puis une publication sur les GitHub Releases.