I counted my desktop folders last month. Forty-three. The naming scheme had evolved from "research" to "research-sorted" to "research-sorted-v2" to "final-actual". That was the moment I admitted the problem was never storage. It was reopening.
A PDF dies the day you file it. What I actually work with is the between state of knowledge: an article and a meeting recording that corroborate each other, a screenshot that contradicts a claim I wrote last month, a half-finished draft hanging off three sources. Folders have no slot for any of that. Folders have "inside". They don't have "between".
So I built Knovum: a local-first desktop knowledge workspace where your sources sit on one infinite canvas, and the relationships between them are first-class citizens.
One Space, one canvas
My first version was a tree. I used it for two weeks and gave up, because a tree forces you to decide "who belongs under whom" at filing time — and about 80% of the connections in knowledge work only reveal themselves while you work.
The current shape is an infinite canvas. Web clips, PDFs and Office docs, images, audio, video, code, Markdown notes — all of it lands as cards you can spread out, group, tag, and save as named views. Writing view, sorting view, same canvas, different lens.
Two interoperability details I use daily: JSON Canvas (.canvas) imports and exports both ways, and a whole Space packs into a single .knovumspace file — content, relations, derivations and citations included. Handing someone a Space is handing them a project.
Notes apps record. I wanted it to keep the argument too
Knovum ships six typed knowledge objects — Concept, Question, Claim, Evidence, Experiment, Decision — connected by ten relation kinds: supports, contradicts, depends-on, supersedes, answers, derives-from, and friends.
Then there's Knowledge Health, my favorite thing in the codebase. It continuously reports claims with no evidence, accepted-but-contradicted claims, evidence whose source document changed under it, open questions that already have answers. The first time it told me "this evidence's source was updated last week, the citation no longer matches", I just sat there. That used to surface as an incident three months later.
Answers with citations that age visibly
Search is hybrid: lexical plus semantic, with on-device Qwen3 embeddings. The index never leaves the machine.
Ask answers from the sources you select, and every citation keeps its location: a page in a PDF, a time range in a recording, a heading and character span in a note, a line range in code. Click and you're there.
The part I'm unreasonably proud of: citations track their source. If the source changes and no longer matches, the citation flips to detached instead of silently pretending. I've been burned by stale AI summaries one too many times, so staleness is now a visible state.
Twelve AI capabilities, all on-device
Whisper transcription, speaker diarization, TTS with voice cloning, vocal/accompaniment separation, background removal, upscaling, inpainting, smart selection, depth estimation, local semantic embeddings — all running locally after a one-time model download, SHA-256-pinned weights, Metal-accelerated on Apple Silicon.
Cloud models are strictly opt-in: nineteen-plus providers or any OpenAI-compatible endpoint, or delegate to a desktop agent. Keys live in a dedicated local secrets database, never in config files or logs. And canvas editing, keyword search, transcription and semantic indexing all work with zero AI connections configured.
There's also system-wide push-to-talk: hold a shortcut, speak in whatever app is frontmost, local Whisper types it in. Meeting notes at talking speed.
Every result keeps its receipt
Select material, run an intent — generate document, image, or video; remove background; split layers; add subtitles. Every result records its derivation: the inputs and their revisions, the action that ran, the engine or model that executed it. "Where did this paragraph come from?" becomes a three-second answer instead of an archaeology dig.
The stack, and a few obsessions
Tauri 2, Vue 3, TypeScript, Rust, SQLite, LanceDB, Konva, Tailwind CSS v4. The Rust core owns data, inference and OS integration; the Vue renderer owns interaction; generated strict contracts connect them.
A few things worth stealing:
- Konva was chosen by an actual canvas-platform benchmark, and the decision is written into the dependency policy — replacing it requires re-running the benchmark;
- CI runs the full quality gate on macOS arm64, macOS Intel and Windows on every push;
- House rule: no TS/Vue file over 180 lines. That rule has saved me from "I'll just stuff it in here for now" more times than I can count.
Honest fine print
- It runs from source today: Node 22.13+, the pinned Rust toolchain, plus uv, CMake, Protobuf and LLVM. First build is slow (native components compile); after that it's fast.
- The license is source-available personal-noncommercial, not OSI open source. Use, modify and share freely as an individual; organizational or commercial use needs separate authorization. I'm not going to dress that up.
- macOS 14+ and Windows 10 2004+ only; Linux is out of release scope for now.
git clone https://github.com/madebyzan/knovum.git
cd knovum
corepack enable
pnpm install --frozen-lockfile
pnpm desktop:dev
Try it, break it, tell me
If you're also the person with forty-three folders of material you never reopen: come spread it on a canvas. Repo is here — github.com/madebyzan/knovum. Stars are encouragement; brutal issues are collaboration.




















