Skip to main content
Support

Browse by category

All categories
Changelog

PDF tools changelog

All 40 entries, newest first. Click an entry to read it, or go back to the full changelog for the other areas.

fixedCompare PDF — One edit, one row on large drawingsOpen Compare PDF

Large plotted drawings list far fewer rows for the same changes, with every piece still inside its row and marked on the page.

  • A value edited on a plot is one row: a dimension whose digit changed used to list its text and its drawn digit as two rows. They are now one row, with the old and the new value stated.
  • Nearby pieces group the same at any size: a sheet lettered larger is read as the same drawing plotted larger, so pieces of one change sit together in one row there too.
  • A changed note is one row, its lettering included: on drawings whose letters are drawn as strokes under invisible search text, the strokes of a changed word now sit in that word's row instead of listing as separate drawn rows.
  • A redrawn sheet is one row: a sheet where most of the drawing differs (a view regenerated, a sheet redrafted on a new template) is listed once as "sheet redrawn" with the share that differs. Its text and value changes keep their own rows, and on a schematic each part changed still has its own row.
changedCompare PDF — Sharper on drawings, quieter on documentsOpen Compare PDF

Compare PDF now finds edits hidden inside pictures on board and flex drawings, and lists fewer rows for changes that are really one change. A struck passage, a renumbered list or a deleted drawing sheet now reads as one change, not hundreds. On fab drawings plotted from CAD, unchanged notes and nudged balloons no longer show up as changes, and each sheet of a reissued drawing set is compared with its own partner.

Each sheet compared with its partner

  • Sheets inserted, removed or moved: a drawing set reissued with new sheets in the middle still compares each sheet with the one it replaced. A title block that every sheet carries no longer makes two unrelated sheets look alike, and a sheet that was redrawn from scratch shows as a sheet removed and one added rather than being compared with whichever sheet came next.

Finds more

  • Edits inside board renders: a version label on the silkscreen of a 3D render (v0.3 to v0.4), white lettering on a dark solder mask, and labels swapped between two buttons are each pointed to where they changed, not shown as one changed picture.
  • Tables pasted as pictures: a quantity edited in a table set as an image is found by its words, even when a section was added under the table.
  • Small marks on panels: fiducials removed from a panel's rails are listed, even when the boards on the panel moved apart.
  • A page of renders paired: a page holding only pictures pairs with its partner by where the pictures sit, so its edits are compared rather than shown as a page removed and a page added.

Fewer rows for the same change

  • A drawing sheet added or removed is one row, its pieces folded under it. Documents still list what each removed or added page held.
  • A paragraph moved elsewhere is one row, even when it lands in a column of short lines.
  • Text a page break only moved (a table row split differently across two pages, a cell carried to the next page) folds with the layout instead of reading as removed and added.
  • Renumbered lists (a reference list after a citation was removed) and line numbers on long drafts (1015, 1016 ...) fold as layout.
  • A passage struck line by line, as a reported bill strikes its original text, is one row per struck passage.
  • Zone letters and numbers along a drawing's border, relabelled when the sheet moved to other paper, are one row.
  • Fab drawings plotted from CAD draw their lettering as strokes, with the words as an invisible search layer on top. They now compare as drawings, so unchanged notes and tolerances no longer read as removed and added.
  • A balloon, datum letter or note nudged a few points on a fab drawing plotted from CAD folds as layout, one click away. Schematics keep exact positions, printed ones included: a net label placed elsewhere is wired elsewhere, so it stays listed.

Every change is still listed: rows that belong to one change are grouped, each piece keeping its own highlight on the page.

addedCompare PDF — Create reportOpen Compare PDF

Compare PDF now makes a report you can read, print and pass on. Press Create report after a comparison, choose a layout and a page size, and get a typeset PDF, a Word file or an HTML page that presents every change the comparison found.

What the report holds

  • A cover with the answer first: both files with their SHA-256 fingerprints, one sentence on what changed and whether every page was compared, and the count of each kind of change.
  • A summary: a strip with one cell per page shows where the changes are, and the key changes (values, hidden content, and anything you starred or marked for follow-up) come first.
  • One entry per change: its words as a redline, deletions struck through and insertions underlined, beside a picture of the place from both files. A change repeated across pages is one entry that names every place.
  • An appendix with what the pages do not show: changes hidden from view, hidden content in both files, the changes folded into others with their reason, what could not be compared, document properties, layers and signatures.
  • A way to check it: the fingerprints and the receipt link let anyone holding the two files confirm which files the report describes.

Three layouts

  • Document: every change in page order.
  • Drawing set: a sheet index with each sheet's revision, revision clouds and outcome, then the changes sheet by sheet. A drawing set opens in this layout.
  • Contract: the changed passages as a redline, the way legal reviews read.

Formats

  • PDF: typeset with embedded fonts, bookmarks for every section, page and sheet, and a running header on every page.
  • Word: the same report as a .docx, for notes and tracked edits.
  • HTML: the accessible version, with headings, table headers and alt text on every picture.
  • CSV and JSON: the change list for a spreadsheet, as before.

Long comparisons stay readable: past 120 changes, the key changes get full entries and the rest are one line each in a change list. Every change is listed once, whatever the layout or format.

changedCompare PDF — choose the pages of a long documentOpen Compare PDF

Compare PDF compares a long document by holding every page of both versions in your browser at once, and a document of a few thousand pages can need more memory than a browser tab has. Long documents now stop before the comparison starts and ask which pages to compare.

Improvements

  • Choose the pages to compare: when either file has more than 800 pages (200 on a phone or tablet), you choose a range of pages on each side, such as one part of a long regulation, and only those pages are compared. The results say which pages were compared.
  • Or compare every page: you can still compare the whole document, with a clear note that the tab may stop responding or close before it finishes.
  • Drawing sets are not limited: a drawing set is compared sheet by sheet, so its page count does not matter.
changedCompare PDF — edits inside tables pasted as picturesOpen Compare PDF

When a table is pasted into a document as a black-and-white picture, such as a quantities sheet in a bid addendum, and the new version lays it out again, Compare PDF now highlights the entries that changed instead of the whole picture. Nothing is read or recognised: each word's ink is matched to the same ink on the other side.

Improvements

  • Edited entries in a pictured table: a quantity changed from 2,500 to 2,135, or from 38 to 28, is highlighted on both sides, and rows added under the table are highlighted on the new version. This holds when the new version widens its columns, wraps a row onto two lines, or moves rows.
  • Only what changed: words that stayed the same are matched wherever they moved to, so a re-laid-out table shows its few edits, not every row.
changedCompare PDF — changes inside pictures, and finer drawing editsOpen Compare PDF

When a picture in the document changed, such as a board render, a photo, or a table pasted as an image, Compare PDF now highlights the places inside it that changed instead of the whole picture. Small edits on drawings that were read as unchanged are now listed.

Improvements

  • Changes inside pictures: each region of a picture that differs is highlighted on both sides. This holds when the picture was recoloured, as with a board rendered in another solder-mask colour, and when it was placed turned or stretched to a new size. A one-pixel edit, such as a version printed as "0.3b" instead of "0.3a", is found too.
  • Moved notes and labels on schematics: a note box, a simulation directive or a label set somewhere else on the sheet is listed as moved. A revision table pushed down by a new row is still read as layout.
  • Drawing sets with matching views: assembly sheets that name the same parts, such as the top and bottom views of one board, now pair with their own revision instead of each other.
  • Small edits on fab drawings: a footprint removed, two port labels swapped and a revision drawn in a stroked font are listed. Pieces that moved together are highlighted one by one.

