Always-on desktop subscription manager that pings you before renewals and lets you approve payments with simulated voice + face MFA.
Stitch pivoted from travel booking to subscription payment control for a faster, payment-centric MVP:
- Single dashboard for recurring subscriptions
- Due-soon payment pings
- Voice-triggered approval flow (
"approve") - Simulated face verification step before approval
- Local-first desktop experience for demo speed and privacy
- Rust (stable)
- Node.js 20+ and npm
From the repository root:
cd "/Volumes/KYE SSD 2023/STITCH"
npm installRun desktop app (Tauri + Vite):
npm run devRun browser-only UI (no Tauri window):
npm run dev:browserBrowser URL: http://localhost:1420/
SubscriptionList: upcoming renewals with approve actionsPaymentPingPopup: due-soon ping surfaceVoiceStatusIndicator: simulated keyword listening stateFaceAuthModal: 2-second simulated face scanSettingsPanel: voice toggle, face MFA toggle, auto-approve thresholdPaymentHistory: approved renewals and totals
apps/desktop: Tauri 2 + React + TypeScript + Vite + Tailwind app shellpackages/shared: shared schemas/types/constantsapps/desktop/src/fixtures/subscriptions.ts: MVP subscription mock data
Use Vite only so Chrome, Safari, or Cursor’s simple browser can load the app. Leave this terminal open while you work.
From the repo root:
cd "/Volumes/KYE SSD 2023/STITCH"
npm install
npm run dev:browserThen open http://localhost:1420/ (or use “Simple Browser” in the editor).
dev:browser is the same as dev:ui — a clearer name. Do not run npm run dev (Tauri) in another terminal at the same time: both need port 1420 and will conflict.
Limitation: Browser mode does not run Tauri-specific APIs (@tauri-apps/api invoke, etc.). For full desktop behavior, use npm run dev in its own session when you need the native window.
You probably still have Vite or stitch-desktop running on port 1420. From the repo root:
npm run kill:devOr manually in Terminal.app (outside Cursor if the editor terminal is wedged):
lsof -nP -iTCP:1420 -sTCP:LISTEN
kill -9 <PID_FROM_FIRST_COLUMN>Then close the dead terminal tab in Cursor (trash icon) and open a new terminal.
Important: If your log showed cargo run and Running target/debug/stitch-desktop, you were on npm run dev (Tauri), not browser-only. For “just show me the app in Chrome,” use npm run dev:browser only — no Rust step, usually easier to stop with Ctrl+C.
npm install: install workspace dependenciesnpm run dev: desktop mode (Tauri window + Vite)npm run dev:ui/npm run dev:browser: browser mode onlynpm run build: production frontend buildnpm run tauri build: desktop bundle buildnpm run lint: lint desktop workspacenpm run typecheck: typecheck shared + desktop workspacesnpm run kill:dev: kill stuck Vite/Tauri process on port 1420
dev:ui is run internally by Tauri as beforeDevCommand; run it manually only when you want the browser without a native window.
- Tauri commands are implemented in Rust:
save_session,load_session,list_sessions. - React wrappers expose typed functions:
saveSession,loadSession,listSessionsinapps/desktop/src/persistence/sessionStore.ts. - Loaded data is validated on the frontend with shared schemas (
parseSession,messageSchema). - Storage format is JSON (no SQLite yet, no network sync).
Sessions are saved under:
~/Library/Application Support/com.stitch.desktop/sessions/
Each session is a JSON file named from the session id (sanitized).
User-facing name is Stitch only (no “Conductor” in product copy).
See docs/security-checklist.md for MVP hardening status (capabilities, IPC validation, CSP, and future VPS requirements).