Releases: utyagi24/klarpdf
Release list
v0.19.0
What's Changed
- chore: the PR test summary says which suite it is reporting by @utyagi24 in #316
- M131: the release ships the bundle it is named after by @utyagi24 in #317
- docs: the MCP bridge serves any client, on any OS — say so where people read it by @utyagi24 in #318
- M132: the bridge installs on the Python people have, and the README says how by @utyagi24 in #320
- plan: how the bridge gets installed (M133–M136) by @utyagi24 in #321
- M133: packaging/ says which product each file builds by @utyagi24 in #322
- deps: pypdf → 6.17.0 (three parse-DoS CVEs) + M137: the dev lock is compiled off Windows by @utyagi24 in #324
- M134: the wheel installs one top-level name, not four by @utyagi24 in #323
- M135: one distribution on PyPI, pinned like the application it is by @utyagi24 in #325
- docs: the readme ships inside the wheel, so write it for the package by @utyagi24 in #326
- docs: lead the page with the install, not with twenty lines of prose by @utyagi24 in #327
- M136: install.py — needs nothing but a Python by @utyagi24 in #328
- v0.19.0 — the bridge you can actually install by @utyagi24 in #329
Full Changelog: v0.18.0...v0.19.0
v0.18.0
What's Changed
- plan: revise the MCP / Agent Bridge roadmap after a premise review by @utyagi24 in #238
- M38.5: retry the save path's os.replace through a transient lock by @utyagi24 in #239
- Keep a document's structure when a save moves no pages by @utyagi24 in #253
- Fix whole-word search dropping matches next to punctuation by @utyagi24 in #247
- Count a wrapped match as one occurrence, not one per line by @utyagi24 in #249
- Centre a revealed search hit instead of parking it at the window edge by @utyagi24 in #251
- Centre the marked thumbnail in the Pages sidebar too by @utyagi24 in #252
- Fix three defects found by hands-on testing with a real client by @utyagi24 in #246
- M39 ⭐: MCP scaffold + read-only core by @utyagi24 in #240
- M40: transform tools by @utyagi24 in #241
- M41: redaction + encrypted input by @utyagi24 in #242
- M42: MCP dependency lock + packaging by @utyagi24 in #243
- M43: hardening + docs by @utyagi24 in #244
- docs: the M44 verification runbook (RELEASE.md §4) by @utyagi24 in #245
- Verify redact_text covered the query, not just the boxes it chose by @utyagi24 in #248
- Return one search hit per occurrence, with a box per line by @utyagi24 in #250
- M94: the bridge says what it knows (TC-002 open items) by @utyagi24 in #254
- M95: a redaction check that can fail when the matcher is wrong by @utyagi24 in #255
- M96: a neighbouring line no longer vetoes a whole-word match by @utyagi24 in #256
- M97: a region redaction may cover more than one line by @utyagi24 in #257
- M98: report separator variants and over-redaction by @utyagi24 in #258
- plan: schedule M99–M101 (region clip, multi-query, annotation round trip) by @utyagi24 in #259
- M102: the redaction safety net crashed instead of firing by @utyagi24 in #261
- M100: one redaction call, several queries by @utyagi24 in #262
- M99: a region clip on render_page and export_images by @utyagi24 in #260
- M104: the export naming scheme argued with its own feature by @utyagi24 in #264
- M103: what the reply says about what it never looked at by @utyagi24 in #263
- docs: carry open follow-ups, plan M105 + M106, and the rule that made them necessary by @utyagi24 in #265
- M106: an unknown parameter is an error, not a silent no-op by @utyagi24 in #266
- M105: fit the descriptions to the transport, publish the rest as a resource by @utyagi24 in #267
- M107: disclose a redaction that landed inside a longer word by @utyagi24 in #268
- M108: the residual counts said spellings and meant places by @utyagi24 in #269
- M109: a redaction that re-encodes an image says so by @utyagi24 in #270
- plan: re-scope M101 — annotation is a capability, not a redaction pre-step by @utyagi24 in #271
- plan: schedule M110 + M111 — the save cost regression and the export drift by @utyagi24 in #273
- M110: the save's cleanup level follows the route, not the file by @utyagi24 in #275
- M111: Reduced-Size PDF stops returning a file bigger than a plain Save (stacked on #275) by @utyagi24 in #276
- plan: M114 (a mark on one page rewrites all 572), the WSL monitor finding, and the declined Reduce-dpi item by @utyagi24 in #278
- plan: correct the M114 entry, and record that one core has two consumers by @utyagi24 in #279
- plan: M114 — say what the metadata obstacle actually is, in plain terms by @utyagi24 in #280
- M115: the core's PDF engine is declared once, not once per surface by @utyagi24 in #281
- M114: a mark on one page no longer rewrites all 572 by @utyagi24 in #282
- plan: record M101's hold, and the two follow-ups that were only half-written down by @utyagi24 in #283
- M115.1: run the bridge against its own lock by @utyagi24 in #285
- docs: M115.1 is enforced — record it, and how to check it stayed that way by @utyagi24 in #286
- docs: reproducible defects go to GitHub Issues, undecided ones stay in PROGRESS by @utyagi24 in #289
- M116: adding a highlight appends 1,865 bytes instead of rewriting 8.8 MB by @utyagi24 in #287
- docs: M116's follow-up is worse than its entry said — scope it properly by @utyagi24 in #290
- M117: an append writes the mark you added, not the two hundred already there by @utyagi24 in #293
- docs: record the MCP no-socket test gap on native Windows by @utyagi24 in #295
- M101: annotation as a capability — annotate + get_annotations by @utyagi24 in #272
- plan: schedule M112 + M113 — the M101 annotation follow-ups (stacked on #272) by @utyagi24 in #274
- M113: the nine things TC-012 and TC-013 found in M101 by @utyagi24 in #296
- M118: the boundaries M113 stopped one step short of by @utyagi24 in #297
- M120: a shape stops resizing itself on every save by @utyagi24 in #299
- M119: a directory handed to a bridge tool says so on Windows too by @utyagi24 in #298
- M121: Insert Blank Page leaves you looking at the page you made by @utyagi24 in #300
- M122: the no-socket guard stops catching asyncio instead of us by @utyagi24 in #302
- M123: run the Windows half of the suite + pin the skip set on both platforms by @utyagi24 in #303
- M124: a sandbox refusal is not a failure to open a file by @utyagi24 in #305
- M125: a skip says its own name and its own reason by @utyagi24 in #306
- M126: the release check that was written down but never run by @utyagi24 in #307
- docs: a Windows session can pick up M44 without reconstructing it by @utyagi24 in #308
- docs: three corrections the first Windows run of the M44 runbook found by @utyagi24 in #309
- M127: the bundle could not be built on the platform that ships it by @utyagi24 in #310
- M128: the bundle declared a Python requirement no Python could satisfy by @utyagi24 in #312
- M129: the bundle ships the lock it installs from by @utyagi24 in #313
- M130: a test that could not be run in the environment it was written for by @utyagi24 in #314
- release: v0.18.0 — the MCP / Agent Bridge by @utyagi24 in #315
Full Changelog: v0.17.1...v0.18.0
v0.17.1
What's Changed
- M92.6 — the Pages sidebar rolls continuously under the wheel by @utyagi24 in #233
- Bump pypdf 6.14.2 → 6.15.0 — clears two Moderate parse-DoS advisories by @utyagi24 in #235
- docs: reconcile the Dependabot policy with the actual repo settings by @utyagi24 in #236
- Release v0.17.1 — pypdf security patch + the Pages sidebar fix by @utyagi24 in #237
Full Changelog: v0.17.0...v0.17.1
v0.17.0
What's Changed
- M80: Ctrl+wheel zoom, anchored on the pointer by @utyagi24 in #197
- plan: M81–M88 — reading input, render performance, DPI correctness, notes, and four interop bugs by @utyagi24 in #198
- plan: renumber post-R6 milestones into implementation order by @utyagi24 in #199
- M81: notes on text markup — the model, the round-trip, and the data loss it cures by @utyagi24 in #200
- M82: foreign text markup is not a drag target, and stops stealing the press by @utyagi24 in #201
- M83: the annotations tuple is heterogeneous — give geometry one answer by @utyagi24 in #202
- M84: highlights multiply instead of alpha-blending by @utyagi24 in #203
- M85: the current page is the one you can see most of, not the one under a point by @utyagi24 in #204
- M89.4 + two open-path bugs the same testing pass turned up by @utyagi24 in #206
- M86: one geometry change should cost one rasterise by @utyagi24 in #205
- plan: measure M87's premises before building it by @utyagi24 in #207
- M87.2: bound the render cache by bytes, not by page count by @utyagi24 in #208
- M87.1: buy the prefetch band with bytes, not with a page count by @utyagi24 in #209
- M87.3: a render pass costs the band, not the document by @utyagi24 in #210
- M88.1-.4: 100% means physical size, and pixels are the screen's own by @utyagi24 in #211
- M88.6: the zoom range becomes 25%-500% by @utyagi24 in #212
- M88.5: closed as no work required (owner call), completing M88 by @utyagi24 in #213
- M89.1-.3: Home/End, Space paging, and Shift+wheel horizontal pan by @utyagi24 in #214
- M89.6: Ctrl+A selects the whole document, and the repaint rework it needs by @utyagi24 in #216
- M89.5: closed unmerged - the pinch handler is unreachable on Windows by @utyagi24 in #218
- M90: Notes — the interface (M90.1–.4) by @utyagi24 in #219
- M91 plan: whitespace fidelity, glyph legibility, reading position by @utyagi24 in #221
- M91.3: a page counter on the reading bar by @utyagi24 in #224
- M91.1: a text box paints its leading spaces by @utyagi24 in #222
- M91.2: Rotate stops reading as Undo by @utyagi24 in #223
- M91.4: the reading keys stop being eaten - a coasting wheel, the sidebar, and the page counter by @utyagi24 in #225
- M92 plan: mouse-wheel scroll step, measured on the owner's display by @utyagi24 in #226
- M92.1: a mouse-wheel detent moves a defined distance by @utyagi24 in #227
- M92.2: a wheel detent is eased, not teleported by @utyagi24 in #228
- M92.3: bound the coast-mute, so the wheel can never be dead for long by @utyagi24 in #229
- M92.4: take prefetch off the scroll's critical path by @utyagi24 in #230
- M92.5: let the glide land on page 1 instead of restarting into it by @utyagi24 in #231
- Release v0.17.0 — scrolling that behaves by @utyagi24 in #232
Full Changelog: v0.16.2...v0.17.0
v0.16.2
What's Changed
- Reading bar: follow Preview — drop undo/redo, keep a single rotate button by @utyagi24 in #194
- Release v0.16.2 — reading-bar legibility (drop undo/redo + single rotate) by @utyagi24 in #195
- Regenerate README screenshots for the v0.16.2 reading bar by @utyagi24 in #196
Full Changelog: v0.16.1...v0.16.2
v0.16.1
KlarPDF v0.16.1 "Simplify & Read" delivers the R6 UI tranche — the Preview-inspired simplification built on one idea: the app at rest is a viewer; the markup kit is chrome you summon on demand.
This release supersedes v0.16.0, which was tagged but never published: a pre-release audit caught the pypdf advisories below, so R6 ships here as v0.16.1 with the fix included. Changes are shown against the last published release, v0.15.0.
Highlights
- Two-tier toolbar — a calm reading bar at rest; a Markup toggle summons the full markup kit (its visibility is remembered app-wide).
- View modes — Full Screen (F11), Slideshow, and a Two-Page facing layout.
- One gesture-detecting Redact — drag on text for a text redaction, drag elsewhere to rubber-band a block.
- Sticky markup arming — Highlight / Underline / Strike Out / Pen stay armed to mark passage after passage.
- Arrowheads are line style — Arrow folds into Line with none/start/end/both ends, plus a dashed stroke.
- Find bar — Match case + Whole words toggles.
- Annotations sidebar — a tab listing every text mark, click to jump (shown only when the document has marks).
- Right-click a mark to recolour, or add and remove markup layers in place.
- Object editing — arrow-key nudge, text-box width reflow, and a split Line-Styling / Colors / Opacity style menu.
- Simplified sidebar (no title bar, optional tabs on demand) and two search fixes (large-document find-as-you-type; search matches the page's printed text only).
Security
- Bumps pypdf 6.13.3 → 6.14.2, fixing four upstream crafted-PDF denial-of-service advisories (CVE-2026-59935 / 59936 / 59937 / 59938). pypdf is the best-effort fallback engine (PyMuPDF is authoritative and handles text extraction), so exposure was limited and DoS-only.
What's Changed
- fix(viewer): zoom holds the viewport centre instead of drifting to a corner by @utyagi24 in #158
- Plan R6 "Simplify & Read" (M71-M79): Preview-inspired UI simplification by @utyagi24 in #157
- M71: Two-tier toolbar - resting reading bar + summoned markup bar by @utyagi24 in #159
- M72: One Redact tool - the press point picks the gesture by @utyagi24 in #160
- M73: Sticky markup arming - HUS + Pen stay armed across gestures by @utyagi24 in #161
- M74: Arrow ends as line style - Arrow merges into Line, both-ended arrows by @utyagi24 in #162
- M75: Find bar match options - Match case + Whole words toggles by @utyagi24 in #163
- M76: Markup context menu - recolour / add / remove layers in place by @utyagi24 in #164
- M77: Annotations sidebar tab - every mark listed, click to jump by @utyagi24 in #165
- M78: View modes - Full Screen, Slideshow, Two-Page view by @utyagi24 in #166
- M76.1: Markup context menu as Preview's swatch rows - one removal path by @utyagi24 in #167
- M76.2: HUS colours always visible in Markup menu + armed-highlight preview colour by @utyagi24 in #168
- feat: Dashed stroke style for drawn marks (Width menu -> Line Style) by @utyagi24 in #169
- M78.1: slideshow steps rows, wheel steps slides, F11 exits full screen by @utyagi24 in #170
- M75.1: Whole words picks words vs phrase; dead hit verbs disabled by @utyagi24 in #171
- M63.1: remember a signature's transparency settings per image by @utyagi24 in #172
- M63.2: name the recent submenu "Recent Signatures / Images" by @utyagi24 in #173
- M77.1: the Annotations tab lists text markups, not every mark by @utyagi24 in #174
- M79.1: sidebar without a title bar, Pages by default, tabs on demand by @utyagi24 in #175
- M71.1: a page-and-pen icon for the Markup toggle by @utyagi24 in #176
- M79.2: the sidebar's dropped arrow really goes by @utyagi24 in #177
- M79.3: a new mark offers the Annotations tab, never mounts it by @utyagi24 in #178
- docs(R6): plan M78.2–M78.6 — arrow-nudge, text-box width, icon polish, HUS swatches, style split by @utyagi24 in #179
- fix(draw): keep a dashed line's arrowhead solid in the overlay (WYSIWYG) by @utyagi24 in #185
- feat(M78.2): nudge object selection with arrow keys by @utyagi24 in #180
- feat(M78.3): resize text-box width with a right-edge handle (reflow) by @utyagi24 in #181
- feat(M78.4): redraw the Grab / Text Box / Pen markup-bar glyphs by @utyagi24 in #182
- feat(M78.5): make Markup ▾ three arming swatch rows by @utyagi24 in #183
- feat(M78.6): split the markup style button into three by @utyagi24 in #184
- Fix find-as-you-type hanging on a large document (M78.7) by @utyagi24 in #186
- Annotations rows read back what was highlighted, at one page read each (M78.8) by @utyagi24 in #187
- Find toolbar button toggles; Tools menu grouped like the markup bar by @utyagi24 in #189
- Document the search-vs-live-model bugs and the chosen fix (Direction A) by @utyagi24 in #188
- Search matches the page's printed text only (Direction A) by @utyagi24 in #190
- Release v0.16.0 "Simplify & Read" (R6, M71–M79) by @utyagi24 in #191
- Bump pypdf 6.13.3 → 6.14.2 (CVE-2026-59935/36/37/38) by @utyagi24 in #192
- Release v0.16.1 "Simplify & Read" (R6) — supersedes unpublished v0.16.0 by @utyagi24 in #193
Full Changelog: v0.15.0...v0.16.1
v0.15.0
What's Changed
- fix: setuptools 82.0.1 → 83.0.0 in the build lock (PYSEC-2026-3447) by @utyagi24 in #144
- docs: make the audit a release gate, and PR-merge an explicit step by @utyagi24 in #145
- M61: unified content-draw engine (stamps, signatures, watermarks) by @utyagi24 in #146
- M62: stamp, signature & watermark placement UI by @utyagi24 in #147
- M63: image stamp / signature (white-background removal, recent list) by @utyagi24 in #148
- M64: search & redact (review panel, case/whole-word, batched) by @utyagi24 in #149
- M66: foreign-annotation infrastructure + delete by @utyagi24 in #150
- M67: move foreign marks (appearance preserved verbatim) by @utyagi24 in #151
- M68: adopt-on-edit (modeled types, precise degrade warning) by @utyagi24 in #152
- M69: form-field creation (text, checkbox, dropdown) by @utyagi24 in #153
- M69.1: R4 stamp polish — rotation, object menu, font size, sticky style by @utyagi24 in #154
- M69.2–M69.3: watermark fixes, then stamp + watermark merged into one feature by @utyagi24 in #155
- M70: v0.15.0 "Stamp, Sign & Watermark" — version bump + docs by @utyagi24 in #156
Full Changelog: v0.14.0...v0.15.0
v0.14.0
What's Changed
- M56: underline & strikeout — the Highlight text-quad path + the Markup ▾ split-button by @utyagi24 in #130
- M58: pen & shapes tools — draw / move / delete + the Draw ▾ split-button by @utyagi24 in #132
- M59: copy / paste objects — in-process clipboard + focus-routed Ctrl+C/X/V by @utyagi24 in #133
- M59.5: markup colour · width · fill — shared style for underline / strikeout + pen & shapes by @utyagi24 in #134
- M59.6: multi-object selection — Objects mode, marquee + Ctrl-click, group style / move / delete by @utyagi24 in #135
- M59.7: object resize — selection handles, single + group scaling by @utyagi24 in #136
- M59.8: object z-order — Bring to Front / Forward · Send Backward / to Back by @utyagi24 in #137
- M59.9: polish & fidelity — markup palettes, object opacity, layer + scroll fixes by @utyagi24 in #138
- M59.10: markup merges instead of stacking by @utyagi24 in #139
- M59.11: preview paint order follows the model's z-order by @utyagi24 in #140
- M59.12: group copy / cut / paste by @utyagi24 in #141
- M59.13: one dropdown-arrow position for every menu button by @utyagi24 in #142
- v0.14.0: version bump + R3 wrap docs by @utyagi24 in #143
Full Changelog: v0.13.0...v0.14.0
v0.12.0
What's Changed
- docs(release): the AppMutex refusal exit code is not stable by @utyagi24 in #105
- feat(g7): author-email guard, secret ignores, and the decided main ruleset by @utyagi24 in #106
- fix(ci): a failed PR comment must not fail the pytest check by @utyagi24 in #109
- feat(g6): donations via GitHub Sponsors + pre-author the G8 ruleset by @utyagi24 in #107
- feat(brand): themed README hero, real app screenshots, brand badges by @utyagi24 in #108
- chore(packaging): suffix release artifacts with -x64 by @utyagi24 in #110
- docs(g8): record the public flip, correct G7's ruleset premise by @utyagi24 in #111
- docs(g8): close out G8 — social preview verified, repo no longer "private" by @utyagi24 in #112
- docs(readme): correct the headless test count (376 → 414) by @utyagi24 in #114
- fix(tests): stop the headless suite hanging on QPrinter without CUPS by @utyagi24 in #113
- docs(readme): reorganize the home page around a feature inventory by @utyagi24 in #115
- plan: schedule the GUI feature tranche G1-G5 (M45-M70) from the owner decision by @utyagi24 in #116
- fix: restore URI links PyMuPDF's insert_pdf silently drops at save by @utyagi24 in #122
- feat(m45): Outline sidebar + Go to Page (Ctrl+G) by @utyagi24 in #117
- feat(m49): night reading mode by @utyagi24 in #121
- feat(r1): the Tools menu — modes out of View, Rotate into Edit by @utyagi24 in #123
- release: v0.12.0 "Navigate & Polish" (R1, M45–M50) by @utyagi24 in #124
Full Changelog: v0.10.1...v0.12.0
v0.10.1
What's Changed
- docs(release): close the app before uninstalling by @utyagi24 in #101
- fix(icon): app icon spans its canvas (tile); .pdf gets its own document icon by @utyagi24 in #102
- feat(installer): refuse to install or uninstall while KlarPDF is running by @utyagi24 in #103
- release: v0.10.1 — Windows shell-integration patch by @utyagi24 in #104
Full Changelog: v0.10.0...v0.10.1