First paint
the file
repo walk starts only when you search
// agents write the code. you verify it.
Iota is a native macOS read-only code viewer for the agent era. First paint is the file you opened. The rest of the repo catches up in the background. One binary, zero config, no Electron. It is not an editor. That is the point.
$ curl -fsSL https://raw.githubusercontent.com/maheshkasabe/iota/main/install.sh | bash
First paint
the file
repo walk starts only when you search
Runtime
1 process
no Electron, no Node, no extension host
Config
0
point it at a path and read
Grammars
9
Rust, TS/JS, Python, Go, HTML, CSS, shell, Markdown
LSP
lazy
off until hover or jump
Writes
none
no save, no rename, no format-on-save
~/src/iota · editor.rs
⌘P12 pub struct TextBuffer {
13 text: String,
14 lines: Vec<usize>,
15 path: Option<PathBuf>,
16 }
17
18 impl TextBuffer {
19 pub fn line(&self, row: usize) -> &str {
20 let start = self.lines[row];
21 // only the visible window is painted
22 &self.text[start..]
23 }
24 }
01 / why
Code now arrives from a terminal, not a keyboard. What is left is review, jump-to-definition, and a diff against HEAD. That job does not need a gigabyte IDE. It needs a window that opens the file and stays out of the way.
Agents, harnesses, and scripts write the patch, run the tests, and move the branch. You should not have to boot an editor to see what they did.
Open the worktree, follow a symbol, split a pane, diff vs git HEAD, close the window. F12, Shift+F12, Cmd+D. Then you are done.
An extension host, a file watcher, and a plugin marketplace just to read a file. Iota is one AppKit process. It does not save, because saving is someone else’s job.
read-only is the feature
where it fits
| dimension | traditional IDE | Iota |
|---|---|---|
| built for | typing, plugins, a workspace that never sleeps | reading, jumping, diffing, verifying |
| process tree | Electron + extension host + watchers | one native binary |
| first paint | wait for the indexer | the file you passed on the command line |
| language servers | always on | off until hover or jump |
| setup | settings.json, extensions, runtimes | zero config |
| writes | the whole point | none |
02 / features
The chords you already have in your hands, in a window that only paints the lines you can see.
f.01 · navigate
Cmd+P for files, Cmd+Shift+O for symbols in this buffer, Cmd+T for the workspace. Ranking is nucleo, the same feel as a tight fzf. The walk starts the first time you open a palette — not at launch.
⌘P files ⌘⇧O symbols
f.02 · git
Cmd+D splits the current file against git HEAD. Additions and deletions keep their line numbers. Esc leaves the diff. No extra git UI, no staging, no commit box.
⌘D diff vs HEAD
f.03 · tree
Cmd+B. Folders are listed only when you expand them. Hidden files, gitignored build dirs, and binaries stay out. Click a file to open it. No outline view, no watching the whole disk.
⌘B sidebar
f.04 · layout
Cmd+\ adds a pane. Cmd+1–9 focuses one. Each pane keeps its own tabs and scroll. Closing a tab in one pane does not close it in another.
⌘\ split ⌘1–9 focus
f.05 · lsp
rust-analyzer, gopls, pyright/pylsp, typescript-language-server or vtsls — if they are on your PATH. Spawned on first K / F12 / Shift+F12. Missing? Jump falls back to a word search in the buffer.
F12 def K hover
f.06 · term
Cmd+J opens $SHELL at the workspace root. Hide it and the session stays. This is for running the agent, not for turning Iota into an IDE.
⌘J terminal
03 / keys
The chords you already know. Esc leaves a palette or a diff. Click and scroll still work if you insist.
04 / install
One curl clones
github.com/maheshkasabe/iota,
installs Rust if needed, builds a release binary, and puts
Iota.app in ~/Applications. Language servers
are optional and picked up from $PATH when they exist.
a · one command
$ curl -fsSL https://raw.githubusercontent.com/maheshkasabe/iota/main/install.sh | bash
Read the script first if you prefer: same URL, no pipe to bash.
b · from source
$ git clone https://github.com/maheshkasabe/iota.git
Then cargo run --release -- /path/to/repo
c · Dock
$ ./scripts/bundle-app.sh
Writes target/release/Iota.app after a clone.
| language | server | install |
|---|---|---|
| Rust | rust-analyzer | |
| Go | gopls | |
| TypeScript | typescript-language-server | |
| Python | pyright or pylsp |