Releases: ekoori/NoPDF
Release list
noPDF v0.0.5-beta.00
noPDF release notes
Version scheme v0.0.X-beta.YY: X is the public release line, YY the
local build number (raised on every build). Public releases are cut with
scripts/release.ps1 -Publish, which bumps X, resets YY to 00, and
publishes v0.0.X-beta.00 to GitHub. Newest first.
Unreleased (0.0.5 line)
Nothing yet.
v0.0.5-beta.00 - 2026-07-20
-
noPDF is now MIT licensed (
LICENSE), and every bundled component's notice ships with
the binaries.THIRD-PARTY-NOTICES.mdcovers PDFium (BSD-3-Clause, via the Apache-2.0
PDFiumCore bindings and prebuilt native libraries), PDFsharp, Avalonia, SharpCompress,
YamlDotNet, CommunityToolkit.Mvvm, System.Drawing.Common, the vendored DjvuNet, and the Inter
font (SIL Open Font License 1.1); the release script copies it andLICENSEintoRelease/
and now fails rather than producing a release without them. The vendored DjvuNet's own MIT
notice — dropped in error when it was vendored — is restored, andVENDORING.mdrecords what
was modified locally and how to re-vendor from upstream. -
New documents and blank pages.
:newfileopens an empty document in a new tab, at the
size set bydefault_page_sizein config.yaml (A4 unless you change it); it lives in memory
until the first:save, which asks where to put it.:newpage [size]adds a blank page
after the current one —a4,a3,a5,letterorlegal, anlsuffix for landscape
(a4l), or millimetres asWxH(200x150). With no size it matches the page you're on. -
:flattenbakes annotations and filled form fields into the page content, so they stop
being separate objects that can be selected, moved or deleted. It draws each annotation's own
appearance, so a flattened page renders identically to the unflattened one. It's undoable
until you save; note that it rewrites page content, so it does invalidate any existing
signature — the status bar says so when that applies. -
DjVu opens with no external tool. A pure-managed DjVu decoder (the vendored, MIT-licensed
DjvuNet,src/third_party/DjvuNet) is built in, so
.djvu/.djvfiles work out of the box on every platform — no more "install DjVuLibre".
If it ever meets a DjVu variant it can't handle, it still falls back to a bundled or
installedddjvu. -
DjVu renders correctly on photographic scans. Illuminated books and scanned plates came
out as colour negatives, most pages came out blank, and double-page spreads came out
narrower than single leaves. Colours are no longer wrongly inverted; render resolution is
chosen from the factors the decoder can actually deliver (the wrong one silently produced a
blank page); and page size now follows the DjVu's own dimensions and DPI rather than
whatever resolution a page happened to be rendered at. -
Plain scanned DjVu opens at all. Bitonal documents — a JB2 mask with no colour layer,
which is most scanned text — failed outright with "could not decode". They now render from
the mask, box-filtered down so shrunken text stays antialiased and readable instead of
losing strokes. -
Converted documents are remembered. The PDF that a DjVu or comic archive is converted
into is cached in the temp folder, so reopening a book is instant rather than a full
re-decode. An entry is keyed to the source's size and timestamp, so editing or replacing the
original re-converts rather than serving a stale copy; entries expire after 30 days and the
cache is capped at 2 GB. -
Conversion reports progress, and pages appear as they are converted. The status bar shows
both phases —Decoding … page N of Mand thenBuilding … page N of M, which matters
because assembling the PDF is about half the wait. The document also lays itself out as soon
as the page geometry is known and fills each page in as it is decoded, so a long scan is
readable from the first page instead of showing nothing until the end. Nothing scrolls or
steals focus while this happens, and it costs no extra conversion time. The tab opens
straight away and fills in, rather than appearing only once the whole file is converted. -
Any page can be the current one in a multi-page-across view. With
:view scroll 2(or
scrollh), the current page was pinned to the first column: an even page could never be
focused,:page 2was undone as soon as it scrolled, and:newpagecould only insert after
an odd page. Scrolling now only moves the current page when it reaches a different row, and
clicking a page makes it current. -
The command line opens over the document, not above it. It and the which-key hint were
docked below the viewport, so opening the command line shrank the page area and the panels
and re-laid-out the document underneath you. They now float over the bottom of the view. -
The window can be dragged by its chrome. With the title bar hidden, the status bar and
the side panels now move the window too — anywhere that isn't a button, list, text box or
scrollbar. Double-clicking those areas maximises and restores, as the tab strip already did. -
DjVu opens several times faster, in a fraction of the memory. Pages decode in parallel,
the file is read once instead of per worker (which matters on network/cloud-mounted
libraries), and photographic pages are stored as JPEG rather than PNG. A 37-page illuminated
book went from ~9s and a 52 MB document to ~4.5s and 6 MB. Bitonal text pages stay PNG. -
Smoother zooming. Zoom (wheel or command) now resizes the pages and re-anchors the
scroll in a single layout pass, instead of resizing and then jumping a frame later — no
more jitter. Command zoom (:zoom,zi/zo) keeps the viewport centre put.
v0.0.4-beta.00 - 2026-07-18
-
Editing a signed document is now clearly flagged. Verification says "INVALID — the
document was changed after it was signed" (red) instead of the softer "cannot verify",
and the signatures panel re-checks itself after a save, so it no longer keeps showing
a stale "valid" once you've edited and saved the file. -
Switching tabs keeps each document where you left it — the scroll position and page no
longer reset to page 1. (The shared scroll viewer resets to 0 during the swap, and that
was overwriting the incoming tab's remembered position before it could be restored.) -
Smoother zooming. Pages now resize together and instantly (the shown image scales),
with the crisp re-render deferred until zooming settles — instead of each page popping
back in one at a time, which read as jittery. -
After certifying with a certificate, the tab switches to the signed file, so you're
looking at and working on what was actually written and signed. -
:viewis per tab again. The page view is recycled between tabs, and only the first
display of a document applied its mode — so a:viewcommand appeared to change every
tab, and switching around left documents in each other's layouts. Each tab now re-asserts
its own mode and scroll position when it comes forward. -
The signature watermark is visible again. It was being drawn at ~13% opacity (the
stored mask peaks at 33/255), which is invisible on white; it's now normalised to a
readable watermark. It also stretches to the signature frame instead of sitting in a
square at the left. -
Signature stamps show in other viewers. The stamp carried a custom
/Name, which on
a stamp annotation names a predefined icon; viewers that honour it over the appearance
stream drew nothing. Dropped — the appearance stream is authoritative. -
A signed document can be edited and saved again. It always could, but a failed save
said nothing at all —:saveswallowed the error and left the tab looking saved when
nothing had been written. Failures are now reported and the tab stays dirty. Editing a
signed file naturally invalidates its signature;:siglistsays so plainly rather than
pretending otherwise. -
The signature stamp's logo keeps its shape (centred, no longer stretched) and is
drawn at ~50% opacity, while the name, reason and date scale to the frame you draw. -
Ctrl+Zundoes your typing inside a form field. PDFium keeps an edit history per
field, so undo/redo now goes there while a field is focused and back to the document's
own history once you leave it — one doesn't consume the other. -
The print dialog has a preset dropdown. Pick a saved preset to load its settings, and
edit its name right there (renaming saves it as a new preset). -
Each release ships the default
config.yamlnext to the binaries — the fully
commented one, generated from the live command list. -
Docs split: README.md is now for using noPDF; everything about building,
the architecture and cutting releases moved to CONTRIBUTE.md. -
Fill in PDF forms. View mode (
:hand) is now also form mode: click a field — or press
fand type its label, since hints now cover form fields as well as links — and type.
With the mouse you can click to place the caret, drag to select text inside a field, and
toggle checkboxes/radios; the pointer shows an I-beam over a field and no longer pans the
page when you click one. Backspace/Delete/arrows/Home/End/Tab work,Ctrl+Ccopies a
field's selection, Esc leaves the field, and clicking away commits it. Filled values
are saved into the file (they live inside PDFium until then, so they're folded back in on
save, and before any page operation). Signature fields aren't offered for typing — those
are for:sign. -
:w <file>re-points the tab at the file it just wrote, so:save,:copypathand
the session all follow the new file instead of the one you sav...
noPDF v0.0.4-beta.00
noPDF release notes
Version scheme v0.0.X-beta.YY: X is the public release line, YY the
local build number (raised on every build). Public releases are cut with
scripts/release.ps1 -Publish, which bumps X, resets YY to 00, and
publishes v0.0.X-beta.00 to GitHub. Newest first.
Unreleased (0.0.4 line)
Nothing yet.
v0.0.4-beta.00 - 2026-07-18
-
Editing a signed document is now clearly flagged. Verification says "INVALID — the
document was changed after it was signed" (red) instead of the softer "cannot verify",
and the signatures panel re-checks itself after a save, so it no longer keeps showing
a stale "valid" once you've edited and saved the file. -
Switching tabs keeps each document where you left it — the scroll position and page no
longer reset to page 1. (The shared scroll viewer resets to 0 during the swap, and that
was overwriting the incoming tab's remembered position before it could be restored.) -
Smoother zooming. Pages now resize together and instantly (the shown image scales),
with the crisp re-render deferred until zooming settles — instead of each page popping
back in one at a time, which read as jittery. -
After certifying with a certificate, the tab switches to the signed file, so you're
looking at and working on what was actually written and signed. -
:viewis per tab again. The page view is recycled between tabs, and only the first
display of a document applied its mode — so a:viewcommand appeared to change every
tab, and switching around left documents in each other's layouts. Each tab now re-asserts
its own mode and scroll position when it comes forward. -
The signature watermark is visible again. It was being drawn at ~13% opacity (the
stored mask peaks at 33/255), which is invisible on white; it's now normalised to a
readable watermark. It also stretches to the signature frame instead of sitting in a
square at the left. -
Signature stamps show in other viewers. The stamp carried a custom
/Name, which on
a stamp annotation names a predefined icon; viewers that honour it over the appearance
stream drew nothing. Dropped — the appearance stream is authoritative. -
A signed document can be edited and saved again. It always could, but a failed save
said nothing at all —:saveswallowed the error and left the tab looking saved when
nothing had been written. Failures are now reported and the tab stays dirty. Editing a
signed file naturally invalidates its signature;:siglistsays so plainly rather than
pretending otherwise. -
The signature stamp's logo keeps its shape (centred, no longer stretched) and is
drawn at ~50% opacity, while the name, reason and date scale to the frame you draw. -
Ctrl+Zundoes your typing inside a form field. PDFium keeps an edit history per
field, so undo/redo now goes there while a field is focused and back to the document's
own history once you leave it — one doesn't consume the other. -
The print dialog has a preset dropdown. Pick a saved preset to load its settings, and
edit its name right there (renaming saves it as a new preset). -
Each release ships the default
config.yamlnext to the binaries — the fully
commented one, generated from the live command list. -
Docs split: README.md is now for using noPDF; everything about building,
the architecture and cutting releases moved to CONTRIBUTE.md. -
Fill in PDF forms. View mode (
:hand) is now also form mode: click a field — or press
fand type its label, since hints now cover form fields as well as links — and type.
With the mouse you can click to place the caret, drag to select text inside a field, and
toggle checkboxes/radios; the pointer shows an I-beam over a field and no longer pans the
page when you click one. Backspace/Delete/arrows/Home/End/Tab work,Ctrl+Ccopies a
field's selection, Esc leaves the field, and clicking away commits it. Filled values
are saved into the file (they live inside PDFium until then, so they're folded back in on
save, and before any page operation). Signature fields aren't offered for typing — those
are for:sign. -
:w <file>re-points the tab at the file it just wrote, so:save,:copypathand
the session all follow the new file instead of the one you saved away from. -
:view scroll N/:view scrollh Nstay centred when you zoom instead of drifting to
the left/top edge. -
:page nextworks in:view scrollh. Pages are reached sideways in that view, but it
was aligning them vertically (so nothing moved) and tracking the current page by vertical
position (so it never changed as you scrolled across). -
Print presets replace the single set of print defaults.
:printdialogcan save its
choices as a named preset;:print <name>uses one, a bare:printuses whichever is
marked default, and:printpreset [list | default <name> | del <name>]manages them. -
Signature verification reads externally-signed PDFs properly. The CMS is now taken
from the/Contentsstring rather than the byte-range gap, so every signer and signing
time is read even when a file's byte ranges are malformed (e.g. a document signed by
several people with a tool that rewrites the whole file each save). The signing time
falls back to the signature dictionary's/Mdate when the CMS carries none, and a
signature whose byte range doesn't line up is reported as "cannot verify — re-saved after
signing" instead of a bogus "invalid". -
Form fields and signature stamps now render. noPDF drew pages without their widget
annotations, so AcroForm content — text/checkbox/radio/list/button fields, and the visible
"Digitally signed by …" stamps — was simply missing. Pages now get PDFium's form pass
(FPDF_FFLDraw) on top of the page render, which is the only way those are drawn. Fields
appear exactly as the document authors them (no viewer-added highlight wash). Filling
fields in is still read-only for now — this is the display half. -
:view scroll Nno longer overlaps pages or leaves odd gaps when you zoom. The
columns are sized to the pages at the current zoom (like the horizontal-scroll rows), so
zooming grows them and scrolls rather than letting them collide. -
Zoom commands keep the page you're on —
:zoom in/out/<pct>(andzi/zo) re-centre
the current page instead of jumping elsewhere. -
:view fullis now zoomable. Pages are laid out at their real size instead of being
capped to the viewport, so:zoomvisibly resizes them and you can pan a zoomed page;
a hand-set zoom also survives the command bar opening (it used to snap back to fit). -
:printdialogalways failed with "object reference not set to an instance of an
object". The dialog hand-wrote anInitializeComponent, which won overload resolution
over Avalonia's generated one — the only one that wires up the named controls, so they
were all null. A bad page range now says so instead of quietly printing everything. -
Annotation groups are saved in the PDF (under a private
/NoPdfGroupkey other
viewers ignore), nesting included — they used to live only in memory and were lost on
save. Groups now also show in the annotations panel as a header with their members
nested underneath. -
:siglistverifies signatures instead of just counting them, and lists them at the
bottom of the signatures panel: signer, time, whether the signed bytes are unchanged,
and whether the certificate chains to a trusted root (a self-signed one reads as intact
but untrusted). Signatures noPDF writes now carry a signing time. -
:viewis remembered per file, alongside the zoom and scroll position. -
Every build raises the build number, Debug included, so the version always names the
build you're running rather than skipping a number at release time. -
Deleting an annotation stopped working after a command. Delete is a page key, and
the command bar never handed focus back, so after:saveyou could still drag an
annotation but not delete it. Focus now returns to the page, andDeleteis bound
globally so it works wherever focus happens to be. -
:view scrollhuses the whole viewport height — the rows no longer stop short of
the top and bottom — and once zoomed in you can pan down to see the full page height. -
Changing
:viewkeeps the page you were on instead of jumping back to page 1. -
A newly opened document opens on page 1; it used to inherit the scroll position of
whatever was in the tab before it. -
:reloadre-reads the original file, and drops the cached unsaved edits with it —
otherwise the edits you just discarded came back the next time you opened the file. -
Clicking an annotation in the annotations panel focuses the annotation, not just
its page: the scroll-to-page was landing last and undoing the reveal.
v0.0.3-beta.00 - 2026-07-15
Printing:
:printactually prints. It used to hand the PDF to the default handler's
"print" verb — which is noPDF itself — so it always failed. Pages are now
rasterised and sent to the printer, annotations included. Windows only.- Defaults live in the config (
print_printer,print_copies,print_fit_to_page,
print_grayscale,print_landscape);:printdialogpicks them per-print and
can save the choices back as the:printdefaults.
Commands & docs:
- One command catalogue now drives
:help(a landscape table per menu group:
Command / Aliases / Keys / Description), the config file's comments, and the
status-bar usage hint — so they can't drift apart. :open "path with spaces"works, and:openloads into the current tab.:copypathreports the path it copied.
Session & recovery:
- Autosave: unsaved edits are cached to
%AppData%/NoPdf/autosaveevery
...
noPDF v0.0.3-beta.00
noPDF release notes
Version scheme v0.0.X-beta.YY: X is the public release line, YY the
local build number (raised on every non-debug build). Public releases are cut with
scripts/release.ps1 -Publish, which bumps X, resets YY to 00, and
publishes v0.0.X-beta.00 to GitHub. Newest first.
Unreleased (0.0.3 line)
Nothing yet.
v0.0.3-beta.00 - 2026-07-15
Printing:
:printactually prints. It used to hand the PDF to the default handler's
"print" verb — which is noPDF itself — so it always failed. Pages are now
rasterised and sent to the printer, annotations included. Windows only.- Defaults live in the config (
print_printer,print_copies,print_fit_to_page,
print_grayscale,print_landscape);:printdialogpicks them per-print and
can save the choices back as the:printdefaults.
Commands & docs:
- One command catalogue now drives
:help(a landscape table per menu group:
Command / Aliases / Keys / Description), the config file's comments, and the
status-bar usage hint — so they can't drift apart. :open "path with spaces"works, and:openloads into the current tab.:copypathreports the path it copied.
Session & recovery:
- Autosave: unsaved edits are cached to
%AppData%/NoPdf/autosaveevery
autosave_minutes(default 5, 0 = off) and on exit, then recovered on the next
start — still linked to the original file, so saving writes back to it. - Lazy tabs: restoring a session no longer reads every file up front; a tab
loads the first time you open it.
Tabs, help & bookmarks:
- Opening a file that's already open focuses its tab instead of duplicating it
(paths are normalised; drag-drop / OS-launch / command all agree). :showtabsis now:tabspanel— no args toggles it; position ittop,
bottom,leftorrightof the view.title_buttons_in_tabs(default off)
makes the min/close buttons ride with the panel.:helpopens a real help document in a tab (commands, hotkeys, aliases).:bookmarknow writes into the PDF's outline, so bookmarks are saved in the
file and show up in other viewers; the never-persisted "My bookmarks" list is gone.- Status bar always shows page / pages; the pages panel has a button to jump to
the page shown in the view. - A binding like
o: ":open"pre-fills the command line instead of running it. - Clicking an annotation in the annotations panel focuses that annotation.
- In view mode the cursor becomes a finger over links and a click follows them.
Formats & view:
- Open CBZ/CBR/CB7/CBT comic archives and DjVu documents (converted to PDF on
load; DjVu needs DjVuLibre'sddjvuon PATH). - View modes:
:view scroll [X](vertical scroll, X across),:view full [X]
(only the X page(s) in focus fill the viewport — no other page can appear, at any
zoom; scrolling turns pages) and:view scrollh [X](horizontal scroll, X rows,
filling each column downwards). - The tabs panel can sit top/bottom/left/right, and the top bar collapses when it
would otherwise be an empty strip (title_buttons_in_tabs: true). - Annotations panel (
:annots) listing every annotation; click to jump to it.
Editing & selection:
- Select is the default tool; marquee-select on empty space (drag down = enclose,
drag up = touch). Middle-click a tab to close it. - Nested grouping (group a group; ungroup peels one level). Shift-resize keeps aspect
ratio. Grab-hand cursor while panning.
Editor & navigation:
- Multi-select annotations (shift-click); edit colour/width/font/opacity for the
whole selection at once. - Move the selection together; Shift constrains to one axis, Ctrl+drag
duplicates. - Group / ungroup (
Ctrl+G/Ctrl+Shift+G,:group/:ungroup). - Copy / paste annotation objects (
Ctrl+C/Ctrl+V,:yank/:paste),
shared across tabs. - Paste a clipboard screenshot as a resizable image annotation with an
optional frame and adjustable opacity; baked into the PDF on save. - Follow-links hint mode (
f): label every on-screen link, type the label to
follow it (internal page jumps or web/mail links). - Middle-mouse-button panning; Ctrl+wheel zoom now stays anchored to the cursor.
- Find (
/,n,N) scrolls the match into view.
Signatures & fixes (earlier in the 0.0.2 line):
- Per-signature certificates: a Use certificate toggle with browse/generate
(self-signed.pfx);:sign <alias>selects a preset; type the signing reason
into the stamp and a certified signature prompts to save a signed copy. - Signature stamp logo is transparent and left-aligned.
- Imported markup no longer gets a spurious default frame.
- Closing the last tab returns to the start page.
v0.0.2-beta.00
- Release-process versioning refinements (X/YY scheme) and four-platform build.
v0.0.1-beta.01
- First tagged prerelease. Self-contained single-file binaries for Windows,
Linux, and macOS (Intel + Apple Silicon). Keyboard-driven PDF viewer/editor:
annotations, bookmarks, page ops, visible + cryptographic signatures,
qutebrowser-style command line, theming, session persistence.
noPDF v0.0.2-beta.00
noPDF v0.0.2-beta.00
noPDF v0.0.1-beta.01
noPDF v0.0.1-beta.01 - first tagged prerelease. Self-contained single-file binaries for Windows, Linux, and macOS (Intel + Apple Silicon).