Passer au contenu principal
Cette page décrit l’état actuel du code de Syntheo Desktop, à l’intention des développeurs et des contributeurs. Syntheo Desktop est un fork d’Anarlog (Fastrepl), distribué sous licence MIT : l’origine du code est détaillée dans 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

  1. Capture. crates/listener-core capture 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.
  2. Transcription. crates/owhisper-client ne contient que des adaptateurs on-premise : le protocole OpenAI (Realtime et /v1/audio/transcriptions, dans adapter/openai et adapter/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/transcriptions avec le protocole OpenAI, par le flux temps réel /v1/realtime avec NVIDIA NIM.
  3. 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.
  4. 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 par plugins/template à partir des modèles Jinja de crates/template-app/assets (enhance.*, title.*, chat.*…). Les templates de compte rendu sont stockés en base (migration 20260413020000_templates.sql). L’appel au LLM passe par le SDK ai et @ai-sdk/openai-compatible, vers l’unique endpoint configuré.
  5. 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 dans crates/db-app/migrations, appliquées par crates/db-migrate.
  • Recherche plein texte : plugins/tantivy maintient un index search_index dans le dossier de données. Des déclencheurs SQLite alimentent une file search_index_dirty, que l’application consomme pour réindexer les sessions, documents et transcriptions modifiés.
  • Emplacement des données : le dossier syntheo du répertoire de données de l’utilisateur, par exemple ~/.local/share/syntheo sous Linux (crates/storage, identifiant d’application fr.willisback.syntheo).
  • Clés d’API : jamais en base ni dans le binaire. plugins/store2 les range dans le trousseau du système via la crate keyring : 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 de apps/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 binaire syntheo lit directement la base app.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 mcp lance un serveur MCP en stdio (apps/cli/src/mcp/, bibliothèque rmcp). 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-api porte les commandes associées ; plugins/mcp, hérité d’Anarlog, ne déclare aucune commande.
La vue d’ensemble se trouve dans Agents.

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 et cargo test sur main), ci-security (analyse des dépendances, détection de secrets), ci-codeql et ci-traceability (issue liée, type de PR, impact semver).
  • Release (release.yml, à chaque push sur main) : la version est calculée depuis les Conventional Commits. feat donne une version mineure, fix et perf un correctif, et un ! une version majeure. Un commit marqué [skip release] ne publie rien.
  • Paquets : AppImage et .deb pour Linux. Pour Windows, build-windows.yml produit 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 SHA256SUMS et SHA256SUMS-windows, une attestation de provenance vérifiable avec gh attestation verify, puis une publication sur les GitHub Releases.
Aucun build macOS n’est publié pour l’instant.

Conformité

Les données stockées, les flux réseau et les responsabilités de l’utilisateur sont détaillés dans Syntheo Desktop et le RGPD.