For macOS · iPad · iPhone
DjVuReader
A native Apple reader for scanned books, archives, and academic papers in DjVu. Built in SwiftUI, backed by a Rust core. Reads stay on your device — no accounts, no analytics, no third-party trackers.
This is a working preview. The Apple app, live Rust decoder, text search, outline parsing, on-device OCR, annotations, and page rendering are wired together; public beta and App Store review are still release gates.

Real screenshots from the preview build — the pages are decoded on the device by the Rust core, not mocked up.
01Why DjVu, why this reader
The format the archives never left.
DjVu compresses a scanned page by separating what it actually is: sharp black text in one layer, the photographic background in another, a palette for the colour that remains. A 700-page monograph that would be a 400 MB PDF lands in a few dozen megabytes and still resolves the serifs. That is why library scans, mathematical archives, and academic repositories still ship it decades on.
What the format never got is a maintained Apple client. The desktop readers are ports of ports; the mobile ones are ad-funded shells that render a page and stop. We are rebuilding the decoder in Rust under a permissive licence and wrapping it in a SwiftUI app that behaves like the rest of the system — split view, keyboard focus, Dynamic Type, VoiceOver.
- Layered by design
JB2 text masks, IW44 wavelet backgrounds, FGbz colour palettes, and MMR masks are decoded as separate layers and composited — the same way the encoder built the page.
- Structure, not just pixels
Bundled, indirect, and shared-dictionary documents all resolve. The hidden text layer, NAVM outline, thumbnails, and embedded annotations come across as data, not as a flat image.
- A permissive core
The Rust decoder carries no GPL runtime code. DjVuLibre is used only at development time, as an oracle to check the parser against known fixtures.
02Privacy posture
The file does not leave the room.
DjVuReader treats opening a document the way a librarian treats a call slip — the page goes between you and the shelf, and nothing else. No copy is mailed elsewhere. There is no “send report” dropdown that quietly does something else.
The same posture applies to this site. It is statically rendered, served from a CDN, and free of third-party scripts.
- On device
Your DjVu files, page bookmarks, and reading history live on the device you opened them on. The app never uploads them.
- No accounts
There is no sign-in. No email, no Apple ID handoff, no anonymous user identifiers we keep on a server.
- No analytics
No third-party SDKs. No web beacons. No ad networks. No A/B testing service. We do not measure your reading.
- No cookies
This landing page sets no cookies and ships no third-party JavaScript. The only thing it stores is your light/dark preference, in this browser’s local storage.
The Apple app ships a Privacy Manifest declaring no tracking, no tracking domains, and no collected data types. Required Reason API entries are limited to file timestamps, disk space, and user-defaults categories.
Rust decoder · Vision OCR · local storage
Documents · reading state · OCR text · ink annotations
Product lookup, purchase, restore — no document data
No analytics · no accounts · no sync · no ad networks
03Built for Apple
A reader, not a viewer.
Every native control we have today is in the preview build — split view, sidebar, search drawer, page strip, settings, accessibility and Privacy Manifest. The real Rust decoder is wired into that shell; public beta and store submission are separate release gates.
- Document import
Reads your library, not the cloud
Open .djvu and .djv files from Finder, the Files app, AirDrop, or a security-scoped folder. The app declares DjVu as an imported UTType — your files keep their identity outside our app.
- Text & search
Search the page, not just the cover
Pages with an embedded text layer become searchable instantly. Hits show page, line, and a short snippet — Unicode-aware, including CJK substrings.
- Outline
Outline that respects the volume
When a NAVM outline is present, the reader exposes a flattened sidebar with page jumps. Until then the reader is honest: it shows a numeric index instead of guessing chapters.
- Multi-window
Two pages, two windows, one app
Built on NavigationSplitView and prepared for Stage Manager and Mac Catalyst. Open a second window to keep an index page visible while you read.
- Keyboard-first
Built for keyboard hands
Arrow keys page through the document, menu commands expose search and open actions, and non-conflicting reader shortcuts stay discoverable from the system menus.
- Catalyst
macOS that feels like macOS
Catalyst optimised for Mac, not just resized. Window chrome, menu bar, and keyboard focus stay native; the same code runs on iPad with adaptive layout.
04Honest status
What is shipped, what is in progress.
DjVuReader is being built milestone by milestone in public-facing documentation. This table is the same status the engineering team tracks internally — there is no marketing layer between you and the roadmap.
| Capability | Status | ||
|---|---|---|---|
| SwiftUI app shellLibrary, reader, sidebar, search drawer, settings | Library, reader, sidebar, search drawer, settings | Preview supportedNative iPhone, iPad, and Mac Catalyst surfaces | Native iPhone, iPad, and Mac Catalyst surfaces |
| DjVuKit Swift packageDomain models, live FFI client, text search | Domain models, live FFI client, text search | Preview supportedLinks the Rust decoder when DjVuCore.xcframework is present | Links the Rust decoder when DjVuCore.xcframework is present |
| DjVu IFF parser (Rust)Bundled / Indirect / Shared dictionary structure | Bundled / Indirect / Shared dictionary structure | Preview supportedSynthetic, malformed, public, and small wild corpora are gated | Synthetic, malformed, public, and small wild corpora are gated |
| Metadata over FFIpage count, dimensions, dpi, gamma, orientation | page count, dimensions, dpi, gamma, orientation | Preview supportedAvailable through the live Swift client | Available through the live Swift client |
| Text layer (TXTa / TXTz)Per-page text, compressed text, Unicode-aware search | Per-page text, compressed text, Unicode-aware search | Preview supportedBZZ-compressed text is part of the supported MVP set | BZZ-compressed text is part of the supported MVP set |
| Page renderingJB2, IW44, FGbz, FG44, baseline JPEG (BGjp / FGjp), Smmr MMR mask | JB2, IW44, FGbz, FG44, baseline JPEG (BGjp / FGjp), Smmr MMR mask | Preview supportedLive renderer; only non-baseline JPEG sub-variants degrade by design | Live renderer; only non-baseline JPEG sub-variants degrade by design |
| NAVM outlineReal chapter / heading tree | Real chapter / heading tree | Preview supportedBZZ-decoded outline tree with safe fallback | BZZ-decoded outline tree with safe fallback |
| Annotations & thumbnailsANTa / ANTz annotation parsing, TH44 thumbnail pixels | ANTa / ANTz annotation parsing, TH44 thumbnail pixels | Preview supportedParsed into a dedicated channel; thumbnails decode via IW44 | Parsed into a dedicated channel; thumbnails decode via IW44 |
| Selection, OCR & notesText selection / copy, on-device OCR, local highlights & ink | Text selection / copy, on-device OCR, local highlights & ink | Preview supportedVision OCR runs on-device for image-only pages; notes stay on device | Vision OCR runs on-device for image-only pages; notes stay on device |
| Unsupported DjVu chunksNon-baseline JPEG sub-variants in BGjp / FGjp | Non-baseline JPEG sub-variants in BGjp / FGjp | UnsupportedProgressive / arithmetic / lossless / 12-bit / CMYK degrade cleanly | Progressive / arithmetic / lossless / 12-bit / CMYK degrade cleanly |
| App Store / TestFlightPublic download or beta enrolment | Public download or beta enrolment | Release gatePending signed archives, store metadata, screenshots, and beta run | Pending signed archives, store metadata, screenshots, and beta run |
Preview compatibility is tracked under make ci-pr. Public release still requires signed app archives, TestFlight, App Store / Mac App Store review assets, and the documented corpus thresholds. We will not claim support for codecs outside the published support matrix.
05System requirements
Modern Apple, no surprises.
We ship for Sequoia and the iOS 18 generation so we can rely on the new Privacy Manifest, NavigationSplitView, and Mac Catalyst behaviour. We are not stretching across older OS revisions to chase install counts.
- iPhone
- iOS 18 or later
- iPad
- iPadOS 18 or later
- Mac
- macOS 15 (Sequoia) or later · Apple silicon and Intel
- Files
- .djvu, .djv, and bundled DjVu documents in the supported compatibility set.
- Network
- Not required for reading. Purchases and restores use Apple StoreKit.
Pricing posture
Free to read. One unlock, never a subscription.
- The app will be free to download. Read up to three imported documents in full; bundled samples do not use a slot.
- One non-consumable Lifetime Unlock enables an unlimited library, annotations, PDF export, printing, and Read Aloud. No subscription, ads, account, or referral program.
- The App Store will show the final local price. Store availability and price remain release gates.
06Availability
There is no download button here yet.
We would rather show you the gate list than a badge that leads nowhere. When these are green, this section becomes the download section — and not one line before.
- Preview supported
Decoder + app shell
Rust decoder, DjVuKit bridge, and the SwiftUI reader run together on device against the gated corpora.
- Preview supported
Privacy manifest & legal pages
Privacy Manifest, privacy policy, and support page are published and match what the app actually does.
- Release gate
Signed archives
Distribution-signed iOS, iPadOS, and Mac Catalyst archives that pass App Store validation.
- Release gate
Public TestFlight
An external beta with real documents from real libraries, and the crash and feedback loop that comes with it.
- Release gate
Store metadata & screenshots
Real captured screenshots for every device class, final copy, category, age rating, and the confirmed price point.
- Release gate
App Store review
Review passed for both the App Store and the Mac App Store, with a live product URL to put on this page.
No mailing list, no “notify me” form, no account. Nothing on this page collects an address, so the honest answer is: check back, or watch the repository.
07FAQ
What we tell people who ask.
Is this on the App Store?
Not yet. The app has a live Rust decoder and native Apple shell, but public TestFlight, App Store review, and Mac App Store packaging are still release gates. There is no App Store URL, no TestFlight invite, and no download badge on this page on purpose.
Can DjVuReader open every DjVu file today?
Almost. The compatibility set covers bundled DjVu/DjVm structure, shared resources, BZZ-compressed text, NAVM outlines, JB2 masks, IW44 background and foreground layers, FGbz colour palettes, baseline-JPEG layers (BGjp / FGjp), MMR masks (Smmr), thumbnail pixels (TH44), and embedded annotation parsing (ANTa / ANTz). The only deliberately unsupported scope is non-baseline JPEG sub-variants — progressive, arithmetic, lossless, 12-bit, and CMYK — which degrade cleanly instead of failing.
What does the app do with my files?
It opens them with security-scoped access, then copies imported documents into the app’s private local storage so they stay available after relaunch. DjVuReader never uploads or syncs them. On-device OCR and ink annotations stay on the device too. There is no account system, no cloud sync, no telemetry. The Privacy Manifest declares no tracking and no collected data types.
Is there OCR, annotation, or format conversion?
Reading, text selection, on-device OCR, and annotation are in. You can select and copy a page’s text, recognise text on-device with Vision for image-only scans, and mark pages with local highlighter and pen ink that stays on your device. Whole-document Export as PDF is built in — it re-renders every page through the same decoder (ink included) so DjVu books can travel to apps that only read PDF. Beyond that it remains a reader rather than an editor: no DjVu→other-format conversion tooling and no in-place file editing.
Why DjVu, why now?
DjVu is the format many large scanned-book corpora and academic archives still ship in. Existing Apple-platform readers tend to be unmaintained or feel unfinished. We are rebuilding the decoder in Rust under a permissive licence and wrapping it in a SwiftUI app that respects the platform.
What about DjVuLibre and licensing?
DjVuReader does not ship any DjVuLibre code at runtime. DjVuLibre is used only as a development-time oracle to validate the Rust parser against known fixtures. The shipping app and this site contain no GPL runtime code.
Does this site track me?
No. It is a static site with no cookies, no analytics, no third-party scripts, and no remote fonts — every asset is served from this origin. The only thing stored in your browser is the light/dark preference you choose, kept in local storage and never sent anywhere.
Can I follow along?
The repository tracks per-round engineering reports, an architecture decision record log, and an explicit roadmap with acceptance gates. The next observable changes are release-readiness gates: wider corpus confidence, signed archives, public beta, store metadata, screenshots, privacy URLs, and Catalyst packaging.
