Skip to content

Releases

v0.58.0

Choose a tag to compare

@tannevaled tannevaled released this 11 Nov 09:07
2e57724

What's Changed

  • redact: a scanned page can be redacted, because ops v0.38.0 destroys JPEG pixels by @tannevaled in #117

Full Changelog: v0.57.0...v0.58.0

v0.57.0

Choose a tag to compare

@tannevaled tannevaled released this 10 Nov 16:14
72c089b

The browser check is told its colour scheme, and CI runs both

browsercheck takes the scheme as its fifth argument — light (the default,
so a bare local run says what CI says), dark, or system to take the
machine's own. It goes in before the page is loaded, so the whole run is in a
scheme the check chose rather than one the machine happened to be in.

CI runs it four ways: both pixel ratios crossed with both schemes.

⛔ This is a mistake that came back three times — a page-arrival check that
could only run on a light display and was green in CI throughout, and a theme
gate that reported a defect twice about working code. A recurring mistake is a
missing tool and a missing gate, not a note.

⛔ And the gate is proved rather than assumed: putting the old light-only
assumption back makes the light run pass and the dark run fail with "the
document never appeared where the page is drawn"
.

[2026-11-10]

🤖 Generated with Claude Code

v0.56.0

Choose a tag to compare

@tannevaled tannevaled released this 10 Nov 15:41
6061127

The browser's colour scheme has to reach the canvas

The browser check now drives DevTools' emulated media and reads the canvas
back: the page's own prefers-color-scheme has to reach the workbench, both
ways, and the reader's own choice has to survive the system changing under it.

the canvas is 0.198 dark with the browser reporting light
the browser said dark and the canvas went from 0.198 to 0.755 dark
the browser said light again and the canvas went back to 0.198 dark
the reader's own choice survived the system changing under it

