A PDF reader and annotator built as a Chrome extension. It bundles Mozilla PDF.js, opens PDF files you visit, drag into Chrome, or pick from your computer, and lets you annotate, sign and fill them without an account and without uploading anything to a server.
- Local by design: rendering, annotation and form filling all happen in the tab, using a bundled copy of PDF.js. Documents are never uploaded.
- Opens PDFs automatically: top-level navigations to a URL ending in
.pdfare shown in this viewer instead of Chrome's built-in one. Embedded PDFs inside web pages are left alone. - Fillable forms: AcroForm text fields, checkboxes, radio buttons and dropdowns are editable, and their values are written into the file you save or download.
- Annotations: freehand ink, highlights, free text, images, stamps and comments, with undo and redo.
- Left vertical toolbar: sidebar, bookmarks, read aloud, theme, single-page view, scroll mode, fullscreen and toolbar auto-hide in one column beside the page.
- Bookmarks panel: save the current page with the toolbar button or
Ctrl+B, and manage the list in the sidebar. Each PDF has its own bookmarks. - Open from the popup: "Open Local PDF" picks a file inside the popup, so cancelling never leaves an empty tab. Dragging a PDF onto the viewer window also works, with or without Chrome's "Allow access to file URLs".
- Right-click to open: "Open with Freedom PDF Viewer" on any
.pdflink. - Page tools: extract a page range to a new PDF, reorder pages by dragging thumbnails, delete pages, and export the current page to PNG.
- Merge and watermark: append another local PDF to the open document, or stamp configurable text across every page.
- Signatures: draw a signature and drop it onto the page as an image stamp you can move and resize.
- Themes: Light, Dark, Sepia and Night, remembered between sessions and independent of your OS setting. The popup follows your OS light/dark setting.
- Read aloud: text-to-speech that advances page by page using a locally installed browser voice. Network speech voices are excluded.
- Saving:
Ctrl+Swrites annotations, signatures and form values back into the file and downloads it; the Download button saves the untouched original.
Page tools preserve current annotations, form values and page labels. When reordering, deleting or merging pages in the viewer, bookmarks follow retained pages. PNG exports include current annotations and form values and follow the selected page rotation. Opening a corrupt PDF or cancelling its password prompt keeps your current document open.
- Download the latest release
.zipfrom the Releases page. - Unzip it into a folder on your computer.
- Open Google Chrome and go to
chrome://extensions/. - Turn on Developer mode in the top-right corner.
- Click Load unpacked and select the folder you unzipped.
- The extension is installed. Open any PDF link, drag a PDF onto the browser, or use the toolbar icon → Open Local PDF.
chmod +x build.sh && ./build.shThe version is read from manifest.json, so the archive name can never drift from the manifest. The
script excludes development files such as .git and source maps. Both build scripts work from any
working directory and replace the previous archive only after packaging succeeds.
Run node scripts/verify.mjs with Node.js 22+ and native Chrome installed. Set CHROME_BIN if Chrome
is not at /usr/bin/google-chrome-stable. This optional regression check uses an isolated, temporary
Chrome profile and generated PDFs; it needs no package install. It checks saving, form/annotation
preservation, page tools, popup handoffs, navigation, relay limits, and dialog/keyboard behavior.
It disables newer JavaScript APIs in the page and PDF workers to exercise Chrome 123 compatibility
paths on current Chrome. The script and its fixtures are excluded from release archives.
The suite includes a synthetic encrypted PDF with the test password audit-password. To check ZIP
contents, asset references and failed-build recovery after building, run python3 scripts/verify-release.py.
This extension requests the minimum permissions it needs:
| Permission | Purpose |
|---|---|
webNavigation |
Notice a top-level navigation whose URL ends in .pdf and rewrite that tab to the viewer |
contextMenus |
Add "Open with Freedom PDF Viewer" to the right-click menu for PDF links |
file:///* (host permission) |
Read a local PDF you open or drag into Chrome |
http://*/*, https://*/* (host permissions) |
See a navigation's URL and retrieve the PDF it points at, on any site |
Note: The extension does not request the
tabspermission, and it has no analytics, telemetry, or third-party servers. See PRIVACY.md for exactly what is handled and what is stored.
Local files: Chrome disables file:// access for extensions until you turn on Allow access to
file URLs under the extension's details on chrome://extensions. You only need it for PDFs opened
from the address bar or a file manager — picking a file from the popup, or dragging it onto an open
viewer window, works without it.
Chrome Web Store: Broad http(s)://*/* access is required so the extension can act as a PDF
handler for links on any site. See STORE_SUBMISSION.md for the reviewer-facing
wording.
Browser version: The viewer stylesheet uses light-dark() and related modern CSS, and the manifest
declares "minimum_chrome_version": "123". Older Chromium builds will refuse to install the
extension.
Contributions, issues, and feature requests are welcome. Feel free to check the issues page if you want to contribute.
This project is licensed under the MIT License - see the LICENSE file for details.
This project utilizes PDF.js by Mozilla, which is licensed under the Apache License 2.0; its licence text is bundled at pdfjs/LICENSE.