Aleksandr Mihhailovski

Self-initiated · 2026

ReMargin

I wanted a reader where annotations matter as much as the text. Built one.

Role

Design Engineer

Project

Self-initiated product

Timeline

2026

Focus
  • Product design
  • Frontend engineering
  • Information architecture
ReMargin — a reader where annotations matter as much as the text
01 · Context

Readers handle reading, not thinking

Every EPUB reader handles reading. None of them handle thinking. Apple Books locks your notes. Kindle makes export painful. Moon+ Reader buries annotations in settings. I wanted a reader where highlights and margin notes are the point — not a feature hidden behind three taps.

The target user is someone who reads to write: researchers, PhD students, Zettelkasten practitioners. People who need their annotations to leave the app.

02 · Core interaction

The margin note

The margin note. Not in a sidebar, not in a popup — on the page margin, connected to the highlighted text with a line. Like handwriting in a physical book. Desktop only: on mobile, the margin collapses and notes live in a bottom sheet.

Five highlight colors with keyboard shortcuts 1–5. No menu hunting. Select text, press a number. Done.

Margin notes with connector lines on desktop
Margin notes with connector lines on desktop — highlights with the popover color picker.
Mobile bottom sheet after text selection
Mobile bottom sheet after text selection.
Design decision
Highlights have no confirmation step. The color is the action. ‘Add note’ is a separate explicit choice — most highlights don’t need a note, and forcing the dialog kills reading flow.
03 · Export architecture

Export shaped everything

Every annotation exports as a standalone Markdown file with YAML frontmatter: book title, author, page number, color, date. Per-book zip, all-books zip. Drag into Obsidian — it just works.

This was the product requirement that shaped everything else. If export is the primary output, then every annotation needs to carry enough metadata to be useful outside the app.

Exported annotation as Markdown with YAML frontmatter
Exported annotation as Markdown with YAML frontmatter.
04 · Library

Library as knowledge dashboard

Two views: Grid (book cards with covers) and Notes (cross-book annotation feed). The Notes view shows all highlights across all books, grouped by source, with inline editing and search.

Grid view with book cards
Grid view with book cards.
Notes view — cross-book annotation dashboard
Notes view — cross-book annotation dashboard.
05 · Technical decisions

Technical decisions

Local-first. IndexedDB for files, localStorage for metadata. No server, no auth. All data stays on the device.

epub.js. rendition.on(‘selected’) fires 1 out of 20 times under rapid selection. The fix: bypass epub.js events, listen on the iframe document directly, convert ranges to CFI manually.

Typography. Space Grotesk for UI, Newsreader for the reading surface, DM Serif Display for the logo.

AI-assisted engineering. Built with Claude Code as the primary coding tool. My role: product decisions, design direction, architecture, prompts, QA. Claude Code: implementation, debugging, iteration. This workflow let me ship a full product solo in 10 days — something that would otherwise require a small team.

06 · Design system

Tokens, not magic numbers

Every color, radius, spacing value, and font-size in the codebase resolves to a CSS custom property. Two themes (dark with warm cream light), three type families, a 4px spacing grid, and five highlight colors — all tokenized and used consistently across 8 component stylesheets.

Color tokens
Dark
bg-primary
#0f0f11
bg-secondary
#161618
bg-tertiary
#1c1e21
accent
#d97757
text-primary
#ffffff
text-secondary
#e2e3e5
text-tertiary
#97979a
text-quaternary
#6b6f76
Light
bg-primary
#fdfcf5
bg-secondary
#f5efdf
bg-tertiary
#ebe6d6
accent
#d97757
text-primary
#3d3a34
text-secondary
#524e46
text-tertiary
#787570
text-quaternary
#a8a39a
Highlight palette
1 · yellow
2 · green
3 · blue
4 · red
5 · purple
Typography
DM Serif Display · Logo
remargin
Space Grotesk 400/500 · UI
The quick brown fox jumps over the lazy dog. 0123456789.
Newsreader 400/400i · Reading surface
Men with a still natural nature, barbarians in every terrible sense of the word, men of prey, still in possession of unbroken strength of will and desire for power.
Reading surfaces

The thread on which our thoughts are strung passes through.

light

The thread on which our thoughts are strung passes through.

sepia

The thread on which our thoughts are strung passes through.

dark
Spacing · 4px grid
4
8
12
16
20
24
32
40
48
Border radius
sm · 4px
md · 8px
lg · 12px
full · 9999px
Components
Book card
Cover zone 4:3 + meta block. Hover elevates border. Continue variant: accent top-bar + badge.
Highlight popover
Desktop: floating near selection. Mobile: bottom sheet. 5 color buttons + Add note + Copy citation.
Annotation card
Color bar left edge. Quote italic, comment regular, page + date footer. Click: navigate to source.
Progress pill
Fixed bottom-left. Percent | time | page/total. Pill shape.
Settings drawer
Slides from right, attached to header. Font size, surface, theme.
Context menu
Right-click desktop, long-press mobile. Upload cover, export, delete.
07 · Result

Result

Solo build — design, engineering, deployment. PWA installable. Two demo books seeded on first visit (public domain from Project Gutenberg).

Key insight
PDF support was built, shipped, and removed. The rendering was stable but text selection, zoom, and annotations across two parallel reader architectures created a maintenance surface I couldn’t sustain alone. Cutting PDF and polishing EPUB was the right product decision — depth over breadth.