A local-first macOS coding workspace. Keel runs the coding agents you already use.
A local Laya selector or an optional hosted Jev selector chooses a route. The host checks each choice before Keel applies it.
Getting started · Build from source · Architecture · Roadmap · All documentation
Keel 0.2.0 puts the editor workspace, provider connections, task routing, and decision records into one Rust/GPUI app. It uses an Avid-derived interface.
Workspace
- Sessions, a composer, a transcript, a terminal, a changes view, and settings in one native window.
- Agent graph (new). Press ⇧⌘G to see each active session as an agent node, its subagents as child nodes, and the files it reads or writes as shared context nodes. Select a node to steer or stop its agent. Double-click an agent to open its session.
- Image attachments and macOS Dictation in the composer.
- A git history pane with a commit lane graph beside the changes view.
- Crash recovery: an append-only run journal replays live streams and marks interrupted runs.
Coding agents
- Claude Code, Codex, Cursor, Grok, Hermes, and pi through the Agent Client Protocol (ACP).
- An embedded DeepSeek agent loop that runs in process, with host-enforced tool focus.
- Each provider keeps its own authentication, model configuration, and tool loop.
- Subagent spawns show as
Taskcalls, including Grok'sspawn_subagent. - Installed Codex Computer Use MCP tools reach compatible ACP sessions.
Decisions
- Laya (local, Core ML) or Jev (hosted, opt-in) chooses an eligible route for a fresh, unpinned task, or abstains.
- The host validates every choice. A rejected, stale, or expired choice falls back to the ordinary route.
- Each decision leaves a bounded receipt in the transcript: candidates, result, validation, fallback, and observed outcome.
- Decision export (new).
keel decisions exportwrites one replay case per receipt as JSONL. - Decision report (new).
keel decisions reportprints counts by backend, stage, and validation, plus fallback and confidence figures.
Operations
keel headlessruns the engine without a UI.keel daemon installruns it as a background service.keel statusandkeel laya statusshow the workspace, the saved mode, and the model state.- One engine owns one data directory. A second engine stops with a clear error.
Pinned routes and live or resumed sessions keep their existing route. External ACP agents keep their own internal tool loops.
| Mode | Runs where | Requires | What happens |
|---|---|---|---|
| Laya — default | Locally through Core ML | Worker and pinned checkpoint | Selects from host-prepared candidates, or abstains. |
| Jev — opt-in | Hosted by TypeSafe | Existing protected local credential | Sends a bounded decision request directly to TypeSafe. |
| Normal | No selector call | Your coding provider setup | Uses the ordinary harness route. |
Exactly one backend runs per decision. A local selector does not mean your coding worker runs locally. Each coding provider keeps its own authentication and model configuration.
- Use Apple Silicon with macOS 15 or later for the packaged Laya model.
- Build from source, or use a local development package you already have. This repository does not currently publish downloadable app releases.
- Open Keel and choose Local Laya, Jev, or Normal harness.
- Open Settings → Accounts to inspect installed coding CLIs, then Settings → Agents to configure available adapters.
- Choose a provider and model, then start a task.
The light package downloads Laya only when you choose Download and activate Laya. While it downloads, the ordinary harness works and the Laya preference stays saved. The full package already contains the pinned checkpoint.
See the user guide for setup, status commands, and troubleshooting.
- Decision records support evaluation; automatic training is not implemented.
- Build checks do not establish better coding outcomes. See the dated build report.
- External ACP tools do not all pass through Laya or Jev.
keel computer-use decideselects a prepared action ID; it does not click or type.- Voice input uses macOS Dictation. Native Codex realtime voice and cloud sync are absent.
- App packages are ad hoc signed development builds. Public installer distribution still needs Developer ID signing and notarization.
The application and its runtime dependencies live in apps/ and crates/.
Optional imported libraries are in extras/; diagnostic
programs and maintenance utilities are in tools/.
See the developer guide for the complete layout and checks.
| Start here | Responsibility |
|---|---|
apps/keel |
App entry point and local CLI. |
crates/ui |
Workspace, onboarding, settings, and appearance. |
decision_mode.rs |
Saved mode and available decision backend. |
jev_routing.rs |
Eligible route candidates and validation. |
decision_log.rs |
Read-only receipt export and report. |
agent_graph.rs |
Agent graph view. |
crates/harness |
Local ACP adapters and installed computer-use MCP discovery. |
crates/laya-local |
Local Core ML worker integration. |
crates/jev-core |
Typed decision requests and direct TypeSafe client. |
agent.rs |
Embedded DeepSeek loop and tool-dispatch checks. |
A plain cargo build or cargo run selects Keel. Use cargo test --workspace
to check all packages, including optional libraries and the standalone CLI.
The roadmap follows the improvement loop: record decisions, replay them, compare, and let a human approve the change. Items move up only when they have code and a test.
Shipped in this update
- Agent graph: agents, subagents, and shared files in one view, with steer and stop (⇧⌘G).
-
keel decisions export: one replay case per decision receipt, as JSONL (loop step 1). -
keel decisions report: selected, abstained, fallback, validation, and confidence counts.
Next
-
keel decisions replay: run a baseline and one candidate on the same exported cases (loop steps 2–3). - Held-out case sets and a side-by-side comparison report (loop step 4).
- A decision report panel in Settings, with the same numbers as the CLI.
- A
--profileoption, so export and report can read synced profiles. - Agent graph: a warning when two agents write the same file.
- A Jev key-entry screen in Settings → Agents.
Later
- Developer ID signing, notarization, and downloadable releases.
- Computer-use actions that run only after a host confirmation.
- Native Codex realtime voice.
- Optional cloud sync from the source-only
cloud-connectcrate.
Read the architecture for the implemented boundaries, the build report for recorded checks, and the improvement-loop proposal for the evaluation work still needed.
The separate Jev Engineering repository contains the framework, paper, and examples. The article source index points to this application's source and build documents.
Keel retains the source notices for its Avid-derived UI and embedded DeepSeek components. Local inference uses Laya and the Laya Core ML runtime.
See LICENSE, UI license, DeepSeek license, Laya runtime license, and the third-party notices.