Skip to content

Desktop app (Tauri)

Synapse ships as a light desktop app: the same web frontend in a native window, with the whole workspace stored on the device (IndexedDB + Loro CRDT docs). It works fully offline out of the box; connecting a server is optional and adds sync between devices, cloud AI, OCR and document conversion.

1. Build prerequisites

  • The repo's Node/pnpm setup (see the root README).
  • Rust (stable) via https://rustup.rs.
  • Platform basics: on macOS the Xcode command line tools; on Linux the webkit2gtk and gtk development packages; on Windows the MSVC build tools and WebView2 (preinstalled on Windows 11).

2. Build and run

pnpm --filter @synapse/shell dev     # dev window against the Vite dev server
pnpm --filter @synapse/shell build   # installable bundle (.app/.dmg, .msi, .deb/.AppImage)

The build compiles the web app in its tauri mode (apps/web/dist-tauri) and wraps it. Bundles land in apps/shell/src-tauri/target/release/bundle/.

3. Standalone mode

Launching the app with no server configured skips the login entirely: the device is the workspace, everything is stored locally. PDFs are added fully offline (bytes into the local store, text and page count extracted on the device). Other formats are converted on the device through the same tools the server uses, when they are installed on the machine: LibreOffice for office documents (pptx, docx, ...), pandoc plus a PDF engine for markup formats. On macOS:

brew install --cask libreoffice
brew install pandoc typst

Settings > This device > Document conversion shows what the app found and takes explicit binary paths for unusual install locations. AI runs against the provider configured in Settings > This device > Device AI, either a local runtime (Ollama) or your own OpenAI/Anthropic key, and covers exercise generation as well as the transcription of scanned PDFs on import. Accounts and the server AI provider are server concerns, so those settings sections only appear once a server is connected.

4. Connecting a server

In the app: Settings > Server, enter the server URL and an account. The app logs in once, stores the opaque session token on the device and from then on syncs the workspace with that server (and through it, your other devices).

Server side, allow the desktop origin to call the API cross-origin in apps/api/.env:

CORS_ORIGINS=tauri://localhost,http://tauri.localhost

(macOS/Linux use tauri://localhost; Windows uses http://tauri.localhost.)