02  ·  Scrivo  ·  active
projectsabout

Sydney

02 · Scrivo

A Markdown editor for my notes

With Markdown becoming the default document format for LLMs, a markdown document editor replaces an IDE as my most often used work app. I already used Obsidian, but rather annoyingly it couldn't open markdown files that were outside of a Vault. I tried Typora, but again it didn't have the features I wanted - tabs for one, and the startup time was a little long. So I set out to make a Typora clone exactly the way I wanted.

rusttauri 2codemirror 6
Opening a note

Reading first, editing when I need to

A few notes on how the two views fit together.

With scrivo notes.md, Rust renders the reading view while the window opens. Code highlighting can arrive afterwards; the first job is getting the note on screen.

Ctrl+E switches to a CodeMirror editor with live preview. Tables, maths and images render in place. The reading and editing views carry the source position across, so switching doesn't send me back to the top.

There are tabs, find, a contents sidebar and a command palette. Named files autosave after I stop typing for a couple of seconds.

The source file

Keeping the Markdown I wrote

Some rich-text editors parse Markdown into a document tree, then generate Markdown again when saving. That can change perfectly valid formatting. Scrivo uses CodeMirror decorations over the source text instead, in the same general family of approaches as Obsidian.

Editing the source

The preview sits over the text buffer. Editing a table cell still changes ordinary Markdown and participates in undo.

File details

The editor keeps the UTF-8 BOM and dominant line ending style. It refuses invalid UTF-8 rather than silently replacing bytes.

Rendering

The reading view builds its HTML from Markdown parse events, rather than passing through the document's own HTML.

Recovery

Unsaved text gets a separate recovery copy. After a crash I can restore or discard it, without automatically replacing a newer file on disk.

Keeping it testable

The text and file rules live outside the UI. That lets me check them without opening the desktop app.

Long documents

The reader inserts the first chunk before paint, then adds the rest in idle slices. A long note shouldn't have to finish rendering before I can see its beginning.

The original annoyance

Did it actually open faster?

A Linux comparison from September 2026. The scripts and results are in the repository.

I compared the two apps by launching them in turns and checking screenshots for actual document content. Timing when a window appears would count a blank window as success, which isn't the delay I was trying to fix.

These are medians from 12 paired runs per file, using Scrivo commit 129cd13 and Typora 1.14.9-1 on 27 September 2026. Times are milliseconds.

Scrivo's first-viewport time changes very little between these files because the rest of the document arrives later. This measures the beginning being readable, not the whole file being rendered.

This was useful for checking the specific problem I started with. It isn't a comparison of everything the two editors can do.

FIG. 1 · time to verified first viewport
file              app      window   content
medium  8.8 KB    Typora      411       965
                  Scrivo      211       340
large   443 KB    Typora      433     2,016
                  Scrivo      211       356
The content column is the one I was interested in: when there was something to read.
The comparison

What the timing script looked for

These reference captures are what counted as readable content in the startup runs.

FIG. 2 · Scrivo, medium.md, 1280×720
Scrivo reading view of the benchmark medium document: a heading, a paragraph with inline styles, a blockquote and nested lists.
Reading view in the default light appearance. The status line says Reading · Ctrl+E to edit.
FIG. 3 · Typora, medium.md, 1280×705 (cropped)
Typora showing the same benchmark document in a dark theme with wider paragraph spacing.
Same file in Typora with a dark theme. The themes differ, so compare the content and timing, not the colours.
Still working on it

The less tidy bits

Quite a few startup tweaks made no meaningful difference. Inserting more chunks per idle slice helped the full document finish sooner, but barely changed when the first viewport appeared. It was a useful distinction to measure.

  • Mixed line endings get normalised to the dominant one on save. The UI says so, but it is a rewrite, and the editor is only lossless for files with one style.
  • Recovery writes are asynchronous. A process killed before the write finishes can lose the last few keystrokes.
  • Obsidian theme import covers CSS variables only. Layouts, plugins and companion assets are not supported.
  • I have only benchmarked on Linux, with Typora 1.14.9-1 running headless in the same compositor. Numbers on macOS and Windows are unmeasured.

Open question

Typora does more than Scrivo, and I only measured this on Linux. I'm happy that my notes open faster in that setup; I wouldn't turn those runs into a general claim about the better editor.

MaterialsRust, Tauri 2, TypeScript, CodeMirror 6
VintageSept 2026 to now
StatusActive
Source github/xnmp/scrivo
Press / for the other projects02 / 12
Index12 / 12

  • 01Tauri ExplorerMy file explorer · Rust and Svelte · notes on building it
  • 02ScrivoMy Markdown reader and editor · Typora-style live preview
  • 03BallastMy mood diary · Markdown files · desktop and Android
  • 04Quickshell barMy Hyprland bar · agent state and quota pacing
  • 05Tableau FrogData exploration · linked charts · AI experiments
  • 06LambdaQueryPython-to-SQL compiler · started in 2017, revisited in 2026
  • 07Ashen CathedralA first-person Diablo experiment · Unreal Engine 5 · paused
  • 08Brood War AIBrood War agent · imitation learning · work in progress
  • 09AutomatedSpikeMagic deck search · learned pilots · XMage experiments
  • 10Zheng Shang YouOur family card game · learning agents · playable version
  • 11EskivA game from high school · recreated during Covid · search-based bot
  • 12Intuition on the Central Limit TheoremCentral limit theorem · interactive mathematical exposition
↑↓ move↵ openesc closeTap a project to open it