dodo — a fast, no-nonsense PDF reader for Linux

For almost a year now, I’ve been working on a side project called dodo — a PDF reader built specifically to scratch an itch I couldn’t get rid of on Linux.



Yes, there’s Okular. It’s powerful, but bloated, and the UI often feels more like it’s fighting you than helping you.
Then there’s Sioyek — fast, keyboard-driven, and honestly excellent — except it’s still based on Qt5, and Qt6 is very much the present (and future).

So I did what any stubborn developer would do: I wrote my own.


Tech stack (and why)

  • MuPDF as the rendering core
    Fast, battle-tested, and brutally efficient. Exactly what a PDF engine should be.

  • Qt6 for the GUI
    I’ve been working with Qt for nearly a decade. I know its strengths, its quirks, and where it shines. Qt6 gives me modern rendering, better input handling, and a cleaner future path.

As of today:

  • ~830 commits

  • ~10k lines of C++ (excluding Qt6, MuPDF, SyncTeX, and third-party libs)

This isn’t a toy project anymore.


What makes dodo different

1. Almost everything is asynchronous

Page rendering, link extraction, annotations — none of it blocks the UI thread. The result is simple: dodo feels fast, even on large or ugly PDFs.

2. Multiple viewing layouts


You can switch between:

  • Single page

  • Left-to-right

  • Top-to-bottom

No hacks, no weird edge cases — just proper layout support.

3. Essential annotations (done right)

No annotation overload. Just the ones that actually matter:

  • Text highlights

  • Popup annotations

  • Rectangle annotations

4. Full SyncTeX support



If you work with LaTeX, this is non-negotiable. Jump seamlessly between your source and the rendered PDF. It works, and it works reliably.

5. Configuration-first design

dodo is configured using TOML, not a bloated settings dialog. You can change almost all of the settings to your liking, define keybindings for all of the actions.

 

Why? Because configuration files are:

  • Faster to edit

  • Easier to version-control

  • More transparent than clicking through menus

Almost everything in dodo is configurable, and that’s intentional.

6. Jump Marker (yes, this should be standard)

When you click an internal link, dodo briefly highlights the destination with a rectangular marker.

Once you use this, you’ll immediately notice how disorienting every other PDF reader feels without it.

7. Search hits in the scrollbar

Search results are visualized directly in the scrollbar — the same way modern editors and browsers do it.
This gives you instant spatial awareness of where matches are in the document.

8. Modern Linux support

dodo is built with modern Linux setups in mind:

  • Native Wayland support

  • Dark mode

  • High-DPI awareness (with configurable DPR handling)

  • Session restoration (tabs and files are restored on launch)

If something looks blurry, that’s usually a DPI mismatch — and yes, you can fix it explicitly.


What’s next?

There’s more coming. Performance refinements, usability improvements, and a few features I still haven’t seen done properly in other readers.

If you’re curious, check out TODO.md in the repository to see what I’m working on next.


Final thoughts

dodo exists because I wanted a PDF reader that:

  • Stays fast no matter the document

  • Doesn’t fight my workflow

  • Respects configuration and keyboard usage

  • Works properly on modern Linux systems

If that sounds like what you’ve been missing, dodo might be worth a look.

The repository is public, issues and pull requests are welcome, and feedback — especially from power users — is genuinely useful.

Comments