AI agent orchestrator that runs each session in an isolated git worktree. Native macOS app, solarized theming, vim keybindings.
Download from the latest release:
| Platform | Architecture | Download |
|---|---|---|
| macOS | Apple Silicon (M1/M2/M3/M4) | aarch64-apple-darwin |
| macOS | Intel | x86_64-apple-darwin |
| Linux | x86_64 | x86_64-linux-gnu |
| Linux | ARM64 | aarch64-linux-gnu |
# Example: Apple Silicon Mac
curl -LO https://github.com/drichardson-tmp/flight-attendant/releases/latest/download/flight-attendant-aarch64-apple-darwin.tar.gz
tar xzf flight-attendant-aarch64-apple-darwin.tar.gz
mv flight-attendant /usr/local/bin/
flight-attendantBinaries are automatically built for all architectures on each tagged release via GitHub Actions.
Requires Rust 1.75+.
git clone https://github.com/drichardson-tmp/flight-attendant.git
cd flight-attendant
cargo build --release
# Binary is at target/release/flight-attendant (~5MB)
./target/release/flight-attendant# Install target
rustup target add x86_64-apple-darwin # Intel Mac
rustup target add aarch64-apple-darwin # Apple Silicon
rustup target add x86_64-unknown-linux-gnu # Linux x86_64
rustup target add aarch64-unknown-linux-gnu # Linux ARM64
# Build for a specific target
cargo build --release --target x86_64-apple-darwinbrew install flight-attendantFlight Attendant automatically picks up your Claude credentials. Zero config needed if you've logged into Claude Code:
- macOS Keychain (automatic) --- reads the OAuth token stored by
claudeCLI - Environment variable (manual override) ---
ANTHROPIC_API_KEY=sk-ant-... flight-attendant
If you haven't logged in yet, run claude once and sign in. Flight Attendant will find the token.
Launch the app:
flight-attendantA native macOS window opens. On first launch, pick light or dark mode.
| Key | Action |
|---|---|
n |
New session (creates a git worktree named after an animal) |
i |
Insert mode (type messages) |
Esc |
Normal mode |
h / l |
Switch panels (sidebar / chat / files) |
j / k |
Navigate lists / scroll content |
Enter |
Select session |
D |
Delete session + worktree |
Cmd+P |
Fuzzy file finder |
Cmd+, |
Preferences (theme, font size, custom fonts) |
Open preferences (Cmd+,) and upload your .woff2, .ttf, or .otf files. MonoLisa, Berkeley Mono, JetBrains Mono --- whatever you use. The font loads instantly via the FontFace API.
| Env var | Default | Purpose |
|---|---|---|
FA_PORT |
3000 |
Server port |
FA_REPO_PATH |
Current directory | Git repo to create worktrees from |
FA_WORKTREE_BASE |
<repo>/.worktrees |
Where worktrees are stored |
ANTHROPIC_API_KEY |
Keychain | Manual API key override |
flight-attendant/
├── src/
│ ├── main.rs # Native window (wry/tao) + Axum server
│ ├── config.rs # Config + macOS Keychain auth
│ ├── state.rs # In-memory session state (RwLock<HashMap>)
│ ├── router.rs # Route definitions
│ ├── error.rs # Unified error -> HTTP response
│ ├── frontend.rs # rust-embed static asset serving
│ ├── api/ # REST handlers
│ │ ├── sessions.rs # CRUD sessions (POST/GET/DELETE)
│ │ ├── files.rs # Fuzzy file search + read
│ │ ├── models.rs # List AI models
│ │ └── health.rs # Health check
│ ├── ws/chat.rs # WebSocket streaming chat
│ ├── agents/
│ │ ├── provider.rs # AiProvider trait (extensible)
│ │ └── anthropic.rs # Claude API client (SSE streaming)
│ └── git/
│ ├── worktree.rs # git2 worktree management
│ └── animals.rs # 100 animal names for sessions
├── frontend/ # Vanilla HTML/CSS/JS (embedded in binary)
│ ├── css/ # Solarized theme, aviation design
│ └── js/ # Chat, sidebar, finder, vim keybindings
└── tests/
└── api_tests.rs # 22 integration tests
- Single binary --- frontend is embedded via
rust-embed, no separate server needed - Native window ---
wry(WKWebView on macOS), not Electron - In-memory state --- sessions live in a
RwLock<HashMap>, fine for single-user - 1:1 worktree:session --- each agent gets its own isolated filesystem
- macOS Keychain auth --- zero config if you've used Claude Code before
- Claude Opus 4.6 (1M context) --- default
- Claude Sonnet 4
- Claude Opus 4
- Claude Haiku 3.5
Switch models per-session via the dropdown in the sidebar.
# Run in dev mode (hot-reloads frontend assets from disk)
cargo run
# Run tests (35 total: 13 unit + 22 integration)
cargo test
# Release build with LTO
cargo build --releaseMIT