Glance
Glance
I write a lot of markdown. Lately I also generate a lot of it. Coding agents leave behind READMEs, summaries, plans, half-finished notes, all of it is dot md. And every time I actually wanted to read one of these, I was stuck choosing between a text editor (raw, no rendering) and dragging the file into a browser (works, but it's a browser tab pretending to be a document).
Rakugaki was for writing markdown. Glance is the other half. For reading it.
What it is
A small native macOS app. No Electron, no tab, no account. You drop a markdown or a HTML file on it and it shows you the rendered thing, nicely set, and then gets out of the way.
Under the hood it's a SwiftUI shell around a WKWebView. The rendering is the same web stack I'd reach for anyway, Marked for markdown, Highlight.js for code, Mermaid for diagrams, KaTeX for math, except all of it is bundled inside the app. Fonts too. Nothing gets fetched from a CDN. Open a file on a plane and it renders exactly the same.
The thing that makes it feel native is that the webview loads one template once, and every file you open after that gets pushed in over JavaScript. So switching files doesn't reload a page, it just swaps the content. Feels instant.
The shell
It ended up looking a bit like Obsidian, which wasn't the plan but isn't a bad place to land. There's a sidebar with your recent files and an optional folder vault. A command palette on Cmd+K for everything. The table of contents lives out in the left margin when the window is wide enough and folds back into the sidebar when it isn't.
There's a minimap on the right that I'm weirdly fond of. It replaces the scrollbar, shows a block per heading sized to that section, and vanishes when you stop scrolling. Click anywhere on it to jump.
Other bits: find in page, font sizing that sticks between launches, live reload when the file changes on disk, export to PDF, and Copy as Rich Text so you can paste a formatted version straight into an email or a doc.
The interesting bits were the bugs, as usual
A few that ate more time than they should have.
Math fought markdown. LaTeX is full of _ and ^ and \, which markdown happily reads as emphasis and escapes before KaTeX ever sees them. The fix was to teach Marked about math as a proper token, so $...$ gets pulled out before any of that happens, and code blocks are left alone.
Text selection bled everywhere. Selecting a paragraph would highlight the full width of the window, gutters and all, because the content column was centered with margin: auto and WebKit fills the selection gaps against the body. Centering with flexbox instead keeps the highlight inside the column. Tiny change, annoyingly hard to find.
Then the small papercuts: tables leaving a stray border line under the last row, task-list items showing a bullet and a checkbox, the margin TOC being selectable so dragging into it grabbed the text too. The kind of stuff nobody notices until it's wrong.
The icon nearly broke me
I wanted a simple dark icon: the letters "ǑǑ" stacked in a dozen IBM Plex Mono weights, hazy, like a font specimen. Made it, dropped it in, and there was a white border around it in the Dock. Full-bleed it, still there. Square it, still there. I went down a rabbit hole convinced my image was wrong.
It wasn't. macOS Tahoe now wraps every app icon in a light "glass tile" and draws a rim around it, and a dark icon meets that rim at a hard edge. A classic .icns can't escape it, no matter how you shape the art. The only way out, that I found, is Apple's new Icon Composer .icon format, which carries the glass treatment properly. Built one, compiled it into the bundle with actool, rim gone. The build script now compiles it on every run.
I learned more about macOS icon internals than I ever wanted to.
Getting it
Free download for macOS 13+ from the site. It isn't notarized yet, so the first launch needs a right-click then Open. After that it behaves.
Or build it yourself. It's one script.
The code
It's on GitHub. Open an issue if your markdown renders weird, I'd genuinely like to know.
It does one thing. It shows you the file. That's the whole pitch.