Cached at:
05/31/26, 02:20 PM
# croft
Source: [https://codeberg.org/vitali87/croft](https://codeberg.org/vitali87/croft)

A VS Code style three pane workspace that runs entirely inside your terminal\. Written in Rust for performance and ships as a single static binary\.
- **Left pane \(sidebar\):**Explorer with multi\-select, cut / copy / paste, drag and drop file moves, and VS Code style icons \(Codicons / Devicons / Seti\)\. Two more sidebar views switch in via the activity bar: full\-text Search and a Remote \(SSH\) explorer\.
- **Top right pane \(editor\):**code editor with`tree\-sitter`syntax highlighting plus inline preview tabs for PNG / JPEG / GIF / BMP / WebP, PDFs \(with page navigation\), and CSV / TSV / XLSX / XLS / ODS spreadsheets\.
- **Bottom right pane \(terminal\):**a real interactive shell, your`$SHELL`running on a real PTY\.
- All three panes resize by dragging the seams between them\.
Built on[ratatui](https://ratatui.rs/)\+[crossterm](https://github.com/crossterm-rs/crossterm), with[portable\-pty](https://docs.rs/portable-pty/)for the embedded shell,[vt100](https://docs.rs/vt100/)for terminal\-state parsing,[tree\-sitter](https://tree-sitter.github.io/tree-sitter/)for incremental, AST\-based syntax highlighting,[calamine](https://docs.rs/calamine/)for spreadsheet parsing, and the iTerm2 OSC 1337 inline\-image protocol for image / PDF previews\.
## Requirements
RequirementWhymacOS or LinuxThe PTY layer uses POSIX`forkpty`\. Windows is not yet supported\.Rust 1\.78\+ stableTo compile the binary\.A Nerd Font as your terminal fontThe file explorer icons are Private Use Area glyphs \(Codicons, Devicons, Seti\)\. Without a Nerd Font, icons render as`\[?\]`boxes\.A 256 color or truecolor terminalmacOS Terminal\.app, iTerm2, Alacritty, kitty, WezTerm, Ghostty all qualify\.iTerm2, WezTerm, Ghostty, or kitty \(optional\)Required for inline image / PDF / sheet preview rendering via OSC 1337\. Other terminals fall back to a metadata header line so the feature is still informative\.`pdftoppm`from poppler\-utils \(optional\)Multi\-page PDF preview\. Install with`brew install poppler`\(macOS\) or`apt install poppler\-utils`\(Linux\)\. Without it, croft falls back to macOS`sips`for page 1 only\.### Install Rust
```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
### Install a Nerd Font \(macOS\)
```
brew install --cask font-meslo-lg-nerd-font
```
Then set Terminal\.app's default profile font to it\. The fastest way is the bundled command \(after building, see below\):
```
./target/release/croft setup-terminal
```
This sets the default profile font to PostScript name`MesloLGSNFM\-Regular`at 13pt via AppleScript\. Existing custom profiles are not modified\. Quit Terminal\.app entirely \(cmd\+Q\) and reopen for the change to take effect\.
If you prefer to do it by hand: Terminal\.app → Settings → Profiles → your default profile → Text → Font → Change → MesloLGS Nerd Font Mono Regular 13pt\.
**Why MesloLGS NF specifically:**macOS Terminal\.app does not perform CoreText style font fallback for Private Use Area glyphs the way iTerm2 does\. The Nerd Font glyphs only render if the*primary*terminal font has them\. MesloLGS NF ships every Codicon, Devicon, and Seti glyph the explorer uses\.
> **PostScript name vs display name\.**AppleScript needs the*PostScript*name, which is what's embedded in the \.ttf, not what Terminal\.app's font picker displays\. The PostScript name for`MesloLGSNerdFontMono\-Regular\.ttf`is`MesloLGSNFM\-Regular`\. Passing the display name silently no\-ops in AppleScript and Terminal\.app keeps the previous font, which is why icons appear broken even after running the setup command\.
## Install
The fastest path, no clone required:
```
cargo install --git https://codeberg.org/vitali87/croft.git
```
This compiles croft from the latest`main`and drops the binary in`~/\.cargo/bin/croft`\. Re\-run the same command to upgrade\.
### Build from source
```
git clone https://codeberg.org/vitali87/croft.git
cd croft
cargo build --release
# optional, install into ~/.cargo/bin
cargo install --path .
```
## Run
```
croft # opens the current directory
croft ~/projects # opens a specific folder
croft --help
croft setup-terminal --help
```
## Keybindings
### Global
KeysAction`Ctrl\+s`Save the open file`Ctrl\+q`Quit`F1`Open the shortcuts modal \(every binding grouped by pane, scrollable\)`F6`Cycle focus across panes \(tree → editor → terminal → tree\)`Ctrl\+b`Toggle the file tree / side panel`Ctrl\+j`Toggle the terminal pane`Ctrl\+Shift\+j`Maximize the terminal pane \(collapses the editor / welcome to zero rows so the terminal fills the right column next to the Explorer; press again to restore the previous split\)`Ctrl\+p`\(or`Cmd\+p`with the iTerm2 setup below\)Quick Open: fuzzy\-search workspace files by name and jump to the picked file \(auto\-expands the Explorer to reveal it\)`Ctrl\+Shift\+e`/`Cmd\+Shift\+e`Jump to the Explorer sidebar from any pane`Ctrl\+Shift\+f`/`Cmd\+Shift\+f`Jump to the Search sidebar`Ctrl\+Shift\+s`/`Cmd\+Shift\+s`Jump to Source Control \(works from the editor too\)`Ctrl\+Shift\+g`/`Cmd\+Shift\+g`Jump to Source Control \(when the editor is not focused;`Cmd\+Shift\+G`in the editor is goto\-bottom\)`Ctrl\+Shift\+d`/`Cmd\+Shift\+d`Jump to Run and Debug`Ctrl\+Shift\+r`/`Cmd\+Shift\+r`Jump to Remote \(SSH\)`Ctrl\+Shift\+l`/`Cmd\+Shift\+l`While connected to a remote, disconnect and drop back into the local croft at the directory you connected from \(`Ctrl\+q`still fully exits\)Click activity\-bar icons \(left edge\)Switch between Explorer, Search, Source Control, Run\-Debug, and Remote sidebar viewsDrag the vertical seam between sidebar and editorResize the sidebarDrag the horizontal seam between editor and terminalResize the terminal paneMouse wheelScroll the pane under the pointer### Explorer \(file tree\)
KeysAction`↑`/`↓`Move selection`Enter`or`→`on a fileOpen in editor; on a folder: expand or collapse`←`on a folderCollapse`Shift`\+`↑`/`↓`/`PageUp`/`PageDown`/`Home`/`End`Extend multi\-selection from the anchor row`Shift`\+click another rowExtend multi\-selection across the range`Alt`\+click \(Option\+click on macOS\) or`Ctrl`\+clickToggle a row in or out of the multi\-selection`Ctrl`\+`A`/`Cmd`\+`A`Select every visible row`Esc`Clear the multi\-selection`Ctrl`\+`C`/`Cmd`\+`C`Copy selected paths to the explorer clipboard`Ctrl`\+`X`/`Cmd`\+`X`Cut selected paths to the explorer clipboard`Ctrl`\+`V`/`Cmd`\+`V`Paste clipboard paths into the focused folder \(move on Cut, copy on Copy\)Drag a row onto a folderMove the selection into that folder`Alt`\-drag a row onto a folderCopy the selection into that folder instead of moving`Delete`/`Backspace`\(or`Cmd`\+`Backspace`\)Move every selected path to the OS Trash\. On macOS the trash sound plays once for the whole batch\.Right\-clickContext menu: Cut, Copy, Paste, Rename, Delete \(with item count when multi\-selected\), and on empty space New File / New Folder### Search sidebar
KeysActionTypeLive`\.gitignore`\-aware search across the workspace; refreshes per keystroke \(~120 ms debounce, off the UI thread\)\. Capped at 200 hits\.Click`Aa`,`ab`,`\.\*`togglesFlip case\-sensitive / whole\-word / regex; re\-runs immediately\. Active toggles render with a yellow background\.`↑`/`↓`\+`Enter`, or click a resultOpen the file at the matched line### Editor: text
KeysActionArrows, Home, EndNavigate \(clears any active selection\)`Shift`\+arrows /`Shift`\+`Home`/`End`/`PageUp`/`PageDown`Extend the selection by the same motion`PageUp`/`PageDown`\(`fn`\+`↑`/`fn`\+`↓`on Mac\)Scroll exactly one viewportAny printable char, Enter, Backspace, Delete, TabEdit \(typing or deleting with an active selection replaces it\)Mouse dragSelect text; selection stays highlighted until you copy or click elsewhere`Ctrl`\+`C`/`Cmd`\+`C`Copy the selection to the system clipboard via OSC 52`Ctrl`\+`X`/`Cmd`\+`X`Cut the selection`Ctrl`\+`V`/`Cmd`\+`V`Paste at the cursor; replaces selection if any`Ctrl`\+`Z`/`Cmd`\+`Z`Undo \(typing bursts coalesce into one step; backspace, paste, cut, replace are each their own step\)`Cmd`\+`A`Select the entire buffer`Ctrl`\+`f`/`Cmd`\+`f`Open the inline Find bar at the top\-right of the editor — pre\-fills the query from the selection \(single line\) or the word under the cursor; typing jumps the cursor to the first match at\-or\-after the cursor and highlights the active match in orange and the rest in yellow;`Enter`/`F3`walks forward,`Shift\+Enter`/`Shift\+F3`walks back,`Esc`closes`Ctrl`\+`A`Move to the start of the current line \(readline\-style\)`Ctrl`\+`E`Move to the end of the current line`Ctrl`\+`K`Kill from cursor to end of line \(yanks to the system clipboard\)`Ctrl`\+`U`Kill from cursor to start of line \(yanks to the system clipboard\)`Cmd`\+`o`Open a new line below the current row, inheriting its indent`Cmd`\+`Shift`\+`O`Open a new line above the current row, inheriting its indent`Cmd`\+`g``g`Go to the top of the file`Cmd`\+`N``Cmd`\+`g``g`Go to line`N`\(count can lead,`Cmd`\+`5``Cmd`\+`g``g`→ line 5; count can also go after the first`Cmd`\+`g`\)`Cmd`\+`Shift`\+`G`Go to the bottom of the file \(with a leading count, jumps to that line\)`Cmd`\+`d``d`Delete the current line \(yanks to the system clipboard\)`Cmd`\+`N``Cmd`\+`d``d`Delete`N`lines`Cmd`\+`y``y`Yank \(copy\) the current line to the system clipboard`Cmd`\+`N``Cmd`\+`y``y`Yank`N`lines`Esc`Clear the current selection### Editor: image preview \(`\.png`,`\.jpg`,`\.jpeg`,`\.gif`,`\.bmp`,`\.webp`\)
Tabs are read\-only\. Every keystroke is swallowed so a stray key cannot corrupt a buffer the user cannot see\.
### Editor: PDF preview \(`\.pdf`\)
KeysAction`→`/`Page Down`/`Space`Next page`←`/`Page Up`Previous page`Home`First page`End`Last page \(when page count is known\)### Editor: spreadsheet preview \(`\.csv`,`\.tsv`,`\.xlsx`,`\.xls`,`\.xlsb`,`\.ods`\)
KeysAction`↑`/`↓`/`←`/`→`Pan one row / column`PageUp`/`PageDown`Pan a full viewport vertically`Home`Jump to row 1, column 1`End`Jump to the last visible page`Tab`/`Shift\+Tab`Switch worksheet \(in multi\-sheet workbooks\)### Terminal
KeysActionAny keyForwarded to the shell PTY \(arrows,`Ctrl\+letter`,`Alt\+x`, function keys all translated to the proper VT escape sequences\)Mouse dragSelect text; selection stays highlighted until you copy or click elsewhereMouse wheelScroll through 5000 rows of scrollback\. In alternate\-screen mode \(vim / less / htop\) the wheel forwards arrow keys so the running app handles it\. Any keystroke snaps back to the live bottom\.`Ctrl\+Shift\+c`\(or`Cmd\+c`with kitty\-protocol terminals\)Explicit copy of the terminal's current selection`Ctrl\+Shift\+t`Open another terminal next to the current one \(works from any pane\)\. Each terminal has its own PTY, scrollback, and selection\.`Ctrl\+Shift\+w`Close the active terminal \(no\-op when only one is left; use`Ctrl\+J`to hide the pane\)\.`Ctrl\+Shift\+\]`Cycle to the next terminal in the pane\. Click any terminal to switch focus directly\.## iTerm2 setup for macOS users
Run Croft's iTerm2 setup once after building:
```
./target/release/croft setup-iterm2
```
This writes the default\-profile font settings plus Croft's iTerm2 keyboard setup:
iTerm2 keystrokeInstalled mappingWhat croft does`⌘P``\\x1b\[112;9u`Quick Open: fuzzy\-search workspace files`⌘F``\\x1b\[102;9u`In\-editor Find \(jumps to next match as you type\)`⌘⇧E``\\x1b\[69;10u`Jump to the Explorer sidebar`⌘⇧F``\\x1b\[70;10u`Jump to the Search sidebar`⌘⇧S``\\x1b\[83;10u`Jump to Source Control`⌘⇧D``\\x1b\[68;10u`Jump to Run and Debug`⌘⇧R``\\x1b\[82;10u`Jump to Remote \(SSH\)`⌘⇧L``\\x1b\[76;10u`Disconnect a remote session and drop back into the local croft`⌘⇧N``\\x1b\[78;10u`Explorer "New folder" prompt \(when the tree is focused\)`⌃⇧J``\\x1b\[74;6u`Maximize the terminal pane \(collapses the editor / welcome; press again to restore the previous editor↔terminal split\)`⌘V``\\x1b\[118;9u`in global and profile key mapsRead the system clipboard and paste into the focused editor, or into Search when Search is activeIt also moves the following iTerm2 / macOS menu shortcuts out of the way \(each goes to`Cmd\+Opt\+<letter\>`so the original iTerm2 action stays reachable on a chord croft does not use\):**Edit → Find → Find Globally\.\.\.**off`⌘⇧F`,**Edit → Paste**off`⌘V`,**Shell → Split Vertically with Same Profile**off`⌘D`,**Shell → Split Horizontally with Same Profile**off`⌘⇧D`,**Edit → Find Next / Find Previous / Jump to Selection**,**File → Print**off`⌘P`,**Window → Select Tab 1\.\.9**off`⌘1\.\.⌘9`, and the macOS**Help → Show Help Menu**off`⌘⇧/`\. Fully quit iTerm2 with`⌘Q`and reopen it after setup; iTerm2 caches its plist while running\.
### 1\. Right\-click reaches croft
By default iTerm2 shows its own context menu \(Copy / Open URL / etc\.\) on right\-click and never forwards it to the running app, so croft's New File / New Folder menu would never trigger\.
iTerm2 → Settings \(`⌘,`\) → search**"right click"**→ tick**"Right click reported to apps, does not open menu"**\. After that, right\-clicking inside croft's tree pane opens croft's menu\. No iTerm2 restart needed\.
Terminal\.app does not expose this toggle, so right\-click is iTerm2\-only\.
### 2\. Cmd\+S as save \(and other Cmd shortcuts\)
`Ctrl\+S`saves out of the box in any terminal\. Getting`Cmd\+S`to save in croft on macOS takes one extra step that no terminal app can fix on its own\. macOS reserves the Cmd modifier for application menus; both Terminal\.app and iTerm2 follow this rule\. iTerm2 ≥3\.5 supports the kitty keyboard protocol \(croft negotiates`\\x1b\[\>3u`on startup\), but iTerm2 still does not deliver`Cmd\+letter`over CSI u even with**Apps can change how keys are reported**and**Report keys using CSI u**both enabled\. Verified empirically\.
The standard fix is a one\-line key mapping that rewrites`Cmd\+letter`to the byte`Ctrl\+letter`already sends\. Croft's existing tested`Ctrl\+S`handler does the rest\.
iTerm2 → Settings →**Profiles**→ Default →**Keys**tab →**Key Mappings**sub\-tab → click**\+**→ "Click to Set" → press**⌘S**→ Action:**Send Hex Code**→ Code:`0x13`→ OK\.
iTerm2 keystroke to bindHex codeWhat croft does`⌘S``0x13`Save`⌘Q``0x11`Quit`⌘B``0x02`Toggle file tree`⌘C``0x03`Copy current selection \(editor or terminal\) to the system clipboard via OSC 52`⌘X``0x18`Cut the editor selection`⌘Z``0x1a`Undo the last editor edit`⌘A``0x01`Select all in the focused pane \(editor: select whole buffer\)\. Without this map iTerm2 runs**Edit → Select All**on the whole iTerm2 window instead\.For`⌘⇧F`and`⌘V`, use`croft setup\-iterm2`; it installs both mappings globally and into every profile\.
### 3\. Cmd\+Shift\+F to jump to the Search sidebar
After`setup\-iterm2`and an iTerm2 relaunch,`⌘⇧F`jumps to the Search panel from anywhere in croft\. The installed global mapping emits`\\x1b\[70;10u`, the kitty\-protocol encoding for`Shift\+Cmd\+F`; crossterm decodes that as`KeyEvent \{ code: Char\('F'\), modifiers: SHIFT \| SUPER \}`, which croft handles as Search\.
### 4\. ⌘V paste
After`setup\-iterm2`and an iTerm2 relaunch, the working flow is:
1. Press`⌘⇧F`; Search becomes active\.
2. Press`⌘V`; iTerm2 sends`\\x1b\[118;9u`, the kitty/CSI\-u encoding for`Cmd\+V`\.
3. Croft handles that as Search paste, reads the macOS clipboard via native`NSPasteboard`, and inserts it into the Search query\.
When the editor is focused, that same`⌘V`path pastes into the editor, even if the Search sidebar is still visible\. If another terminal sends a normal bracketed paste event instead of the CSI\-u key event, croft routes it by focus the same way\.
**Zero\-setup alternative: ⌃⇧V\.**If you don't want to touch System Settings, press`⌃⇧V`\(Control\+Shift\+V\) inside the Search input\. iTerm encodes that as the`0x16`byte natively, with no menu conflict and no per\-profile mapping needed\. croft's search\-paste handler matches it the same way as ⌘V\.
Other terminals \(kitty, Ghostty, WezTerm, Alacritty\) deliver Cmd over the kitty protocol natively; croft already negotiates it on startup, so`Cmd\+S`,`Cmd\+Shift\+F`,`Cmd\+V`, and friends work there with no remap\.
## How the embedded terminal works
`portable\_pty::native\_pty\_system\(\)\.openpty\(\.\.\.\)`allocates a pseudoterminal and`spawn\_command\(\.\.\.\)`runs`$SHELL`on the slave side\. A background thread drains the master fd into a`vt100::Parser`, which maintains the screen cell grid in memory\. The render path walks`screen\.cell\(y, x\)`for every cell in the pane and emits styled cells to the ratatui buffer with proper foreground / background / bold / italic / underline / reverse styles\.
Resizes call`master\.resize\(\.\.\.\)`and`parser\.set\_size\(\.\.\.\)`so programs like`htop`,`vim`, or your shell prompt redraw to fit the pane\.
Keystrokes from`crossterm`'s`Event::Key`are translated back to the byte sequences real terminals send \(arrow keys to`\\x1b\[A`etc\.,`Ctrl\+letter`to`0x01\.\.0x1a`,`Alt\+x`to`\\x1b<x\>`\) and written to the master writer\.
## Project layout
```
src/
├── main.rs entry point
├── cli.rs clap CLI: open path, setup-terminal / setup-iterm2 / keys subcommands
├── app.rs event loop, three-pane layout + activity bar, key dispatch, status bar, mouse, clipboard, splitters, preview overlays
├── clipboard.rs native macOS clipboard read path with pbpaste fallback
├── git.rs branch / dirty / ahead-behind status, plus anonymous git-protocol fetch for the welcome screen recents
├── highlight.rs tree-sitter highlight registry per language
├── icons.rs Codicon / Devicon / Seti glyphs and per-language colors
├── iterm2.rs iTerm2 plist mutation helpers for fonts and Croft key mappings
├── iterm2_inline.rs OSC 1337 inline-image baking pipeline (welcome wordmark, image / PDF preview, activity-bar icons, SSH empty-state hero)
├── pdf.rs PDF rasteriser: prefers pdftoppm (poppler), falls back to macOS sips
├── remote.rs remote (SSH) target metadata and launch dispatch
├── sheet.rs CSV / TSV / XLSX / XLS / XLSB / ODS parsing via the csv and calamine crates
├── lsp/ LSP client stack
│ ├── mod.rs
│ ├── client.rs async-lsp client wrapper with router for unhandled notifications
│ ├── config.rs per-language LSP config (basedpyright, ruff, ty, rust-analyzer)
│ ├── log_file.rs LSP stderr / debug log sink at ~/.croft/lsp.log
│ ├── manager.rs lifecycle: spawn / did_open / did_change / completion / shutdown
│ ├── registry.rs language detection from file extension and shebang
│ └── runtime.rs Tokio runtime owned by the LSP manager
└── widgets/
├── mod.rs
├── completion_popup.rs LSP completion popup (anchored at the cursor, filterable)
├── diff.rs side-by-side file diff renderer used by the explorer's Compare action
├── editor.rs tree-sitter highlighted editor with full write path, mouse-drag selection, OSC 52 copy/cut, plus image / PDF / spreadsheet preview tabs
├── editor_find.rs VS Code-style inline Find bar (Cmd+F) with active-match orange highlight, Enter / Shift+Enter walk, case-sensitive / whole-word / regex toggles
├── file_finder.rs VS Code-style Quick Open (Cmd+P) fuzzy file picker with tiered match ranking (exact filename > prefix > substring > path > subsequence)
├── file_tree.rs ignore::WalkBuilder backed tree, lazy children, fs-watcher refresh, multi-select, drag-drop, bulk trash, reveal-path on Cmd+P open
├── remote.rs Remote (SSH) sidebar widget with empty-state hero illustration
├── run_debug.rs Run and Debug sidebar widget: empty state plus Run [filename] button that spawns the active file in a fresh terminal
├── scrollbar.rs shared vertical-scrollbar geometry
├── search.rs sidebar search panel + .gitignore-aware substring walker
├── shortcuts.rs F1 shortcuts modal: every binding grouped by pane, scrollable
├── source_control.rs Source Control sidebar widget: branch summary, commit input, change list, commit button, no-repo hero
└── terminal.rs portable-pty + alacritty_terminal + ratatui integration with selection + scrollback
tests/cli.rs integration tests for the CLI surface
```
## Status
What works:
- Three\-pane layout with draggable splitters between sidebar / editor / terminal\.
- File tree with expansion / collapse, multi\-select \(Shift\+click range, Alt or Ctrl\+click toggle\), drag\-and\-drop file moves \(Alt\-drag for copy\), explorer\-scoped Cut / Copy / Paste, bulk delete to OS Trash with a single trash sound on macOS\.
- Right\-click context menu with Cut, Copy, Paste, Rename, count\-aware Delete, plus New File / New Folder on empty space\.
- Live filesystem watcher with a 50 ms polling fallback for missed startup or host events\.
- File open with tree\-sitter highlighting \(Rust, Python, JS, TS, TSX, JSON, TOML, YAML, Markdown, Go, HTML, CSS, Bash\)\.
- Full editor write path: insert / delete / Enter / Tab / Backspace / save round\-trip with`●`dirty marker, auto\-reload on external write when buffer is clean, OSC 52 copy / cut, undo with intelligent edit\-step coalescing\.
- Inline preview tabs that render directly in the editor pane via OSC 1337: PNG / JPEG / GIF / BMP / WebP, PDFs \(with page navigation, multi\-page when poppler is installed\), and CSV / TSV / XLSX / XLS / XLSB / ODS spreadsheets\.
- Search sidebar \(live,`\.gitignore`\-aware, off the UI thread, regex / case / whole\-word toggles\)\.
- Remote \(SSH\) sidebar that lists hosts from`~/\.ssh/config`and launches a remote croft session\.
- Run and Debug sidebar \(icon four\): a Run \[filename\] button that picks a runner by file extension \(Python, Node, Ruby, bash, zsh, fish, PHP, Perl, Lua, plus tsx for TS/TSX\) and spawns the file in a fresh terminal at the right cwd\. Python is venv\-aware: walks from the file's directory up to the workspace root looking for`\.venv/bin/python`,`venv/bin/python`, or`\.env/bin/python`and uses the project's interpreter when found, falling back to system`python3`only when nothing is in scope\.
- Embedded shell with full ANSI color, key forwarding, mouse\-drag text selection, and 5000\-row scrollback\.
- Git status pill in the bottom bar \(branch, dirty bullet, ahead / behind\)\.
- Welcome recents fetched live via the anonymous git protocol so the panel works behind shared egress IPs \(Tailscale, corporate NAT\) where the Bitbucket / GitHub REST APIs are rate\-limited\.
- `setup\-terminal`and`setup\-iterm2`AppleScript / plist helpers\.
The repo ships 568 unit tests plus CLI integration tests; run with`cargo test`\.
Already working: the three\-pane layout, file explorer, multi\-tab editor with syntax highlighting, live embedded terminals, git status, fuzzy file finder, remote launch over SSH, and LSP\-backed completion and diagnostics \(Python, TypeScript/TSX, JavaScript, Rust, Go\)\.
On the roadmap: command palette, settings, a stepping debugger, and a plugin system\.
## Goal
A complete VS Code replacement in the terminal: the full IDE experience as a single fast Rust binary\. Everything VS Code does, croft will do, without leaving the TUI\.
## License
MIT\.