Notes. Books. PDFs. One Typst-native workspace.
A GPU-accelerated, privacy-first desktop app for writing linked notes, publishing web books, and crafting beautiful PDFs — all in pure Rust, all in Typst.
Free. Open Source. Local-only. No telemetry. No webview.
Most note apps render Markdown in a browser. Most PDF tools live behind a paywall. Most reference managers don't talk to your notes.
Zetteltypsten unifies them — on top of Typst, the modern successor to LaTeX — and renders everything natively on the GPU.
A Zettelkasten built on real Typst syntax. Use @ref and <label> to link notes, #metadata() to tag them, and watch the knowledge graph emerge. Inspired by Logseq and Obsidian.
- Native cross-note references — no custom DSL
- Live force-directed graph view
- Backlinks, tag index, full-text search
Assemble notes into a published book — table of contents, chapters, parts. Inspired by mdBook, powered by Typst.
Compose PDFs from the same notes you already write. Side-by-side preview with sub-frame incremental recompilation — typing feels instant. Inspired by the Typst Web App.
Drop papers into your vault, highlight, annotate, extract. Inspired by Zotero.
- DOI lookup → automatic BibTeX
- Annotation overlay with color-coded highlights
- One-click export to Markdown
- Search across the whole library
100% Rust. No JavaScript. No WebView. No HTML rendering.
| Layer | Technology |
|---|---|
| UI | GPUI (Metal / Vulkan) |
| Components | gpui-component |
| Compiler | typst 0.14 |
| Renderer | Custom Frame Painter — Typst Frame → GPUI Canvas |
| Database | Limbo |
| Text Search | Tantivy |
| File watcher | notify + walkdir |
The heart of the app. Typst compiles your source to a Frame tree; we walk it and paint each FrameItem directly to the GPU — glyphs, shapes, images, links — with zero rasterization round-trips.
Two modes share one renderer: a continuous note view and a paginated PDF preview.
A persistent ZettelWorld lets comemo memoize parsing, evaluation, and layout across keystrokes. Single-character edits recompile in 1–5 ms.
git clone https://github.com/your-org/zetteltypsten
cd zetteltypsten
cargo run --package zt-app -- /path/to/your/vaultA vault is just a directory of .typ files. Zetteltypsten creates a .zetteltypsten/ folder for its index — everything else is yours.
| Shortcut | Action |
|---|---|
Cmd+B |
Toggle left sidebar |
Cmd+R |
Toggle right sidebar |
Cmd+E |
Edit / view mode |
Cmd+N |
New note |
Cmd+S |
Save |
Cmd+W |
Close tab |
crates/
zt-app/ Binary entry point
zt-ui/ Workspace, Frame Painter, views
zt-typst/ Typst World, compiler, font cache
zt-core/ Domain types
zt-editor/ Text buffer, cursor, history
zt-index/ Vault indexer, link graph
zt-db/ Limbo + Tantivy layer
zt-fs/ Scanner + watcher
zt-book/ Book builder
- Pure Rust. No JS, no WASM, no WebView.
- Native Typst.
@ref,<label>,#metadata()— never a custom DSL. - Local first. Your vault is plain files. Always.
- GPU first. Everything renders through GPUI's canvas.
- Use the toolkit. Lean on
gpui-componentinstead of rebuilding UI from scratch.
Open source. See LICENSE.