A native macOS code editor for CLI-agent workflows.
Pine keeps CLI agents in the terminal and the code in view. It reflects agent activity, file changes, diagnostics, and Git context across a fast native workspace without turning into another AI dashboard. Built with SwiftUI and AppKit for macOS 26 Liquid Glass — no Electron runtime.
- Native macOS — SwiftUI + AppKit, Liquid Glass UI, system text handling. No browser engine, no runtime
- Agent-aware workflow — Detects supported CLI agents, marks active terminal tabs and attention states, and provides activity history with undo for agent changes
- LSP code intelligence — Diagnostics, completion, hover, go-to-definition, code actions, rename, and a Problems panel
- Syntax highlighting — bundled grammars for Swift, TypeScript, Python, Go, Rust, Java, Kotlin, Ruby, C/C++, and more
- Split panes — Drag tabs to edges to split horizontally or vertically. Drag between panes to move. Resize with divider
- Built-in terminal — Full VT100/xterm emulator via SwiftTerm. Multiple tabs, themes, TUI apps, clickable file and OSC 8 links, send-to-terminal, pane maximize, and a global quick-terminal hotkey
- Lightweight extensibility — User grammars, tasks, and keybindings without an extension marketplace
- Git integration — File status in sidebar, diff markers in gutter, blame view, branch switching from title bar or Git menu
- Symbol navigation — Jump to functions and classes with Cmd+R
- Code folding — Fold/unfold blocks from the gutter or via menu
- Minimap — Scaled code overview with syntax colors and diff markers. Click to navigate
- Find & replace — In-file and project-wide search with .gitignore support
- Quick Open — Fuzzy file search with Cmd+P
- Markdown preview — Source, rendered, or side-by-side via swift-markdown
- Status bar — Cursor position, line endings, indentation style, file size
- Bracket matching — Highlights matching pairs while skipping strings and comments
- File management — Reveal in Finder, duplicate files with Finder-like naming
- Large file handling — Progressive loading for 10 MB+ files, optional highlighting disable for 1 MB+
- Strip trailing whitespace — Automatically cleans up on save
- Validation & format on save — YAML, shell, Dockerfile, and Terraform diagnostics with language-aware formatters
- Auto-save & session restore — Picks up where you left off
- Auto-updates — Built-in via Sparkle
- Localized — English, German, Spanish, French, Japanese, Korean, Portuguese (BR), Russian, Simplified Chinese
Homebrew (recommended):
brew tap batonogov/tap
brew install --cask pine-editorDirect download: grab the latest .dmg from Releases.
Requires macOS 26+ and Xcode 26+. Pine keeps a macOS 26.0 deployment target while also checking source compatibility with the current macOS 27 beta SDK.
git clone https://github.com/batonogov/pine.git
cd pine
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
xcodebuild -project Pine.xcodeproj -scheme Pine buildDependencies resolve automatically via Swift Package Manager on first build.
| Shortcut | Action |
|---|---|
Cmd+P |
Quick Open |
Cmd+Shift+O |
Open folder |
Cmd+S |
Save |
Cmd+Option+S |
Save All |
Cmd+Shift+S |
Save As |
Cmd+Shift+D |
Duplicate file |
Cmd+W |
Close tab |
Cmd+F |
Find |
Cmd+Option+F |
Find & Replace |
Cmd+G / Cmd+Shift+G |
Find Next / Previous |
Cmd+E |
Use Selection for Find |
Cmd+L |
Go to Line |
Cmd+R |
Go to Symbol |
Cmd+/ |
Toggle comment |
Cmd+Shift+B |
Switch branch |
Cmd+Shift+M |
Toggle minimap |
Cmd+Shift+P |
Markdown preview |
Ctrl+Option+Down / Up |
Next / Previous change |
Cmd+` |
Toggle terminal |
Cmd+T |
New terminal tab |
Cmd++ / Cmd+- |
Zoom in / out |
Cmd+0 |
Reset font size |
MVVM with SwiftUI views backed by AppKit via NSViewRepresentable. The editor core uses the native NSTextStorage/NSLayoutManager/NSTextContainer stack. Syntax highlighting runs asynchronously on a background queue with generation tokens to prevent stale results. Git operations run in parallel via GCD. Project-wide search uses Swift concurrency with sliding-window parallelism.
Contributions are welcome. Please open an issue first to discuss what you'd like to change. See the Issues page.



