A local-first research assistant: ingest your PDFs, EPUBs, HTML, DOCX and Markdown, then ask
questions and get answers with inline page-level citations back to your own documents.
Built from the tagged commit and passed a clean-machine install gate before being published — see
How this was verified below, including the one caveat that travels with that verdict.
Install
Download Provenote_0.6.0_x64-setup.exe (Windows x64) and run it.
- The installer is not code-signed, so Windows SmartScreen will warn you. That warning is
accurate: it means nobody has paid a certificate authority to vouch for the binary. Choose
More info → Run anyway if you are comfortable with that. - It is a 1.6 GB download (1,572 MiB) and installs to roughly the same size. The embedding and
re-ranking models are bundled so the app works offline and never uploads your documents. - Upgrading from 0.5.1: install over it. Your library, settings and conversations live in a
data folder the installer does not touch (%LOCALAPPDATA%\doc_assistant\data, separate from the
app). The first time you open the Library every document is marked changed, because the way
text is extracted changed in this release, and a re-index re-reads every file (about 15 seconds
per paper, cached afterwards). New in 0.6.0, that re-read keeps a document's figures, keywords
and corrected metadata attached — under 0.5.1 it would have cut them loose. The clean-machine
gate below installs fresh; an in-place upgrade was not part of it.
What's new since 0.5.1
- You can read a document beside its library entry. Open any PDF and its own pages appear in a
pane next to it — the page as printed, not the text pulled out of it. Clicking a passage in
Chunks, or Show the page on a citation in chat, opens the pane at the page that passage
came from. Fit page or full width, zoom with Ctrl/Cmd + wheel (a sharper render, not a magnified
blur), and drag the divider. A file that has moved, or sits on a drive that is not connected, says
so and names the path. - A citation can show you where it came from, in place. Clicking a source in an answer offers
In context: the cited passage highlighted inside a window of the surrounding text, with how far
through the document it sits. A passage that cannot be placed says so rather than guessing. - You can add documents from inside the app. Drop files or a folder onto the window, or use
Add documents…. A review sheet says what will happen to each file — added, already in your
library, unsupported, unreadable — with the exceptions sorted to the top, and nothing is copied,
registered or indexed until you confirm. Undo all is offered immediately afterwards. - Your documents no longer have to live in Provenote's own folder. Adding a file is a choice
between copy it in and reference it where it is. A referenced file is never moved, altered or
deleted by the app; removing it from your library removes only the app's record of it. When its
folder cannot be reached — an external drive, a share that is offline — the app says the location
is unavailable rather than showing a library full of missing documents. - You can import from Zotero. Point the app at a Zotero library and its attachments arrive in
the same review sheet, with the same duplicate check and the same copy-or-reference choice.
Zotero's own titles, authors and years are kept and not overwritten by what the app reads out of
the PDF. Tested against a database built to Zotero's documented schema, not yet against a live
Zotero install. - You can re-run one part of reading a document, instead of all of it. Metadata, figures,
references and text can each be redone on their own, for one document or a selection, and each
says what it will cost before it runs — they differ by four orders of magnitude. - The concept graph is back, and says how much of your library it covers — "30 of your 98
documents", and why. A concept can be put on the graph from Manage keywords; that used to
need a script the installed app does not ship, so a fresh install's graph stayed empty forever. - Improving how a document is read no longer disconnects everything attached to it. A document
used to be identified by the text extracted from it, so any extraction fix gave it a new identity
and orphaned its figure descriptions, keywords, folders and hand-corrected metadata — measured at
4,123 rows on a 97-document library, 19 of them unrecoverable. A document is now identified by
the file it came from. - A citation only becomes a link when the titles agree. Surname-plus-year alone was wrong 13
times in 16 on the working library (one review of graph neural networks pointed at a paper on
mouse whisker cortex). With title agreement required the links went from 16 to 41, the 12 false
ones dropped and the rest checked by hand; your own numbers will differ. - Indexing can use more than one core, and you can say how many — off, light (the default,
two), balanced or full, never the whole machine. It changes how long indexing takes, never what
it produces. On the development machine two workers bought most of the achievable gain. - Benchmark numbers now say what produced them. Every eval run records the corpus, the model
and the live retrieval settings, and a check reports, per metric, whether two runs measured the
same thing — because a five-trial run in August looked like a 6% improvement and was a model
swap. Documentation:evals/README.md. - Smaller changes. A corrected title now shows everywhere, not only in the Library list. EPUB
files no longer read their own table of contents as body text. Settings is a set of categories
rather than one long scroll. Native menus and dropdowns follow the app's theme. - Fixed. 723 of 881 figure images on the working library could not be shown and are back,
re-rendered from the position already recorded; re-running the figure pass no longer discards
descriptions that were paid for (552 of them). Two indexing faults that lost text: a cursor
skipped overlapping passages, leaving 30-40% unable to say where they came from (now 100%). A
short document is no longer reported as broken for being short, and the app names the tool that
actually read each file. A heading ending in a colon ("Preprint of the paper:") is a lead-in, not
a title.
Known limits
Stated because they are the things most likely to surprise you.
- A cited passage is located on the page, but not marked on it. The pane opens at the right
page; it does not yet highlight the passage within that page. - A page number can occasionally be one page early. For a small number of pages (0.2% across
the development library, concentrated in one scanned book) the text recorded for a page is the
previous page's, so a jump lands one page before the passage. - Citation links are worked out when a document is first read, and are not revisited. Adding
the paper a reference points at will not turn that reference into a link on its own — the citing
document has to be read again. A command-line pass can refresh them without re-reading anything;
it is not yet a button. - Moving or renaming a file outside the app loses anything recorded against its old path. The
document survives — its content is recognised, so it is not read or embedded again, and its
figures, keywords and corrections stay attached — but an exclusion you set is recorded against
the path, so it does not follow the file. - Scanned PDFs are only read if your system happens to have an OCR engine, and the installer does
not include one. A PDF that is pure page images extracts to nothing and is marked broken. But
if atesseractbinary is on your PATH, the PDF reader finds it by itself and reads the pages
instead — and nothing in the app asks for this or reports it. The same scan produced 0 characters
on one date and 34,600 on another, on the same machine, with nothing in the app changed. Two
machines on the same version can therefore build different libraries from the same file, and the
extraction cache keeps whichever result came first. A fresh install gets the 0-character
behaviour. Deliberate, opt-in OCR whose output is marked as such is designed and not built.
(TheCHANGELOG.mdat the tagged commit states this limit wrongly — it says an OCR tool on your
machine makes no difference. The corrected text is onmainand here.) - Citation coverage on a local model is a floor, not a bug. With a local Ollama model many
claims come back uncited — measured at 36% sentence coverage forllama3.1:8bagainst 81% for a
paid model, on the same 27 questions, corpus, prompt and retrieval; on some answers it cites
nothing at all. When the app flags claims as uncited on a local model, the integrity layer is
working, not failing. Configure a paid provider in Settings if you need consistent citation. - Keywords describe a document; they do not group your library. 97% of them appear on exactly
one document — useful for finding a paper, not for slicing a collection into topics. - Windows only for now. The app runs from source on other platforms; only Windows has an
installer. - Tables extract inconsistently.
How this was verified
Every number here is reproducible rather than a verdict, and the gate output is recorded in the
repository's development log.
- Built from the tagged source. The installer was built on 2026-09-01 from the release commit;
the tag sits five commits later and differs from it only in theCargo.lockversion line, the
release-preflight script and that script's tests — nothing that ships.git diff v0.6.0..main -- src apps scripts testsis empty. - Clean-machine gate: installed on a fresh Windows Sandbox with no Python on PATH. Silent
install 181 s; the bundled models loaded and the app reported healthy ~210 s after launch;
3 PDFs indexed into 322 chunks in 40 s; one answer in 14 s with 10 sources and 4 resolved
citations, 0 unresolvable, onllama3.1:8b. That end-to-end path matters because a previous
build started, served health checks and reported a healthy chunk count while being unable to
read a single PDF — only a real install catches that. - Read that verdict in two halves. The packaging half — installs, starts, reads PDFs, indexes,
answers — is strong evidence. The citation half is one sample: on the 0.5.1 installer the same
assertion failed 1 run in 4 on a byte-identical build, because the local model sometimes cites
nothing at all. A PASS here says the installed app can index and answer; it is not a
citation-quality result. - Gates at release: 2,389 Python tests · 257 frontend tests · type-checks clean on both sides
(mypy, 98 files; svelte-check, 219 files).
Provenote_0.6.0_x64-setup.exe
SHA-256 2280180840548023735044020e9a0e05ec418d06522909af66dbe4db9a5c5bc4