TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
A PDF reader and annotator for research, on Windows and macOS: one slim toolbar, annotation at the text you select, split view, four reading themes, and an optional AI assistant that cites its sources
ProductivityTypeScript · JavaScriptGitHub @emilmshOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
A PDF reader and annotator for Windows and macOS, built for research. Free, MIT-licensed, and offline unless you ask a question.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A PDF reader for research.
PDF Scholar is for the documents you work through rather than skim: research articles,
reports, books. The window is nearly all page — one slim toolbar carries the tools, the
contents and assistant panels stay out of the way until called, and the toolbar itself
can be unpinned, leaving only the page.Read the full README ↗PDF Scholar is for documents you work through rather than skim: research articles, reports, books. The window is nearly all page. One slim toolbar holds the tools, the contents and assistant panels stay hidden until called, and the toolbar itself can be unpinned.
Four reading themes, and every file reopens where you stopped. Annotation starts from a menu at the selected text; every mark is listed in a panel beside the document, and comments can be shown in the margin or exported into one. A split view puts a figure or table beside the passage that discusses it. Cross-references preview where they are cited, and can be followed and returned from. The optional AI assistant answers from the open document and cites the passage behind each claim. Free, MIT-licensed, and offline unless you ask a question.
Runs on Windows and macOS, and as a browser extension for Edge and Chrome. A Linux build is in beta.
Two ways to run it: the desktop app, or a browser extension that opens PDFs inside Edge or Chrome. Both use the same reader, annotator and assistant.
⬇ Get PDF Scholar for Windows —
download PDF-Scholar-Setup-*.exe from the latest release and run it. Per-user install,
no admin rights. It registers as a PDF handler in Explorer and adds a "Recent" Jump List
to the taskbar. The installer carries both x64 and native arm64 builds and picks the
right one, so Windows-on-ARM machines run native rather than emulated. Everything works
offline. The AI features need your own API key (Anthropic, OpenAI, Azure OpenAI,
OpenRouter, Google Gemini, Grok, Mistral or Groq), any OpenAI-compatible endpoint, or a
local model via Ollama or LM Studio with no key at all — entered in the assistant
settings. A ChatGPT Plus/Pro sign-in works instead of a key.
No install allowed on your machine? Each release also carries a portable zip
(PDF-Scholar-*-portable-x64.zip, and an arm64 twin): extract it anywhere and run the
exe. Settings, recents and drafts live in a data folder beside it, so the folder moves
as a whole. It registers nothing, so it is not under "Open with" until you browse to it
once, and it reports new releases but cannot install them. AI keys are encrypted to the
Windows account that saved them and do not follow the folder to another machine.
⬇ Get PDF Scholar from the Microsoft Store — the same app as an MSIX package, x64 and arm64. The installer is updated more often.
The build is not signed with an Apple Developer certificate — deliberate, the app
has zero recurring costs. Two consequences for both paths below: Gatekeeper needs one
xattr command per installed version, and the app cannot install its own updates. It
still checks for them and, when one appears, shows the command or the download link
that matches how you installed it.
With Homebrew — recommended, since brew upgrade then delivers
new versions:
brew install --cask emilmsh/tap/pdf-scholar
xattr -cr "/Applications/PDF Scholar.app"
The second line is the Gatekeeper step; repeat it after each brew upgrade.
By hand: download the .dmg from the
latest release —
-arm64 for Apple Silicon, -x64 for Intel. Drag PDF Scholar.app into
Applications (not straight from the disk image), run the same xattr command, and
open it. New versions come from the releases page.
If Gatekeeper says unverified developer rather than "damaged", Open Anyway under System Settings → Privacy & Security also works; the "damaged" variant has no such button, so use the command.
Built in CI on every release and tested on Apple hardware. If something misbehaves on your Mac, open an issue with what works and what breaks.
From the latest release:
.deb (recommended — it registers the PDF file association,
and Ubuntu 24.04+'s AppArmor policy blocks parts of the AppImage sandbox)..AppImage — chmod +x and run. No libfuse2 needed.Both auto-update in place.
The build comes from the same sources as the Windows one, in CI, but has never been run on a Linux machine: I develop on Windows and have no Linux hardware. The beta label is literal. If you run it, open an issue with your distro and what worked or broke.
The same viewer; each PDF opens as an ordinary browser tab instead of in the browser's built-in reader. Make the browser your default PDF app and a double-click in Explorer opens here too. To keep the browser's own handling of web PDFs — viewing or downloading them as you have set it — switch off "Open PDFs from the web here" in the gear menu; local files still open here.
⬇ Get it for Edge or for Chrome — one click, and updates arrive on their own. Store review takes time, so a listing can trail the newest release by a version or two.
By hand — to run a build newer than the stores carry:
pdf-scholar-extension.zip
and unzip it; it unpacks to one pdf-scholar-extension folder.edge://extensions or chrome://extensions and turn on Developer mode.pdf-scholar-extension folder.Either way, opening local files (the Explorer double-click) needs one more toggle: Allow access to file URLs on the extension's Details page. Only you can grant it, so the extension asks once.
See docs/BROWSER-EXTENSION.md for the architecture and
the desktop-vs-extension parity.
The frame at the top is one window in three of the four reading modes — the same page, the same moment. Tint sets the page on a light paper tone (here the classic Sepia cream); Night and Night+ are the two dark modes, the second with higher contrast.
Rest the pointer on a citation, figure, table or equation reference and a preview of its target opens beside the text, without moving the page (long-press on a touchscreen). A citation shows its reference as text, as Zotero's reader does — selectable, its DOI and web links live — and a bracketed citation like «[3, 5–9]» lists every reference in it, whichever number the pointer rests on. Each has «Go to» for its place in the list (Ctrl+click: the other column). A figure, table or equation gets a window onto its page: scroll it, Ctrl+wheel to rescale, drag the corner to enlarge. Click inside to go there, Ctrl+click to open it in the other column.
A table or figure often sits on one page and the text that discusses it on another. S opens a second column of the same document. The column can also hold another document: drag its tab into the view, pick it under "Open in split view" in the view menu ("Another file …" for one not yet open), right-click its tab, or drop a PDF on the column. Two papers can then be read and annotated side by side; Shift+S swaps the sides.
The tools appear at the text you select, and every mark is listed in a panel beside the document.
Both modes live in one search bar, a tab apart.
Optional, and it runs on your own API key — or on your ChatGPT plan. It answers from the open document, and each claim carries a reference; following one goes to the sentence it came from.
The desktop app can let an AI tool on your computer search what you noted across every paper: highlights with the words they mark, comments, notes, and your assistant conversations with the passages each answer cited. While you write, ask the tool what you noted about a method, and it looks it up without opening a PDF.
Every command is listed in one map — Settings → Keyboard shortcuts — grouped by task, with its keys beside it. Any shortcut can be rebound or reset, one or all at once; the keys in this README are the defaults.
Reading, annotating and saving are local; the app runs without network access. Two lookups go online, each on a click: a document's reference from doi.org, and a cited paper's abstract from free scholarly databases (arXiv, Europe PMC, Crossref, OpenAlex). Only the DOI, or the one reference entry, is sent. Assistant requests go directly to the provider you chose, under your key and that provider's terms; there is no intermediary server, and with a local model (Ollama, LM Studio) your questions stay on the machine too.
An AI action sends document content — normally the whole text, an excerpt for very long documents — and several actions fire on one click. An AI access switch in the assistant's settings decides how far that goes. "Confirm before sharing" pauses the first request that takes a document to a provider in a session, naming the model and what is about to be attached, and lets follow-up questions about the same document pass; a new document or a new provider asks again. "Off" blocks every AI request in the transport layer, so a stored key cannot leak content by accident. An outside AI tool you turn on under "AI tools" reads your notes and conversations, and what it reads goes to that tool's provider, under that tool's terms. Its own switch takes that back.
The key is pasted once, in the assistant's settings, and goes into the platform's key store: DPAPI on Windows, Keychain on macOS, the system keyring on Linux. The browser extension has no key store to reach and instead encrypts the key under a key no script can read out. The settings panel names the case on your machine, and docs/PRIVACY.md has the per-platform detail. A spending cap in the provider's console is worth setting either way: no local storage can stop a program already running as you from asking for the key to be decrypted.
PDF Scholar works as an external reader for Zotero: under General → "Open PDFs using", choose PDF Scholar, and library PDFs open here. Saved marks are standard PDF annotations in the file itself, so Zotero's own reader shows them (read-only, with a lock icon), and File → "Import Annotations…" converts the highlights and underlines into native, editable Zotero annotations (text boxes and ink are not importable on Zotero's side). Importing moves them: Zotero strips the annotations from the file and keeps them in its database — its import dialog says so. If you keep reading in PDF Scholar, skip the import: the annotations stay in the file, Zotero's reader still shows them, and Zotero sync carries the annotated file to your other devices. Import when you want to edit them in Zotero or extract them into a note, and use File → "Export PDF…" if you later need a copy with them re-embedded.
A document in a Zotero library also gets a Zotero section in the save button's menu:
show the item in Zotero, or copy an in-text citation, a full reference or the BibTeX
entry. The style is a picker in that section — APA 7, Chicago (author-date or notes),
Harvard (Cite Them Right), IEEE, MLA 9, Nature or Vancouver, all shipped with Zotero —
and one choice serves every document. BibTeX comes from Zotero's built-in exporter, so
Better BibTeX is not needed; the citation key is Zotero's generated one, not a Better
BibTeX pinned key. Two fields are left out: file, which names the PDF's location on
your disk, and abstract, which belongs in the library rather than in a .bib file. The
metadata comes from Zotero's local API on your own machine — enable it once under
Settings → Advanced → "Allow other applications on this computer to communicate with
Zotero". Stored attachments are recognised by path alone, so "Show in Zotero" works for
them even with the API off. Linked attachments (a library kept in its own folder,
ZotFile-style) carry no item key in their path; they are matched by filename against the
library's attachment list through the same API, so their Zotero section appears while
Zotero runs with the API on.
A document outside your Zotero library can still be cited if it prints its DOI on the first pages or carries it in its metadata, as most published papers do. The save menu then shows a Reference section with the DOI and one row, "Fetch reference from doi.org". Clicking it fetches the item's metadata (the Crossref or DataCite record, the same data a citation manager imports) and turns it into an in-text citation, a reference in the chosen style and a BibTeX entry (for numeric styles like IEEE the in-text row stays empty, since the number depends on your bibliography's order). That click is the only time anything leaves your machine, and only the DOI is sent. When Zotero knows the document, its section takes precedence — your corrected metadata beats the publisher's deposit — so you never see two versions of one citation.
npm install
npm run dev # full Electron app with HMR
npm run dev:web # renderer only, in a plain browser on :5199
npm run typecheck # tsc for renderer, main/preload and the extension
npm run dist # NSIS installer (Windows)
npm run build:ext # browser-extension bundle → dist-extension/
npm run ext:local # same build, mirrored into the folder your browser loaded unpacked
npm run test:windows # two windows on one file, end to end (needs npm run build first)
npm run shoot # drive the app into each documented state and photograph it
npm run check:shots # which shipped screenshots predate the visual changes
npm run shoot and npm run test:windows drive the real desktop app over Chromium's
DevTools protocol, which Electron ships, so neither needs a browser-automation
dependency. Both run in a throwaway profile with factory defaults and leave your
recents, reading positions and theme alone.
Every shot asserts its state before capturing, so a renamed tooltip or a jump that
never happened fails the run instead of saving a wrong picture; shoot is a UI smoke
test as much as a camera. --list shows the shot names; pass names to run a subset. The
assistant shots replay an answer recorded once into docs/ai-fixtures/, so an ordinary
run needs no API key; only the provider call comes from disk, while the chips, the jump
to the cited sentence, the highlight and the snipped region run live. --with-ai calls
the real provider with your own key, and --record refreshes the recording.
Shots land in the gitignored docs/screenshots/_auto/; the images in this README are
picked by hand. npm run check:shots reports which shipped images predate the visual
changes since — see docs/RELEASE.md.
npm run test:windows opens a second window on the same file, annotates in both, saves
from one, and verifies the result with mupdf — a different PDF implementation, so it
cannot share a bug with our writer. It covers the overlay, the IPC, main's shared draft,
the reload in the other window, and the bytes on disk.
Architecture in short: pdf.js v6 renders, EmbedPDF (PDFium WASM) writes. The React
renderer draws annotations in its own overlay, not pdf.js's editor layer. The Electron
main process owns the annotation engine, the AI providers and the draft-based save
model. Every platform call goes through one interface (PdfxApi), so one renderer
serves the desktop app, the browser extension and the plain-browser dev preview. See
CLAUDE.md and docs/ROADMAP.md for the details and the road ahead.
Actively developed, by someone who reads PDFs for a living. Installers are attached to
the GitHub releases, and
docs/PLATFORMS.md lists what each platform supports today.
If PDF Scholar was useful in your research, a citation is appreciated — use GitHub's
Cite this repository button, backed by CITATION.cff.
PDF Scholar is licensed under the MIT License. Every bundled component is permissively licensed: annotations are written by EmbedPDF's PDFium build (MIT / BSD-3-Clause), rendering by pdf.js (Apache-2.0), text on scanned pages by Tesseract through tesseract.js-core and its trained models (all Apache-2.0), plus Electron (MIT), React (MIT), the Anthropic SDK (MIT) and the Libertinus wordmark font (SIL OFL 1.1). Text boxes are set in the PDF standard fonts, which every reader already has — nothing is embedded in the documents you save. (mupdf, AGPL, is used only as a development-time test verifier and ships with no release build.)
Built by Emil Mathias Strøm Halseth, who reads PDFs for a living, with assistance from Claude Code. Logo by Elisabeth Walle.