⛔ This is the one CI guarantee the retired second editor had and this did not
(#111). The Go tests drive the theme through a fake host, which says what the
workbench does when it is told the system changed and nothing about whether
the page ever tells it.

It runs at both pixel ratios, with no workflow change.

[2026-11-10]

🤖 Generated with Claude Code

v0.55.0

Choose a tag to compare

@tannevaled tannevaled released this 10 Nov 14:09
10e4021

The page that loads says playground

The tool is served at /playground/ since the rename, and the first thing a
visitor read while the binary came down was PDF workbench / loading the
workbench
— a name they had not asked for and could not find again.

The title, the heading, the loading line and the web manifest's name now use
the address's own word.

⛔ The code and the documentation go on saying workbench, because there the
word describes what the thing does; here it sits under an address and has
to agree with it.

[2026-11-10]

🤖 Generated with Claude Code

v0.54.0

Choose a tag to compare

@tannevaled tannevaled released this 10 Nov 13:22
6ed5873

It is called playground now — the repository, the module and the page

⛔ The module path changes: github.com/go-pdfkit/app →
github.com/go-pdfkit/playground, and browsercheck's with it. The repository
was renamed first, so go install github.com/go-pdfkit/app@latest worked
through GitHub's redirect until this release; from here the path is the new one.
Nothing in the fleet imports either.

The published page moves with it: /app/ becomes /playground/. The shell
is path-relative throughout, so nothing in it had to change.

playground is what every other org in the fleet calls the thing you open in a
browser tab — go-filesystems/playground, go-notebook/playground,
go-wasmcontainers/playground. It also settles a duplication: the landing
repository carried a second PDF editor at /playground/, with its own
ribbon, thumbnails and ~24 commands, which drew no icons on any control and
went to the wrong page by one when a minipage was pressed. It has been retired;
there is one editor now.

[2026-11-10]

🤖 Generated with Claude Code

v0.53.0

Choose a tag to compare

@tannevaled tannevaled released this 10 Nov 08:05
8986641

Compare this document with an earlier version of it

Compare with a file, on the Read tab, asks for another version and reads
what changed between it and the one on the screen: pages added or dropped,
words, pictures and comments. On
ops v0.37.0's
ops.Compare.

It is a reading, like the text and the grids — it replaces the picture of
the page, and pressing the verb again puts the page back.

⛔ The direction is said out loud, in the report. A comparison has two
documents in it, and a reader who has the order backwards reads every addition
as a deletion. The file chosen is the earlier version, the document open is
the later one, and the heading says "the left page is draft1.pdf; the right
page is this document"
rather than leaving it to be worked out from the page
numbers.

⛔ Any change to the document drops the report. It names pages and
differences; after a page is dropped it names pages that are not there, while
looking exactly as authoritative as it did a second earlier.

What it compares is what Save would write: a form that has been filled in
is saved as the file it came from with the answers appended, and those are not
the same bytes as the rebuilt document.

[2026-11-10]

🤖 Generated with Claude Code

v0.52.0

Choose a tag to compare

@tannevaled tannevaled released this 09 Nov 20:07
3b15963

Turn the pages by any angle

Turn them by an angle, beside Turn them on the Pages tab, takes the turns
a quarter cannot say: any number of degrees, clockwise, added to whatever the
page already carries. On
ops v0.36.0's
Doc.Turn.

⛔ The paper grows and nothing is cut off. A page turned thirty degrees
comes back on a bigger sheet, because one that stayed the same size would have
two corners of the page over its edge — and the status line says so, since that
is the part nobody expects: "turned 1 by 30 degrees — the paper grew to hold
the corners"
. It is the one difference from straightening a crooked scan,
which keeps the paper it was given.

A quarter, a half or three quarters still go through the page's own /Rotate
and change nothing else about the file, so text that was selectable stays
selectable.

⛔ The two controls share a row, which is a measurement rather than a
matter of taste: given a row of its own, the angle left the Pages panel laid
out 44 pixels past the bottom of its box, and a last control that can only be
scrolled to is a control people do not find.

[2026-11-09]

🤖 Generated with Claude Code

v0.51.0

Choose a tag to compare

@tannevaled tannevaled released this 09 Nov 14:25
69cbf8f

A line over a picture can be redacted, pixels and all

On ops v0.35.0: a
redaction across a picture now destroys the picture's own samples and
writes the picture back, as ISO 32000-1 §12.5.6.23 requires — "clipping or
image masks shall not be used to hide that data"
.

For a reader of scanned paper that refusal was everything. A scan is one
picture across the whole page, so "across an image" met every selection they
ever made, and the only thing left to do with it was the black rectangle this
verb exists to stop them drawing.

The pictures ops still cannot rewrite — a JPEG, a turned one, one drawn twice,
one carrying a mask — are refused by name, with the reason, which is the
part a reader can act on.

⛔ A redacted page looks the same whether this worked or not: the region is
painted afterwards either way. So the new test reads the samples back out of
the saved file rather than off the screen, on a picture of two rows of
different greys with the line drawn across the lower one — the row the words
sit on must come back zero, the row forty points above it must come back as it
went in.

[2026-11-09]

🤖 Generated with Claude Code

v0.50.0

Choose a tag to compare

@tannevaled tannevaled released this 09 Nov 14:00
37ea492

The page menu opens over a tile of the arranging grid

Right-clicking a page in Arrange pages now opens the same page menu the
reading pane carries — rotate, delete, extract, move — on the page under the
pointer
, not on whatever page the reading happened to be showing.

The grid knew where its tiles were and the menu did not ask: gridUnder now
answers which page a point lands on, and pageUnder asks it before falling back
to the reading. A tile is a page, so the menu over a tile is that page's menu.

[2026-11-09]

🤖 Generated with Claude Code

v0.49.0

Choose a tag to compare

@tannevaled tannevaled released this 09 Nov 13:38
0082555

What's Changed

  • Add several files at once, and only where several are meant by @tannevaled in #104
  • browsercheck: wait for the merged file by its page count by @tannevaled in #105

Full Changelog: v0.48.0...v0.49.0