Fixes

  • A row added to a table laid out differently: when the new version splits a table's rows or columns another way, only the added entry is highlighted, not the whole table.
  • Hebrew text: a changed Hebrew word is highlighted where it stands, not at its mirror image along the line.
fixedCompare PDF — marks on a drawing sheet stay listedOpen Compare PDF

A small mark added or removed on a circuit-board drawing is listed again.

Fixes

  • Marks on a drawing sheet: 4.4.3 hid a table or frame that the text carried to another place, and on some board drawings it hid small marks too, where the same mark was also drawn nearby. It now applies only on a page whose text the layout also carried, so a drawing whose labels stayed in place lists every mark that changed.
fixedCompare PDF — fewer rows for text and drawings that did not changeOpen Compare PDF

Long documents that were re-typeset, such as drug labels, tax instructions and contracts, now list far fewer rows for things that did not change. A paragraph moved into a table is one move.

Fixes

  • A paragraph beside a table: an unchanged paragraph that the layout moved beside a table no longer lists as edited.
  • Tables and frames carried by the text: a table's grid or a figure's frame that the text pushed to the next page or lower is no longer listed as removed in one place and added in another.
  • A paragraph moved into a table cell: listed as one move instead of a removal and an addition.
  • The same result every time: on a busy computer, a page whose drawing took too long to read no longer lists its pictures as added or removed. Its pictures are compared by their pixels, as its drawing is.
fixedCompare PDF — circuit drawings list what a reader seesOpen Compare PDF

Schematics and board drawings from Altium and similar programs list about a fifth fewer rows. The rows that went were names no one sees on the page.

Fixes

  • Invisible pin, pad, part and net names: these programs write every name a second time as invisible text so a PDF viewer can jump between parts. A re-export reshuffles them. They no longer list as changes; the Hidden content panel still counts them.
  • Search text over drawn lettering still compared: a schematic whose words are drawn as lines, with invisible text laid over them for search, still has that text compared word by word.
  • Hidden text in documents unchanged: invisible or white text in a contract or report is still listed and marked hidden.
  • Spec sheets drawn without text: a sheet whose only text was those names is now compared part by part instead of as a picture, so each changed part is listed.
fixedCompare PDF — printed drawings read as drawingsOpen Compare PDF

A schematic, board drawing or connector drawing saved through a PDF printer is now compared as a drawing, the same as one exported straight from the design program. Compare PDF decides from what the pages hold, not from the program that wrote the file.

Fixes

  • Changes on printed schematics were hidden: a schematic printed through Distiller, Ghostscript or Microsoft Print to PDF was read as running text, and the rules for reflowed text folded away real edits. Each edit is now listed.
  • Changed areas on printed drawings: nearby changes on a printed fab sheet, assembly drawing or connector drawing are grouped into one changed area. Flex-circuit and connector drawings list about half as many rows.
  • Documents unchanged: letters, contracts, reports and papers are compared exactly as before.
changedCompare PDF — moved figures, inserted sheets and re-exported drawingsOpen Compare PDF

Three cases now read the way you would describe them: a figure moved to another page, a sheet inserted into a drawing set, and the same drawing exported a little larger.

Improvements

  • A moved figure is one move: a drawing moved to another page, with its caption, is listed as one moved row instead of a removal, an addition and a moved caption.
  • An inserted sheet is one row: a new sheet in a drawing set is listed as one added row, with each of its pieces still marked on the page.
  • A drawing exported slightly larger: the same sheet printed at 101% no longer shows as changed all over; the whole page's scale is set aside as drift.
  • Pieces that moved together: a part and its label, or a figure's pieces, moved by the same distance are one row.
fixedCompare PDF — outlines that point at the editOpen Compare PDF

An edit inside a long paragraph, and a sentence removed above a table, are now outlined where they are.

Fixes

  • The changed lines of a paragraph: an edited paragraph points at the lines that changed, not only at the whole paragraph.
  • A removed sentence above a table: a sentence removed just above a table is outlined on its own line. Before, it shared one outline with the table below it.
addedCompare PDF — share a comparison as a receipt anyone can checkOpen Compare PDF

A finished comparison now has a receipt link. Send it to a colleague or a counterparty: when they open it and add their own copies of the two files, the page compares them in their browser and says whether they get the same result.

What's new

  • Share: the Share button in the toolbar (and "Share link" under the summary) gives you the receipt link and a short summary to paste in an email, a chat or a review thread.
  • What the link holds: the change counts by kind, page counts, file sizes, both files' SHA-256 fingerprints, a digest of the result, and the tool version, engine, build and date. It holds no file names and no document text.
  • Checking a receipt: a page opened from a receipt shows what the sender's comparison found, marked as unchecked. Add the two files and the card says Same result, Different result, Swapped (with a button to swap them back) or Not these files, naming which file matches.
  • Reports and exports: the PDF and HTML reports carry the link on the cover, and the JSON export has it in a receipt field. The CSV and the marked-up PDF are unchanged.
  • Agents: results from window.loft.tools and the WebMCP tools include the receipt link, so an agent can cite a comparison that the reader can check.

Improvements

  • Copy summary: the copied summary now holds counts only. Tick "Include file names and text" to copy the full summary with the file names and the changed text.
fixedCompare PDF — repeated headings stay with their own sheetOpen Compare PDF

A heading that every sheet repeats, such as "NOTES:", is now matched with the copy on the same sheet.

Fixes

  • Inserted sheet, nothing else listed: when a sheet is inserted into a drawing set, the next sheet's "NOTES:" heading is no longer listed as changed. Before, it was matched with the inserted sheet's own "NOTES:".
  • Identical text, matched by its neighbours: when two copies of the same text could match, the copy whose neighbours also match is chosen.
changedCompare PDF — numbered changes, on the page and in the listOpen Compare PDF

Every change in the list now has a number, and the same number sits beside its highlight on the page. You can see at a glance which highlight is which row, and you can point a colleague to "change 12".

Improvements

  • One number, both places: the list numbers its rows from the top, and each highlight on the page shows its row's number, on the original and the new version alike.
  • Readable at any zoom: the numbers stay the same size on screen as you zoom in or out.
  • Pieces of one change share its number: a run of renumbered headings or the parts of one drawing change all show the number of their one row.
changedCompare PDF — one comparison for every page, each change shown onceOpen Compare PDF

Compare PDF now reads every document the same way, whether it is a contract, a report, a drawing or a mix of them. A change is listed once, as the piece you would point at: the clause, the paragraph, the label or the sheet. Text that was only pushed along by an edit above it stays out of the list.

Improvements

  • Same file, drawn a little differently: a page shifted, scaled or put on another paper size as a whole no longer lists every line as moved. Only what moved against the rest of the page is shown.
  • Moved and edited in one row: a clause or paragraph that moved and was also edited is one row, with the changed words marked inside it, instead of a move row plus separate edits.
  • Pages side by side as printed: page 1 is shown beside page 1, page 2 beside page 2. Content that moved to another page is shown as moved; content only pushed down by an insertion above it is folded away.
  • No whole-page marks: a new or removed page is shown by marking what is on it, not by outlining the page.
  • Renumbered clauses in one row: inserting a clause near the top renumbers the ones below it; the run of renumbered headings is one row, even across pages.
  • Edits in place, not removed and added: a heading number, a label or a footer whose text changed is shown as edited, with its old and new text, instead of as one item removed and another added.
  • Running headers and footers: a header or footer changed the same way on every page, such as a draft stamp becoming a final one, is one row, with the other pages folded under it.
  • Repeated sentences: a sentence that appears several times in a document is matched with the copy in the same place, so an edit to one copy reads as that edit.
  • A change across a page break: text removed or added across a page break is one row, not one per page.
  • Callouts: an added or removed callout on a drawing is boxed by all it draws, its leader line and arrow included, not only its label.
  • Line breaks in more languages: a word broken across lines in Thai, Lao, Khmer, Myanmar or Korean, or at a dash or soft hyphen, reads as one word.
  • Order of the list: the list follows the new version from top to bottom, with a removed item placed where it used to be.
