Written in Swift, with a Rust core.
Skipper is a native Mac app with no web view in its interface. The interface is Swift, the work underneath is Rust, and the two run in one process with a typed boundary between them.
Swift for the Mac
The app is written in Swift 6 with AppKit and SwiftUI. AppKit owns the windows, native window tabs, the toolbar, the split views, and the sidebar. SwiftUI draws the content inside them. Skipper behaves the way Mac apps do.
- every session is a native window tab you can drag between windows
- menu commands with keyboard shortcuts, and ⌘K to search all of them
- standard text editing, on-device dictation, Quick Look, and drag and drop
It compiles in Swift 6 language mode with main actor isolation by default and strict memory safety checks, and warnings fail the build.
A Rust engine underneath
The engine is Rust, linked into the app as a static library with UniFFI generating the Swift bindings. It handles the work under the interface.
- cloning repositories and creating, duplicating, and removing worktrees
- the agent accounts, their credential homes, and which account resumes which conversation
- GitHub pull requests, checks, and merges through the GitHub CLI
- a local SQLite database of your projects and sessions
The engine runs its work on Tokio, off the main thread, so the interface stays responsive while it clones, fetches, and reads usage.
Hull, a terminal server for each session
Each session's terminals and scripts run in Hull, a Rust server process of its own. The app talks to it over gRPC on a Unix socket, authenticated with a token for that session. Hull parses every byte of terminal output with libghostty's terminal core, the same engine that draws the terminal in the app, and runs agent state detection on the result.
Each Hull also reserves a block of 100 ports for its session and
exports the first as SKIPPER_WORKSPACE_PORT, so parallel sessions can
run the same dev server without a conflict.
Local by design
Skipper has no account of its own, and no Skipper server sits between you and your work. Skipper does not upload your repositories. The agents send what they read to Anthropic or OpenAI with your credentials, as they do in a terminal, and GitHub calls go through the GitHub CLI. Skipper's own requests are update checks and downloads, the public status pages of GitHub, Anthropic, and OpenAI, and crash and performance reports, which you can stop by turning off Share diagnostics in Settings.
Skipper keeps its database, bare clones of your repositories, and each
session's worktree under ~/.skipper. API keys are in your Keychain.
Tools for the agent
Every session gets a local MCP server from Skipper, set up automatically for Claude Code, Codex, and OpenCode. Through it an agent can name its session, list your projects, add another repository to its session as a sibling worktree, and start a new session for work it wants to hand off.