mirror of
https://github.com/priyanshujain/margin.git
synced 2026-10-02 11:07:04 +00:00
3572c7a6b9d6b6c6d514ed7786a878ea30b9120f
load/save/delete_book built paths from the raw id, and ids round-trip from file JSON, so a crafted id could escape the library directory. Route all three through a book_path helper that rejects anything but [A-Za-z0-9_-]. Claude-Session: https://claude.ai/code/session_01RzTWrLiy4zGuw2hZSQGamk
margin
An offline desktop app for writing books and exporting them to print-ready PDF and reflowable EPUB — a focused, free alternative to InDesign for text-first books (novels, non-fiction).
Stack
- Tauri 2 (Rust shell) — offline by construction; the entire export pipeline runs locally, nothing hits the network.
- React + TipTap — the semantic writing surface.
- Typst (embedded as a Rust crate) — print-ready PDF with real book typography.
- Built-in EPUB3 generator + zip packager.
One semantic document feeds three renderers — the editor, the PDF, and the EPUB — from a single design-token theme (Quiet Press: Literata for the page, Hanken Grotesk for the chrome). Both fonts are bundled.
Develop
pnpm install
pnpm tauri dev # the real desktop app: live PDF dock, file dialogs, PDF/EPUB export
pnpm dev # browser-only UI preview (Tauri APIs are inert)
The first tauri dev build is slow because it compiles Typst.
Using it
- A book saves as a single
.marginfile (JSON). Open / Save with ⌘O / ⌘S. - Click the title in the top bar for Book setup (title, author, ISBN, trim size, language).
- Insert images from the toolbar and choose a placement (inline / full-width / full-page / float).
- Export to PDF or EPUB from the titlebar menu.
Layout
src/editor/— TipTap editor, extensions, figure block, floating toolbar.src/components/— app shell, preview dock, book-setup panel, pdf.js renderer.src/export/—typst.ts(book → Typst source),epub.ts(book → EPUB3 files),exporters.ts.src/store/,src/model/— document model and state.src-tauri/src/—pdf.rs(Typst compile),epub.rs(zip packager),project.rs(file IO).
Languages
TypeScript
46.6%
CSS
13.7%
Rust
12%
Astro
11.2%
HTML
8.4%
Other
8.1%