changedCompare PDF — nearby changes on a drawing grouped, every text edit keptOpen Compare PDF

Compare PDF groups the changes that sit together on a drawing into one change, folds what re-typesetting moves, and keeps every text edit.

What's new

  • Nearby changes on a drawing are one change: a part added with its labels and wires, or a block that moved, shows as one row with its pieces inside ("5 changes here"). The summary, sheet counts, status bar and review progress count it once, and the CSV and JSON exports carry the group.
  • A drawing lane: each page lists its text changes first, then the changes that alter only what is drawn, such as a moved wire or a redrawn symbol.

Improvements

  • Re-typeset documents: rules across the text, frames around it and pages that exist only because the text broke elsewhere fold as typesetting instead of listing as changes.
  • Board and fab drawings: fab drawing pages with no text are paired in order and compared. A plain line or rectangle pairs only with one nearby, so it no longer reads as moved across the sheet. A part that moved with its neighbours and had its value changed reads as that value edit.
  • Each edit in a paragraph on its own: an inserted or struck phrase inside a paragraph is its own change, of its own kind.
  • Running headers and footers are reported once, not on every page.
  • Font changes: a change of size, weight or face is typesetting. It is not listed and never read as a move.
  • Labels read differently: a schematic label that one file sets as one piece and the other as several, every word in its place, folds as typesetting instead of listing as removed and added. A copy of a label that was stacked twice and is now set once stays listed.

Fixes

  • No text edit is dropped: a change of case or of a hyphen inside a word is an edit. Text clipped away, past the page edge or too small to see is listed with the reason it can't be seen. A removed label among removed drawing pieces keeps its words.
  • Text layers compared exactly: a page with a text layer is compared by its text and never read by OCR, so values such as "NA(…)" and footprint edits on schematics are kept.
  • Turned or re-scaled views: a line added inside a turned or re-scaled view is reported, not folded into the turn.
  • Hidden words: an invisible word set inside a visible line is marked hidden, and text overprinted to look bold reads once.
  • Moved labels on schematics: a label that moved and now sits beside another label shows as its own move, with the added label as an addition. Before, the move was shown on the wrong label.
  • Schematics on other paper: identical labels on a sheet printed on another paper size pair with the ones in the same place, instead of reading as swapped and moved.
  • Text carried to the next page: in a document whose text flowed onto the next page, the place the text left no longer shows as a visual change.
  • Text painted over or faded: text covered by a white page drawn over it, painted again in white over itself, or faded to near-invisible opacity is listed as made hard to see. Before, it showed no change at all.
  • Nothing folded away that reads or looks different: a change folded away as layout, as a running header or as words grouped differently is listed again when the text there reads otherwise or a mark on it changed, such as a word set in capitals, two values swapped between the lines of a note, a hyphen dropped, or a strike drawn through words that stayed.
  • Case and hyphen edits beside other changes: a word set in capitals, or a hyphen dropped inside a word, is listed when it is the first or last word of a text, sits beside another edit, or is on a line the two files read in a different order. Before, these could be folded away with the change or the layout next to them.
  • Words set in another order: two values or names swapped ("from 30 to 45" set as "from 45 to 30") are listed, with the words between them, beside another edit and in a paragraph the other file sets as two. Before, a swap there could be folded away.
  • Underlines and strikes, word by word: a line is judged by the words it marks. An underline run on under one more word, or turned into a strike, is listed. One carried with its heading, or longer because the text is set larger, is not.
  • Exact word positions: words are placed where their letters are drawn, so a mark on one word lands on that word, and the words after an edited first word no longer read as moved.
  • Accents set by TeX: a name such as "Adri`a" reads as the accented letter, the same as a file that sets "Adrià".
fixedCompare PDF — partial addenda, the same result every run, one ID per changeOpen Compare PDF

Compare PDF now reads a partial addendum the way a reviewer does, gives the same result every time you compare the same two files, and keeps one ID for each change in the app and in every export.

Fixes

  • Sheets an addendum does not reissue: when you compare a full drawing set with a partial addendum, each sheet the addendum leaves out reads "Not reissued" and lists no changes. Before, each one was a removed page, and its text filled the Values list.
  • The same result every run: a picture shared between pages is now read every time, so a large set lists the same changes on every run, however busy the computer is. Fewer pictures fall back to being compared by placement and size only.
  • Changes outside a revision cloud: the sheet map counts them on revised drawing sheets only, not on added letter pages.
  • Page numbers in a set: an added or removed page is named by its page number in its own file, not "Page 1".

Improvements

  • One ID per change: each change keeps one ID in the app, in your review marks, in the PDF and HTML report, the CSV, the JSON and the marked-up copy. Marks you made in the earlier version carry over.
  • Acknowledged hidden items are remembered with the same two files, like review marks.
  • Exports: the CSV and JSON carry each change's review status (reviewed, follow-up or open), its repeat count and the change it repeats, and keep Compare PDF's own descriptions apart from the document's words.
  • Hidden content wording: each reason content is hidden reads the same in the change list, the Hidden content panel, the report and the exports.
fixedCompare PDF — hyphens kept as written, clearer sheet labelsOpen Compare PDF

Compare PDF shows hyphenated words as the document writes them, and every view of a drawing set uses the same words for a sheet's status.

Fixes

  • Hyphens inside a line: a phrase such as "short- and long-term" reads as written. Only a word broken at the end of a line is joined.
  • Changed sheets counted: on the sheet map, a renumbered sheet that also changed counts as changed and still shows its old number.
  • One set of status words: the page rail, the status bar, the sheet map and the report use the same words for a sheet's status. The rail's badge reads "Changed" with the number of changes.

Improvements

  • Faster on reissued sheets: a sheet reprinted at another size or turned is read once, not twice.
  • Faster reports in Safari: evidence crops are encoded once, and a crop repeated in the report is drawn once.
fixedCompare PDF — fewer false changes on schematics, values read in place, hold to peekOpen Compare PDF

Compare PDF lists fewer changes that aren't there on older schematics, reads changed values where they stand, and lets you peek at an original sheet without leaving the sheet map.

Fixes

  • Schematics with stroked lettering: on sheets that draw their lettering as strokes under invisible search text, such as older KiCad exports, each change is checked against what the page shows. Far fewer changes are listed on those sheets, and every real difference still has a change.
  • Small moved details: a small piece that moved with no change naming it, such as a few letters of a note, gets a change of its own.
  • Dates split across lines: a date hyphenated at the end of a line ("Decem- ber 30") reads as one date in the Values list.
  • Renumbered list items: an added clause "(3)" reads as added, and the clause after it reads 3 → 4, instead of pairing the two "(3)" labels.
  • Underlines on moved text: underlines that move with their paragraph fold with it instead of listing as separate changes.
  • Hold to peek: on the sheet map, a short press opens a sheet, and a press held for a moment shows the original in place. Letting go keeps you on the map.
  • Screen readers: a sheet-map tile without a sheet number is announced by its page number, as it is shown.
