Drop-down menus, full mouse support, and the shortcuts your fingers already know — drawn in character cells, over SSH if you like. No modes, no new muscle memory. Ctrl+S saves, Ctrl+F finds, Ctrl+Q quits. That's the whole tutorial.
Free & open source (GPL-3.0) · one binary, zero runtime dependencies · Linux, macOS & Windows
Why CMeDit
Nothing to memorise. Modeless, like every desktop app you've ever used: Shift+arrows select, double-click picks a word, Ctrl+C and Ctrl+V talk to your system clipboard — across SSH too.
A real interface. Fuzzy file open (Ctrl+P), a command palette, go-to-definition (F12), project-wide find & replace staged for review, and live lint squigglies from the tools already on the machine — ruff, eslint, shellcheck — with no language server to install.
Instant, everywhere. One self-contained binary that starts in milliseconds and runs identically on your laptop, a container, or a server on the far side of an ocean.
The part nobody believes
CMeDit looks at a file's bytes before it decodes them, so a file opens as what it is — on a machine you reached by SSH, over a link you can't paste through. CSVs open as a real, editable grid. Pictures open as pictures, in 24-bit colour. PDFs reflow as readable documents, archives list without unpacking, and a 281 MB log opens paged at 32 MB resident.
These views are projections, never serialised back: a format the reader doesn't fully model can never be written over your file. What you edit is always the thing you opened — and anything too big to edit opens in a paged viewer whose memory doesn't depend on the file's size.
Real-time diagnostics, no language server
CMeDit auto-detects the linters already on the machine — ruff, flake8, eslint, stylelint, shellcheck, pyright — and re-lints about half a second after you stop typing. Your unsaved buffer streams to the tool over stdin, so the squigglies reflect what's on screen; your pyproject.toml or eslint config applies because the tool runs from your workspace root. No LSP install, no extension marketplace, no per-host server process.
The remote-work superpower
An SSH session is the fastest way to be on a machine, and usually the most limiting. CMeDit closes the gap: the workflows that normally force you to scp files home, mount remote drives, or install a remote IDE server just… work, in the terminal you already have open.
Nothing to install on the remote end. One static-friendly binary; no plugin marketplace, no per-host server process, no version skew.
Clipboard that crosses the wire. Copy in CMeDit on the server, paste on your laptop, via the OSC 52 escape.
Frugal with your bandwidth. The renderer diffs frames and uses hardware scroll regions, so a one-line scroll costs a few bytes — high-latency links feel dramatically better. Kick off a long search and CMeDit pings you with a desktop notification when it's done, even from the far end of a session.
Engineering, not vibes
No UI framework sits between CMeDit and the terminal, so it controls exactly what gets drawn, when, and how it travels — which is why high-latency SSH links feel local.
| Rendering | Repaints only the cells that changed, one write per frame, tear-free. A one-line scroll costs a few bytes. |
| Big files | Multi-megabyte files open instantly; a 281 MB, four-million-line log sits at ~32 MB resident. |
| Search | The regex engine is linear-time by construction — (a+)+b cannot hang a project-wide search. |
| Long sessions | Histories are bounded and memory is flat: open a 32 MB CSV, close it, and you're back where you started. |
| Plain terminals | Capabilities are probed at startup and upgrades are opt-in by evidence. A dumb terminal gets a plain, correct stream. |
Get it
Builds offline; the only dependencies ship with the compiler. The result is a single binary you can drop onto any machine, including the ones you SSH into. CMeDit is written in Haskell, a language with a storied tradition of producing white papers instead of products — out of respect for that tradition, this release ships with both.