KittyClaw
kittyclaw.dev · Get early access
KittyClaw is a local control plane for software work performed by AI agents. Submit a software ticket, watch it move across the live board, read the run that changed the code, inspect its verification evidence, and make the final release decision yourself.
The product proves three things in one journey: a live board, a readable run, and human validation before external release. New boards start with Backlog, Todo, InProgress, Blocked, Scheduled, Review, and Done (columns remain customizable). Runs can use Claude Code, OpenAI Codex, Grok Build, or a local Ollama model.
Follow the guided five-minute demo to repeat the journey with a realistic software ticket. The companion activation test protocol measures whether qualified trial users reach their first run within ten minutes.
A project can be split into independently named pipelines whose stable identities survive renames. Columns can own generic processors with persistent memory, reusable project skills, ordered ticket selection, durable retries, and switch-like routing to columns in any pipeline. Right-click a column and choose Configure column to edit its name, color, role, position, ticket guidance, processor, and routing without losing the visual context of the board. Tickets in Waiting or OwnerAction columns always show a prominent contextual block between their description and activity, explaining whether the owner must comment or move the ticket to a specific validation/refusal column, or whether KittyClaw will resume it automatically. Columns can also be inserted between existing lanes or added at the end directly from the Kanban; the Workflows page remains the global pipeline-and-skills overview. Execution state is separate from business columns, so an InProgress column is optional. The legacy AutomationEngine remains available for trigger-based rules, cron/interval work, and backward compatibility. Agents run through Claude Code, OpenAI Codex, Grok Build, Mistral Vibe, or a local Ollama model while their output streams into the app.
Each processor is versioned with its project in.agents/processors/column-<id>/processor.json. This authoritative definition contains itsmission, explicit prompt, model, skills, ticket ordering, retry policy, and routing. SQLite keepsonly a synchronized runtime projection and execution state. Persistent lessons live beside thedefinition under .agents/processors/column-<id>/memory/MEMORY.md.
Tech Stack
- .NET 10 / Blazor Server (interactive SSR)
- SQLite via Entity Framework Core (one DB per project)
- OpenAPI with auto-generated Markdown docs
- Agent execution: at least one supported CLI — Claude Code CLI, OpenAI Codex CLI, Grok Build, or Mistral Vibe. Ollama is also supported for local models through Claude Code CLI (local-model setup).
- Optional for repository initialization, Git-aware automations, and agent commits: Git
Getting Started
Prerequisites
- .NET 10 SDK
- At least one agent CLI on your
PATH: Claude Code (claude), OpenAI Codex (codex), Grok Build (grok), or Mistral Vibe (vibe). Local-model execution requires both Claude Code CLI and a reachable Ollama server. - Optional: Git (
giton yourPATH) for repository initialization, Git-aware automations, and agent commits
On first launch, the onboarding popup checks Git and every supported provider CLI using the same resolved executable paths as dispatch: Claude Code (claude / KITTYCLAW_CLAUDE_BIN), OpenAI Codex (codex / KITTYCLAW_CODEX_BIN), Grok Build (grok, ~/.grok/bin, or KITTYCLAW_GROK_BIN), and Mistral Vibe (vibe / KITTYCLAW_MISTRAL_BIN). It also reports optional Ollama availability. Any one agent provider is sufficient, failed or timed-out probes remain non-blocking, and Git-dependent features still require Git.
Run
From the repo root:
run.bat (Windows)
./run.sh (macOS / Linux)
Both wrap dotnet watch --project KittyClaw.Web --non-interactive and serve the app at http://localhost:5230 with hot reload enabled.
Creating a project
From the home page, select Create a project, enter a name, and choose its workspace. The built-in folder browser works on Windows, macOS, and Linux without opening a native system dialog behind the browser. It exposes the home directory, mounted drives or filesystem roots, breadcrumbs, parent navigation, and direct path entry. You can also type an absolute path and create the folder when it does not exist.
Click Initialize to:
- Create the project registry entry + per-project SQLite DB.
- Copy the project template from
ProjectTemplate/(preamble.md,{agent}/SKILL.md,{agent}/memory/MEMORY.mdindex,memory-consolidation.md,automations.json,CLAUDE.md) into the workspace — agent files under<workspace>/.agents/,CLAUDE.mdat the workspace root. - Run
git initif the workspace is not already a git repo (skipped ifgitisn't installed). - Create a member for each agent slug found in the template.
- Open the project setup wizard.
The setup wizard analyzes an existing workspace and proposes distinct pipelines, columns, human hand-offs, processors, routing, and schedules. For an empty folder it first asks a few questions about the project's purpose, deliverables, human decisions, and recurring work. Proposals are graphical: you can add or remove pipelines, review each pipeline's columns, refine a step with a prompt, and move backward before approval. Nothing is created during this preparation; Create the workflow applies and verifies the approved plan, then opens the board.
This new-project setup is intentionally separate from the legacy-board migration wizard. Migration terminology and legacy-automation cleanup are shown only when an existing automation-based board needs conversion.
The workspace folder itself is never deleted by KittyClaw, even when you delete a project.
Data Storage
All KittyClaw data is stored locally in %APPDATA%/KittyClaw/:
registry.db— project registryprojects/{slug}.db— per-project database (tickets, comments, labels, columns, members)uploads/— uploaded imagesruns/{runId}.json— agent run snapshots (events, status, exit code)settings.json— language + onboarding flag
Per-project agent state lives in the workspace: <workspace>/.agents/{agent}/memory/ (scored MEMORY.md index + per-topic lesson files), <workspace>/.agents/channel/ (session state), etc.
Project Structure
| Path | Description |
|---|---|
| KittyClaw.Core | Domain models, EF Core contexts, services, automation engine, embedded project template |
| KittyClaw.Core.Tests | xUnit tests (conditions, triggers, signals, JSON polymorphism) |
| KittyClaw.Web | Blazor Server UI + REST API |
| KittyClaw.QaRunner | Isolated test-instance launcher (Playwright + scenario runner) used by the qa-tester agent |
| KittyClaw.ClaudeMock | Mock claude CLI used by KittyClaw.QaRunner for hermetic agent dispatch in tests |
| ProjectTemplate/ | Source of truth for new-project initialization. Files under Agents/ are written to <workspace>/.agents/; CLAUDE.md is written to the workspace root. |
| tools/ | Repo helpers (e.g. publish-stable.ps1 to bundle Web + QaRunner + ClaudeMock for a stable channel) |
Architecture
Per-feature architecture documentation lives under doc/. Start with pipeline and column processing for the multi-pipeline model, or doc/index.md for the complete architecture map.
API
All endpoints are under /api. The documentation is auto-generated from the live OpenAPI spec:
- Human-readable Markdown:
GET http://localhost:5230/api/docs - Machine-readable JSON:
GET http://localhost:5230/openapi/v1.json
MCP server
KittyClaw can expose an embedded MCP endpoint at http://localhost:5230/mcp (Streamable HTTP), so any MCP client can drive the board — list projects, create and move tickets, comment, and read the board layout — without touching the REST API. Set KITTYCLAW_MCP_ENABLED=1 before starting KittyClaw, then hook it up to Claude Code with:
claude mcp add --transport http kittyclaw http://localhost:5230/mcp
Seven tools ship in v1: list_projects, list_tickets, get_ticket, create_ticket, comment_ticket, move_ticket, board_overview. The endpoint is disabled by default and uses the same localhost trust boundary as the REST API. Details in doc/mcp.md.
For AI Agents
This app is designed to be operated by AI agents through its REST API. Here's how to get started:
- Read the live API docs at
http://localhost:5230/api/docs— every endpoint, request/response example, and schema, always up to date with the running server. - Identify yourself —
authoris required on every mutating endpoint; omitting it returns HTTP 400. Use your plain agent name (e.g."programmer","groomer"). The human user is"owner". - Discover the board — call
GET /api/projectsfirst, thenGET /api/projects/{slug}/columnsto learn the workflow stages andGET /api/projects/{slug}/membersfor assignable members. - Use the right status — ticket statuses must match existing column names. Fetch columns before moving tickets.
- Track your work — add comments on tickets to explain what you did or what you need. Use
@mentionsto notify members,#idto reference tickets in the same project, and#{slug}:{id}to reference tickets in another project. - Labels & priority — use
GET /api/projects/{slug}/labelsto discover available labels, and set priority toIdea,NiceToHave,Required, orCritical. - Check mentions — call
GET /api/projects/{slug}/mentions/{your-handle}to find tickets that mention you. - Sub-tickets — set
parentIdwhen creating a ticket to make it a child. UsePUT /api/projects/{slug}/tickets/{id}/parentto reparent, orDELETEit to detach. List sub-tickets with?parentId={id}. - Cross-project transfers — use
POST /api/projects/{slug}/tickets/{id}/transferonly after checking that the target project has compatible columns, assignees, and labels. The operation preserves the ticket tree and its history or rejects the transfer without changing either project. See Lossless ticket transfer.
Conventions
- Author format:
"owner"for the human user, plain agent name (e.g."programmer") for AI agents - Priority levels:
Idea,NiceToHave,Required,Critical - Default column:
Backlog
UI Features
- Onboarding popup on first launch that checks Git, Claude Code, OpenAI Codex, Grok Build, Mistral Vibe, and Ollama
- Cross-platform in-app workspace browser with roots, breadcrumbs, direct path entry, and folder creation
- Guided new-project setup that analyzes the workspace and proposes editable pipelines and columns before creating the workflow
- Guided legacy-board migration that preserves completed tickets and retires replaced automations only after verification
- Unified multi-project home with project cards and kanban swimlanes
- Multi-pipeline Kanban with visually distinguished allowed and forbidden drop targets based on processor routing
- Contextual column editor for structure, role, owner guidance, processor, ordered actions, scheduled tasks, and routing
- Customizable dashboard view with free-drag tiles (Markdown, KPI, charts, Heatmap, Timeline, …), AI chat-based tile creation, and auto-refresh via LLM prompts
- Ticket detail panel with comments and activity timeline
- Live agent run drawer (SSE stream of provider output, steer + stop controls)
- New-instruction chat drawer to send an ad-hoc prompt to an agent
- Markdown rendering with
@mention,#id, and#{slug}:{id}cross-project ticket reference support - Advanced search syntax:
#42,@owner,>date,priority:critical,label:bug,by:owner - Sub-tickets with parent/child relationships and progress tracking
- Lossless, atomic ticket-tree transfers between projects through the REST API
- Column management directly from the board (insert, duplicate, reorder, configure, and mark read)
- Label and member management
- Image upload in descriptions and comments
- Local model support (Ollama): per-project base URL with model autodiscovery, per-member default model, and per-action configuration in
.agents/automations.json - Provider-aware dispatch through Claude Code, OpenAI Codex, Grok Build, Mistral Vibe, or Ollama, with conversation handoff and unavailable-model fallback
Dashboard
Each project has a customizable Dashboard view alongside the kanban board. Tiles are free-dragged, auto-refresh on a schedule, and can be created or edited from the in-app AI chat panel — the agent writes the tile's folder for you.
Tile types
| Template id | What it renders |
|---|---|
markdown |
Free-form Markdown content |
table |
Tabular data with headers and rows |
kpi |
Single large number with label and optional delta |
kpi-grid |
Grid of multiple KPI cards |
progress |
Progress bar with current / target values |
sparkline |
Compact inline trend line |
bar-chart |
Vertical or horizontal bar chart |
donut |
Donut / pie chart of categorical proportions |
gauge |
Radial gauge for a bounded value |
status-grid |
Grid of colored status pills (up/down/warn) |
heatmap |
Calendar-style heatmap of intensity over time |
leaderboard |
Ranked list with scores |
timeline |
Chronological list of events |
image |
Static or refreshed image |
mermaid |
Mermaid diagram (flowchart, sequence, …) |
Folder layout
Each tile lives in its own folder under .dashboard/ in the project workspace:
.dashboard/
<tile-slug>/
tile.yaml # template, title, refresh schedule, prompt
script.ps1 # optional refresh script (or script.sh, script.py, …)
output.json # last refresh output consumed by the template
tile.yaml key fields
template— one of the ids in the table above.title— display name shown in the tile header.refresh— interval (e.g.5m,1h) for periodic refresh.refreshAt— cron-style time-of-day refresh (alternative torefresh).prompt— instructions sent to the agent when (re)generatingoutput.json.
Tiles can be created from the dashboard's AI chat panel by describing what you want — the agent picks a template, writes tile.yaml, generates the refresh script, and produces the initial output.json.
Cost reporting
The Costs page provides a cached, per-project view of agent usage, so opening the report is immediate even with a long run history. Date presets make common periods quick to select, while project, pipeline, and model filters can be combined; pipeline choices automatically follow the selected projects. A visible legend distinguishes measured costs from estimated costs in the daily charts.
Automation model
- Triggers:
interval,ticketInColumn,statusChange,subTicketStatus,ticketCommentAdded,gitCommit,boardIdle,agentInactivity. - Conditions:
ticketInColumn,ticketCountInColumn,fieldLength,priority,labels,assignedTo,hasParent,allSubTicketsInStatus,ticketAge. - Actions:
runAgent,moveTicketStatus,setLabels,assignTicket,addComment,consolidateAgentMemory,commitAgentMemory,executePowerShell,createTicket,httpRequest(outbound webhooks; loopback/link-local targets blocked unlessallowLocalTargets). {assignee}placeholder inrunAgent.agent/runAgent.concurrencyGroupresolves from the firing ticket'sassignedTo.- Canonical post-run chain:
runAgent→consolidateAgentMemory(focused claude pass that curates the agent'smemory/index + topic files) →commitAgentMemory(commits the result).
Telemetry
KittyClaw sends one anonymous heartbeat per day to a self-hosted-friendly analytics service (Umami) so we know how many instances are alive and which versions run in the wild. The payload contains exactly three fields and nothing else:
- a random instance id (a GUID generated locally on first run — not tied to any user, machine, or project data)
- the KittyClaw version
- the OS family (
Windows/macOS/Linux)
No ticket content, project names, hostnames, or usage details are ever sent. Failures are silent and never affect the app. Development instances never send telemetry.
License
KittyClaw is licensed under the AGPL-3.0-or-later. Self-hosting and personal use are unrestricted; if you distribute a modified version or offer one as a network service, you must publish your source under the same license.
Additional terms under AGPL §7 (full text in NOTICE.md): derivative works must keep the KittyClaw attribution visible (the in-app legal notice and a "based on KittyClaw" statement in their README), must not misrepresent their origin, and receive no rights to the KittyClaw name or logos.
Two things the AGPL does not touch (see NOTICE.md):
- Your projects: the template files KittyClaw copies into your workspace (
.agents/,CLAUDE.md, …) are additionally MIT-licensed, and everything the app produces for you (tickets, logs, agent commits, …) is yours, license-free. Managing a project with KittyClaw never places that project under the AGPL. - The past: versions up to and including v0.11 were released under MIT and remain available under those terms.
More Projects & Contact
→ Site + demo: kittyclaw.dev
Check out my other projects at ekioo.com.
Follow me on X: @DamienHOFFSCHIR