changedCompare PDF — drawing sets up to 150 MB per fileOpen Compare PDF

Compare PDF takes drawing sets up to 150 MB per file on a computer, and says what a large comparison needs before it starts.

Changes

  • Larger drawing sets: a drawing set compares sheet by sheet, so each file can be up to 150 MB on a computer. Other PDFs, and every file on a phone or tablet, stay at up to 100 MB.
  • A notice before a large pair: when either file is over 100 MB, the comparison waits. The notice says it uses about 10 GB of memory, that it needs a computer with 16 GB or more, and to close other tabs first. Select Compare PDFs to start.
  • Clear limits: a file over the limit is refused with its size and the limit. A large pair that turns out not to be a drawing set stops before the heavy work and says why.
fixedCompare PDF — turned sheets, smaller reports, lower memoryOpen Compare PDF

Compare PDF reads a drawing sheet that was printed turned, writes smaller review reports, and uses far less memory on long documents.

Fixes

  • Sheets printed turned: a sheet reissued on other paper and turned a quarter turn is compared in the original sheet's frame. Before, nearly every piece on such a sheet read as moved.
  • Only what changed on busy sheets: a group of added or removed pieces is checked piece by piece against what the page shows, so pieces that look the same in both files leave the list.
  • Footers and added pages: a footer edit that runs into an added page reads as two changes, the footer edit and the added page.
  • Words split across lines: a word hyphenated at the end of a line ("Decem- ber") reads as one word in every change.
  • Underlines follow their words: an underline pairs with the words it marks, and one that moved with its text folds with it.
  • Renumbered items: a plain renumbered number such as "Section 3" pairs with the item it opens, like "(3)" does.
  • Sheets not reissued: the page rail, the status bar, the sheet map and the report all say "Not reissued" for a sheet a partial addendum leaves out.

Improvements

  • Smaller reports: the PDF and HTML review reports are about a fifth to two fifths smaller, and an identical crop is stored once.
  • Notes grouped the same way: the report groups notes one line per kind, as the right pane does, and a note in the pane opens the section it refers to.
  • Lower memory on long documents: a long document that is not a drawing set releases each page once it has been compared.
  • Faster re-pairing: comparing again with a fixed sheet pairing keeps both files open instead of reading them again.
addedCompare PDF — hidden content, drawing sets, review marks and a reportOpen Compare PDF

Compare PDF now shows what a page hides, compares a drawing set sheet by sheet, lets you work through a long list of changes with marks and notes, and writes a review report you can hand on. Everything still runs in your browser tab.

