Repository navigation
Releases
v0.8.0
Added
- White is now available in the shared markup palette, including the ink colour picker.
Changed
- The selected ink colour in the palette now has a thick accent ring and a check mark, with
a contrasting dark/light check so it stays visible on every swatch including white. - Document metadata and the outline now load on demand from the resident PDFium handle,
only when the reader first opens the contents or document-information panel. Opening a
document no longer pays for either parse, and the separate PdfPig dependency is gone. - PDFium's native gate is priority-aware: a visible page render is handed the gate before
queued text extraction, link loading, or search work. A long search now yields between
pages instead of making the visible page wait for the whole scan. - Scrolling and zooming now render new pages at 65% width and use medium-quality bitmap
interpolation; once the reader pauses for 220ms, affected pages refine to the full
target size and high-quality interpolation. - Retired page bitmaps go through a small generation-scoped pool instead of being
reallocated from scratch on every render. When the source and target strides match, the
pixel copy is one bulk block instead of one copy per row. - Page trims now walk a set of pages that actually hold bitmaps, thumbnails track their own
populated set, and text trimming walks the loader's loaded pages. Zoom updates only the
realised page views; scroll layout is computed from page points and the zoom factor.
Long documents no longer scan every page for each turn or zoom tick. - Thumbnails reuse the page's decoded bitmap when it is already available and downscale it
instead of asking PDFium to render the page a second time at thumbnail size. - Large-document searches use PDFium's native text search to reject non-matching pages
before their words and character boxes are materialized. Search progress updates are
throttled to 100ms instead of posting once per page. - Queued page renders are coalesced by document/page/kind, so a newer request supersedes
an older queued render instead of making the worker execute stale pages first.
Fixed
- Indeterminate progress bars now only animate while their operation is active. The busy
overlay's spinner had continued repainting the hidden welcome screen after a document
finished opening, keeping one CPU core busy until the window was minimised. Page,
thumbnail, and search spinners are gated the same way. - Toolbar clicks are no longer mistaken for text-selection presses when a page is scrolled
partly behind the toolbar. Position-based page hit-testing is now clipped to the page
list bounds, and a selection press must originate inside a page view. - Search previous/next controls stay hidden until a search returns results and while a
search is running, so the loading bar no longer overlaps them.
Full Changelog: https://github.com/RyzenWang/AirPDF/blob/v0.8.0/CHANGELOG.md
v0.7.0
AirPDF 0.7.0
Tabs became a workspace: they can be dragged into a new order, the strip scrolls itself when a tab is held near either edge, and a right-click closes one tab or every other one. A tray icon keeps reading sessions alive while the window is hidden, and the Windows titlebar opens the native system menu on right-click or Alt+Space. Text selection is character-granular, and the arrow keys scroll a small step instead of turning a whole page.
- Drag tabs to reorder them; holding one near either edge auto-scrolls the strip and tabs slide into place instead of snapping.
- Right-click a tab for Close tab and Close other tabs, both behind the existing unsaved-changes confirmation.
- A system tray icon restores, hides, or opens a window; Hide to tray keeps documents open, and closing a window still exits.
- The Windows custom titlebar opens the native window menu on right-click and Alt+Space, and its caption buttons dim while the window is inactive.
- Text selection is character-granular: a drag copies exactly what was highlighted, while double-click still takes a whole word. Each word keeps the box of every character PDFium reported, and adjacent characters are merged into runs before painting, so a highlight stays a few rectangles rather than one per glyph.
- The arrow keys scroll a small step, Home and End jump to the start and end of the document, and Page Up / Page Down still scroll a screen.
- Page navigation moved to the far left of the toolbar, aligned with the thumbnail rail.
- The app icon is the orange brand tile, regenerated for Windows, macOS, Linux and the Store artwork.
- 272 tests pass (116 Core, 156 App), and the Windows, Linux and macOS builds are NativeAOT.
Known limitations: the installers remain withheld while the builds are unsigned, so Windows and macOS get portable archives. A document that is only page images still has no text layer, so selection and search find nothing in it until OCR support lands.
v0.6.0
AirPDF 0.6.0
The Windows titlebar now lives in the 44px workspace bar, together with the brand, Open, document tabs and window controls. Tabs use the warm active pill, the new-tab button follows the last tab and pins to the visible edge during overflow, and Windows 11 Snap Layouts work on the custom maximize button. macOS and Linux keep their native decorations.
- Unified workspace/tab bar with light, dark and high-contrast tab states.
- Custom Windows titlebar with drag region and minimise, maximise/restore and close controls.
- HTMAXBUTTON hit testing restores Windows 11 Snap Layouts; hover state is preserved.
- New-tab button follows the last tab and pins at overflow.
- 4px tab-strip scrollbar and vertically centred fit-width icon.
- 221 tests pass; Linux x64 and macOS arm64 cross-builds succeed.
Known limitations: the titlebar system menu is not wired, and inactive-window caption dimming is pending. Unsigned installers remain withheld by the release workflow.
v0.5.0
AirPDF 0.5.0
Annotation tools arrive in full: ink, sticky notes, an eraser, colour palettes, and a thickness
control, with undo and redo covering all of them.
- Draw with Ctrl+Shift+K or the pen. The stroke under the pointer is the colour and thickness it
will keep; the arrow beside the pen opens the colours and a live thickness sample. - Erase any markup with the eraser: one drag is one undo step. Esc leaves the eraser as well as
the pen. - Add sticky notes and remove annotations from the page menu; click a note to read it.
- The pen and its palette arrow form one control, with the current colour under the nib.
- Undo and redo keep the last 100 markup edits and restore the exact colour of erased highlights
and strokes instead of bringing them back black. - Text selection, drawing, and erasing are mutually exclusive; switching to a tool clears the
selection. - One PDF is one tab: opening a file that is already open focuses its tab, so saving no longer
fails because a second session holds the file. - Closing a tab reliably returns to Home, and reopening the same file from the recent list
renders its pages at the remembered position instead of showing a blank document.
Unsigned Windows and macOS installers stay withheld; Windows uses the Microsoft Store, and macOS
and Linux ship portable archives.
202 tests pass.
v0.4.0
AirPDF 0.4.0
Windows builds are now in the Microsoft Store:
https://apps.microsoft.com/detail/9pnsx3223qh1
That is the recommended way to install on Windows: updates arrive through the Store, and no
unsigned installer has to be downloaded. macOS and Linux keep their portable archives.
Annotations
- Highlight any selection with Ctrl+Shift+H, remove a highlight from the page menu, and take back
either with Ctrl+Z. Redo arrived with it - Ctrl+Y, plus buttons in the toolbar for both. - Ctrl+S now saves into the document you opened. It writes a temporary file beside the original,
swaps it in, and reopens it, because PDFium reads through an open stream that has to be closed
before the file can be replaced. Ctrl+Shift+S is Save as. - A save that cannot replace the file no longer takes the document with it: a read-only or busy
file is detected before the session is closed, so the reader keeps working and is told why.
Reading
- The welcome screen is the first tab, so the strip exists from the first document and going home
no longer closes what you were reading. - The logo and wordmark form one button back to it, and a document already open in another tab is
focused rather than opened twice when you click one of its bookmarks from Home. - Bookmarks can be renamed and dragged into the order you want.
- The toolbar's zoom controls are one size, and undo/redo sit with the navigation icons.
Fixes
- A highlight stayed invisible until the document was saved and reopened, because the page already
had a bitmap at that width and the re-render was skipped. - Switching tabs no longer leaves the previous document's pages active.
- Scrolling after a tab switch no longer overflows the stack.
Windows installers and the macOS .pkg stay withheld while the builds are unsigned. Use the Store
for Windows, or the portable archives for macOS and Linux.
167 tests pass on Windows, Linux and macOS.
v0.3.2
AirPDF 0.3.2
Every platform is compiled ahead of time now: Linux and macOS join Windows, so the reader
starts almost immediately wherever you run it.
Downloads
These builds are unsigned, so the installers are not offered here: SmartScreen and Gatekeeper
would block the first launch, and that reads as a fault in the reader rather than in its
distribution. Use the portable packages instead:
- Windows x64:
AirPDF-win-Portable.zip— unzip anywhere and runAirPdf.exe - macOS arm64 / x64:
AirPDF-osx-<arch>-Portable.zip— unzip and dragAirPDF.appto Applications - Linux x64:
AirPDF-0.3.2-linux-x64.tar.gz
The first launch may still need More info → Run anyway on Windows, or right-click → Open on
macOS. The installers return once a signing certificate is configured.
Startup
- Windows, Linux and macOS builds are all NativeAOT. On Windows that took the time to first
window from 5.0 s to 0.7 s; Linux and macOS share the same runtime and the same cause,
which was JIT compilation spread across Avalonia initialisation, XAML loading and first
layout rather than one slow call. - Downloads follow the build: Windows and macOS ship a Velopack portable package, Linux ships
a tar.gz of the AOT output.
Under the hood
- Each platform is built and gated separately, because Windows says nothing about Linux or
macOS: different toolchains, different native assets. The Linux job installs clang and
zlib1g-dev; macOS uses the Xcode toolchain on the runner. - A release or pull request fails on any AOT warning, on a missing binary, or on an output
that is far larger than expected. A build that lost a reflection path still starts and then
misbehaves at run time, which is how a trimmed build once stopped writing settings.
v0.3.1
AirPDF 0.3.1
The Windows build is compiled ahead of time, so the reader starts almost immediately.
Startup
- Time to first window on Windows is now 0.7 s, down from 5.0 s. Nothing is compiled at
startup any more. The old cost was spread evenly across Avalonia initialisation, XAML
loading and first layout rather than sitting in one slow call, which is why this needed
ahead-of-time compilation rather than tuning. - The download grows from 33.4 MB to 35.0 MB. The uncompressed output is larger (60 MB
against 28 MB), but Velopack compresses the payload.
Under the hood
- The Windows release and every pull request now build with NativeAOT and fail on any AOT or
trimming warning, because either can remove a reflection path that only fails at runtime.
A trimmed build once stopped writing the settings file exactly that way. - Velopack is no longer rooted for trimming. Rooting it made the AOT compiler compile a COM
shortcut class whose IL cannot be compiled, which warned that it would always throw; the
app never reaches that code, and leaving it trimmable removes the warning and 1.1 MB. - The update path is verified on the AOT build rather than assumed: feed parsing, download
and package unpacking all work. - macOS and Linux builds are unchanged for this release.
v0.3.0
AirPDF 0.3.0
Rotated pages
- Rotated pages now work end to end. Links, search highlights and text selection used to
do nothing on a page with a non-zero /Rotate; all three are supported now, at 90, 180
and 270 degrees. - The fix is a shared page-space to display-space transform plus a text layer that reports
characters in reading order, verified by rendering rotated fixtures and checking that
each computed rectangle covers the ink that was drawn.
Reading
- The text layer is read through PDFium instead of PdfPig, using the same document handle
the pages are rendered from. PdfPig applied /Rotate to its letters before grouping them,
so a quarter turn came back as single letters and a half turn as reversed text. - Chinese and Japanese text keeps per-character selection, and searching for a multi
character CJK term no longer fails because spaces were inserted between characters. - PdfPig still supplies document metadata and the bookmark outline.
Packaging
- The Windows download is roughly halved: 53 MB to 28 MB, by publishing trimmed. The
release step fails on any trimming warning instead of shipping a build whose reflection
paths were removed, and the same check runs on every pull request. - macOS and Linux are unchanged for this release.
Under the hood
- Settings are serialized through a source-generated context, the search whitespace
matcher is a generated regex, and every XAML binding is compiled. Trimming and NativeAOT
analysis now reports no warnings for the whole solution. - 90 tests, up from 52.
AirPDF 0.2.1
A packaging release. The application binaries are unchanged from 0.2.0; this version ships the signing tooling and makes the release pipeline state explicit.
Downloads
| Platform | Package |
|---|---|
| Windows x64 | AirPDF-win-Portable.zip — unzip and run AirPdf.exe |
| macOS Apple Silicon | Portable zip — unzip and drag the app to Applications |
| macOS Intel | Portable zip — unzip and drag the app to Applications |
| Linux x64 | AirPDF-0.2.1-linux-x64.tar.gz |
The installers were withdrawn on 3 November 2026: these builds are unsigned, and SmartScreen and Gatekeeper block an unsigned first launch, which reads as a fault in the reader. The portable packages above are the same build. The first launch may need More info → Run anyway on Windows, or right-click → Open on macOS.
Installed Windows and macOS builds update themselves: they check this release channel, download in the background, and offer Restart to update. Portable and source builds do not self-update.
What changed
packaging/signing/Set-SigningSecrets.ps1validates a code-signing certificate (private key, Code Signing extended key usage, expiry) and uploads it as the repository secrets the release workflow consumes.packaging/signing/New-TestCertificate.ps1mints a throwaway certificate so the signing path can be exercised without a purchased one.- A Signing check workflow verifies the configured credentials without publishing anything.
- The release workflow now fails when signing is half configured instead of silently shipping an unsigned build, and states the signing outcome in the run summary.
docs/SIGNING.mddocuments certificate acquisition, secret names, verification, rotation, and cost.
The reading experience is unchanged: packages still bring PDFium rendering, search, text selection, reading position memory, tabs, multiple windows, links, and English/Simplified Chinese.
Code signing status
These builds are unsigned. No Windows or Apple signing credentials are configured in this repository yet, so:
- Windows SmartScreen will warn about an unknown publisher until the file builds reputation.
- macOS Gatekeeper blocks the
.pkg/.appon other machines. Right-click → Open, orxattr -dr com.apple.quarantineon the app, works around it locally.
The pipeline is ready and verified; see docs/SIGNING.md to add credentials.
Verification
- Core and headless UI tests: 52/52 passing
- CI: Windows, Ubuntu, and macOS green
- Release workflow: all four platform packages built and attached, including the
releases.*.jsonmanifests the in-app updater reads - Signing check: passes with a throwaway certificate, confirming the signing path works end to end
Full changelog: CHANGELOG.md