Ship faster with AI — without sending your code to anyone.
We help developers who worry about pasting proprietary code into cloud AI run coordinated multi-agent workflows locally, so they can leverage AI's full potential without compromising privacy.
SkillDeck is a local‑first, native desktop AI orchestration platform for developers. It brings multi‑agent workflows, filesystem‑based skills, and the Model Context Protocol (MCP) into a single Tauri 2 application — so your code, prompts, and API keys never leave your machine.
Unlike cloud‑based AI assistants, SkillDeck treats your AI workflow as part of your codebase: skills are version‑controllable Markdown files, workflows are declarative DAGs, and every tool call is transparent and approval‑gated.
Note
Built with a Rust core, React frontend, and SQLite storage. Zero Electron. Zero cloud dependency. Optional cloud features are strictly opt‑in.
- Branching Conversations — explore multiple solutions from any message without losing context; navigate and compare branches side‑by‑side.
- Multi‑Agent Workflows — Sequential, Parallel, and Evaluator‑Optimizer orchestration patterns, visualized as interactive DAGs.
- Filesystem‑Based Skills — reusable
SKILL.mdpackages with YAML frontmatter, priority resolution (workspace > personal > registry), and built‑in linting. - MCP Integration — full Model Context Protocol client (stdio + SSE transports, JSON‑RPC 2.0, protocol
2024-11-05) with supervision and automatic restarts. - Tool Approval Gates — risk‑based approval for every external tool call; approve, edit parameters, or deny.
- Multi‑Provider — Claude, OpenAI, and Ollama (local) with per‑profile model selection and parameters.
- Local‑First Storage — SQLite with WAL mode; API keys stored in the OS keychain (macOS Keychain, Windows Credential Manager, libsecret).
- Reactive Streaming — ring buffer → 50 ms debounce → IPC →
requestAnimationFramefor silky‑smooth token rendering. - TOON Encoding — structured data sent to LLMs uses TOON (Token‑Oriented Object Notation), reducing token usage by ~40 % compared to JSON.
SkillDeck is architected as a Reactive, Event‑Driven State Machine with three distinct layers:
graph TB
subgraph Frontend["React Frontend — Pure View Layer"]
UI[UI Components]
State[Zustand + TanStack Query]
end
subgraph Shell["Tauri Shell — OS Integration"]
IPC[IPC Commands & Events]
Keychain[OS Keychain]
end
subgraph Core["Rust Core — Business Logic"]
Agent[Agent Loop]
Workflow[Workflow Engine]
MCP[MCP Client]
Skill[Skill Engine]
DB[(SQLite + SeaORM)]
end
UI -- invoke / events --> IPC
IPC --> Core
Core --> DB
Core --> External[Model Providers & MCP Servers]
| Layer | Crate / Package | Responsibility |
|---|---|---|
| Rust Core | skilldeck-core |
Agent loop, context builder, tool dispatcher, model providers, MCP client, skill loader/resolver/watcher, workflow executor, workspace detection. Zero Tauri dependencies. |
| Tauri Shell | src-tauri |
IPC commands, event bridging, OS keychain integration, window management, approval‑gate queue. Thin — no business logic. |
| React Frontend | src |
Pure UI. State via Zustand, server state via TanStack Query, routing via TanStack Router, components via shadcn/ui. |
Tip
Because skilldeck-core has no Tauri dependency, it’s fully testable in isolation and portable to CLI or server contexts.
At the heart of SkillDeck is a streaming async loop:
- Save the user message to SQLite.
- Build context (conversation history + active skills + workspace files).
- Call the configured model provider.
- Stream tokens: ring buffer → 50 ms debounce → IPC events.
- Dispatch tool calls (built‑in or MCP) through the approval gate.
- Persist the assistant message and emit a
doneevent. - Auto‑process the next queued message, if any.
| Layer | Technologies |
|---|---|
| Core | Rust (Edition 2024), Tokio, SeaORM 2, Petgraph, Notify, Reqwest, Tracing |
| Shell | Tauri 2, tauri-plugin-shell, tauri-plugin-keyring, tauri-plugin-store |
| Frontend | React 19, TypeScript, Vite 8, Tailwind CSS 4, shadcn/ui (Radix primitives) |
| State | Zustand (UI state), TanStack Query (server state) |
| Routing | TanStack Router |
| Workflows | @xyflow/react (React Flow) for DAG visualization; petgraph for execution |
| Database | SQLite (WAL mode) with optional vector search (sqlite-vss) |
| Testing | Rust: cargo test + nextest; Frontend: Vitest (unit + browser) + Playwright |
| Tooling | Biome (lint + format), Lefthook (git hooks), Commitlint, CSpell, Lingui (i18n) |
- Rust (stable, Edition 2024)
- Node.js v20 or later
- pnpm v10 or later
- Tauri prerequisites for your platform
- (Optional) Ollama for local models
# Clone the repository
git clone https://github.com/elcoosp/skilldeck.git
cd skilldeck
# Install frontend dependencies
pnpm install
# Launch with hot-reloading
pnpm tauri devThe app launches and you’re ready to create your first conversation.
Note
On first launch, SkillDeck runs database migrations and seeds default data (a default profile, model pricing entries, and skill source directories).
pnpm build # Build the frontend
pnpm tauri:build # Build native installers (MSI, DMG, AppImage)skilldeck/
├── src/ # React frontend (kebab-case files)
│ ├── components/ # UI components (shadcn/ui + custom)
│ │ ├── conversation/ # Message thread, branches, tool cards
│ │ ├── layout/ # Three-panel shell
│ │ ├── right-panel/ # Session, Workflow, Analytics tabs
│ │ ├── skills/ # Marketplace, install, lint panels
│ │ └── ui/ # shadcn primitives (do not edit)
│ ├── hooks/ # TanStack Query & event hooks
│ ├── store/ # Zustand stores
│ ├── lib/ # IPC wrappers, events, utils
│ └── routes/ # TanStack Router routes
│
├── src-tauri/ # Tauri shell + Rust workspace
│ ├── skilldeck-core/ # Pure Rust library (no Tauri dependency)
│ │ └── src/
│ │ ├── agent/ # Agent loop, context builder, tools
│ │ ├── mcp/ # MCP client, transports, supervisor
│ │ ├── providers/ # Claude, OpenAI, Ollama
│ │ ├── skills/ # Loader, resolver, watcher, scanner
│ │ ├── workflow/ # DAG executor, pattern runners
│ │ ├── workspace/ # Project detection, context loading
│ │ ├── traits/ # ModelProvider, McpTransport, …
│ │ ├── db/ # SeaORM connection + migrations
│ │ └── toon.rs # TOON encoding wrapper
│ ├── skilldeck-models/ # Shared SeaORM entities (50+ tables)
│ ├── migration/ # Database migrations
│ └── src/ # Tauri commands, AppState, keychain
│
├── skilldeck-lint/ # Skill linting engine (CLI + library)
│ └── src/
│ ├── rules/ # 17 lint rules across 4 categories
│ └── bin/main.rs # `skilldeck-lint` CLI
│
├── skilldeck-platform/ # Optional cloud backend (Axum)
│ └── src/
│ ├── core/ # Registration, API keys
│ ├── growth/ # Referrals, nudges, activity events
│ ├── preferences/ # User preferences
│ └── skills/ # Registry, enrichment, lint cron
│
├── skilldeck-user-docs/ # Documentation site (Astro Starlight)
├── skilldeck-landing/ # Marketing landing page (Next.js)
├── skilldeck-marketing-assets/ # Screenshot/video capture (Playwright)
│
├── docs/ # Specs, design docs, reports
│ ├── spec/ # SRS, BRS, architecture, vision
│ ├── design/ # UX, tech stack, project structure
│ └── reports/ # Audit, growth, code-smell reports
│
├── ARCHITECTURE.md # High-level architecture overview
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── SECURITY.md
└── LICENSE.md # MIT OR Apache-2.0
Skills are directories containing a SKILL.md file with YAML frontmatter. They’re injected into the agent’s context and can be version‑controlled like any other code.
---
name: code-review
description: "Review code for bugs, security issues, and style violations"
compatibility: ["claude-3", "gpt-4"]
allowed_tools: ["read_file", "list_directory"]
---
# Code Review
## Instructions
1. Read the target file.
2. Check for null‑access patterns and missing error handling.
3. Report findings grouped by severity (HIGH / MED / LOW).Skills are resolved by priority:
- Workspace —
./.skilldeck/skills/ - Personal —
~/.agents/skills/ - Registry — cached from the SkillDeck Platform
The built‑in linter (skilldeck-lint) runs 17 rules across frontmatter, structure, security, and quality categories, producing a security score and quality score (1–5).
SkillDeck implements the full MCP specification (JSON‑RPC 2.0, protocol 2024-11-05) with:
- stdio transport — spawns local MCP servers as subprocesses.
- SSE transport — connects to remote MCP servers over HTTP.
- Supervision — health checks every 30 s and exponential‑backoff restarts (1 s → 2 s → 4 s → … max 60 s, max 5 attempts).
- Tool registry — aggregates tools from all connected servers.
- Approval gate — every external tool call is gated by default (all six auto‑approve categories are off by default).
Three execution patterns for multi‑step tasks:
| Pattern | When to use |
|---|---|
| Sequential | Each step depends on the previous one; steps run in topological order. |
| Parallel | Independent steps run concurrently using Tokio’s JoinSet. |
| Evaluator‑Optimizer | Iterative refinement loop; generator produces, evaluator scores, repeat until threshold or max iterations. |
Workflows are defined as DAGs, validated with petgraph (cycle detection), visualized with React Flow, and executed with real‑time step tracking.
The agent loop is the heart of the system:
- Persist user message.
- Build context (history + active skills + workspace).
- Call model provider (streaming).
- Emit
agent:tokenevents (50 ms debounce). - Dispatch tool calls (built‑in or MCP).
- Await approval if required (non‑blocking oneshot channel).
- Persist assistant message; emit
done.
# Frontend
pnpm dev # Vite dev server only
pnpm build # Build frontend
pnpm lint # Biome check
pnpm format # Biome format
pnpm typecheck # TypeScript check
pnpm test # Vitest (unit + browser)
pnpm test:coverage # Coverage report
# Rust
cargo test --workspace
cargo clippy --workspace -- -D warnings
cargo fmt --all -- --check
# Tauri
pnpm tauri dev # Dev with hot-reload
pnpm tauri:build # Production build| Layer | Tool | Command |
|---|---|---|
| Rust core | cargo test + nextest |
cargo nextest run |
| Frontend units | Vitest (happy‑dom) | pnpm test:coverage:unit |
| Frontend components | Vitest (browser mode) | pnpm test |
| E2E | Playwright + tauri-driver |
cd e2e-tests && pnpm test |
- Rust:
rustfmt+clippy(warnings as errors in CI). - TS / TSX / JSON / CSS: Biome (replaces ESLint + Prettier).
- Git hooks: Lefthook (runs Biome + CSpell on staged files).
- Commit messages: Commitlint (Conventional Commits).
| What | Where |
|---|---|
| API keys | OS keychain — macOS Keychain, Windows Credential Manager, libsecret |
| Database | ~/.local/share/skilldeck/skilldeck.db (platform‑specific) |
| Lint config (global) | ~/.config/skilldeck/skilldeck-lint.toml |
| Lint config (workspace) | <workspace>/.skilldeck/skilldeck-lint.toml |
| Personal skills | ~/.agents/skills/ |
| Workspace skills | <workspace>/.skilldeck/skills/ |
| Panel layout | Persisted in localStorage under skilldeck-panel-layout |
- User documentation → docs.skilldeck.dev (built with Astro Starlight)
- Architecture overview → ARCHITECTURE.md
- Specifications →
docs/spec/— vision, BRS, SRS, architecture, test verification - Design documents →
docs/design/— UX, tech stack, project structure, v2 roadmap - Skill format → agentskills.io
- Security policy → SECURITY.md
SkillDeck is in beta. Core features are complete and the app is usable for daily work. Remaining focus areas:
- Stability and edge‑case hardening.
- Skill ecosystem growth (registry, sharing, linting).
- Advanced workflow patterns (Map‑Reduce, DAG merging).
- Team features (shared skill libraries, enterprise controls).
See the v2 roadmap for the full plan through 2026.
Your code stays yours. Your agents work for you.
Built with care by developers who believe in local‑first AI.