What's new

  • Hidden content: a change no reader can see on the page is listed and marked hidden, with the reason: on a hidden layer, covered by a shape or picture, white or low-contrast text, off the page, outside its clip, smaller than 1 pt, invisible text, or text that reads differently than it looks. Text that was hidden and now shows, or the reverse, says so.
  • Hidden content panel and X-ray: the panel lists what each file hides, grouped by reason, with ordinary drawing structure kept apart. X-ray outlines hidden items on the page, and you can acknowledge them one by one or by group.
  • Earlier versions inside a file: a PDF saved in increments keeps its earlier versions. Compare PDF finds them and compares the first saved version with the last, so text removed before a later save is not lost.
  • Values list: every number, date, amount and dimension that changed, pinned above the change list with the raw text beside it. Each change carries tags for the facts it touches.
  • Review marks: mark each change Reviewed or Follow-up, star it and add a note, with a progress count. J and K step through the list, Space marks it reviewed, S stars, F flags a follow-up, and U clears. Marks stay with the same two files, and repeats of one change are a single row with a count.
  • Drawing sets, sheet by sheet: sheets pair by the sheet number in the title block (A-101 with A-101), so renumbered, added, removed and unchanged sheets are named as such. You can fix any pairing, and results appear one sheet at a time, starting with the sheet you open.
  • Sheet map: thumbnails with change counts, the revision table beside what the compare found, and a count of changes outside any revision cloud. Hold to flip between the two versions in place.
  • Layers: each file's layers are matched by name, with added, removed and renamed layers named. Changes on layers hidden when the file opens are listed apart, and you can view the page as opened, as printed, or with all layers.
  • Signatures: for each signature, what it covers, whether content was added after signing, the certification level, the signer and time it states, and a check that the signed bytes are intact. You can compare the signed version against the current file. The check runs in your browser and never calls a signature legally valid.
  • Review report: a PDF or HTML report with a cover that fingerprints both files (SHA-256), the must-see items first, every change with an ID that stays the same in the PDF, the HTML, the CSV, the JSON and the marked-up copy, cropped evidence from both files, an appendix of folded items with the reason for each, and a limits-and-method section. Presets shape it for drawings (sheet index and addendum list), engineering (by drawing zone), legal (blackline and clean copy) and HR (by section, with each version's effective date).

Improvements

  • Only what changed: a change is listed only where the two versions look different. On a reissued drawing sheet, pieces that were redrawn but look the same are left out and counted in the notes, so a sheet with one revised note lists that note, not hundreds of unchanged lines.
  • Values kept in place: a value changed next to an identical copy elsewhere on the page reads as the changed value, not as unchanged.
  • Large drawing sets: every sheet of a large set compares, faster and with less memory, and the change list draws only the rows in view.
  • Notes grouped: repeated notes read as one line each, with the pages they cover.
  • Drawings at a new paper size: a sheet re-exported on other paper (A4 to A2) compares at its true scale, and the paper change is one entry.
  • Bills and contracts with line numbers: margin line numbers, running heads and text re-broken across lines or pages no longer read as changes.
  • Arabic and vertical text: Arabic words and vertical Japanese columns compare letter for letter.
  • Report characters: symbols and accented letters print in the PDF report instead of question marks.
  • Messages: pop-up messages across the site show on their own panel again instead of over the page.
changedCompare PDF v4 — one engine that reads the document, not the pixelsOpen Compare PDF

Compare PDF has been rebuilt around a single engine. There is no document-type picker any more: drop any two PDFs and the tool reads each one into a structured model of its text, vector geometry, images, form fields and annotations, then compares the models to each other. Position is only used to point at a change, never to decide whether something changed.

What's new

  • Moves are moves: a note that spilled into the second column, a view nudged a few millimetres to make room, a dimension line pushed away from its feature, or a paragraph that moved to another page shows as one "moved" entry with the distance printed beside it, not as a delete plus an insert. Moves are listed and painted from the start; the Moved chip hides them.
  • Callouts keep their identity: a dimension or leader is recognised by its value and by the feature its arrow points at. Slide the label and it is a move; change the value and only the changed digits light up; point the arrow at a different feature and it reads "retargeted".
  • Vector geometry is compared as geometry: an added hole, a removed stiffener or a lengthened outline highlights only that path, or only the segments that moved, instead of a red and green blot over the whole drawing.
  • Edited images: a logo or photo that was moved and touched up shows the edited region inside the image, with a move badge.
  • Pages pair by content: an inserted sheet no longer turns every later page into "changed"; reordered pages are reported as page moves, and the viewer shows the paired pages side by side ("A 1 · B 2").
  • Scans are read, not just looked at: a page with no text layer goes through OCR in your browser (two engines, united), so a scanned revision compares text to text against the original. Such changes carry the OCR confidence and an OCR badge.
  • Form fields on every page, not just the first, and annotations in their own category.
  • Printed forms compare with live forms: a flattened copy of an AcroForm compares value to value against the original.
  • Different producers, same drawing: the same sheet exported from two applications, with dashes flattened into hundreds of tiny segments by one of them, still reads as unchanged.
  • Restyles are named: the same line, fill or text drawn differently where it was reads as what changed: "black line → red line", "0.25 pt line → 0.5 pt line", "dashed → solid", "10 pt → 14 pt".
  • Turned, mirrored and rescaled views: a view rotated a quarter turn, mirrored, or re-plotted at another scale is one entry that says so ("turned 90°", "scaled 2:1"), not a scatter of moved and redrawn lines.
  • Nothing visible goes unexplained: every page pair is also rendered and compared by eye. A visible difference that no entry explains is reported, and a difference nobody can see (white or invisible text, content outside its clip, a hidden layer) is counted in the notices instead of listed as a change.
  • Scans with an OCR layer: a scanned PDF that already carries an OCR tool's text compares as the scan it shows, with its text read as words. On colour scans, a note stamped in another colour is reported.
  • Tables and case: two swapped columns read as two moves, not one per cell, and a change of case ("TOTAL" → "Total") is an edit.

Improvements

  • Table rows that were inserted or deleted no longer derail the rows below them; each running-balance change is its own entry.
  • Headings stay separate from the paragraph under them, so a renamed heading is one small change.
  • Running headers and footers are tagged as furniture instead of being dropped, so a changed footer is still reported, in its own group.
  • Small edits on big sheets: a one-character edit in 5 pt text on an A1 or A0 drawing ("1.5" → "1,5", "R6" → "R8") is checked at its own scale and reported, not dismissed as invisible.
  • Marks beside dashed lines: a pin stub or a "+" polarity mark next to a dashed line stays its own stroke instead of being swallowed into the line.
  • Copies and near-copies: a copy of a note added above the original reads as an addition, not the note moving; a note edited in place beside a new copy elsewhere reads as an edit and an addition.
  • Paragraphs across pages: a paragraph split by a page break in one version and whole in the other pairs as one paragraph. Text that inserted pages pushed two pages on is a page-break shift; paragraphs moved to another page are moves.
  • Relocated labels: a label that moved and was laid out anew (one line in one version, two in the other) is one move, with the distance.
  • Views and tables: a resized hole is no longer called a rescaled view, and a table that gained a row is not reported as moved.
  • Reviewing: cancelling a comparison no longer shows a false "identical" result; highlights land on the right spot of rotated pages; your accept and dismiss marks stay with the same two files across updates; the phone view has the mark buttons; the change list works from the keyboard.
  • Pictures however they are drawn: a picture embedded inline, repeated across a page, drawn in pieces or painted as a one-colour stencil is compared as a picture. A semi-transparent watermark over the page no longer hides the text under it.
  • Two-column pages: a title that spans both columns reads before them, and each column reads top to bottom, so edits pair with the right paragraph.
  • Moved and restyled at once: text set in another size or colour that also moved reads as both, with the distance. A footer that moved on every page is one move, and a date edited beside the page count is an edit, not a pagination change.
  • Paragraphs a page break cut in two: each piece is highlighted on its own page, with the changed words marked.
  • Drawing labels: a label centred in a box reads as a labelled figure, not a form field, and a dimension whose value only OCR could read is still recognised as a dimension.
  • Fewer doubled entries: a change the structural comparison already reports is not reported again by the pixel pass, while anything beside it that no entry explains still is. A page whose dimension labels could not be read keeps its drawing compared.
  • Honest failures: when a page cannot be rendered or OCR fails, the notices say which side and which page, instead of the comparison quietly reading less.
  • Counts and keys: the filter chips count each change once, the same way the list does, and the phone's change list keeps the j and k shortcuts.

Under the hood

The engine is scored against a synthetic corpus of revision pairs (flex-circuit fab drawings, manufacturing change orders, mechanical sheets, contracts, statements and forms, across two PDF producers and a scanned variant) with exact ground truth, and a ratchet forbids any pair from regressing. Research briefs on tree matching, tagged-PDF reliability, vector comparison, drawing conventions, evaluation methodology and the competitive landscape informed the design.

fixedCompare PDF: fixes for Safari, including one that changed the answer silentlyOpen Compare PDF

Comparing two PDFs could fail in Safari with a raw error message while working everywhere else. Chasing that turned up two further Safari faults — one of which never showed an error at all, it just quietly reported the wrong set of changes.

Bug fixes

  • A stored comparison can no longer break the next one. Compare PDF remembers a finished comparison so re-running the same two files returns instantly. That saved result was read back and used without ever checking its shape, so a record that had been damaged in storage was handed straight into the diff and crashed it — showing an internal error message instead of a comparison. Saved results are now checked before use, and anything that doesn't look right is discarded and simply recomputed. The slow path is a fresh comparison; there is no failure case.

  • Smoothing now happens on every browser, not just some. Before comparing two pages pixel by pixel, Compare PDF gently blurs them so that a line drawn a fraction of a pixel differently in the two files isn't reported as a change. The browser feature it used for that arrived in Safari 18 — and in older Safari, asking for it fails silently rather than reporting a problem. So the smoothing simply did not happen, and those comparisons surfaced ordinary rendering noise as real differences. This is the one to know about: there was no error, no warning, and nothing on screen to suggest the result was different from the same comparison run in another browser. Compare PDF now detects the gap and does the smoothing itself, so every browser compares the same thing.

  • Older Safari no longer breaks the AEC / Blueprint mode outright. One pattern used to recognise dimension labels on drawings ("Ø8", "DIA. 12") relied on a feature Safari only gained in version 16.4. Because of where that check sits, an older Safari didn't just skip the pattern — it refused to load the tool at all. Rewritten to an equivalent form that every browser understands, with tests pinning the two forms to identical results.

  • Error messages are written for people again. When something went genuinely wrong, the tool displayed whatever internal text the failure happened to carry — messages meant for developers, which say nothing useful and can look alarming. You now get a plain explanation, and the technical detail is sent to us instead of to you.

Under the hood

The last item is why the first three took so long to find: the internal detail that identifies a fault was being shown to the user and thrown away rather than recorded, so a browser-specific failure could only ever arrive as a screenshot. That is now reversed — the person gets the explanation, the diagnosis reaches our monitoring — and this class of report should be far quicker to close in future.

fixedHTML to PDF works again, and repeat comparisons stop double-countingOpen HTML to PDF

Two faults found while fixing something else. One had been quietly breaking a tool for its entire life; the other made the same comparison report different numbers the second time you ran it.

Bug fixes

  • HTML to PDF converts again. The tool depended on a component that was never actually included in the site — so pressing Convert always failed, on every browser, for as long as the tool has existed. Nothing in our automated checks caught it, because the way the component was referenced made it invisible to the build: the site compiled cleanly and the tool only broke when a person used it. The dependency is now properly included and loaded on demand, and the build fails if it ever goes missing again.

  • Re-running a comparison no longer duplicates its results. Compare PDF saves a finished comparison so running the same two files again returns immediately. Some changes are found by a second image-based pass, and that pass was running again on top of the saved result — which already contained its findings. Every repeat run appended a second copy of them, so the change count grew and some highlights were drawn twice. The saved result is now recognised as complete and used as-is. Alongside the correctness fix, repeat comparisons are meaningfully faster: the image pass is the expensive half of the work, and it is no longer redone.

Under the hood

The duplication had a root cause worth naming: the finished comparison was being handed to storage before it was actually finished, while a later stage was still adding to it. What got saved therefore depended on timing rather than on the comparison itself. The save now happens once, at the end, on the completed result.

changedScan to PDF — auto-crop, perspective correction, live outlineOpen Scan to PDF

The camera scanner grew the features that make a real document scanner: it finds the page, straightens it, and shows you what it sees before you shoot.

  • Live document outline: the page edges are tracked on the camera preview in real time — line up the green outline, capture, done.
  • Auto-crop + perspective correction: every capture detects the page's four corners and warps it scanner-flat. Shot at an angle, the PDF page still comes out rectangular. Toggle off for whiteboards or odd subjects.
  • No megabytes added: the detection is classical computer vision written for this site — no OpenCV download, no model fetch, ~80 ms per frame at full camera resolution.
  • The B&W filter now runs in a single pass over the frame — snappier captures on long documents.
addedCompare PDF — AEC / Blueprint mode + hang-proof compareOpen Compare PDF

Compare PDF now has a document-type selector again, with a dedicated AEC / Blueprint mode tuned for drawings, schematics, and technical sheets — plus a layer of guards so a heavy file can never freeze the comparison. Files still never leave your device.

What's new

  • Document-type selector: choose Document (contracts, statements, reports — text + pixel), AEC / Blueprint (drawings, schematics — pixel-first with a text overlay), or Image-Scan (pure pixel). The picker shows on the drop screen and is remembered.
  • AEC / Blueprint mode — a hybrid pass built for drawings: a word-level text pass handles dimensions, callouts, and title-block edits while a masked pixel pass catches geometry (lines, circles, symbols). A one-character title revision no longer flags the whole row, and a relocated symbol is recognized as Moved rather than delete-plus-insert.
  • Change locations — every change in AEC mode is tagged with its sheet region (title block, top-left, center…) and its X/Y position, so you can jump straight to it on a large sheet.

Improvements

  • In-place revisions read as edits: a dimension or revision mark that changed in place (Ø8 → Ø10, rev A → B) now shows as one Modified entry with the exact glyphs that changed — not a separate Removed + Added pair.
  • Fonts panel now lists the fonts in each file; Form Fields shows a clear empty state when a PDF has none.
  • Per-document rulers — the on-canvas ruler is now independent per panel (px / in / mm), instead of one ruler spanning both documents.
  • Export the marked-up comparison as a PDF from the toolbar.
  • Scroll to zoom directly (no modifier key); single-page comparisons hide the page-paging controls.

Bug fixes

  • No more frozen "Comparing…": every PDF-render and text-extraction step now has a bounded timeout. If the browser is under heavy load or a file is pathological, the compare aborts with a clear "Compare timed out — try again, or use a smaller / flattened PDF" message and a fresh retry, instead of hanging forever. A page that times out is flagged as incomplete rather than silently shown as "no changes."
  • Fixed the status-bar hint that still said "Ctrl + scroll to zoom" after the gesture became plain scroll.
changedCompare PDF: better noise handling on engineering drawingsOpen Compare PDF

Vector engineering drawings — circuit schematics, blueprints, mechanical diagrams — now produce dramatically cleaner pixel diffs.

Live testing on a pair of electrical-panel drawings (Eaton JDC3 vs JDC4 circuit breakers) surfaced three noise sources unique to vector PDFs:

  • Sub-pixel jitter: identical line drawings rendered with tiny positioning differences between the two PDFs, causing every edge to flag as a false change.
  • Whole-drawing yellow blanket: when a drawing genuinely differs (a 3-pole vs 4-pole layout), the diff was merging everything into one giant highlight that hid the actual structural change.
  • Drawing displacement: A and B canvases drawn at slightly different positions made line edges miss each other entirely.

The new pipeline runs RANSAC affine alignment before the pixel comparison. It uses identity-matched text anchors (dimension callouts, part numbers, title-block labels) as registration points to compute a transform that maps the B canvas onto A's frame. Sub-pixel residue is then mopped up with a small pre-blur, and oversize false-positive blanket regions are dropped automatically.

Result: pinpoint structural diffs survive, render jitter is gone, and the text-tier already explains "the whole drawing differs" via dimension and title-text changes.

fixedCompare PDF catches signatures and light pen strokes againOpen Compare PDF

Compare PDF now reliably flags hand-signed signatures, initials, and other light pen strokes that recent noise-reduction work had accidentally hidden.

A live test on a Taipei medical certificate pair (blank vs signed) revealed that a 2-pixel pre-blur tuned for vector engineering drawings was wiping out the subtle ink contrast of pen strokes before the comparison engine ever saw them. The detector was working — there just wasn't anything left to detect.

The fix introduces an adaptive blur that looks at the alignment between the two PDFs before deciding how much smoothing to apply:

  • Near-identical pages (same template, just filled in differently — signatures, form fields, handwritten edits) skip blur entirely. Light ink contrast is preserved and signatures show up clearly in both the visual diff and the right-side change list.
  • Pages with real content shift (engineering drawings where shapes have moved, like a 3-pole vs 4-pole circuit breaker) still get the 2-pixel blur to cancel sub-pixel render jitter.
  • Image-only PDFs with no text anchors keep blur on as a defensive jitter mask.

Detection thresholds were also tuned back down so that thin pen strokes (typically 1-2 pixels wide) no longer fall under the minimum region size. Engineering-drawing precision is unchanged.

changedCompare PDF v3.3 — RANSAC affine alignment for pixel residualOpen Compare PDF

Live QA on Eaton JDC3 vs JDC4 circuit-breaker drawings exposed pixel-residual false positives on regions where the two PDFs rendered the same vector content at slightly different positions. Five-PR iterative fix landed in one session.

Bug Q + R bundle (PR #502, #503):

  • Pre-blur — 2-px gaussian on both canvases before smartCompare. Sub-pixel edge jitter softens below CONTENT_CHANGE_THRESHOLD; structural diffs survive.
  • Skip morphClose — dense edge runs no longer merge into mega-CCL components that flood as whole-drawing yellow blankets.
  • Drop oversize regions — pixel highlights whose bbox covers > 15% of canvas area get filtered. Text-tier already explains "whole drawing differs" via dimension + title changes.
  • RANSAC affine alignment via lib/align.ts — document-mode compareOne now emits anchorPairs (rows where normalized text matches identically between A and B). ComparePdf feeds those to the existing RANSAC TSR primitive, fits a translation + scale + rotation transform, renders B canvas through the affine into A's frame before smartCompare. Render jitter cancels at the source.

Iterative refinement:

  • PR #504 (reverted by #505) — tried "tighter layering": blur + morph only on unaligned fallback path, arguing alignment makes them redundant. QA showed counts INCREASED (128 → 133) because RANSAC INLIER_THRESHOLD_PTS = 5 pt ≈ 7 px at 100 DPI — sub-pixel jitter < 1 px still survives the inlier filter. Reverted. Alignment + jitter masking are complementary, not exclusive.

Final state: alignment cancels gross translation, pre-blur + morphClose mop up sub-pixel residue, oversize-drop prevents structurally-different-content blanket. Belt-and-suspenders is the correct architecture when the upstream primitive is approximate.

15 PRs in three days got Compare PDF from "v3 substrate works" to "best-in-class browser PDF compare." Algorithm now handles bank statements, tabular summaries, engineering drawings, scanned blueprints, signed certificates, and reflowed contracts — each with their own tier in the pipeline.

changedCompare PDF v3.2 — visual + algorithmic polish marathonOpen Compare PDF

10-PR polish marathon driven by live QA on real bank statements (Chase Jan/Feb), engineering blueprints (Meridian SB-2024), and medical certificates. Each PR fixed a specific bug class surfaced via screenshot + multi-agent dialectic.

Visual fixes

  • MODIFY dominates visually (PR #487) — per-side MODIFY emission so yellow lands at each panel's actual row position, paragraph MOVE detected with relaxed jitter tolerance, fuzzy cross-page MODIFY promote for drifted paragraphs, hyphen unicode coverage (U+00AD, U+2010, U+2011, U+2013).
  • Word-level yellow (PR #488, #501) — yellow paints ONLY on the chars that actually differ, not the whole row. Adobe-style precision. B-side parent rect skip prevents redundant whole-row band on B panel.
  • Filename labels (PR #499) — Original / Modified panel headers show source filenames. Lost from v2 scrap, restored.
  • MODIFY visual dominance — translucent yellow fill α=0.15 base + solid 1.5px yellow stroke, no more dashed-outline-lost-in-fills problem.

Count + status alignment

  • Pixel-fallback chip count (PR #489) — image-only PDFs (blueprints, signed scans) now show region counts in chips instead of zeros. Status bar reads N changes not raw pixel delta.
  • Orphan page counts (PR #497) — 13-pg A vs 14-pg B compare reflects the orphan page in chip totals.

Algorithmic precision

  • Tighter post-promotion thresholds (PR #491) — PROMOTE_SIMILARITY 0.4 → 0.65, JACCARD_FLOOR 0.15 → 0.30, length-ratio 0.4 → 0.5, new TOKEN_JACCARD_FLOOR 0.35 on alpha-only words. Stops unrelated bank-statement transactions ("12/13 CHARGEPOINT" vs "01/13 AMAZON") from pairing as MODIFY just because they share format tokens (CA, INC, /13).
  • Pixel classifier thresholds (PR #492) — PIXELMATCH_THRESHOLD 0.1 → 0.2, CONTENT_CHANGE_THRESHOLD 60 → 80, MIN_REGION_AREA 8 → 24, TONE_DELTA 40 → 55. Stops blueprint title-block yellow flood on sub-pixel render jitter.
  • Table-cell positional MODIFY (PR #494, #497) — Tier 0.5 wires the dead detect-tables.ts scaffold. Aligned tables with ≥30% identical cells get cell-by-cell positional pairing. Bank-statement Account Summary "Available Credit $8,169 → $10,264" now shows yellow on dollar cell only, not whole row. Cell bbox clipped to column midpoint geometry.
  • Histogram longest-run anchor pairing (PR #495) — picks anchor pair whose surrounding equality run is longest, per Pearce's HistogramDiff.java::tryLongestCommonSequence. Fixes cascading mis-anchor in repeated-text legal docs.
  • Additive pixel residual (PR #501) — pixel-engine smartCompare runs alongside text-tier (not exclusive). Filters region overlap > 50% with existing text-tier highlights so identical text labels don't double-count. Engineering drawings + signed PDFs now surface both layers.

Internal docs added: .kb/work/compare-pdf-algorithm-truth.md (ground-truth pipeline tier-by-tier with bug catalogue A–N), .kb/work/compare-pdf-known-limits.md (edge cases the algorithm intentionally doesn't handle).

10 PRs shipped in one day. Each verified against live QA screenshots before merging.

changedCompare PDF v3.1 — eight accuracy and performance winsOpen Compare PDF

Phase A of the v3.1 accuracy push landed eight incremental improvements to how Compare PDF aligns and classifies text changes. Bank statements, contracts, and reflowed documents all produce cleaner, more meaningful diffs.

  • Hyphenation merge — text reflowed at a different column width that splits words at hyphens ("Mini-" + "mum balance" vs "Minimum balance") used to produce three false changes per split. Geometric heuristics now stitch the hyphen back together without needing a dictionary, and the regex covers hyphen-minus, soft hyphen, U+2010, U+2011, and U+2013.
  • Single-pass text cache — three internal callers were each re-parsing every page's text stream. They now share a memoised cache, removing ~30–50% of wall time on 50-page docs.
  • Histogram diff anchoring — replaced the older "count==1 unique word" anchor strategy with a recursive lowest-count-wins procedure (the same one git uses). Documents with repeated phrases ("WHEREAS" × 50 in a lease, "Section 3.2" × 120 in a contract) now anchor on the rare tokens inside each sub-range instead of discarding repeated text outright.
  • Line-mode pre-pass — runs a line-level encoding pass over unmatched residue before falling to per-row fuzzy matching, catching block-moves and simple insertions earlier in the pipeline.
  • Cross-page move detection — paragraphs that move from page X to page Y used to emit as a wholesale red REMOVE on page X plus a wholesale green ADD on page Y. Identical-text moves now promote to a linked MOVE pair.
  • Heavy-redline performance — the tier-3 cross-product cap moved from 5,000 to 90,000 operations per page, so more borderline pairs get the similarity pass and promote to MODIFY instead of falling to wholesale add/remove. Real-fixture impact: the IRS W-9 fixture goes from 659 to 506 reported changes (-23% noise).
  • Table detection scaffold — a lightweight geometric table detector (≥3 consecutive rows with same column structure) ships now and gets wired into the diff pipeline later in the same release.
changedCompare PDF v3.1 — eight algorithmic accuracy + perf winsOpen Compare PDF

Phase A landed eight algorithmic improvements in a single coordinated PR (PR #481) covering accuracy + performance. Distilled from a multi-agent algorithm debate vs Heckel / Pearce / Tichy / Cormode-Muthukrishnan + Liang / Breuel research papers.

  • Histogram-diff anchoring (Pearce / git xhistogram) — replaces Heckel's count == 1 predicate with lowest-count-wins recursion. Legal / financial docs with repeated phrases ("WHEREAS" × 50, "Section 3.2" × 120) now anchor structurally instead of dropping into fuzzy fallback.
  • Hyphenation merge — geometric heuristic (line ends -, next row lowercase, indent within 30pt, dy ≤ 2 line-heights). Catches reflowed body text without dictionary lookups; language-agnostic.
  • dmp linesToChars line-mode pre-pass — Myers-on-row-tokens between tier-1 anchoring and tier-2 fuzzy. Catches block moves + simple insertions among unmatched residue.
  • Tier-1 expansions — Heckel neighbor extension + duplicate-bucket nearest-y fallback. Runs of identical-text rows (page numbers, table cells) now lock as anchored.
  • Paragraph MOVE detection — consecutive anchors with consistent dy collapse into one MOVE record per paragraph instead of N per-row records.
  • Cross-page MOVE promotion — wholesale REMOVE on page X + wholesale ADD on page Y with identical text get paired as MOVE via FNV-1a hash. Adobe-style cross-page reflow detection.
  • Row-level MODIFY with sub-paint metadata — one MODIFY record per modified row in the chip count, char-level parts[] for paint detail.
  • Post-promotion modify pass — 5-stage industry-standard add/remove → MODIFY promotion via Jaccard + dmp similarity. Catches "Previous Balance $X vs $Y" cases that drift past the tier-2 fuzzy Y window.

Plus perf wins: WeakMap text-cache dedup (3× pdfjs read collapse), bounded post-promotion cross-product (~90k ops cap), idle-callback page scheduling.

Similarity calculation switched from changes / canvas_pixels (always rounded to 99%) to 1 - (totalChanges / totalRows) — status bar finally reads meaningful numbers.

changedCompare PDF v3 — lean rebuild on a strategy substrateOpen Compare PDF

Full algorithmic rewrite. v1's monolithic smartCompare pipeline split into a strategy substrate (PR #401, #403, #413). One driver, three mode strategies (document / drawing / image), shared primitives extracted into lib/. ~1,500 LOC of duplication retired.

  • Strategy pattern: per-mode pipelines instead of branching inside one big function. documentStrategy.compareOne handles paragraphs / tables, drawingStrategy handles vector geometry, imageStrategy handles scans.
  • Shared primitives: lib/align.ts (RANSAC TSR fit), lib/pixel-engine.ts (smartCompare), lib/header-footer.ts (page furniture noise filter), extract/text-cache.ts (WeakMap-memoised pdfjs reads).
  • Real-file validation: 7-fixture regression harness via scripts/debug-compare-v3.mjs — Chase statements, Meridian blueprints, Eaton drawings, medical certs, lease agreements, AcroForm cases.
  • Right-pane ChangeList: scrollable per-page list of every Change record with kind icons, before/after preview, confidence percentage, click-to-pulse navigation.
  • Filter chips: Add / Remove / Modify / Move toggles with live per-kind counts.
  • History panel ported from PDF Editor — recent compares persisted in IndexedDB, click-to-restore without re-uploading.
  • Engine toggle via ?engine=v3 + localStorage gate for staged rollout. v1 path retired alongside the engine-toggle UI a session later.

All comparison logic still runs 100% in-browser. Files never upload.

changedCompare PDF v3 — lean rebuild on a faster, cache-aware substrateOpen Compare PDF

Compare PDF now runs on a leaner v3 engine with cache-aware result reuse and tighter validation against real files.

  • Results are cached per file pair: the engine hashes both PDFs plus the comparison options and stores the result in an IndexedDB cache (bounded LRU, 50 entries). Reopening the same comparison is near-instant; tweaking an option does the minimum extra work needed.
  • Build-aware invalidation: when we ship a comparison-engine fix, every existing cached result is invalidated automatically so you never reproduce a stale bug.
  • Real-file validation: the rebuild was validated against actual user files (not just synthetic test cases) so the highlight rules — red removed, green added, yellow modified, blue moved — match what reviewers expect.

A small internal cleanup also dropped some dead code paths and extracted a duplicate-detection helper so the side-B move logic is easier to reason about.

changedAcrobat-grade text editing in PDF Editor — real glyph replacement, not stamp-on-topOpen PDF Editor

PDF Editor's edit-text mode now rewrites the actual content stream instead of stacking a white cover and new glyphs on top. This is the headline feature of v1.2 and lands across five phases of work.

How it now works:

  • Click to edit. Single-click on a word picks that text run and drops the caret at the clicked character position — Acrobat-style, not Word-style drag selection. The drag-bbox picker has been removed entirely.
  • Real content-stream rewrite. A new pdfium-wasm engine handles the actual glyph replacement on save. Original font, position, fill color, and render mode are preserved.
  • Same-line shift. When edited text grows or shrinks in width, adjacent text on the same line translates by the width delta so it doesn't overlap or leave a gap.
  • Line wrap and push-down. When growth pushes siblings past the right margin, they wrap to a new line and every text object below the affected line shifts down by one line-height to make room.
  • Font fallback chain. When the original embedded font is missing glyphs your edit needs (subset fonts only embed glyphs used in the original text), the editor falls back to a PDF base-14 family or embeds NotoSans Regular/Bold/Italic/BoldItalic for non-base-14 families like Calibri or Roboto.
  • Preview accuracy. The on-canvas preview now uses the font family that pdfjs reports for the clicked text, so serif PDFs preview in serif and sans-serif in sans-serif. A subtle dashed cyan underline beneath edited text signals that the preview is approximate — the saved file uses the document's real font.
  • Clip warning. If reflow pushes content past the page bottom and the saved file will clip, a toast warns you so you can undo and shorten the edit.

Smallest-text-object matching also handles the doubled-text scenario where Word and Google Docs sometimes emit nested or stacked runs.

changedCompare PDF gets a full editor shell with rail, inspector, and exclusion zonesOpen Compare PDF

Compare PDF was rebuilt around the same full-viewport editor chrome that powers PDF Editor. The bespoke comparison UI was split into reusable pieces and gained a stack of features that move it beyond a simple pixel-diff viewer.

What's new on the page:

  • Dual drop slots for Original and Modified files, with relaxed file-type detection so PDFs that browsers report with empty MIME types still load.
  • Page rail with stacked A/B thumbnails per row, each tagged with a diff badge — identical, N px changed, only-A, or only-B. Thumbnails lazy-render via IntersectionObserver, so 500-page documents no longer encode a thousand PNGs on first mount.
  • Right-side inspector with single-active accordion panels for Metadata, Bookmarks, Form Fields, and Fonts. Each panel shows A vs B side-by-side with ≠ markers on differences. Panels stay mounted after first open so reopening the Fonts panel doesn't re-walk every page.
  • Drag-rect exclusion zones to mask false-positive highlights — useful for ignoring footers, timestamps, or page numbers that change on every page.
  • Translucent ruler (px / in / mm, R to toggle, unit choice persisted).
  • Text Diff modal now wraps the polished split diff viewer with line numbers, word-level spans, collapsible unchanged hunks, and prev/next change navigation. T opens it.
  • Keyboard shortcuts: ⌘O to open, F7 / Shift-F7 to jump to next/prev change, R for the ruler, page nav with arrow keys, ⌘=/⌘-/⌘0 for zoom.
  • Status bar caps similarity at 99% when any diff exists so "100% similar · 3,355 px differ" can't both render at once.
changedCompare PDF — editor port + featured showcaseOpen Compare PDF

Compare PDF moved off the standalone v1 shell into the shared editor template (PR #320). Same comparison engine, new chrome — header, toolbar, side rail, status bar all unified with the rest of the PDF tool family.

  • Editor chrome: same toolbar, right-pane structure, and status bar as PDF Editor — consistent muscle memory across the tool family
  • Featured-tool landing page: dedicated /featured/compare-pdf showcase with hero, demo, and value props (PR #320, #337)
  • Homepage placement: surfaced in the featured rotation
  • Bug-audit pass: thermal-relief geometry fixes + compare-pdf algorithm review (PR #336)

The legacy v1 standalone shell stayed shipped during the port; v3 substrate landed two weeks later.

addedCompare PDF — visual + text comparisonOpen Compare PDF

Full PDF comparison tool with three modes: visual (side-by-side), overlay (slider), and text diff.

  • Visual comparison: grayscale conversion, pixelmatch pixel diffing, brightness-difference filter, morphological closing, connected-component labeling — catches filled form fields while ignoring rendering noise
  • dHash fast-reject: identical pages detected in microseconds via perceptual hashing
  • Text extraction: reads both content stream (static text) and annotation layer (form field values, Fill & Sign text)
  • Overlay mode: smooth 60fps slider via CSS custom properties (no React re-render during drag)
  • Interaction: focal-point zoom (Ctrl+Wheel tracks mouse position), drag-to-pan, synchronized scroll, fullscreen toggle
  • Smart page handling: different page counts show "Page only in Original/Modified" instead of false "identical"

All processing runs 100% in-browser — your PDFs never leave your device.