For AI agents: fetch the complete documentation index at /llms.txt, the full documentation corpus at /llms-full.txt, the agent skill at /skill.md, or this page as Markdown at /docs/desktop/first-feature.md (or send Accept: text/markdown).
Build your first feature
An end-to-end walk from one native shell change to a verified window.
Beginner walkthrough
Prerequisites: Read the two beginner guides below, finish Desktop local setup, and open this repository at its root in your editor. The shell reads SUPASTACK_APP_URL as a terminal setting when it starts — not from a saved .env file.
Quick terms: a workspace is one team's separate users, data, and settings. The server is the trusted backend; keep provider keys out of browser and phone code. A migration is a versioned database change that creates or updates tables. An AI model is the engine that answers; the model catalog is the server's list of available model IDs and prices. A provider is an outside service such as an AI, email, or billing service. An entitlement is a grant that lets a workspace use a feature. A webhook is a message one service sends to another service's URL.
1. Open .agents/skills/add-a-desktop-capability/SKILL.md — or ask your coding agent to follow it — and make one small native change, for example a new View-menu entry or a different summon shortcut.
2. Run cargo check, start the shell and exercise the change in the open window.
3. Repeat on each operating system you plan to ship — tray, shortcut and menu behavior differs per platform.
For custom code, name the behavior, the menu or shortcut it affects and what should happen on each OS. Give your coding agent this task and ask it to read AGENTS.md, .ai/PROJECT_CONTEXT.md and the .ai/ mirrors of the files it will touch; list files and checks before editing; and show you the diff. Use sample values; never paste a real secret.
Decide native or product first
Anything a user experiences as product UI — screens, data, settings — belongs to the web app and arrives in the window automatically. Only OS-level behavior belongs in Rust: windows, tray, menus, global shortcuts, launch at login and update checks.
apps/desktop/src-tauri/src/lib.rs
apps/desktop/src-tauri/tauri.conf.json
apps/desktop/src-tauri/capabilities/default.jsonKeep the webview sandbox tight
The webview can only call what capabilities/default.json lists. A change that needs a new plugin adds the crate in Cargo.toml, registers it in lib.rs and grants the minimum permission in capabilities — never a wildcard.
Persisted shell state — window position, zoom, update channel, window preferences — lives in the app's data directory through the shipped sidecars, not in files you manage by hand.
Verify on every target OS
Run cargo test, then a real window on Windows, macOS and Linux: window-state restore, close-to-tray, single-instance focus and the summon shortcut with your change active. One OS passing does not prove the other two.