Muo Download

Markdown reader for macOS and Windows

Read for hours without your eyes paying for it

Muo solves the type size from your screen's density and how far you sit from it, then holds every line at 72 characters. Change the size and the measure stays put.

8,803 lines of Go 128 tests 1 dependency Free, MIT licensed

Muo with a document open: the files panel on the left and the reading column set in Inter in the middle.

Change the size of the type and the line stays the same length. The measure is the promise.

A pixel width looks stable and quietly is not

Cap a column at 640 pixels and it holds on the screen you designed it for. Change the type size, or open the file on a laptop, and the character count moves with it. The reader re-reads lines without noticing, and blames the writing.

0.32° · 72ch
18.0 pt

The largest effect on reading comfort is how many characters sit on a line. Too few and the eye finishes before it has parsed the sentence. Too many and the return sweep to the next line loses its place, so you re-read the same line without noticing.

Drag the slider. The gauge shows the apparent height of a capital letter, which is what the eye actually reads. Between 0.26 and 0.38 degrees is the comfortable band.

What changes when the measure is fixed

Four things, all of them consequences of the same decision.

Your eyes stop doing arithmetic

The size is solved from the angle a letter covers at your distance, not guessed from a preference screen.

Every line is 72 characters

The column is capped in characters, so raising the type size widens the page instead of shortening the line.

Two panes that fold away

Files on the left, the page in the middle, the outline a keypress to the right. The page opens alone, with the measure, and every divider drags.

Find shows you where

Every match is marked on the page, headings included. Enter walks them. In a PDF it turns to the right page.

The gauge, where you set the size

Reading Settings puts the apparent size on a band, so you can see whether the type landed well. The header carries the one number the page promises: its character count.

It remembers

Your place in each document, the width of each pane, which panes you folded, the files you had open, and whether you chose light or dark.

Three steps, and the second one is invisible

There is no calibration screen to get through before you can read.

01

Open a file

Markdown, PDF or plain text. Drop it on the window or pick it from the library pane.

02

Muo reads your screen

Density from the display, distance from a sensible default for its size class. Both are editable in settings.

03

Read

The column is already 72 characters. Nudge the size if you want; the measure will not move.

The window, both appearances

Warm paper and warm ink in light, warm charcoal and warm grey in dark. Never pure black on pure white, which blooms at the edges of letters.

Muo in light appearance: the files panel on the left, the reading column in Inter, and the measure in the header.
Light. The page is the only opaque surface.
The same window in dark appearance, with warm charcoal paper and warm grey ink.
Dark. The same palette, one step down.
Reading settings, showing a specimen of the type above sliders for distance and size.
Settings shows the type you are choosing, at the size you are choosing.
8,803lines of Go
128tests
0.32°target angle
72characters per line

Questions worth asking before you install

Including the one about PDFs, which is the honest one.

Which file formats does it open?

Markdown, PDF and plain text. Markdown includes GitHub's extensions: tables, task lists, strikethrough and footnotes.

Does PDF rendering look right?

Not yet. Muo has its own PDF interpreter rather than a browser engine, and it draws text runs as solid bars instead of glyphs. The page layout, the images and the page counter are right; the words are not readable.

Search does work on PDFs, because the interpreter reads the text even when it cannot draw it. It turns to the page the match is on. Faithful rendering needs the embedded font programs interpreted, which is a larger job than the rest of the app.

Why 72 characters and not a pixel width?

The eye finishes a line and returns to the next one by moving a fixed number of characters. Fix that number and the sweep stays reliable. Fix the pixels and the number moves whenever the type size does.

What is the number in the header?

The character count the column actually holds, which is the promise the page keeps. Reading Settings carries the second number, the apparent height of a capital letter in degrees: below 0.26 the eye leans in, above 0.38 the return sweep gets unreliable, and a marker shows which side of the band you are on.

Can I set the size myself?

Yes, with the slider in settings or Cmd plus and minus. The model is a starting point, not a lock. Following the model again is one button away.

Does it run on macOS and Linux?

Yes. Each release carries a signed macOS disk image, two Windows installers, and Debian packages plus tarballs for Linux on both x64 and arm64. Every platform is built from the same tag by the same workflow.

Is there a mobile version?

No. The whole idea depends on knowing the screen's density and the distance to it, and a phone held at 30 cm changes both every time you move. That is a different design problem.

Does it need an account or a network?

No account, no sync, no telemetry. It reads files from disk and writes two small JSON files to your user data folder. The only network access is the update check, and only when you ask for it.

What is it built with?

Go and MyGo, which draws the interface on the GPU. No webview, no JavaScript runtime, no frontend build. One dependency in go.mod.

Is it free?

Yes, MIT licensed. The source is on GitHub and you can build it yourself in one command.

Install it and open the file you are already avoiding

Per user, no administrator prompt, about 11 MB. Uninstalling removes everything it added and leaves your reading positions alone.

Windows 10 and 11, x64 and arm64 macOS 12 and later Debian and Ubuntu, x64 and arm64