The IDE that lives in your terminal. Not a simplified terminal editor — a real alternative to VS Code, Zed, and Sublime that happens to run in your terminal. Single Go binary, zero config.

brew tap eugenioenko/ttt
brew install ttt
curl -sSfL https://raw.githubusercontent.com/eugenioenko/ttt/main/install.sh | sh
Thanks to @Dominiquini for maintaining the AUR package.
yay -S ttt
Requires Go 1.18 or newer:
go install github.com/eugenioenko/ttt/cmd/ttt@latest
This installs the ttt binary to your $GOPATH/bin (or $HOME/go/bin by default). Make sure that directory is in your PATH.
This downloads the latest release binary for your OS/architecture and installs it to /usr/local/bin. To install to a different directory:
INSTALL_DIR=~/.local/bin curl -sSfL https://raw.githubusercontent.com/eugenioenko/ttt/main/install.sh | sh
Pre-built binaries for Linux, macOS, and Windows are available on the Releases page. Download the one for your platform, make it executable, and put it in your PATH.
git clone https://github.com/eugenioenko/ttt.git
cd ttt
make build
This produces an optimized binary at bin/ttt. Add it to your PATH or copy it somewhere convenient:
cp bin/ttt ~/.local/bin/
.editorconfig support — indent size is picked up automatically per file( and ,Open multiple project directories in a single session. Each root appears as a collapsible group in the explorer, search, and changes panels.
ttt # opens the current directory
ttt . # also opens the current directory
ttt /path/to/dir # opens that directory as the workspace
ttt /path/to/file.go # opens the file; workspace is the git repo root
# (falls back to the file's parent dir if not in a repo)
ttt dir1 dir2 # opens multiple folders as a multi-root workspace
ttt --workspace project.ttt # loads a saved workspace file
# Review a GitHub pull request
ttt https://github.com/owner/repo/pull/123
# Review a PR with the repo tree open
ttt . https://github.com/owner/repo/pull/123
Workspace files use the .ttt extension and store a list of folders as relative paths:
{
"folders": [
{ "path": "." },
{ "path": "../other-project" }
]
}
Multi-root file tree in the sidebar (Ctrl+Shift+E). When multiple folders are open, each root is shown as a collapsible group.
Sidebar search panel (Ctrl+Shift+F) powered by ripgrep. Results are grouped by file with match counts.
*.go, vendor/**)Changes panel in the sidebar (Ctrl+Shift+G) with full staging workflow.
Staging:
- Spacebar — toggle stage/unstage on the selected file
- a — stage all unstaged files
- u — unstage all staged files
- + button on the "Changes" section header — stage all files in that section
- - button on the "Staged" section header — unstage all files in that section
Committing: - Inline commit message input at the top of each group - Type a message and press Enter to commit all staged files
Remote operations: - Pull, Push, Sync (pull then push) from the sidebar actions button - Per-repo actions via the group header menu button in multi-root workspaces
Diff view: - Select a changed file to open a diff with syntax highlighting layered on diff backgrounds - Untracked files open directly in the editor
Multi-root: - Changes are grouped by repository, each with its own collapsible Staged/Changes sections - Each group has a commit input and a menu button for pull/push/sync on that specific repo - File status badges: M (modified), A (added), D (deleted), R (renamed), U (untracked)
> in quick-open mode to switch to command mode> in command mode to switch to file modeThe bottom panel (Ctrl+J to toggle) contains the Terminal, Problems, and References tabs.
Built-in terminal emulator. Press Ctrl+` to toggle the terminal panel.
hinshun/vt10x and PTY management via creack/ptysettings.jsonterminal field in theme.jsonTTT has built-in LSP support for language-aware editing features. Install a language server and TTT detects it automatically — zero configuration needed. If a server isn't installed, TTT shows a brief notification with a link to install instructions.
| Language | Server | Install |
|---|---|---|
| Go | gopls | go install golang.org/x/tools/gopls@latest |
| TypeScript / JavaScript | typescript-language-server | npm i -g typescript typescript-language-server |
| Python | pyright | pip install pyright |
| C / C++ | clangd | sudo apt install clangd |
| Rust | rust-analyzer | rustup component add rust-analyzer |
| Vue | vue-language-server | npm i -g @vue/language-server |
| Svelte | svelteserver | npm i -g svelte-language-server |
| CSS / SCSS / Less | vscode-css-language-server | npm i -g vscode-langservers-extracted |
| HTML | vscode-html-language-server | npm i -g vscode-langservers-extracted |
| JSON | vscode-json-language-server | npm i -g vscode-langservers-extracted |
| YAML | yaml-language-server | npm i -g yaml-language-server |
| Bash | bash-language-server | npm i -g bash-language-server |
| Lua | lua-language-server | LuaLS releases |
| Zig | zls | ZLS releases |
| Kotlin | kotlin-language-server | Releases |
| Java | jdtls | Eclipse JDT.LS |
| Ruby | ruby-lsp | gem install ruby-lsp |
| Dart | dart language-server | Included with Dart SDK |
| Elixir | elixir-ls | Releases |
| PHP | phpactor | composer global require phpactor/phpactor |
| Terraform | terraform-ls | Releases |
| Markdown | marksman | Releases |
| Tailwind CSS | tailwindcss-language-server | npm i -g @tailwindcss/language-server |
| Docker | docker-langserver | npm i -g dockerfile-language-server-nodejs |
You can also add custom servers or override built-in ones in ~/.config/ttt/settings.json. See the LSP docs for details.
To disable LSP entirely: "lsp": { "enabled": false } in settings.
| Feature | Keybinding | Description |
|---|---|---|
| Autocomplete | Ctrl+U | Trigger completion at cursor position |
| Signature Help | (automatic) | Parameter hints shown on ( and , |
| Go to Definition | F12 | Jump to the definition of the symbol under the cursor |
| Go to Implementation | Shift+F12 | Jump to the implementation of the symbol under the cursor |
| Go to Type Definition | (command palette) | Jump to the type definition of the symbol under the cursor |
| Find References | (command palette) | Find all references to the symbol under the cursor (results in bottom panel REFERENCES tab) |
| Rename Symbol | F2 | Rename the symbol under the cursor across all files in the workspace |
| Hover | Ctrl+K I | Show type information and documentation for the symbol under the cursor |
| Format Document | (command palette) | Format the entire document using the language server |
| Format Selection | (command palette) | Format the selected range |
| Diagnostics | (automatic) | Error/warning squiggles inline, status bar summary, hover popup |
Completions trigger automatically as you type with a configurable debounce (default 150ms, set autocomplete.debounce in settings.json). The completion list filters live as you continue typing, and supports completionItem/resolve for additional details and auto-imports.
The LSP server publishes diagnostics (errors, warnings, hints) which are displayed as:
formatOnSave in settings.json to auto-format when savinglsp.saveOnRename in settings.json to auto-save affected files after renaming.Tabs follow a pin-on-reclick model similar to VS Code:
TTT supports fully customizable themes via JSON files. You can change every color in the editor — from syntax highlighting and diff ba