No description
Pages now get a crisp 1 screen-px outline instead of a blurred shadow, and the canvas background shows faint world-anchored grid lines that pan and zoom with the pages (spacing steps up ×4 when zoomed out). 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.