No description
Each grid cell is now the active page's size, aligned to its edges, so the grid marks where neighbouring pages would sit. Falls back to A4 at the origin when no page is active. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| docker | ||
| memos/memos | ||
| scripts | ||
| src | ||
| static | ||
| .dockerignore | ||
| .gitignore | ||
| compose.yaml | ||
| Dockerfile | ||
| package-lock.json | ||
| package.json | ||
| palm-rejection-test.html | ||
| README.md | ||
| spec.md | ||
| svelte.config.js | ||
| tsconfig.json | ||
| vite.config.ts | ||
Papure
Lecture notes as a tree of pages ("comb") — live-preview markdown underneath, vector ink on top — stored as one dual-layer PDF per canvas and synced through a GitHub repo. See spec.md for the design.
Run
npm install
npm run dev # http://localhost:5173
npm test # unit tests (tree, markdown, PDF round trip, sync against a fake GitHub)
npm run check # type-check
npm run build # static PWA in build/ — serve it from any static host (HTTPS for PWA install)
Docker
docker compose up -d --build # http://localhost:8080 (set PAPURE_PORT to change)
The image builds the PWA and serves it with nginx. Put an HTTPS reverse proxy in front of it: installing the PWA and the offline service worker both need HTTPS. To update, git pull and run the same command again.
Using it
- Tools (bottom bar): Text
T, PenP, HighlighterH, EraserE, Import PDF, Undo/Redo, zoom. The pen's eraser end erases too. - Pages: the grey "+" tiles next to the active page add a page there;
Alt+Arrowmoves to (or creates) the neighbour. Right-click a page or use its⋯button to insert, resize or delete it. - Importing a PDF into a non-empty canvas shows every free spot; click one to place the chain. Into a blank canvas it simply replaces the empty page. The Files panel can also import a PDF as a new canvas.
- View: wheel/trackpad pans,
Ctrl+wheel or pinch zooms,Ctrl+0fits the page,Ctrl+9shows the whole tree, space-drag or middle-drag pans. - Sync: Settings → Sync. Use a fine-grained token with Contents: read & write on the repo. Edits autosave locally; pushes happen every N minutes and on
Ctrl+S/ the sync button. Conflicts: newer wins.
Layout
src/lib/model— page tree (pure functions: insert/remove/flatten/layout).src/lib/editor— markdown analysis shared by the CodeMirror live preview and the PDF text layout.src/lib/pdf— PDF writer (vector text, Ink annotations, embedded source-of-truth files) and reader.src/lib/ink— stroke recording/outlines and palm rejection (ported frompalm-rejection-test.html).src/lib/storage,src/lib/sync— IndexedDB vault and GitHub sync.
Fonts in static/fonts are pre-subset (scripts/subset-fonts.sh) because pdf-lib's own subsetter drops glyphs.