A LAN-based client-server desktop application built with Tauri and Rust, with a Nuxt + Vue frontend. One person hosts a server on their machine, everyone else on the same network connects to it as a client — no internet or external infrastructure required.
Sign in |
Sign up |
Home — signed in as a member |
Home — signed in as an admin |
Admin — manage users |
Admin — add a user directly |
The app is a single desktop client that can act as either a host or a joiner:
- Welcome — choose to host a new session or join one that's already running on the LAN.
- Host spawns the
serverbinary locally (bound to0.0.0.0:8080), points the client at127.0.0.1:8080, and takes you straight to sign up as the first (admin) user. The server process is killed automatically when the hosting window closes. - Join asks for a server address (e.g.
192.168.1.10:8080) already running on someone else's machine, then takes you to sign in. - Sign in / sign up authenticates against the connected server (JWT-based). New accounts created via sign-up are regular members.
- Home shows every account on the server with live online/offline presence over a WebSocket connection. Admins additionally see a settings shortcut into user management.
- Manage users (admin only) — promote/demote, disable/enable, remove accounts, or add a new user directly with a chosen role and password.
Route access is enforced by app/middleware/session.global.ts: you can't reach authenticated pages without a connected server and a valid session, and you're redirected forward automatically once both are satisfied.
- Tauri v2 (Rust) for the desktop shell
- Nuxt 4 + Vue 3 for the frontend
- Axum + SQLite (sqlx) for the LAN server (
server/) - Bun as the runtime and package manager
- Valibot for validation
- Vitest for tests
- oxlint + oxfmt for linting and formatting
app/ Nuxt frontend — pages, components, composables
server/ Standalone Axum REST + WebSocket API (see server/README.md)
src-tauri/ Tauri desktop shell (Rust) — window, hosting, IPC commands
scripts/ Dev server orchestration, versioning, and release automation
The server/ directory is a standalone Axum REST + WebSocket API (JWT auth, SQLite storage, real-time user presence) that the Tauri app and Nuxt frontend talk to over the LAN. See server/README.md for setup, configuration, and the API reference.
src-tauri/ is the Tauri v2 shell around the Nuxt frontend. When you choose to host, src-tauri/src/hosting.rs spawns the server binary as a child process with a generated JWT secret and an app-data-scoped SQLite database, waits for it to start listening, and exposes start_server/stop_server commands to the frontend (app/composables/useHosting.ts). This currently expects the server binary to already be built alongside src-tauri on the same machine — run bun run server:build before hosting from a packaged app.
Install dependencies:
bun installStart the app in development mode (Nuxt dev server + Tauri window):
bun run devbun run fmt:check # oxfmt + cargo fmt --check
bun run lint # oxlint + cargo clippy
bun run nuxt:typecheck
bun run test # vitestVersion bumps, changelog generation, and Tauri version sync are handled by scripts/release.ts:
bun run release patch # or minor / majorThis bumps package.json, generates the changelog, syncs the version into src-tauri/Cargo.toml, Cargo.lock, and tauri.conf.json, then commits, tags, and pushes. The release workflow picks up the pushed tag and builds/publishes the desktop app.





