A lightweight desktop client for Ferdium, built with Tauri v2 (Rust + native WebView) instead of Electron. Sign in to sync with a Ferdium server, or start from scratch with services and workspaces saved locally.
⚡️ This project is vibe-coded. It was built end-to-end in a pair-programming session with an AI assistant (Claude / Claude Code). The architecture, code, icon and CI/CD were shaped conversationally rather than from a formal spec — treat it accordingly. 🤖
The name is a nod to the lineage Franz → Ferdi → Ferdium, with the -ium
suffix kept and Tauri baked in.
Ferdium is great, but Electron makes it heavy. Tauridium renders each service in its own isolated native WebView (per-service persistent sessions). It can sync with the Ferdium server REST API or keep your setup on this device.
- Sign in to your Ferdium server — account, services and workspaces stay synced
- Start from scratch without an account — services and workspaces stay on this device
- Each service in an isolated, persistent session (native WebView)
- Services load on demand by default to avoid opening every web app at startup
- Native notifications + dock unread badges
- Close-to-tray, run in background, launch at login
- Per-service settings (name, custom URL, team, notifications, mute, badges, hibernation, dark mode, favicon, proxy, custom user agent…) — synced when signed in
- App settings in tabs: General / Services / Appearance / Privacy / Advanced
- Collapsible service rail with compact icons; expand it to see service labels, workspaces, account actions and Add a service. App settings have a gear shortcut.
- Service rail customization (icon size, services location, grayscale + dim level)
- Theme (system / dark / light) + accent color (Tauri yellow by default)
Local mode uses the public Ferdium recipes repository on GitHub for its service catalog and recipe definitions. Your locally created services and workspaces are stored in Tauridium's app data directory and are not synced to a Ferdium account. Switching to a server account keeps the local setup on this device for later.
- Tauri v2 (Rust) — multi-webview, tray, native notifications
- Svelte 5 + TypeScript — the shell UI
- reqwest (rustls) — server calls from Rust (no CORS, token kept out of JS)
- Vendored + patched wry — unfreezes
window.ipcso Electron-style recipe IPC works (e.g. Synology Chat)
Requirements: Rust (stable), Node 20+, and the Tauri prerequisites for your OS.
npm install
cargo tauri dev # or: npm run tauri devnpm test # frontend (vitest)
cargo test --manifest-path src-tauri/Cargo.toml # Rustcargo tauri build # release bundle for your platform
cargo tauri build --debug # faster debug bundleOn macOS, signing locally with your own identity avoids repeated Keychain prompts (WebView session stores are Keychain-encrypted; a stable signature makes "Always Allow" stick):
APPLE_SIGNING_IDENTITY="Apple Development: …" cargo tauri build --debugPushing a v* tag triggers GitHub Actions, which runs the tests, builds for
macOS (universal), Linux (x86_64 / ARM64) and Windows (x86_64 /
ARM64), then — once every build passes — publishes a GitHub Release with the
bundles attached.
Release notes come from CHANGELOG.md: the workflow extracts the
section matching the tagged version and uses it as the GitHub Release body. So,
before tagging:
- Move the relevant
## [Unreleased]entries into a new## [X.Y.Z] - DATEsection (write them in English — this is the project convention). - Bump the version in
src-tauri/tauri.conf.json,src-tauri/Cargo.tomlandsrc-tauri/Cargo.lock, then commit. - Tag and push:
git tag v0.1.0 && git push origin v0.1.0If no matching CHANGELOG.md section exists, the workflow falls back to generic
notes (and logs a warning).
Continuous integration (cargo fmt · clippy · Rust tests · svelte-check ·
vitest · frontend build) runs on every push and pull request.
Grab the asset for your platform from the latest release.
macOS builds are unsigned (no paid Apple Developer account), so Gatekeeper
blocks them on first launch ("Tauridium can't be opened…"). Open the .dmg,
drag Tauridium to Applications, then either:
- macOS ≤ 14: right-click the app → Open → confirm; or
- macOS 15+: try to open it, then System Settings → Privacy & Security → Open Anyway; or
- run once in Terminal:
xattr -cr /Applications/Tauridium.app
Linux: .deb / .rpm / .AppImage (x86_64 and ARM64).
Windows: .msi or -setup.exe (x64 and ARM64).
- Passkeys / biometric sign-in (Touch ID, security keys) don't work. This is
a WebKit limitation: WebAuthn is disabled in an embedded
WKWebViewunless the app holds Apple's restricted Web Browser entitlement (granted only to real browsers). It affects every service, not just Google. Workaround: on the login screen pick "try another way" and use a password + an authenticator code (TOTP) or a phone prompt instead of a passkey. See tauri-apps/tauri#7926. - The native right-click "Download Image" doesn't work. WKWebView handles that context-menu item through an internal path that isn't exposed to the app. Downloads triggered from within a service (in-page download buttons, e.g. WhatsApp or ChatGPT) do work and save to your Downloads folder. Workaround: use the service's own download button instead of the right-click menu.
- Vibe-coded personal project — expect rough edges.
- Primary target is macOS; other platforms build in CI but are less battle-tested.
- macOS builds are unsigned (see Install) — proper Developer ID signing + notarization needs a paid Apple Developer account, wired in CI and ready to activate via secrets.
- Not affiliated with Ferdium.
0 comments
log in to comment.