{"slug": "show-hn-toast-a-beautiful-by-default-in-terminal-ide", "title": "Show HN: Toast, a beautiful by default in terminal IDE", "summary": "Developer paradise-runner released Toast, a terminal-based IDE that ships with managed language servers, an integrated file tree, multi-tab editing, and themes out of the box, installable via Homebrew with `brew install paradise-runner/tap/toast`. Toast is in early development and explicitly markets itself as having no AI features and no telemetry, contrasting with vscode and zed, which the project's comparison table marks as lacking both. Each release also ships an experimental standalone macOS app, Toast.app, bundled in a libghostty terminal window that is not yet code-signed or notarized.", "body_md": "toast is a beautiful developer environment right in your terminal. vim, nvim, and emacs have you build your editor from scratch, while toast ships with managed LSPs, an integrated file tree, multiple file tabs, and themes out of the box. toast is for the developer who wants to stay in their terminal without spending hours getting it up to snuff.\n\n*early development*, you may encounter bugs. \n\n⚠️ This project is in⚠️ \n\n```\nbrew install paradise-runner/tap/toast\n```\n\n| Editor | No AI features | No telemetry | Built-in file tree | Mouse support | \n|---|---|---|---|---|\n| **toast** | ✅ | ✅ | ✅ | ✅ | \n| vim | ✅ | ✅ | ❌ | ❌ | \n| emacs | ✅ | ✅ | ❌ | ❌ | \n| vscode | ❌ | ❌ | ✅ | ✅ | \n| zed | ❌ | ❌ | ✅ | ✅ | \n\n- **Multi-tab editing** with unsaved-changes indicators, mouse-close buttons, and quit confirmation\n- **Syntax highlighting** via tree-sitter (Go, Python, JavaScript, TypeScript, Rust, CSS, HTML, YAML, Bash, Markdown)\n- **Managed language servers** — Toast offers to install missing servers for Go, Rust, Python, JavaScript, TypeScript, and Markdown (harper), with an extensible config for other languages\n- **Spell checking** — misspelled words in Markdown and plain-text files are underlined in the theme's diagnostic color via harper\n- **Go to definition** — hold`Ctrl` and hover to underline symbols with a target, then`Ctrl` -click to jump to the exact definition\n- **File tree sidebar** with git status, ignored-file dimming, create/delete actions, file watching, and draggable resizing\n- **Project-wide search** powered by`rg` (ripgrep)\n- **In-file find/replace** with next/previous navigation, match-case, and whole-word options\n- **Command palette** —`Ctrl+Shift+P` fuzzy search over every action, with keybinding hints, live toggle state, MRU ordering, and a status-bar confirmation flash\n- **Markdown preview** for`.md` ,`.markdown` , and`.mdx` files\n- **Theme system** — built-in`system` (derived from terminal colors at runtime),`toast-dark` , and`toast-light` , plus a VSCode theme importer\n- **Auto-save** — dirty files are written to disk after a configurable inactivity delay (default 300 ms), with an optional manual-save mode\n- **Configurable** via`~/.config/toast/config.json`\n\n**Homebrew (macOS)**\n\n```\nbrew install paradise-runner/tap/toast\n```\n\n**Download a release**\n\nGrab a zip for your platform from the [releases page](https://github.com/paradise-runner/toast/releases), unzip it, and place the binary on your `$PATH`:\n\n```\n# example for Apple Silicon\ncurl -Lo toast.zip https://github.com/paradise-runner/toast/releases/latest/download/toast-darwin-arm64.zip\nunzip toast.zip\ninstall -m755 toast-darwin-arm64 /usr/local/bin/toast\n```\n\n**Standalone macOS app**\n\n**Experimental:** this bundles toast inside a libghostty terminal window\nand has more bugs than the terminal version. The TUI — Homebrew or the\nrelease binary above — is the primary, best-tested way to run toast.\n\n⚠️ \n\nPrefer a native app over the terminal? Each release also ships **Toast.app** —\na complete desktop app with its own terminal window (libghostty), native menu\nbar, and dock icon. No terminal, Homebrew, or Go required.\n\n1. Grab the zip for your Mac from the [releases page](https://github.com/paradise-runner/toast/releases/latest) :`toast-app-darwin-arm64.zip` for Apple Silicon (M1/M2/M3/M4),`toast-app-darwin-amd64.zip` for Intel.\n2. Unzip it and drag **Toast.app** into your`Applications` folder.\n\n```\ncurl -LO https://github.com/paradise-runner/toast/releases/latest/download/toast-app-darwin-arm64.zip\nunzip toast-app-darwin-arm64.zip\nmv Toast.app /Applications/\n```\n\n**First launch:** the app is not code-signed or notarized yet, so macOS\nGatekeeper will block a plain double-click. Right-click **Toast.app** in\nFinder and choose **Open**, then **Open** again — it launches fine from then\non. Or clear the quarantine flag once:\n`xattr -dr com.apple.quarantine /Applications/Toast.app`\n\nLaunch Toast like any app — from Launchpad, Spotlight, or the Finder. It opens\non a blank editor where you can pick a folder with the **Select Workspace**\nbutton or the **File › Open Folder…** menu item. To open a specific file or\ndirectory from the command line:\n\n```\nopen -a Toast ~/src/foo.go\nopen -a Toast ~/src/myproject\n```\n\nYou can also drop a file or folder onto the app's dock icon. See\n[docs/experimental/libghostty-bundle.md](/paradise-runner/toast/blob/main/docs/experimental/libghostty-bundle.md)\nfor how the app works and its current limitations.\n\n**Build from source**\n\nRequires Go 1.25.2+.\n\n```\ngit clone https://github.com/paradise-runner/toast\ncd toast\nmake build\n# binary written to bin/toast\ntoast               # open current directory\ntoast path/to/dir   # open a specific directory\ntoast path/to/file  # open a file (auto-detects git root)\ntoast new/file.go   # open a new file buffer if the parent directory exists\ntoast --help\ntoast --version\n```\n\n`rg` is required for project search. When a built-in language server is missing, Toast shows an install prompt in the lower-right corner. Managed installs use the language's standard toolchain (`go`, `npm`, or `rustup`) or download a prebuilt binary (harper), and only run after you accept the prompt. Toast also uses compatible servers already on your `$PATH`.\n\nAll keybindings can be remapped in `~/.config/toast/config.json` (see [Configuration](#configuration)).\n\n| Key | Action | \n|---|---|\n| `Ctrl+Q` | Quit | \n| `Ctrl+S` /`Cmd+S` | Save | \n| `Ctrl+W` /`Cmd+W` | Close tab | \n| `Ctrl+P` | Quick-open file search (fuzzy) | \n| `Ctrl+Shift+P` /`Cmd+Shift+P` | Command palette | \n| `Ctrl+Alt+Right` | Next tab | \n| `Ctrl+Alt+Left` | Previous tab | \n| `Ctrl+B` | Toggle sidebar | \n| `Ctrl+Shift+E` | Toggle focus between editor and file tree | \n| `Ctrl+Shift+F` | Search | \n| `Ctrl+F` /`Cmd+F` | Find and replace in the current file | \n| `Ctrl+G` /`Cmd+L` | Go to line | \n| `Ctrl+Shift+M` | Toggle Markdown preview | \n| `Ctrl+Z` /`Cmd+Z` | Undo | \n| `Ctrl+Y` /`Ctrl+Shift+Z` /`Cmd+Y` /`Cmd+Shift+Z` | Redo | \n| `Ctrl+Space` /`Cmd+Space` | Trigger completion | \n| `Ctrl+Shift+K` | Show hover | \n| `Ctrl` +hover /`Ctrl` -click | Check for and follow a definition | \n| `F12` | Go to the definition at the cursor | \n\nToast reads `~/.config/toast/config.json` on startup. Missing keys fall back to defaults.\n\n```\n{\n  \"theme\": \"toast-dark\",\n  \"editor\": {\n    \"tab_width\": 4,\n    \"auto_indent\": true,\n    \"trim_trailing_whitespace_on_save\": true,\n    \"insert_final_newline_on_save\": true,\n    \"auto_save\": \"auto\",\n    \"auto_save_delay_ms\": 300,\n    \"bottom_padding\": 3\n  },\n  \"sidebar\": {\n    \"visible\": true,\n    \"width\": 30,\n    \"confirm_delete\": true,\n    \"file_icons\": {\n      \"enabled\": true,\n      \"color_mode\": \"accent\"\n    }\n  },\n  \"ignored_patterns\": [\".git\", \"node_modules\", \"__pycache__\", \".DS_Store\"]\n}\n```\n\n`auto_save` selects the save mode: `\"auto\"` (default) writes dirty buffers to\ndisk after `auto_save_delay_ms` milliseconds of inactivity, while `\"manual\"`\nrequires an explicit save (`ctrl+s` / `super+s`).\n\nAll default keybindings can be overridden with the `keybindings` object. Each action accepts a list of key strings (supports `ctrl`, `alt`, `shift`, `super` modifiers). An empty list unbinds the action.\n\n```\n{\n  \"keybindings\": {\n    \"save\": [\"ctrl+s\"],\n    \"quick_open\": [\"ctrl+o\"],\n    \"next_tab\": [\"ctrl+tab\"],\n    \"prev_tab\": [\"ctrl+shift+tab\"],\n    \"quit\": []\n  }\n}\n```\n\nAvailable actions: `quit`, `toggle_sidebar`, `save`, `new_file`, `close_tab`, `undo`, `redo`, `next_tab`, `prev_tab`, `search`, `find_replace`, `quick_open`, `command_palette`, `theme_picker`, `go_to_line`, `go_to_definition`, `toggle_focus`, `markdown_preview`, `show_hover`, `trigger_completion`.\n\nOmit `lsp` to use Toast's managed defaults for Go, Rust, Python, JavaScript, TypeScript, and Markdown; set `\"lsp\": {}` to disable all language servers. Entries in `lsp` override the managed default for that language, while unlisted managed languages keep their defaults — so a partial config never loses newly shipped servers. Each entry is extension-driven, so other languages can be added without changing Toast. A custom server already installed on `$PATH` only needs a command and its filename suffixes:\n\n```\n{\n  \"lsp\": {\n    \"zig\": {\n      \"command\": \"zls\",\n      \"args\": [],\n      \"extensions\": [\".zig\"]\n    }\n  }\n}\n```\n\nFor an opt-in managed custom server, add `managed_command` (the installed executable path) and an `install` recipe. Recipes support `{install_dir}`, `{install_root}`, `{root_dir}`, `{home}`, and `{target}` (the platform's Rust target triple, for per-platform prebuilt binaries) placeholders:\n\n```\n{\n  \"lsp\": {\n    \"example\": {\n      \"command\": \"example-language-server\",\n      \"args\": [\"--stdio\"],\n      \"extensions\": [\".example\"],\n      \"managed_command\": \"{install_dir}/bin/example-language-server\",\n      \"install\": {\n        \"name\": \"Example Language Server\",\n        \"command\": \"example-package-manager\",\n        \"args\": [\"install\", \"--bin-dir\", \"{install_dir}/bin\", \"example-language-server\"],\n        \"env\": {}\n      }\n    }\n  }\n}\n```\n\nAlternatively, an `install` recipe can download a prebuilt binary archive. The archive must contain a single executable file at its root (a wrapping top-level directory is tolerated); it is installed to `{install_dir}/bin`:\n\n```\n{\n  \"lsp\": {\n    \"example\": {\n      \"command\": \"example-language-server\",\n      \"args\": [\"--stdio\"],\n      \"extensions\": [\".example\"],\n      \"managed_command\": \"{install_dir}/bin/example-language-server\",\n      \"install\": {\n        \"name\": \"Example Language Server\",\n        \"download\": {\n          \"url\": \"https://github.com/org/example/releases/latest/download/example-ls-{target}.tar.gz\"\n        }\n      }\n    }\n  }\n}\n```\n\nBuilt-in themes: `system`, `toast-dark`, `toast-light`. Custom themes live in `~/.config/toast/themes/`.\n\n**Import a VSCode theme:**\n\n```\ntoast migrate-theme vscode path/to/theme.json\n# writes ~/.config/toast/themes/<theme-name>.json\n```\n\nThen set `\"theme\": \"<theme-name>\"` in your config.\n\nFound a bug or have a feature request? We'd love to hear from you! Please open an [issue on GitHub](https://github.com/paradise-runner/toast/issues) with as much detail as possible. Your feedback helps make Toast better.\n\n```\nmake build             # compile\nmake run               # go run ./cmd/toast .\nmake test              # go test ./...\nmake test-integration  # run opt-in Ghostty/tmux terminal integration tests\nmake test-integration-update  # refresh golden screenshots\n```\n\n", "url": "https://wpnews.pro/news/show-hn-toast-a-beautiful-by-default-in-terminal-ide", "canonical_source": "https://github.com/paradise-runner/toast", "published_at": "2026-09-11 17:54:53+00:00", "updated_at": "2026-09-11 18:16:59.845496+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["Toast", "paradise-runner", "Homebrew", "vim", "emacs", "vscode", "zed", "libghostty"], "alternates": {"html": "https://wpnews.pro/news/show-hn-toast-a-beautiful-by-default-in-terminal-ide", "markdown": "https://wpnews.pro/news/show-hn-toast-a-beautiful-by-default-in-terminal-ide.md", "text": "https://wpnews.pro/news/show-hn-toast-a-beautiful-by-default-in-terminal-ide.txt", "jsonld": "https://wpnews.pro/news/show-hn-toast-a-beautiful-by-default-in-terminal-ide.jsonld"}}