LOCAL-FIRST MARKDOWN EDITOR
Parsing, sanitizing and highlighting run in Rust, off the keystroke path. Files open from and save to your own disk. There is no account, no document server and no telemetry.
SPECIFICATION
A keystroke does not re-render the whole document: ScribeOps finds the block that
changed and updates only that part of the preview. Measured in Chrome on identical
files. marked is included as a reference point — it parses Markdown
only, and does not include the sanitizing or highlighting ScribeOps does in the
same pass.
| Document | Typing latency | Incremental render | marked (parse only) |
|---|---|---|---|
| 1,000 lines | 1.6 ms | 2.4 ms | 6.4 ms |
| 10,000 lines | 19 ms | 13 ms | 49 ms |
| 100,000 lines | 188 ms | 125 ms | 410 ms |
Typing latency is the cost of one keystroke. Incremental render is the cost of redrawing the edited block. Run them yourself on the benchmark page.
Nothing you write is uploaded, scanned, or used to train a model. Your documents are plain markdown files on your own disk — readable today, and readable long after ScribeOps is gone.
Open and save actual .md files through the File System Access API.
Every file keeps version snapshots you can restore. Separate crash-recovery drafts survive a closed tab.
Every document is sanitized in Rust before it touches the page. No injected markup.
Every dependency is served from the app's own origin, enforced by a strict CSP.
A shared document travels inside the link itself. Nothing is stored anywhere.
The tools you need and nothing you don't. Focus mode dims everything but the line you're on. Syntax highlighting keeps the markup legible. A command palette keeps your hands on the keyboard.
Headings, emphasis, code, math and frontmatter, coloured in the editor itself.
Use the two panes side by side, or give either one the whole screen.
LaTeX rendered in the preview, in exports, and in print.
Mermaid flowcharts and sequence diagrams, written as text.
Write once. Export a self-contained HTML file, paste rendered text straight into
Gmail or Notion, print a clean PDF, or take the plain .md and go.
She described the handoff as “three teams and one spreadsheet”, which is roughly what the logs show as well.
The fix is smaller than it looks: one owner, one queue, and a weekly read-out that nobody has to assemble by hand.
ScribeOps installs to your dock or home screen and runs with no connection. The heavy parts load only when a document actually asks for them.
Gzipped, measured on the built app. The service worker registers after the editor is interactive, so caching never competes with your first keystroke; after that the app shell loads from cache in about 250 ms, on any network.
RFCs, runbooks and READMEs that live in the repo next to the code, with diagrams that are diffable text.
LaTeX that renders as you type, in a file you can hand to a supervisor as HTML or PDF without a toolchain.
Journals, meeting notes and half-formed ideas that should never be sitting on somebody else's server.