Desktop configuration manager for GSD Pi preferences. A native Tauri app that gives you a structured GUI over the YAML preferences file you'd otherwise hand-edit, plus a library view for skills, agents, and API keys.
Web app: Browser editor — upload or create a configuration, edit in the browser, then download preferences.md, models.json, and settings.json for your machine. Preset gallery and wizard included (see Web vs desktop).
| General | Models | API Keys & Auth |
|---|---|---|
![]() |
![]() |
![]() |
| Workflow mode, profiles, and global behavior toggles. | Per-phase model selection with ordered fallback chains. | Keychain-backed provider keys and CLI auth status. |
- Edit preferences visually. Every field in
.gsd/preferences.md(or~/.gsd/preferences.md) is exposed across organized sections — models, git, hooks, parallel execution, safety, verification, routing, and more. - Global or project scope. Toggle between editing your global preferences or a per-project file. Recent projects are remembered.
- Skills library. Browse, edit, create, and delete
SKILL.mdfiles in~/.claude/skills/and<project>/.claude/skills/. Legacygsd-*bundled skills are filtered out. - Agents library. Same workflow for
.claude/agents/*.mdsubagent definitions. - API keys via OS keychain. Store provider keys (Anthropic, OpenAI, etc.) in the system keyring and export them to a sourceable
~/.gsd/env.shshell file (mode0600). - Presets. Import/export
.preset.mdfiles for sharing configurations, or copy a redacted YAML block to the clipboard with the Share dialog (secrets are scrubbed before it leaves the app). - Atomic, snowflake-safe writes. Saves go through an atomic write path and stringy IDs (Discord channel IDs, etc.) survive round-trips without numeric truncation.
- Tauri 2 (Rust backend, system-native window)
- React 19 + TypeScript + Vite 8
- Tailwind CSS 4
keyringcrate for OS keychain access
- Node.js 20+
- Rust toolchain (stable)
- Tauri 2 prerequisites for your platform — see tauri.app/start/prerequisites
npm install
npm run tauri devThe dev server runs on port 1420. The app window opens automatically once the Rust backend compiles.
npm install
npm run dev:webOpens the gallery + editor on port 5173. Copy .env.web.example to .env.web.local to override preset repo URLs.
npm run build:web
npm run preview:web
npm testPreset gallery data is loaded from open-gsd/gsd-pi-presets (override URLs in .env.web.local).
The web app is a cloud editor: it cannot read or write files on your computer. Import existing configs (or start from a preset/wizard), edit in the session, then Download files to install under ~/.gsd/ locally. A browser draft is kept so you can refresh without losing work in that session.
| Feature | Web | Desktop |
|---|---|---|
| Preference sections (editor) | Yes | Yes |
Edit ~/.gsd/ or project files in place |
No — upload + download | Yes |
| Global / project scope | Global only | Global + real project folders |
models.json / settings.json |
Import + download | On disk |
| Skills / agents libraries | No | Yes (~/.claude, project) |
| API keys | Browser session; export env.sh |
OS keychain |
CLI auth detection (gcloud, gh) |
No | Yes |
| Preset gallery / wizard | Yes | Import/export files |
| Auto-update installer | No | Yes |
npm run tauri buildBundles land in src-tauri/target/release/bundle/.
| Shortcut | Action |
|---|---|
⌘K |
Open command palette (jump to any field) |
⌘S |
Save changes |
⌘⇧Z |
Discard changes |
[ / ] |
Previous / next section |
src/ React frontend
components/ Sidebar, Palette, ShareModal, FormControls
components/sections/ One file per preferences section
hooks/ useDirty (change tracking)
lib/ keyboard, presets, theme, validators, tauri listeners
types.ts TypeScript mirror of the GSD Pi preferences schema
src-tauri/ Rust backend
src/lib.rs Tauri command handlers (preferences, skills, agents, keys)
src/core.rs YAML serialization, frontmatter parsing, atomic writes
tauri.conf.json Window config & bundle settings
- Global:
~/.gsd/preferences.md - Project:
<project>/.gsd/preferences.md
Both are markdown files with a YAML frontmatter block — fully compatible with hand editing if you ever need to drop into a text editor.
MIT © Jeremy McSpadden


