A portable, format-agnostic annotation format for PDF, Markdown, and DOCX. Local-first sidecar JSON. Edit-tolerant text anchors. A directed lineage graph between snippets. MarkRank centrality over your reading.
Universal binary · macOS Intel + Apple Silicon · ~8.5 MB · unsigned dev build
Six things Marklee gives you that a notes app or PDF reader doesn't.
Plain JSON sidecars next to the source. No server, no account.
Email someone paper.pdf + paper.pdf.annot.json —
they get your annotations, fully.
A normative four-tier algorithm finds your highlight even after the
source has been edited:
text + context → exact → fuzzy in section → orphaned.
Connect snippets with labeled edges — supports, contradicts, elaborates. The graph is first-class data. MarkRank surfaces the most-cited ideas.
Share one annotation as a URL. Hash + anchor + optional text/context;
the receiver opens the source PDF and lands on the right region.
Like HTML #:~:text= Text Fragments — for documents.
One snippet schema covers PDF, Markdown, DOCX, and plain text. Lineage view mixes a page-3 PDF quote with a §Methods Markdown snippet on the same canvas.
Every implementation detail in SPEC.md + a JSON Schema you can validate sidecars against in CI. The format is the contract; the tools are interchangeable.
Three views from inside Marklee. Drop your own screenshots into the
placeholders below — see the comments in landing/index.html
for what to capture and the suggested aspect.
Drag-select text in any document to make a snippet. Drag a sticker from the groups panel onto a snippet to tag it. Paste from anywhere — text or image — directly into the workspace.
The lineage view turns the snippets into a directed labeled graph — docs on the left, snippets in the middle, groups on the right. Edges you draw between snippets show your reasoning. MarkRank ranks them by graph centrality.
Click share on any snippet. The Marklee Permalink format encodes hash + page + anchor + optional text/context. The receiver opens the source and lands on the right region — even if the source has been lightly edited since.
One sidecar per document. Every snippet, edge, and group lives inside. Self-describing, version-controllable, scriptable.
{
"markleeVersion": "0.1",
"kind": "document",
"source": {
"path": "genome.pdf",
"kind": "pdf",
"contentHash": "sha256:ab12cd34…"
},
"snippets": [
{
"id": "3f7e…",
"page": 12,
"text": "Humans share roughly 98.8% of their DNA with chimpanzees.",
"contextBefore": "…comparative genomics has revealed that ",
"contextAfter": " The remaining 1.2% accounts for…",
"anchor": "Chapter 3 > Common ancestors",
"comment": "Worth re-checking against the 2023 update.",
"groups": ["evidence", "biology"]
}
],
"edges": [
{
"source": "3f7e…",
"target": "a9b2…",
"label": "supports"
}
],
"groups": [
{
"id": "evidence",
"name": "Evidence"
}
]
}
Existing annotation formats either lock you into a server, hard-code byte offsets that break, or stop at one document type. Marklee fills the space between them.
| Marklee | W3C WADM | XFDF | Hypothesis | Sciwheel | |
|---|---|---|---|---|---|
| PDF + Markdown + DOCX | ✓ | ~ | PDF only | HTML mostly | PDF + HTML |
| Sidecar / portable | ✓ | server | XML | server | cloud-only |
| Edit-tolerant anchors | 4-tier | partial | byte offset | TextQuote | unknown |
| Labeled-edge graph | ✓ | replies only | |||
| Per-annotation permalink | defined | URI | page-only | ||
| Centrality algorithm | MarkRank |
v0.1, working draft. Spec stable enough to write tools against; format may change incompatibly until 1.0. Reference implementation is the desktop app on this page. The web build (browser-mode + permalink bootstrap) and Chrome extension are next.
Built local-first because the data model demands it. Nothing about Marklee requires a server, and nothing it does will ever require an account.