OxygenPDF
Back to Home

Changelog

Every feature, improvement, and fix — tracked as we build OxygenPDF.

October 2026

  1. v2026.10.06-01
    Latest

    Signing a signed PDF keeps the first signature valid

    Digital Sign PDF and Timestamp PDF used to rewrite the whole file, which broke every signature already in it. They now add the new signature or timestamp after the original bytes, the way a second signer in any PDF app does, so earlier signatures still check out. Timestamps were also invalid on their own: the timestamp covered the file before it was stamped, not after. It now covers the stamped file.

    Arabic pages read right to left

    The Arabic site showed Arabic text inside a left-to-right layout. Pages now run right to left: navigation starts on the right, settings sit on the left of the preview, and arrows point the way Arabic reads. Anything that stands for the paper itself, like the stamp position picker and the editors, keeps the page’s own left and right.

    All changes in version 2026.10.06-01

    • Fixed
      Arabic: pages lay out right to left
    • Fixed
      Digital Sign PDF: signing an already-signed PDF no longer invalidates the earlier signatures
    • Fixed
      Timestamp PDF: timestamps verify, and earlier signatures in the file stay valid
  2. v2026.10.02-01

    Edit PDF shows the right page after you add, copy or move one

    After inserting a blank page, duplicating a page or reordering pages, Edit PDF drew each slot from whichever original page had that number. A new blank page showed the page it displaced, every page after it showed its neighbour, and the last one failed to load. Edit Text and text highlighting read the wrong page the same way. Each page now draws and reads its own content.

    PDF tools work again on older browsers

    Opening a PDF failed with "URL.parse is not a function" on Chrome before 126 and Safari before 18, including Chrome 109, the last version for Windows 7 and 8. Those browsers now get the PDF engine build made for them.

    All changes in version 2026.10.02-01

    • Fixed
      Edit PDF: blank, duplicated and reordered pages render and edit their own content
    • Fixed
      PDF tools: open on Chrome < 126 and Safari < 18
    • Fixed
      Edit PDF: opening a password-protected file no longer logs an error before you unlock it

September 2026

  1. v2026.09.30-01

    Sanitize PDF now deletes the attachments it removes

    Deep sanitize used to unlink embedded files without deleting them, so the attachment's bytes were still inside the cleaned PDF. It now deletes them, along with every other object the file no longer uses. Strip metadata also clears custom document properties, such as the Company field Word adds, not just the standard ones.

    PDF/A-1b files that pass validation

    PDF to PDF/A now writes archival metadata that matches the document properties field for field, and it adds the file ID PDF/A requires when the source has none. veraPDF used to reject PDF/A-1b output from almost any source for those two reasons alone.

    All changes in version 2026.09.30-01

    • Fixed
      Sanitize PDF: deep mode deletes embedded files instead of just unlinking them
    • Fixed
      Sanitize PDF: strip metadata removes custom document properties too
    • Fixed
      PDF to PDF/A: archival metadata matches the document properties; a missing file ID is added
    • Fixed
      Metadata Editor shows the file's real Producer and Creator instead of pdf-lib
  2. v2026.09.28-01

    DRM-free EPUBs with protected fonts now convert

    EPUB to PDF used to refuse any book that listed its fonts as obfuscated, a common InDesign export setting that isn't DRM. Those books now convert in full. Books with real DRM are still refused.

    Change the password on a protected PDF

    Protect PDF now removes a file's existing password before setting yours, so the new password is the only one that opens it. Before, re-protecting a locked PDF produced a file nothing could open.

    All changes in version 2026.09.28-01

    • Fixed
      EPUB to PDF: books whose encryption.xml only obfuscates fonts are no longer mistaken for DRM
    • Fixed
      Protect PDF: re-protecting an already password-protected PDF gives a file that opens
  3. v2026.09.26-01

    Name your file before you download it

    Every tool's finished file now has a File name field above the Download button. Nothing downloads on its own any more, so the name you type is the name that lands in your Downloads folder, and it carries over to Share, Save to cloud and the next tool you send the file to.

    Save to Google Drive, Dropbox or OneDrive

    The arrow beside Download saves the finished file straight from your browser to your own drive, into an OxygenPDF folder. OxygenPDF never sees the file, and asks only for access to the files it creates. Export as hands a PDF to the Word, Excel, PowerPoint, JPG or PDF/A converter in one tap.

    Share the file, not just a link

    On phones and browsers that support it, Share sends the file itself to WhatsApp, Messages, Mail, AirDrop or any app on your device. Social sites can't take a file from a web page, so X, Facebook, LinkedIn, Telegram and Reddit get a link to the tool instead.

    All changes in version 2026.09.26-01

    • New
      Rename the finished file in every tool; the name is kept when you edit again and re-run
    • New
      Save to Google Drive, Dropbox and OneDrive from the Download menu, uploaded from your browser
    • New
      Export as Word, Excel, PowerPoint, JPG or PDF/A from any finished PDF
    • New
      Smart tips on finished results point to the tool that does the next job better
    • New
      Share: native share sheet with the file attached, plus links for social networks
    • Improved
      Tools no longer download the result the moment processing finishes; the Download button does
    • Fixed
      Markdown to PDF keeps code blocks, inline code and snake_case names exactly as written
  4. v2026.09.24-02

    Mixed PDFs no longer lose their scanned pages

    PDF to Word, PDF to Markdown, PDF to Text and OCR PDF now check each page. Pages that already have text are read directly, headings and tables included, and only the scanned ones go through OCR. Before, a PDF with both came back with its scanned pages blank. OCR PDF also stopped turning text pages into images, and the result tells you how many pages it OCR'd.

    Better OCR for Chinese and Japanese

    The new Auto setting chooses an engine from the language you pick. Chinese and Japanese go to PP-OCRv6, which read our test scans without a single error. Other languages stay on Tesseract: it covers more scripts and downloads far less. PaddleOCR also stopped running words together.

    Fewer garbled PDFs

    Text extraction now runs the latest pdf-inspector release. Japanese and Korean PDFs that came out as garbage now read correctly, 1,800.00 no longer turns into 1A800.00, ticked checkboxes stay ticked, and m³ keeps its superscript. The desktop app uses this engine too; it had been falling back to a simpler one.

    All changes in version 2026.09.24-02

    • New
      Per-page OCR routing in PDF to Word, PDF to Markdown, PDF to Text and OCR PDF
    • New
      Auto OCR engine: PP-OCRv6 for Chinese, Japanese and designed pages like infographics, Tesseract for other scans
    • New
      pdf-inspector updated to upstream 1.24 with embedded CJK character maps
    • Fixed
      OCR PDF keeps the original text of pages that already had it
    • New
      PDF to Word keeps the page layout: rules, tables, form boxes and ticks stay where the PDF draws them, and the text stays editable
    • New
      PDF to Word keeps scanned pages and infographics looking as they did, with every line OCR reads turned into editable text where it sat
    • New
      Edit PDF edits scanned pages and image-only PDFs: click a line, retype it, and the new words sit on the page as it was
    • New
      Edit PDF has a new toolbar: tabs for Edit, Markup, Draw, Insert, Annotate and Pages, every tool named, and its options in the same row
    • New
      Edit PDF scrolls through the whole document in one go instead of jumping from page to page
    • Fixed
      Layout-preserved Word export no longer turns pages upside down, and uses fonts every Word install has
    • Fixed
      Right-to-left text and CJK text in predefined character maps come out right in PDF to Word
    • Fixed
      Headings in PDF to Word come out bold and full size instead of small and blue
    • Fixed
      PDF to Markdown and PDF to Text respect the page range in every mode
    • Fixed
      PaddleOCR output keeps the spaces between words
    • Fixed
      PaddleOCR loads on iOS and the desktop app
    • Fixed
      Page numbers in the health check and chat document profile were off by one
    • Fixed
      The desktop app ships the PDF reading engine instead of falling back
  5. v2026.09.23-01
    Major release

    49 new tools — the largest drop yet

    The toolkit went from 68 to 119 tools in one release. The additions come from a competitor-gap sweep: ebook and archive formats (EPUB, MOBI, FB2, DjVu, CBZ, XPS, PSD, HEIC, TIFF), a full digital-signing set (sign, validate, timestamp, certificate inspection), print-production tools (PDF/A, prepress photo tiling, font outlining, linearization), and a run of single-job tools like Extract Images, Overlay PDF, Table of Contents and Page Labels. Everything still runs in your browser — nothing is uploaded.

    A category bar, because 119 tools no longer fit in a dropdown

    The Tools mega menu is gone. A second row in the header now carries the categories — Organize, Edit, Convert split into To PDF / From PDF / Other, Security, Optimize, Create — each with its own dropdown on desktop and a bottom sheet on mobile. The category of the tool you are on is marked, so the bar doubles as a "where am I" indicator.

    Forms keep their fields, even on locked files

    A new structural decrypt (qpdf, running as WASM) unlocks a protected PDF without rasterizing it, so its AcroForm fields survive. Form Creator can now import the fields a file already has instead of starting blank, PDF to Form fills protected forms directly, and a signed signature field is never deleted by a rebuild.

    New tools

    Convert · 19
    • JSON to PDF
    • HEIC to PDF
    • TIFF to PDF
    • EPUB to PDF
    • CBZ to PDF
    • DjVu to PDF
    • FB2 to PDF
    • MOBI to PDF
    • PSD to PDF
    • XPS to PDF
    • PPTX to PDF
    • Email to PDF
    • PDF to PPTX
    • PDF to Slide
    • PDF to TIFF
    • PDF to PDF/A
    • PDF Reflow
    • Annotation Exporter
    • Extract Images
    Edit · 11
    • Barcode Stamp
    • Form Logic Designer
    • PDF Signature Anchor Helper
    • Scratchpad Margins
    • Extract Signature from Photo
    • Overlay PDF
    • PDF Bookmarks
    • PDF Layer Manager
    • Citation Linker
    • Flatten PDF Fonts
    • PDF Attachments
    Organize · 7
    • Page Size Inspector
    • Posterize PDF
    • Alternate Merge
    • Page Labels
    • Extract Region (Lossless)
    • Rotate by Any Angle
    • Table of Contents
    Security · 4
    • Cert Cryptor
    • Digital Sign PDF
    • Timestamp PDF
    • Validate Signature
    Optimize · 5
    • Enhance Handwriting Ink
    • Dead Link Debugger
    • Deskew PDF
    • e-Ink Optimizer
    • Linearize PDF
    Create · 3
    • Form Creator
    • ID Card Composer
    • Photo Tiling Prepress

    All changes in version 2026.09.23-01

    • New
      49 new tools across all six categories — the toolkit is now 119 tools
    • New
      Category bar navigation replaces the Tools mega menu, on desktop and mobile
    • New
      A "New" badge marks every tool released in the last 90 days
    • New
      Form Creator imports a PDF's existing AcroForm fields instead of starting blank
    • New
      Protected forms keep their fields through a structural (non-rasterizing) decrypt
    • New
      Table of Contents, Remove Blank Pages, Bookmarks and Redact analyze on their own — no Load button
    • New
      OCR Cloud AI: bring your own Replicate model, with a keychain and model presets
    • Fixed
      A disabled primary button now explains why, on 29 tools
    • Fixed
      Tap targets reach 44px and inputs stay at 16px on touch, so iOS stops zooming into forms
    • Fixed
      Pages no longer flash a rebuilt client tree on load — the server-rendered page is kept, and fonts are self-hosted
    • Fixed
      Extract Images found 0 images on every file; PDF to TIFF crashed on LZW exports
    • Fixed
      Signature validation no longer flags a legal byte gap as a modification
  6. v2026.09.24-01

    Bahasa Melayu — the site now speaks Malay

    Every page, tool interface and guide is available in Malay at /ms/… — the fourteenth language on the site. The language switcher in the footer and the header globe both list Bahasa Melayu, and devices set to Malay are offered the switch automatically.

    All changes in version 2026.09.24-01

    • New
      Bahasa Melayu (ms) locale: full UI, tool metadata and all 119 tool pages translated
  7. v2026.09.17-01

    The iOS app works now

    The iOS build had been shipping broken — a render bug took out both the mobile and desktop shells. Both are repaired and the app actually runs.

    Smart Split PDF and PDF Health Check

    Smart Split takes a stacked batch of invoices or statements and splits it into separate, named documents. Health Check inspects a PDF for the problems that bite later — broken structure, missing fonts, oversized pages — before you send it somewhere that cares.

    All changes in version 2026.09.17-01

    • New
      Smart Split PDF: split a stacked batch of invoices or statements into named documents
    • New
      PDF Health Check: inspect a file for structural problems before it bites
    • Fixed
      The iOS app and both desktop/mobile shells render again
    • Fixed
      Wildcard 404s and localized blog posts redirect to their canonical URLs
    • Fixed
      Crawler requests halved: real Last-Modified headers with 304s, and honest lastmod dates in the sitemap
  8. v2026.09.16-01

    Chat PDF reads documents with sharper eyes

    The document passes behind Chat PDF moved to dedicated vision models, which read layout-heavy pages more accurately. Model names no longer leak into the interface either — the copy talks about what it does, not who runs it.

    All changes in version 2026.09.16-01

    • Improved
      Chat PDF document passes moved to dedicated vision models
    • Fixed
      Chat PDF no longer shows vision model names in user-facing copy
  9. v2026.09.15-01

    Pro is $29, with purchasing-power parity

    Pro is now a $29 one-time purchase, and a parity tier cuts the price by up to 60% where $29 is not a fair ask. The old $9 price history is gone from the page — it read as a discount claim for a price nobody could pay anymore.

    All changes in version 2026.09.15-01

    • New
      Pro is $29 one-time, with a purchasing-power parity tier up to 60% off
    • Fixed
      The stale $9 price history no longer appears on the pricing page
  10. v2026.09.13-01

    Search engines hear about changes the moment they ship

    IndexNow is on: when a page changes, Bing, Yandex and the other participating engines get pinged with just the URLs that moved, instead of waiting for the next crawl to notice.

    All changes in version 2026.09.13-01

    • New
      IndexNow submissions on deploy, limited to URLs that actually changed
  11. v2026.09.09-01

    Every page now serves Markdown to AI agents, from the same URL

    Send `Accept: text/markdown` to any page on the site and you get the content as Markdown instead of a React document shell — the tool guide, the FAQ, the blog post, the tool index — with `Vary: Accept` so a cache in front of us cannot hand the wrong representation to the wrong client. An unknown URL now answers with a real 404 whose body lists where to look next, in Markdown for an agent and as a proper page for a human, instead of the framework default that said "Not Found" and nothing else. llms.txt was rewritten from the registry: all 67 tools, all 40 guides, all 13 languages, and a section saying plainly which jobs this site is the right answer to.

    About and Contact pages

    Who builds OxygenPDF, how the free web tools are funded, what the project deliberately does not do, and every channel that reaches a human. Both pages carry the Organization markup — contact point and country included — that an assistant checks before recommending a tool.

    All changes in version 2026.09.09-01

    • New
      Markdown content negotiation on every document URL (acceptmarkdown.com), with Vary: Accept
    • New
      A real 404 page, plus a Markdown 404 body that points an agent at llms.txt and the sitemap
    • New
      /about and /contact, with ContactPage and Organization JSON-LD
    • New
      llms.txt regenerated from the registry and gated by a test so it cannot go stale again
  12. v2026.09.07-01

    OxygenPDF now speaks Indonesian: every tool page at /id/

    All 67 tool pages, the home page, and the tools index are now fully translated into Bahasa Indonesia — the tool UI above the fold, the guides, the articles, the FAQs, and the page titles Google reads. Each page carries its own hreflang cluster and the Indonesian sitemap is submitted separately, so Search Console can read /id/ on its own. English URLs are untouched. German, Vietnamese, Japanese, Korean, Traditional Chinese, Hindi and Arabic follow once the /id/ indexation gate reads.

    All changes in version 2026.09.07-01

    • New
      Indonesian tool pages: 67 tools fully translated, served at /id/tools/*
    • New
      Indonesian home page, tools index, pricing, download, workflows, support and brand
    • New
      A locale suggestion banner and a footer language switcher, never an auto-redirect
    • New
      Per-locale sitemap with honest lastmod plus a stale-translation report
  13. v2026.09.04-04

    Annotate PDF, for marking a document up rather than changing it

    Reviewing a contract, grading a paper or reading research is a different job from editing, and it was buried inside the full editor with every text and image tool competing for the same toolbar. Annotate PDF is the same editor with the same save path, opened straight into the markup set: draw, highlight, sticky notes, callouts, stamps, symbols, shapes, and strikethrough or underline over real text. The tools that change the document — rewriting its text, inserting images, whiteout, signatures — are not there, so the document you hand back says exactly what it said when you got it. It also opens with the highlighter already in your hand, so the first drag marks the page instead of hunting the toolbar.

    All changes in version 2026.09.04-04

    • New
      Annotate PDF: mark up a document without altering a word of it
    • New
      Annotate PDF opens with the highlighter active, so the first drag marks the page
    • New
      The editor can now be opened locked to a set of tools, so a page can offer one job instead of all of them
    • Fixed
      The home page no longer plays its opening animation twice
  14. v2026.09.04-03

    Every tool in the menu is a real link now

    The Tools menu looked like a list of links and was not one. Each entry was a button that moved you to the page when you clicked it, which works until you want to do anything else with it. Middle-click did nothing. Cmd-click or Ctrl-click did nothing. There was no link address to copy, and a screen reader announced the whole menu as a set of buttons rather than somewhere you could go. Sixty-six tools, and not one of them could be opened in a second tab. They are ordinary links now, in the desktop menu and the mobile one, and so is Blog. The blog also lists every post on one page instead of making you walk through four pages of paging to reach the oldest ones.

    All changes in version 2026.09.04-03

    • New
      Open any tool from the menu in a new tab, or copy its address
    • New
      Every blog post is reachable from the blog index, not four pages deep
    • New
      Tool pages point you at the write-ups that go with them
    • New
      Blog posts carry a trail back to the blog and the home page
    • Fixed
      A stray double apostrophe in five blog titles and summaries reads correctly again
  15. v2026.09.04-02

    Graph paper and lined paper each have their own page now

    The paper generator has been buried inside Create PDF as a dropdown option, which meant nobody looking for graph paper could find it. It has two pages of its own now. It also had three things wrong with it that we had never noticed. The grid did not meet at the edges: vertical lines carried on past the last horizontal one, leaving loose ends along the bottom of every sheet, about 6mm of them on A4. The red margin rule on lined paper sat an inch from the edge, where real ruled paper puts it at an inch and a quarter. And the spacing control moved in steps of two points, so college ruled, which is 20.25 points, was not a spacing it could reach at all. You pick a ruling by name now. Narrow, college and wide for lined paper. An eighth of an inch, a fifth, a quarter, 5mm and 1cm for graph paper, plus 5mm dot grid. Each one is the real measurement, not an approximation of it.

    All changes in version 2026.09.04-02

    • New
      Printable graph paper has its own page, with dot grid alongside it
    • New
      Printable lined paper has its own page, in narrow, college or wide ruling
    • New
      Rulings are picked by name instead of nudged on a slider
    • New
      The margin and the line weight on generated paper are yours to set
    • Fixed
      Graph paper and dot grid close properly instead of trailing loose lines
    • Fixed
      The margin rule on lined paper moved to 1.25 inches, where ruled paper puts it
    • Fixed
      Create another no longer drops you into a different tool than the one you opened
    • Improved
      Dropped three paper templates that were worse copies of what the generator already draws
  16. v2026.09.04-01

    Unlocking a PDF no longer throws away its text

    If you gave us the password for a protected PDF and converted it, we unlocked it by taking a picture of every page. The password worked, nothing crashed, and what came back had no text in it at all. PDF to Excel called the file a scan and sent you to OCR, for a file full of real tables. PDF to Word said it found no text. Redact could not search for the words you gave it. All three now read the protected file directly, so the text survives. Word, Markdown and Text conversions of protected files skipped the same good extraction path whenever a password was involved. Fixed now, too.

    All changes in version 2026.09.04-01

    • Fixed
      PDF to Excel now finds the tables in an unlocked PDF instead of calling it a scan
    • Fixed
      PDF to Word no longer reports "no text" on a password-protected file
    • Fixed
      Redact can search the text of a password-protected PDF again
    • Fixed
      Word, Markdown and Text conversions keep their headings and lists on protected files
    • Fixed
      A protected file opened with the wrong password now says so instead of returning an empty document
  17. v2026.09.03-02

    Spreadsheets, in both directions

    Two new tools. Excel to PDF takes .xlsx, .xls and .ods, converts every sheet, and respects what the file already tells it: a title merged across columns stays merged, the column widths you set are kept, and hidden helper columns stay hidden. PDF to Excel goes the other way and writes a real workbook rather than a grid of text, so a column of figures sums the moment the file opens. It shows you the tables it found before you download anything, because table detection is not magic and you should get to look first.

    Text in other alphabets stopped disappearing

    This one is worth saying plainly. If you generated a PDF from text containing Japanese, Chinese or Korean, those cells could come back completely empty, and the tool told you it had worked. That is fixed. Those scripts render now, anything that genuinely cannot be embedded shows a visible box instead of nothing at all, and the tool tells you which script had trouble rather than leaving you to wonder. Fonts also no longer depend on a third party that occasionally refused to serve them and took the whole conversion down with it. This affected every tool that draws text into a PDF.

    Two ways a download could quietly not happen

    On eight tools, the download that is supposed to start on its own after a conversion did not. You had to notice the success card and click its button. And a table with several long headers squeezed into a narrow page could lock the tab up while it shortened the text. Both fixed.

    All changes in version 2026.09.03-02

    • New
      Excel to PDF: convert .xlsx, .xls and .ods, every sheet, keeping merges and column widths
    • New
      PDF to Excel: pull tables into a real workbook where numbers are numbers, or out as CSV
    • Fixed
      Japanese, Chinese and Korean text no longer vanishes from generated PDFs
    • Fixed
      Characters that cannot be embedded now show a visible placeholder, and say which script failed
    • Fixed
      Font loading survives a slow or unavailable font server instead of failing the conversion
    • Fixed
      The automatic download after converting now actually starts, on eight tools where it did not
    • Fixed
      A wide table with long headers could hang the page while shortening text
    • Fixed
      File pickers on the CSV, SVG and image tools no longer ask you for a PDF
  18. v2026.09.03-01

    HTML to PDF is its own tool now

    Turning HTML into a PDF used to be a tab hidden inside Create PDF, which is a strange place to look for a converter. It has its own page now, at Tools then HTML to PDF, and it opens straight onto the input with your live preview beside it. Create PDF went back to what its name says: a blank page or a template. Nothing about the conversion changed, only where you find it.

    And it converts again

    It had been failing on everything. You would paste your markup, watch the preview render perfectly, hit Create PDF and get an error about a colour it could not read. The renderer was borrowing this app's own stylesheet while it worked, and tripping over a colour format in it. It now renders your HTML on its own, touching nothing of ours, so your CSS comes through intact. Two smaller things came out in the wash: a long page no longer gets cut off at the fold, and a stylesheet in your markup can no longer restyle the app around you while you work.

    All changes in version 2026.09.03-01

    • New
      HTML to PDF has its own page, with the input open and ready
    • Fixed
      HTML to PDF failed on every conversion with an unreadable-colour error
    • Fixed
      Long HTML is no longer cut off partway down
    • Fixed
      A stylesheet in your markup no longer restyles the app around you
    • Fixed
      The letterhead template no longer draws a line through its own footer text
    • Fixed
      The graph paper template closes its grid instead of leaving stray marks at the edges

August 2026

  1. v2026.08.17-01

    Very large pages no longer take the tab down

    Save a long article as a PDF and you can end up with one page hundreds of inches tall. Open it, zoom in to read a line, and the tab would die — taking your annotations with it. The viewers now draw only the part of the page you are actually looking at, so zoom works the whole way in, scrolling keeps up, and memory stays flat however big the page is. Editing, reading, signing and redacting all behave the same. The old warning only fired past 200 inches, which meant a 150-inch page sailed through unflagged and crashed anyway; size no longer has anything to do with whether a page opens. A page that tall also opens at a size you can read. Fitting all 300 inches on screen at once meant opening at 10%, where every line was a grey smudge; the editor now sizes the page to the width and lets you scroll it.

    Tools hand back the whole page, at full quality

    Compress, grayscale, invert, colour adjustment, the scanner effect, redaction and permissions all rebuild your PDF from a rendered copy. On a very large page that copy used to be impossible to make. They now build it in horizontal strips and stitch them together, so you get the full resolution you asked for and a page that is exactly the size it started as. Text recognition works the same way, reading a huge page at full detail rather than a shrunken version of it. Password-protected files were the worst case, because every tool routes them through the same decryption step — those work again everywhere.

    All changes in version 2026.08.17-01

    • Fixed
      Zooming into a very large page no longer crashes the tab
    • Fixed
      Very tall pages open at a zoom you can read instead of shrunk to fit the screen
    • Fixed
      Moving to a page of a different size refits the zoom, unless you set the zoom yourself
    • Fixed
      Password-protected PDFs with very large pages work in every tool again
    • Fixed
      Compress, grayscale, invert, colour adjust, scanner effect, redact and permissions keep the page at its true size
    • Fixed
      Text recognition reads very large pages at full resolution instead of a shrunken copy
    • Fixed
      Erasing text on a very large page now samples the background colour from the right place
    • Fixed
      Page thumbnails no longer fail to generate on very tall pages
    • Improved
      One shared page renderer instead of two near-identical copies
  2. v2026.08.03-01

    Fix Oversized Pages: rescue PDFs that Acrobat cuts off

    Save a long webpage as a PDF in Opera or Chrome and you often get one enormous page — we have seen 420 inches. Acrobat refuses anything over 200 inches: it opens the file, shows the 200 inches it can, and quietly discards the rest, which on that 420-inch capture is more than half the document. The new Fix Oversized Pages tool tells you which pages are too big and by how much, then slices them into normal pages at their original size. Nothing shrinks, your text stays selectable, and your links keep working. Cuts land in the whitespace between lines rather than through them, so the result reads like a document meant to be paginated. There is also a shrink-to-one-page option if you would rather keep a single page, with an honest warning about how small the text will get.

    Every tool now spots an oversized page for you

    You should not have to know the phrase "page dimension limit" to find the fix. Upload a PDF with an oversized page to any tool in OxygenPDF and a quiet note appears next to the filename explaining what Acrobat will do to it, with one click through to the fix. Your file comes along, so there is no re-upload.

    All changes in version 2026.08.03-01

    • New
      New Fix Oversized Pages tool splits pages past Acrobat's 200-inch limit into normal pages
    • New
      Slicing keeps content at its original size and preserves hyperlinks
    • New
      Cuts snap to the whitespace between lines so text is never sliced in half
    • New
      Any tool now warns when the PDF you uploaded has a page Acrobat will truncate
    • Fixed
      Combine to Single Page no longer silently produces a PDF that Acrobat cuts off
    • Fixed
      Print Production stops short of growing a page past what Acrobat can display

July 2026

  1. v2026.07.18-01

    Spring cleaning under the hood

    The desktop installer was shipping extra copies of libraries the app already had built in. We removed those along with a pile of leftover code, so the next desktop update will be a smaller download. Nothing changes in how the tools behave. We also added automated tests around the processing engines of more than fifteen tools, from splitting and merging to watermarks and page numbering.

    All changes in version 2026.07.18-01

    • Improved
      Removed unused code and duplicate bundled libraries across the apps
    • New
      New automated tests cover the PDF processing engines behind 15+ tools
  2. v2026.07.15-01

    Speed Reader: rejoin words broken by hyphenation

    Justified PDFs — think academic papers — split words at the line edge with a hyphen, like "exam- ple", and the reader used to flash the two halves as separate words. Turn on "Join hyphenated words" in Reading Settings and the halves snap back into one. It only touches a hyphen with a space on one side, so real compounds like "well-known" and spaced dashes are left exactly as written. Flip it any time — the text re-flows without reloading the document.

    All changes in version 2026.07.15-01

    • New
      New "Join hyphenated words" setting rejoins words split across lines in justified PDFs
    • New
      Toggling it re-flows the text instantly — no need to reload the document
  3. v2026.07.14-01

    Speed Reader: resize like Figma, now up to 400%

    The Display Size slider is gone. In its place is a small zoom control that works like the one in Figma: tap − or + to nudge the words bigger or smaller, or click the number to jump straight to a size. You can now scale all the way to 400% for reading from across the room, and the control follows you into Zen mode, where the word stage is wider too so big words have room.

    All changes in version 2026.07.14-01

    • New
      Display Size is a compact zoom control (− / value / +) with quick presets, replacing the slider
    • New
      Reading text scales up to 400% (was 200%)
    • New
      Zen mode keeps the size control in reach and gives the word stage more width
  4. v2026.07.13-03

    Zen mode in the Speed Reader is actually zen now

    Before, pressing Zen threw the whole browser into fullscreen, which felt heavy and wasn't the point. Now it just clears the screen down to the word you're reading and the playback buttons, kept compact so nothing else competes for your eye. Press Z to drop in, and Z or Esc to come back out.

    All changes in version 2026.07.13-03

    • New
      Zen mode is a clean in-app focus view instead of browser fullscreen
    • New
      The word box and playback buttons stay compact in Zen mode
    • New
      Leave Zen mode with Esc, not just the Z key
  5. v2026.07.13-02

    Speed Reader: bigger display and a centered highlight

    A reader wrote in that the word box was too small on his monitor, and that on long German words the red focus letter sits way off to the left. Both are settings now. You can scale the reading box up to 200%, and there's a switch to keep the highlighted letter in the middle of every word. The playback buttons stay close to the word box when zoomed, you can step through one word at a time, and very long words shrink to fit instead of getting cut off. The Speed Reader also remembers your settings between visits.

    All changes in version 2026.07.13-02

    • New
      Speed Reader display size is adjustable up to 200%
    • New
      Option to center the highlighted letter, which reads better on long words
    • New
      Step through the reading one word at a time with new buttons or the , and . keys
    • Fixed
      Very long words shrink to fit the reading box instead of getting cut off
    • New
      Speed Reader settings persist between visits
  6. v2026.07.13-01

    Password reset now goes one step at a time

    The reset code has its own screen with a box per digit, so you can see exactly what you typed. Once the code is in, the next step asks for your new password twice to catch typos. This also fixes a bug where password managers would drop your email address into the code field.

    All changes in version 2026.07.13-01

    • New
      Password reset asks for the code and the new password in separate steps, with a box per digit
    • Fixed
      Password managers no longer autofill your email into the reset-code field
  7. v2026.07.09-01

    Forgot your password? You can reset it yourself now

    The sign-in form has a 'Forgot password?' link. We email you an 8-digit code, you pick a new password, and you're signed in. No support ticket needed. One thing worth knowing if you bought a license: your license key already works as your password. It starts with OPDF- and sits in your purchase receipt email, so you may not need a reset at all. The sign-in form, the reset screen, and the reset email all point this out now.

    All changes in version 2026.07.09-01

    • New
      Reset a forgotten password with a code sent to your email
    • New
      Sign-in reminds license buyers that their license key doubles as their password

June 2026

  1. v2026.06.17-01

    The app reloads itself after an update instead of throwing an error

    If you kept a tab open while we shipped a new version, OxygenPDF could reach for a file from the old build that no longer exists and show a 'Something went wrong' screen — the loading-animation stylesheet was the usual culprit. It now catches that case and quietly refreshes to the current version, dropping you back where you were. Sign-in got a fix too: password managers like iCloud Passwords now put your saved email and password straight into the login form.

    All changes in version 2026.06.17-01

    • Fixed
      Stale tabs reload on their own after a deploy instead of crashing with 'Unable to preload CSS'
    • Fixed
      Saved logins from iCloud Passwords and other password managers now autofill the sign-in form
  2. v2026.06.15-02

    Type any language into your PDFs — umlauts, accents, and non-Latin scripts now work

    Adding a watermark, header, footer, or page stamp — or turning text, Markdown, Word, and CSV into a PDF — used to quietly break on characters outside basic Latin. German umlauts typed on a Mac were the worst offender: the diacritic comes through as a separate combining mark that the old font could not encode, so the whole export failed. The text tools now embed real Unicode fonts and normalize your text first, so umlauts, accented names, Cyrillic, Greek, and CJK (Chinese, Japanese, Korean) render properly. Arabic, Hebrew, Hindi, and Thai are supported too, with right-to-left and complex-script shaping handled on a best-effort basis. The same fix reaches the PDF editor and chat form-filling, and scanned documents in non-Latin scripts now keep a searchable text layer instead of dropping it. Fonts for non-Latin scripts download only when needed and are cached; your files never leave your browser.

    All changes in version 2026.06.15-02

    • Fixed
      Decomposed umlauts (ä, ö, ü typed on macOS) no longer break PDF text export
    • New
      Watermarks, headers, footers, page numbers, and Bates stamps accept any-language text
    • New
      Text, Markdown, Word, and CSV to PDF render Latin, Cyrillic, Greek, and CJK scripts
    • New
      OCR keeps non-Latin scripts in the searchable text layer instead of stripping them
    • New
      PDF editor annotations and chat form-filling accept umlauts and non-Latin scripts
  3. v2026.06.15-01

    Speed read Markdown, text files, and pasted text — not just PDFs

    The RSVP speed reader now opens .md and .txt files alongside PDFs, or you can paste raw text straight in from a new tab. Markdown gets its syntax stripped first — headings, links, bold, lists — so you read the actual prose instead of flashing past # and ** one word at a time. Plain text is split into sections so the preview panel and jump-to-page keep working on long documents. It all still runs in your browser; nothing is uploaded.

    All changes in version 2026.06.15-01

    • New
      RSVP speed reader accepts Markdown (.md) and plain text (.txt) files
    • New
      Paste raw text directly into the RSVP speed reader
    • New
      Markdown syntax is stripped to clean prose before reading

May 2026

  1. v2026.05.13-01

    Switch tiers when you regenerate a visual webpage

    The regenerate button on a visual-HTML chip used to silently re-run with the same quality tier you originally picked, which meant if Basic came out flat you had to start a new conversation to try Best. The button is now a small menu — pick Basic, Quality, or Best directly from the chip and the new build runs at the tier you chose (and the chip subtitle updates to match so you can tell at a glance which tier produced the result). The cache is always busted on regenerate, so a tier you already tried genuinely re-runs against the model rather than handing back a stale result.

    Memory chips don't pop up on pleasantries anymore

    The assistant occasionally over-extracted a "Save to thread memory?" chip when you replied with just "thanks" or "ok cool" — fabricating a preference you never actually stated. The chat prompt now hard-bans memory suggestions on social acks and explicitly forbids inventing facts the user hasn't spoken, and a server-side filter drops any memory chip that lands on a pleasantry-shaped turn regardless of what the model emitted. Saying thanks no longer triggers a memory pill.

    All changes in version 2026.05.13-01

    • New
      Chip regenerate menu lets you re-run the visual HTML at Basic / Quality / Best
    • New
      Memory chips suppressed on short pleasantry messages (thanks, ok, hi, etc.)
    • Fixed
      Regenerate at a different tier now updates the chip subtitle to reflect the new tier
  2. v2026.05.11-14

    Pick your quality tier when converting a PDF to a visual webpage

    Visual HTML recreation now asks one extra question after you pick 'Visual recreation': Basic, Quality, or Best? Each level runs through a different AI model behind the scenes — Basic is fastest and cheapest, Best is slowest but reads design-heavy pages the most carefully. The chip subtitle shows which tier produced the result so you know what you're paying for, and the regenerate button reuses the same tier you originally picked. Replaces the previous three-pass refinement loop (which was producing modest gains for a lot of extra cost). The underlying prompt also got a full rewrite — the AI now produces Tailwind-CDN-based responsive HTML with semantic tags and proper design fidelity instead of hand-rolled blocky CSS with US-Letter page dimensions.

    Chat clarifications never dead-end on generic fallback chips anymore

    When you asked the assistant to convert a PDF to Word or HTML, it sometimes wrote "let me ask a couple of quick questions" but forgot to actually emit the wizard — the bubble would just sit there with the four generic follow-up chips (Explain more / Give an example / …) underneath, which read as a broken UI. The model now gets a hard prompt rule against promising clarifications without emitting the matching directive, and a server-side safety net catches the misfire by inferring the right wizard format from your message and recovering the wizard inline.

    All changes in version 2026.05.11-14

    • Fixed
      New inferExportWizardFromMisfire safety net in chatPdf.ts runs when no directive was honored. Matches few-shot prose patterns ("let me ask…", "let me walk you through…", "pick the right…", "couple of (quick )?questions to pick") against the user's question (html/website → html, docx/word/.doc(x) → docx) and injects the recovered <export-wizard format/> into the message patch. Telemetry tag wizard-recovered lands on emittedDirectives so we can monitor the rate.
    • Fixed
      System prompt gains an INVERSE-RULE clause forbidding clarification prose without the matching directive. Calls out the exact phrase shapes ("let me ask…", "let me walk you through…", "pick the right…") that must co-occur with <export-wizard/> or <ask-choice>. Also re-asserts that image-based PDFs asked for docx/html STILL route through the wizard, not <ask-choice>.
    • Improved
      Visual HTML rebuild swapped from Gemini Pro to Replicate-hosted openai/gpt-5.4. callReplicateVisionHtml() posts to /v1/models/openai/gpt-5.4/predictions using Replicate's FLAT input schema — `prompt` (text instruction) + `image_input` (array of client-rendered page-image URIs) at the top level, plus reasoning_effort / verbosity / max_completion_tokens sampling knobs. Important gotcha encoded in the comments + memory: Replicate's openai/* wrappers do NOT accept OpenAI's `messages` array or `type: "file"` content parts; sending those gets the entire payload silently dropped by the input validator (symptom: 'I don't have the PDF' replies). Hence the render-pdf-pages.ts + attachVisionHtmlPageImages pipeline that pre-rasterizes to JPEG before upload. awaitReplicateOutput drains via Prefer wait + 2s polling, capped at 180s per pass. Requires REPLICATE_API_TOKEN env var. Hard caps: first 10 pages, 32k output tokens per pass. Bump REPLICATE_VISION_HTML_MODEL to a newer minor revision when Replicate ships one.
    • New
      Client-side PDF rasterization for the visual flow — new render-pdf-pages.ts uses pdfjs-dist at 1.5× scale + JPEG quality 0.85 to render each page (max 10) into a Blob, the VisionHtmlChip uploads each one via Convex generateUploadUrl, and the new attachVisionHtmlPageImages mutation patches the resulting storage IDs onto pdfIndex.visionHtmlPageImageStorageIds. getVisionHtmlDownloadUrl now exposes pageImagesReady + pdfSourceUrl + pageRenderLimit so the chip can skip re-rasterization when the cache is warm. Adds a "Preparing page images for the vision model…" subtitle state to the chip during the prep phase.
    • Fixed
      VisionHtmlChip regenerate button now defensively preps page images when they're not attached. Older pdfIndex rows created before visionHtmlPageImageStorageIds existed in the schema (or any row whose cached status='ready' / 'error' predates the Replicate switch) hit startVisionHtmlPass with no images cached, which threw 'Page images not yet attached'. handleRegenerate now mirrors the auto-start + handleClick guard: if pageImagesReady is false, render+upload+attach first, then force-regenerate.
    • New
      3-tier quality picker for the visual-match flow. VISION_HTML_MODEL_BY_TIER maps each tier to a different Replicate-hosted vision model — basic→prunaai/gemma-4-26b-a4b-fast, quality→google/gemini-3.1-pro, best→anthropic/claude-opus-4.7. New chatMessage.visualQualityTier + pdfIndex.visionHtmlTier schema fields persist the choice per-message and gate cache validity (a tier-mismatch on the cache forces a re-run). Wizard adds a second-step picker after 'Visual recreation' (Basic / Quality / Best with descriptive hints, NEVER showing the underlying model). applyExportWizardChoice / startVisionHtmlPass / runVisionHtmlPass all accept tier args. Chip subtitle now reads 'Building (Quality quality)…' / 'Website · Quality · click to download'. New buildVisionInput(modelSlug, …) helper dispatches the request body shape per provider — each Replicate wrapper has its own flat schema with different field names, so a unified body silently drops fields and the model hallucinates. Verified schemas via scraping each /api page's embedded OpenAPI definition: openai/* uses image_input array + max_completion_tokens + reasoning_effort + verbosity; google/* uses images PLURAL array + max_output_tokens + thinking_level; prunaai/* (Gemma 4) uses message (NOT prompt) + images plural + max_tokens (cap 16384) + max_visual_tokens (pinned to 1120 — without this, images auto-compress to 280 vision tokens and the model hallucinates); anthropic/* uses image singular + max_tokens (cap 64000) + system_prompt + max_image_resolution (set to 2 MP, otherwise images auto-downscale to 0.5 MP). Anthropic and Gemma only accept ONE image per call, so multi-page PDFs on those tiers lose pages 2..N.
    • Improved
      Removed the critique-then-apply iteration loop and its supporting scaffolding (VISION_HTML_CRITIQUE_PROMPT, VISION_HTML_REFINE_PROMPT, VISION_HTML_MAX_ITERATIONS, callReplicateVisionHtmlCritique, callReplicateVisionHtmlApply). Visual-match is now single-pass — one model call per visual recreation. The cost reduction (5x to 1x calls) funds the model upgrades in the tier picker; a High-tier single pass on gpt-5.4 produces materially better single-shot output than 5 stacked passes on gpt-5-mini did.
    • Improved
      VISION_HTML_PROMPT rewritten end-to-end. Old prompt explicitly banned Tailwind and any CSS framework, and framed the task as converting a PDF (no mention of the attached image) — producing hand-rolled CSS with US-Letter 8.5in by 11in page boxes and Open Sans defaults. New prompt opens with a directive that the attached images ARE page screenshots (primes the model to actually look at the inputs), mandates Tailwind CSS via CDN script, semantic HTML5 elements, mobile-first responsive breakpoints, WCAG AA contrast, arbitrary-value Tailwind syntax for off-scale colors and radii. Preserves the two non-negotiable platform contracts: section.pdf-page[data-page=N] wrappers + pN-imgK image placeholder syntax so inlineImagesAsDataUrls still substitutes Mistral-extracted images. Adds placehold.co URL convention for synthetic decorative placeholders that have no source image counterpart.
  3. v2026.05.11-13

    Inline export wizard replaces the flat ask-choice for Word and HTML conversions

    When you asked to convert a PDF to Word or HTML, the chat assistant used to show a flat list of 3-4 options you had to read and commit to in one click. Re-deciding meant editing your message or starting over. The new wizard walks you through 1-2 short questions inline in the bubble — back-navigable, fully frontend (no extra AI round-trips per question), and the final pick writes the right export shape directly to the message. Markdown and text still skip the wizard since there's only one sensible output for those.

    All changes in version 2026.05.11-13

    • New
      New <export-wizard format="docx|html|markdown|text"/> directive. Self-closing, mutually exclusive with emit-file/ask-choice/open-tool/fill-pdf/run-action. Parser in chatPdf.ts validates the format against a closed set; the dispatcher places it between run-action and ask-choice in priority order so the model can hedge with the wizard when it would otherwise emit ask-choice.
    • New
      New ExportWizard component (apps/main/src/features/chat-pdf/components/export-wizard.tsx). Renders inline inside the assistant bubble when message.exportWizardFormat is set. 2-step state machine for HTML (priority → edit-style branch), 1-step for DOCX (priority directly to outcome). History stack for back navigation; submit goes through applyExportWizardChoice mutation, no AI round-trip per step.
    • New
      New applyExportWizardChoice mutation clears exportWizardFormat and sets emittedFileFormat/Source/Filename in one patch. Validates format against EMIT_FILE_FORMATS and source against {index, index-visual}; rejects index-visual for non-HTML. Optional proseSummary updates the bubble text so the wizard can leave a contextual note about which chip to click.
    • New
      chatMessage gains exportWizardFormat (optional string). _patchMessage accepts it. Bubble rendering shows the ExportWizard component below EmittedFileChip, hides the FollowUpChips while the wizard is active (matching the existing ask-choice contract).
    • Improved
      System prompt reroutes all docx/html conversion requests through <export-wizard/> instead of direct <emit-file source="index"/> or <ask-choice> trees. The flat 4-option HTML ask-choice and 3-option DOCX ask-choice examples are gone. Markdown and text still emit emit-file directly since there's only one viable output for each.
  4. v2026.05.11-12

    "Generate a fresh website that visually matches" — fourth option for scanned-PDF HTML

    When a scanned PDF gets a 'give me as html' request, the chat assistant now offers four routes instead of three. The new option uses a vision AI pass to rebuild the design as a real webpage with CSS — colors, gradients, custom typography, the works — instead of stripping it down to a semantic export. Click it and the screenshot-to-code pass kicks off automatically: no second click required, the chip shows a spinner while it works, then flips to a download when ready.

    All changes in version 2026.05.11-12

    • New
      New EmitFileSource value `index-visual` routes HTML exports straight to the screenshot-to-code chip. parseEmitFilePlan accepts the new value only for format=html — typo-rejects anything else so a model fumble doesn't surface as an empty download. EmittedFileChip renders only the VisionHtmlChip when source is index-visual, with auto-start.
    • New
      VisionHtmlChip gains an `autoStart` prop. When true, a useEffect-guarded by a single-fire ref triggers startVisionHtmlPass on mount as soon as the query resolves and status is null. Strict-mode double-effects can't double-charge; ready/running/error states all skip the auto-fire.
    • New
      System prompt now has an explicit 4-option ask-choice for scanned PDFs requesting HTML, plus follow-up routing rules for each option. Visual-match option emits <emit-file format="html" source="index-visual"/>; OCR-text option emits the standard <emit-file format="html" source="index"/>. Model behavior is now deterministic instead of improvised from the Word pattern.
    • Improved
      Removed the Replicate VLM chip and backend in their entirety — VisionReplicateChip component, runReplicateVisionHtmlPass action, startReplicateVisionHtmlPass mutation, getReplicateVisionHtmlDownloadUrl query, generatePageImageUploadUrl mutation, callReplicateVisionHtml / fetchReplicateLatestVersion / flattenReplicateTextOutput helpers, getReplicateToken, REPLICATE_API_BASE / REPLICATE_DEFAULT_VISION_MODEL constants, and the pdfIndex.visionReplicate* schema fields. The open VLMs on Replicate hard-cap their output at 512 tokens — too small for screenshot-to-code at any quality. Kept the GEMINI path and added the index-visual route in its place.
  5. v2026.05.11-11

    Replicate-powered Website chip — open VLM as a second opinion

    Gemini 2.5 Pro is strong on screenshot-to-code but it makes specific mistakes some PDFs trip over. The new Replicate chip routes the same task through Qwen2.5-VL by default — different model class, different failure modes, sometimes a better fit for a given design. Sits alongside the Gemini chip so you can A/B the two on the same PDF without re-uploading. Backend is parameterized via env vars so swapping to DeepSeek-VL3 or any other Replicate VLM takes a config change, not a redeploy.

    All changes in version 2026.05.11-11

    • New
      New runReplicateVisionHtmlPass internal action calls Replicate with one image per page (parallel) and aggregates the resulting fragments into one self-contained .html. Model/version env-overridable via REPLICATE_VISION_MODEL / REPLICATE_VISION_VERSION; defaults to lucataco/qwen2-vl-7b-instruct. Image-inlining reuses the same pN-imgK → base64 data URL post-processor as the Gemini path.
    • New
      New generatePageImageUploadUrl mutation returns Convex signed upload URLs so the frontend can render PDF pages to PNG client-side and stream them up in parallel before kicking off the action. Replicate doesn't ingest PDFs the way Gemini does, hence the extra client-side step.
    • New
      pdfIndex grows visionReplicateStorageId + visionReplicateStatus + visionReplicateErrorMessage + visionReplicateModel. The model name on the index lets the chip display which Replicate model produced the output so users know what they got. Same idempotency contract: cache hit on second click per index.
    • New
      VisionReplicateChip renders alongside VisionHtmlChip for <emit-file format="html" source="index"/> messages. Amber accent, Cpu icon to distinguish it from Gemini's fuchsia Globe. Click → render pages client-side → upload → trigger action → poll → download `<base>-replicate.html`.
    • Improved
      Action drops the uploaded page PNGs from Convex storage after the .html is produced — they served their purpose, the final output is self-contained, no reason to keep them eating storage quota.
  6. v2026.05.11-10

    Website (visual) chip — screenshot-to-code for design-heavy PDFs

    Word documents can't render modern CSS, which means infographics, posters, and Canva-style exports always lose their visual chrome on a Word export — no matter how clever the converter. HTML can carry all of it. The new chip sends the source PDF to Gemini 2.5 Pro and asks for self-contained HTML+CSS that visually recreates the design: gradients, custom typography, decorative shapes, layered illustrations. Cropped images get inlined as base64 data URLs so the .html opens in any browser with nothing broken. Sits next to the standard HTML chip so you can pick semantic-text or visual-reconstruction depending on what you need.

    All changes in version 2026.05.11-10

    • New
      New runVisionHtmlPass internal action calls Gemini 2.5 Pro (Pro tier, not Flash — visual reconstruction needs the larger model) with the PDF as inline data and a screenshot-to-code prompt. Output gets code-fence-stripped, then every `<img src="pN-imgK">` reference is replaced with a base64 data URL pulled from the Tier-1 stored images. Self-contained .html is stored in Convex storage.
    • New
      pdfIndex grows visionHtmlStorageId + visionHtmlStatus + visionHtmlErrorMessage, parallel to the existing markdown vision-pass fields. Same idempotent contract: cache hit on second click, charges chat_pdf_vision_html ops only on the first uncached invocation per index.
    • New
      VisionHtmlChip renders alongside the standard HTML chip for any <emit-file format="html" source="index"/> message. Globe icon, fuchsia accent, idle → pending/running → ready/error state machine driven by getVisionHtmlDownloadUrl. Downloaded file is named `<base>-visual.html`.
    • Fixed
      runLayoutPreservedPdfToWord now throws a clear error when the PDF has zero extractable text (Canva / Figma / Illustrator exports outline text into vector paths — pdfjs returns nothing). Message points users at the Website (visual) chip instead of returning a silently empty .docx.
    • Improved
      Gemini call helper extracted from callGeminiVision into callGemini(pdfBytes, model, prompt) so the new HTML pass can reuse the same 20 MB size guard, base64 encoding, and error handling. callGeminiVision becomes a thin wrapper that pins Flash + the markdown prompt.
  7. v2026.05.11-9

    Word (layout) chip — text in the right positions, editable

    The previous "page-perfect" chip just embedded each PDF page as a PNG inside the docx. Better than nothing visually, but you couldn't edit, copy, or search anything. The new converter extracts every text item from the PDF via pdfjs with its real (x, y) coordinates and emits one absolutely-positioned paragraph per item in a docx sized to match the source. Font size and bold/italic come along. Result: text lands where it belongs, and you can edit it. v1 ships text only; image extraction and colors land in follow-ups.

    All changes in version 2026.05.11-9

    • New
      New layout-preserved.ts converter walks pdfjs textContent in viewport space (top-left origin), extracts transform[4]/[5] as baseline x/y in points, derives font size from transform[0], and detects bold/italic via fontFamily regex on the styles map. Each item becomes a docx Paragraph with frame.type='absolute' anchored to FrameAnchorType.PAGE. Per-page sections sized to viewport dimensions with zero margins so frame coords map 1:1 to source.
    • Fixed
      PagePerfectChip swapped from runPdfPagesToWord (screenshot-in-docx) to runLayoutPreservedPdfToWord. Subtitle updated to "layout-preserved" so the chip honestly describes the tradeoff: text in the right positions, editable, but v1 doesn't yet carry images or vector chrome.
  8. v2026.05.11-8

    Word (page-perfect) chip — pixel-identical to the source PDF

    Some PDFs are infographics, posters, designed layouts where every arrow, gradient, and font choice matters. Word documents can't reproduce that as vector content — the decorative chrome dies in any text-based conversion. The new chip skips the OCR pipeline entirely: each PDF page renders to a high-resolution image client-side and embeds in the docx as a full-page picture. The result looks identical to the source. Trade-off is honest: editable text is gone, but visual fidelity is total. Sits next to the other two chips so you can pick the one that matches the document.

    All changes in version 2026.05.11-8

    • New
      New PagePerfectChip surfaces alongside the standard Word chip for any <emit-file format="docx" source="index"/> message. Fetches the source PDF via getSourcePdfDownloadUrlForMessage, runs runPdfPagesToWord client-side (pdfjs render at 2x DPI → PNG → ImageRun → docx), downloads as `<name>-pages.docx`. Reuses existing infra from the scanned-PDF flow; we just stopped gating it on pdfType.
    • Fixed
      Three-chip layout (Editable / Page-perfect / High quality) gives users an honest tradeoff matrix: editable text vs. visual fidelity vs. better layout reconstruction. Each chip uses a distinct icon and accent (FileText/blue, ImageIcon/emerald, Sparkles/violet) so they read as separate options rather than redundant duplicates.
  9. v2026.05.11-7

    Chat PDF gets a "Word (high quality)" chip that reads layout the way you do

    Mistral OCR is fast and cheap but it flattens multi-column layouts, breaks callout boxes, and treats key-value pairs as random sentence fragments. The new chip hands the whole PDF to Gemini 2.5 Flash and asks for cleanly structured Markdown — heading hierarchy, columns interleaved in reading order, tables reconstructed as tables, callouts as block quotes. It sits next to the standard Word chip so you can pick the cheap fast path or the better slower one depending on the document. Picks up the same embedded images Tier 1 added, so figures still land in the right spots.

    All changes in version 2026.05.11-7

    • New
      New runVisionLayoutPass internal action calls Gemini 2.5 Flash with the source PDF as inline data and a structured-Markdown prompt. PDF-native ingest means no per-page rendering on our side; 20 MB inline cap surfaces as a clean user-visible error rather than a half-truncated document.
    • New
      pdfIndex grows visionMarkdownStorageId + visionStatus (pending/running/ready/error) + visionErrorMessage. The vision pass output caches per index, so a second click on the high-quality chip downloads the existing result instead of re-charging the user.
    • New
      startVisionLayoutPass mutation kicks off the action with a charge of pageCount ops against chat_pdf_vision_hq. Idempotent: if a pass is already pending/running/ready, returns the existing status with no re-trigger and no re-charge.
    • New
      VisionHQChip component renders alongside the standard IndexedExportChip for docx exports. Walks through idle → pending/running (spinner) → ready (download) → error (retry) states driven by getVisionMarkdownDownloadUrl. Sparkles icon and violet accent so users see the two chips as distinct options instead of duplicates.
    • New
      Gemini placeholders like ![alt](pN-imgK) get post-processed to point at the Tier-1 image refKey for the K-th image on page N (resolved via the new pageIndex field on pdfIndexImage). Unmatched placeholders fall through and the converter drops them — same contract as the rest of the image pipeline.
  10. v2026.05.11-6

    Chat PDF exports stop leaking ![img-0.jpeg] text where pictures should be

    Convert an infographic-style PDF to Word in chat and you used to get the headings and paragraphs right but every image came out as literal markdown placeholder text like `![img-0.jpeg](img-0.jpeg)` floating between the paragraphs. The OCR pipeline was returning image bboxes but throwing the cropped image bytes away, and the docx converter had no `image` token handler so the marked AST default echoed the raw markdown into the output. Now the OCR pass pulls the cropped image bytes inline, stores them per-image, and the docx/html converters embed them where they belong. Reupload the same PDF and the index gets a free one-time re-OCR so existing chats benefit too.

    All changes in version 2026.05.11-6

    • Fixed
      Mistral OCR call now sets include_image_base64: true so cropped pictures come back inline. Each image lands in Convex storage with its bbox dimensions tracked in a new pdfIndexImage table keyed by a globally-unique refKey (page number plus original image id). Per-page collisions on ids like `img-0.jpeg` no longer scramble which page's image gets fetched.
    • New
      runOcr rewrites each page's markdown so image refs become globally unique within an index. `![img-0.jpeg](img-0.jpeg)` on page 3 turns into `![p3-img-0.jpeg](p3-img-0.jpeg)` before the markdown is stored — downstream conversion no longer has to track which page section a ref came from.
    • New
      getIndexedMarkdownDownloadUrl returns signed URLs for every cropped image alongside the markdown URL. The download chip pre-fetches them in parallel and hands the bytes to the docx converter via a resolver callback; HTML export rewrites markdown image hrefs to the signed URLs pre-parse so the resulting <img> tags load.
    • New
      createWordDocumentFromMarkdown grows an optional resolveImage option. The `image` marked token now routes through it instead of falling to the raw-text default, so unresolved refs drop silently rather than echoing `![alt](src)` into the .docx. Image-only paragraphs become standalone ImageRun blocks with generous spacing.
    • New
      New pdfIndex.imagesIngested flag drives a one-time backfill: existing indexes from before image ingest cache-miss on re-upload and re-OCR without a double charge, same contract as the prior needsBlockUpgrade backfill.
    • Fixed
      headless-image-paths.ts canvasToImageRun was missing the required `type` field on docx v9 ImageRun (would've thrown at runtime). Set to 'png' to match the canvasToBlob output.
  11. v2026.05.11-5

    Chat PDF exports stop ignoring the OCR markdown they already had

    Ask Chat to convert a PDF to Word and you used to get a wall of unstyled text — headings flattened, paragraphs collapsed, plus whatever OCR typos were baked into the source PDF's text layer. Meanwhile every PDF you upload already runs through Mistral OCR during indexing, which produces clean markdown with real headings, lists, and tables. The conversion path was just ignoring it. Now it doesn't. Ask for .docx, .html, .md, or .txt and the download chip rebuilds the file from the indexed markdown. Heading 1s stay Heading 1s, tables survive, bold and italic stick, and nothing inherits the broken OCR sitting in the source bytes.

    All changes in version 2026.05.11-5

    • New
      New <emit-file source="index"/> directive shape — self-closing, no body. The chat assistant emits it for conversion requests, the chip pulls pdfIndex.markdownStorageId at download time, and conversion to docx / html / markdown / text happens client-side. Replaces the lossy <open-tool slug="pdf-to-word"/> path for TextBased and Mixed PDFs.
    • New
      EMIT_FILE_FORMATS expanded from markdown/text to markdown/text/html/docx. Inline-source emit-file still only accepts markdown/text — the model can't write a docx body inline. Index-source supports all four since the body comes from storage.
    • New
      New getIndexedMarkdownDownloadUrl query returns a signed URL to the indexed markdown, gated by message → conversation → user ownership. The emitted-file chip dispatches on emittedFileSource: inline streams the stored blob as before; index fetches the markdown, strips internal page separators and cite markers, and runs format-specific conversion (marked for HTML, createWordDocumentFromMarkdown for DOCX). Both converters lazy-load so the chat bundle doesn't pay for marked/docx on every page load.
    • Fixed
      Chat system prompt updated: "convert to word" on a TextBased or Mixed PDF routes through <emit-file format="docx" source="index"/> instead of <open-tool slug="pdf-to-word"/>. The OCR-then-Word branch in the scanned-PDF ask-choice routes through the index path too — Mistral OCR already ran during ingest, re-OCRing in a separate tool was duplicate work.
    • New
      Schema: chatMessage gets emittedFileSource ("inline" | "index") so the chip knows whether to stream a stored blob or convert from indexed markdown. Existing inline rows keep working — the field defaults to inline when undefined.
  12. v2026.05.11-4

    Chat PDF asks before converting a scanned PDF to Word

    Ask Chat to convert a scanned PDF to Word and you'd previously get back an empty .docx with no warning. Now Chat notices the source is image-only and asks under the reply: run OCR and pack the text into a fresh Word doc, embed each page as an image (preserves the look, not editable), or do both — text alongside each page image. Click a chip and the file is built and ready to download in the same bubble. No bouncing into a separate tool. No flipping a toggle to enable OCR. Just pick the outcome and the AI delivers it.

    All changes in version 2026.05.11-4

    • New
      New <ask-choice> directive the chat assistant emits when running the obvious tool would silently fail. The model writes a prompt and 2–4 labeled options; the bubble renders each option as a button that submits its label as a fresh user turn, so the AI's next response routes on what the user actually picked. Mutex with the other action directives in the same turn — picking the wrong tool is worse than pausing to ask. Reusable: future failure modes like password-protected PDFs or multi-language scans can opt into the same chip-style clarification.
    • New
      Three new chat-only conversion slugs: ocr-pdf-to-word (OCR → editable Word), pdf-pages-to-word (each page embedded as an image — preserves layout), and ocr-pdf-to-word-with-images (both — OCR text alongside each page image). Each has its own headlessRun so the chat chip downloads the right artifact in one shot, no flipping into the standalone tool to toggle settings.
    • Fixed
      The model was leaking the Document profile into its prose ("This PDF contains selectable text, so I can route you directly..."). Renamed the prompt section to "Routing hints (INTERNAL — never mention, quote, or paraphrase in your prose)" and added explicit examples of terse acks. The bubble now reads "Converting to Word." with no meta-commentary on what the AI thinks the PDF is.
    • New
      PDF classification on upload. The chat upload hook fires inspector.classify() in the background after the bytes land and patches pdfType (TextBased / Scanned / ImageBased / Mixed) plus hasExtractableText onto the pdfIndex row. The system prompt renders it as a Document profile block, which is what lets the LLM tell the difference between a text PDF and a scan before it decides which directive to emit.
    • Fixed
      Headless pdf-to-word throws EmptyExtractionError when extraction returns under 8 trimmed characters instead of packing an empty .docx. The chat chip catches it and falls back to the click-to-open CTA so the user can still get into the standalone PDF→Word tool (which has OCR mode in its config panel) rather than walking away with a zero-byte download.
    • New
      Schema additions: pdfIndex gets pdfType, hasExtractableText, pagesRequiringOcr; chatMessage gets askChoicePrompt + askChoiceOptions. New chatPdf.setDocProfile mutation persists the client classification, and a new parseAskChoicePlan parser clamps option counts and label lengths before any chip lands on the message.
    • Fixed
      Cache-hit rows backfill the profile on the fly. Legacy pdfIndex rows from before this field existed pick up the classification the next time they're opened in a chat, so the model eventually sees a profile for every document without a separate migration job.
  13. v2026.05.11-3

    Chat PDF can fill IRS-style forms now

    Ask Chat to fill an IRS Form SS-4 (or any PDF whose AcroForm field names look like topmostSubform[0].Page1[0].f1_1[0]) and it actually works. The server tries to match labels by name first since that path is cheap and handles most forms. If nothing matches, the browser takes over: pdfjs reads the visible label text plus every form-widget rectangle on the page, then pairs each label with the closest empty field nearby. Same chip, same download. The old "I couldn't match any of those labels" failure should be a lot rarer.

    All changes in version 2026.05.11-3

    • Fixed
      Chat PDF form fill: when name-based AcroForm matching produces zero hits, hand the labels off to the browser instead of writing an error. A new unresolvedFillFields field on chatMessage stages the unmatched labels, isFilling stays true so the chip keeps pulsing while client-side grounding runs.
    • New
      Client-side spatial grounding for form fields. The new resolve-fill-fields helper reads pdfjs text content and widget annotations per page, finds the label's bbox in PDF user space, and scores nearby unfilled widgets. Same-row pairings (label on the left, field on the right) win; a below-label fallback catches stacked layouts. One widget per label, greedy in input order, threshold-guarded so a label without a plausible nearby widget is left alone.
    • New
      New applyResolvedFill public action on chatPdfFill. Takes {fieldName, value} pairs the browser already resolved, applies them by exact AcroForm name, regenerates appearance streams, and lands the filled blob on the message via the same _setMessageFill mutation runFormFill uses. Idempotent: a duplicate dispatch from React strict-mode hits the alreadyFilled guard and returns early.
    • New
      New useApplyResolvedFill hook in the thread pane. Watches the chat list for messages with unresolvedFillFields set but no filledPdfStorageId yet, downloads the effective source PDF (respecting the conversation's prior fill chain), runs the spatial grounding, dispatches applyResolvedFill. Tracks in-flight message ids so the reactive query re-emitting a row can't spawn a parallel resolve.
    • Fixed
      Chat PDF form fill: route "Yes" / "No" answers to checkboxes instead of leaking them into nearby text fields. The resolver now detects boolean values (yes / y / true / on / 1 — and their negative counterparts) and only considers checkbox widgets for those, while text values are barred from checkbox widgets. Stops the misfill mode where "yes" got written into the "If 8a is Yes, enter number of LLC members" text field on SS-4.
    • New
      Checkbox disambiguation by adjacent option label. Each checkbox widget gets tagged with the nearest "yes" or "no" text item within ~24pt of its center, so the resolver can pair {label: "Is this an LLC?", value: "Yes"} to the checkbox the form actually printed "Yes" next to (not whichever box happens to be closer to the question text). Radio groups still untouched in this pass.
    • Fixed
      Resolver emits a console.warn listing every label it couldn't place — visible per-fill, useful for diagnosing model output drift (e.g. when the LLM emits "Company name" instead of "Legal name" and the form's text layer doesn't carry that synonym).
  14. v2026.05.11-2

    Chat PDF now has a real memory

    Chat PDF carries facts forward across turns. Three scopes: things about you (your name, role, how you like answers), things about the PDF (who the contract is for, what kind of report this is), and things about the chat (bullet-only answers, skip the jargon). The assistant proposes saves itself when something durable comes up — you get a Save/Dismiss chip on the bubble, nothing lands without you saying yes. Or type /remember anything you want kept; /memories opens the panel; /forget cleans up. Memories ride into every future prompt so you stop repeating yourself.

    All changes in version 2026.05.11-2

    • New
      Chat PDF memory system. New chatMemory table on the backend with three scopes (user / document / thread), each indexed for ownership-checked retrieval. The chat pipeline pulls the applicable rows on every turn and renders them as a "Saved memories you must respect" section above the document context — within a hard 2000-char injection budget so power users with 50+ memories don't bloat the prompt.
    • New
      Chat PDF: new <remember scope="user|document|thread">FACT</remember> directive. ADDITIVE — the model can emit it alongside any other directive, since saving a fact is orthogonal to whichever action drives the turn. The suggestion stages on the assistant message (pendingMemoryText/Scope) and renders as a Save/Dismiss chip in the bubble; nothing lands in chatMemory until the user clicks Save. Dismiss clears the pending fields with no row written. The model is told to only emit for durable facts about the person, the document, or stable preferences — never for one-off question content.
    • New
      Slash commands: /remember <text> (defaults to user scope, --document and --thread override), /forget <n>, /forget all [scope], /memories. Parsed client-side so they don't burn LLM tokens or count against the monthly operation cap. Synthetic user + assistant turns are inserted so the thread shows what got saved or forgotten. Dedupes against existing exact-match memories at the same scope so spamming /remember can't bloat the table.
    • New
      Memories panel in the workspace top bar. Grouped by scope with inline edit / delete affordances. Pulls from the same Convex query the chip components subscribe to, so accepting a suggestion on a bubble or running /remember updates the panel in the same render.
  15. v2026.05.11

    Chat PDF now delivers filled markdown as a real downloadable file

    Ask "fill this with mock data and give me the markdown file" and you get exactly that: the filled content rendered inline AND attached as a downloadable .md (or .txt) chip — no more misleading "Filled PDF" artifact when you explicitly named a different format. Powered by a new <emit-file> directive on the chat router: when the user names a text output format, the model wraps the synthesized content and the server stores it as a blob, so the download chip lands on the message the same way the PDF chip does. PDF fill requests are unchanged.

    All changes in version 2026.05.11

    • New
      Chat PDF: new <emit-file format="markdown|text" filename="…">CONTENT</emit-file> directive. The chat router parses the tag inside the model response, stores the captured content as a blob (text/markdown or text/plain), and attaches it to the assistant message via emittedFileStorageId/emittedFileFilename/emittedFileFormat. A new EmittedFileChip renders alongside FilledPdfChip in the bubble with a Download CTA. emit-file outranks the other three directives in honor priority (emit > run > open > fill) because a named output format is the most specific user intent.
    • Fixed
      Chat PDF: stop emitting <fill-pdf> when the user explicitly asks for a non-PDF output format. The system prompt now routes "markdown file" / ".md" / "save as text" through <emit-file> instead, and word-doc/image requests get a prose-only response with no directive (no path to those formats yet from the chat router).
  16. v2026.05.10-8

    Filled-form values now land inline with their labels

    When you converted a filled fillable PDF, the values you typed showed up at the corner of each form field instead of where the text actually sits — so labels and values collided in weird ways and the checkbox glyphs ended up clustered at the bottom of the doc. Fixed: pdf-inspector now reads each widget's appearance stream (the same data pdftotext extracts) and places the rendered text at its real position. "Please enter your name: Jordan Lee" reads as one line, not two; checkboxes appear next to the option they belong to; values inside tables sit in their cells.

    All changes in version 2026.05.10-8

    • New
      pdf-inspector: extract widget appearance streams. New extract_widget_appearance_text walks each page's /Annots, follows every Tx/Ch widget's /AP/N to its Form XObject, computes the placement transform mapping the form's /BBox (post-/Matrix) onto the widget's /Rect, and runs the appearance content stream through the existing extract_form_xobject_text pipeline. Result: form values land at their actual draw position as ordinary positioned text items, the same way pdftotext sees them.
    • Fixed
      pdf-inspector AcroForm /V walker now skips widgets whose appearance stream already produced text (so values aren't double-emitted). Btn fields stay on the /V walker path because their appearance is usually a single Zapf Dingbats glyph; the ☑/☐ rendering reads better than the raw extracted character.
    • Fixed
      Per-page Y-descending re-sort on pages that contain widget annotations. Without it, the line builder's stream-order vs Y-sort heuristic flipped on filled-form pages — appearance items jumping back up to their widget positions read as chaos and form values were emitted at the document tail. Pages without widgets are untouched, so non-form PDFs (where stream order can be load-bearing for footnotes/sidebars) aren't affected.
    • Fixed
      Tables in fillable forms now render as real Word tables, not flat paragraphs. Three fixes that compose: (1) the thin-rect synthesis path now merges co-linear segments before passing to the line-based table detector, so Word's per-cell border stamping (each cell edge as its own 0.48pt rect) reconstructs into the 3 horizontal + 3 vertical lines a 2×2 table needs — previously each 14.64pt fragment was discarded as decoration. (2) the line-based detector skips its capture-ratio gate when cell density is ≥80%, so densely-filled small tables embedded in form pages aren't rejected as chart-axis pseudo-tables. (3) cell assignment iterates column edges right-to-left so items right at a boundary land in the higher column instead of the lower one (the prior find returned the first match, mis-claiming items inside the ±2pt boundary tolerance).
    • New
      pdf-inspector now tracks per-glyph fill color (g/rg/k/sc/scn operators) and propagates it through extraction and the merge pass. TextItem gained a color field exposed to JS via the WASM API, used by two markdown layer changes: (a) force a paragraph break between adjacent lines whose dominant color differs by ≥32 per RGB channel, so blue section labels stay separated from black body values; (b) promote short non-near-black lines to H2 headings, which Word renders in blue by default — restoring the visual style of fillable-form labels without needing inline color spans in the markdown.
    • Fixed
      Checkbox options now render as a bulleted list, one option per paragraph, instead of collapsing onto a single line. Three sub-fixes: (1) is_list_item / format_list_item recognize ☑ and ☐ as list markers; (2) the line builder no longer breaks the link between a glyph and its label when the glyph sits to the left of the label (which routinely happens because the widget's Rect.x is a few points lower than the page-content label's x — the line-builder's reverse-x check now permits single-character items to join their row); (3) the list formatter inserts a space between glyph and label when the source has none.
    • Fixed
      Tightened paragraph spacing on Heading2 (240/120 → 120/60 twips before/after) and body paragraphs (200 → 120 twips after). Form-style PDFs sit labels close to their values; the previous Word defaults pushed them too far apart and made the docx look airy compared to the source.
    • Fixed
      Stop bolding the first table row by default. Markdown table syntax always has a header row, but the dependent-style tables our inspector synthesizes from thin-rect borders don't actually want bold styling — row 1 is just data. Render every row identically; if the source has a real header, the user can bold it in Word.
    • Fixed
      Set Calibri as the docx body font on every TextRun. Word's default fallback is Times New Roman in some renderers; explicit Calibri matches what most Word-generated source PDFs use.
    • Fixed
      Checkbox lines no longer get a Word bullet stacked on top of the ☑/☐ glyph. The list-paragraph generator skips the bullet when an item starts with a checkbox glyph, so each option reads as just ☑ Option 1 — matching the visual style of the source form.
    • Fixed
      Tighter Heading2 spacing — after-spacing zeroed so a blue label sits flush against the value paragraph beneath it, the way form-style PDFs render. Body paragraph after-spacing trimmed from 120 to 80 twips, list-item after-spacing zeroed.
  17. v2026.05.10-7

    Filled-form PDF to Word: no more "Dropdown2:" in your docx

    Convert a filled fillable PDF and the docx came back with internal field identifiers all over it — "Name: Jordan Lee", "Dropdown2: Choice 1", "Option1 Option 1: On", "NameofDependent Name of Dependent: Alex Lee". Those are PDF-internal names that Word users were never meant to see. They're gone now: only the value lands in the doc, at the field's position. Checkboxes also got upgraded — instead of "Option 1: On" you get a real ☑, and unchecked boxes show ☐ instead of being silently dropped. Same fix flows through pdf-to-markdown and the chat-pdf headless converter.

    All changes in version 2026.05.10-7

    • Fixed
      pdf-inspector form-field walker (extractor/links.rs): drop the "FieldName: " prefix when emitting AcroForm values. /T names like "Dropdown2", "Option 1", "Name of Dependent" are dev-facing identifiers — they have no place in user-visible output. Page content already has the human label.
    • Fixed
      Btn fields now render as Unicode glyphs: ☑ for /On, ☐ for /Off (and for missing /V). Previously /Off returned early so unchecked boxes left a hole in the output, and /On emitted the literal string "On". Pushbuttons (/Ff bit 17) are skipped — their /V is an action target, not a checkbox state.
    • Fixed
      pdf-inspector markdown post-processor: normalize literal tab characters in extracted text to single spaces. Word/Acrobat-generated PDFs sometimes encode inter-word positioning gaps as \t, which renders as nothing in Word without a tab stop, mashing words together ("Name of Dependent" → "NameofDependent" in the output docx). Replacement happens after table cells are emitted, so markdown tables (which use pipes) are unaffected.
  18. v2026.05.10-6

    Chat PDF: filled-in form text no longer comes back as gibberish

    If you fed Chat PDF a filled form and asked for a Word or Markdown export, the values you actually typed (names, addresses, anything non-trivial) came out as ?? J o r d a n L e e — replacement chars where the BOM should have been, and a space wedged between every letter. That was a UTF-16 BE byte order mark the form-field decoder was reading as raw UTF-8. Acrobat and Preview both write filled values that way, so basically every real-world filled form was hitting this. Fixed: the decoder now handles both PDFDocEncoding and UTF-16 BE, the way the PDF spec says it should.

    All changes in version 2026.05.10-6

    • Fixed
      pdf-inspector (Rust/WASM): form-field /T names, /V text values, and link /URI strings now route through decode_text_string instead of String::from_utf8_lossy. Detects the 0xFE 0xFF BOM, decodes the rest as big-endian UTF-16; falls back to PDFDocEncoding for plain bytes.
    • Fixed
      Same path fixes pdf-to-markdown and pdf-to-word in chat (both ran through the inspector) and any tool that reads AcroForm values
  19. v2026.05.10-5

    Chat PDF: ask, get the file. No tool overlay needed.

    Telling the assistant "convert this to a word doc" used to land you on a "Open in PDF to Word" chip — fine, but you still had to click through, wait for the tool to mount, and click Convert. Now: when you ask, the chip pulses with "Converting to Word…" and resolves to a downloadable .docx right in the bubble. Same for JPG, PNG, WebP, BMP, plain text, Markdown, grayscale, color invert, repair, and annotation removal. Everything that has a deterministic transform with no parameters now auto-executes the moment the model suggests it. Tools that genuinely need UI input (sign, redact regions, image watermark, edit-pdf) still show the click-to-open chip — that's where it's actually useful.

    All changes in version 2026.05.10-5

    • New
      Tool registry: optional `headlessRun: () => Promise<HeadlessRunFn>` on ToolDefinition lets a tool register a UI-free executor that takes a File and returns a {blob, filename}. Lazy import keeps the conversion deps out of every host bundle.
    • New
      Chat: SuggestedToolChip auto-executes a tool's headlessRun when present. Chip lifecycle: idle → running ("Converting to {tool}…") → ready (download chip with the produced blob). Falls back to the original click-to-open chip if the headless path errors so users are never stuck.
    • New
      Headless wired for ten tools: pdf-to-word, pdf-to-jpg/png/webp/bmp (shared image-export pipeline), pdf-to-text, pdf-to-markdown, repair-pdf, remove-annotations, pdf-to-grayscale, invert-colors
    • Improved
      Extracted shared makePdfToImageHeadless helper for the four pdf-to-image tools — single render-to-canvas-and-zip pipeline, format/quality/extension as params. Per-tool wrappers are 3 lines.
  20. v2026.05.10-4

    Chat PDF: instant rotate, lock, sanitize, compress, reverse

    The chat assistant can now run zero-config transforms directly without bouncing you through a tool. Say "rotate every page 90", "lock the form", "compress this", "remove the metadata", or "reverse the page order" and the result downloads in the bubble — same chip you already get for form fills, no second click required. Anything more involved (conversions, signing, redaction, image watermarks, page extraction) still routes through Open-in-tool, so you only pay the UI tax when there's actually configuration to do.

    All changes in version 2026.05.10-4

    • New
      Chat: new <run-action type="..."/> directive lets the AI fire rotate / reverse / flatten / sanitize / compress directly on the source PDF — chip pulses while the transform runs, then resolves to a download chip with the appropriate filename suffix
    • New
      Backend: new chatPdfFill.runInitialAction internalAction loads the conversation's source PDF, applies one of five shared pdf-lib transforms (extracted from the existing follow-up actions), and stores the result via _setMessageFill — same chip semantics as form fill
    • Improved
      Backend: extracted applyFlatten / applySanitize / applyRotate / applyReverse / applyCompress as shared pdf-lib transforms; both the chip's More-menu follow-up actions and the new run-action directive call them. Single source of truth for transform behavior
    • New
      Backend: directive telemetry — every assistant message records emittedDirectives (everything the model tried) and honoredDirective (what we acted on) so prompt-fidelity drift shows up in the data instead of as user-visible bugs
    • New
      System prompt now lists three directives (fill / run / open) with priority rules and 11 few-shot examples covering rotate, reverse, lock, sanitize, compress, convert, extract, redact, sign, add page numbers, and the explicit "no directive" case
  21. v2026.05.10-3

    Chat PDF: ask in plain English, get the right tool

    The chat assistant used to know how to do exactly two things — answer questions and fill forms. Anything else (convert to Word, rotate pages, compress, sign, redact, watermark, crop, extract pages…) it would punt on with "I can't do that." No more. The system prompt now ships with the full catalog of fifty PDF-input tools, and the assistant emits an <open-tool> directive whenever you ask for an action it can't run inline. The reply gets a "Open in PDF to Word" (or whichever tool fits) chip — click it and the tool opens fullscreen over the chat with your PDF already loaded. As a side effect: the model can no longer over-eagerly emit <fill-pdf> on a non-fill turn, because <open-tool> takes precedence when both appear, killing the stray "Filled PDF" chip that used to show up after a botched conversion request.

    All changes in version 2026.05.10-3

    • New
      Chat: AI now suggests the right tool for any operation it can't run inline — emits <open-tool slug="..."/> directive that the chip resolves to a one-click "Open in {tool}" CTA, mounting the tool over chat with the indexed PDF pre-staged on continuation
    • New
      Backend: system prompt rewritten with the full PDF-input tool catalog (fifty tools across Organize / Edit / Convert / Security / Optimize), explicit directive rules (mutually exclusive <fill-pdf> vs <open-tool>), and few-shot examples so the model picks the right slug for "convert to Word", "rotate", "redact", etc
    • New
      Backend: new chatMessage.suggestedToolSlug field + getSourcePdfDownloadUrlForMessage query; parseOpenToolPlan validates against the catalog so a hallucinated slug never persists
    • Fixed
      Chat: stray "Filled PDF" chip on conversion requests — when the model over-emitted <fill-pdf> with hallucinated labels even though the user asked to convert, the dispatcher now prefers <open-tool> when both appear and the prompt explicitly forbids fill-pdf as a fallback for unrelated asks
  22. v2026.05.10-2

    Chat PDF: every tool, one ellipsis away

    The More menu on the download chip used to be a fixed shortlist — Edit, Rotate, Reverse, Lock, Sanitize, Compress. Now it has a search input at the top and the full OxygenPDF catalog underneath, grouped by category (Organize, Edit, Convert, Security, Optimize). Pick any tool and it opens fullscreen over the chat with your filled PDF already loaded — no re-upload, no losing the conversation. The original quick actions stay at the top for one-tap operations; the catalog is for when you want the full tool experience (page-by-page rotation, watermark options, redaction, etc).

    All changes in version 2026.05.10-2

    • New
      Chat: download chip's More menu picks up a Search input and the full PDF-input tool catalog grouped by category — every tool that accepts a PDF is one click away
    • New
      Chat: new generic ToolOverlay mounts any registry tool fullscreen over chat with the filled PDF pre-staged on the continuation context (mirrors the existing EditPdfOverlay plumbing — useLayoutEffect + staged gate so the tool consumes continuation before its first paint)
    • New
      Chat: catalog items search across title + category + description, so typing 'convert' surfaces every Convert tool and 'compress' finds Compress PDF wherever it lives
  23. v2026.05.10

    Chat PDF: in-page editor + a fuller More menu

    The "Edit in editor" item on the download chip now opens the existing /tools/edit-pdf experience as a fullscreen overlay over the chat instead of navigating away — your conversation stays put underneath. The More menu also picked up three new actions: Rotate 90° (clockwise per click, stacks for 180°/270°), Reverse page order, and Compress (structural). The chip's label and filename track every action you apply, so a fully worked-over PDF reads as e.g. "Filled, rotated, locked, and compressed PDF" — and once an action has been applied, its menu item flips to a "done" state to keep you from doing it twice.

    All changes in version 2026.05.10

    • New
      Chat: "Edit in editor" opens the editor inline as a fullscreen overlay (CloseTabProvider trick lets EditorDialog render inline inside our portal'd container instead of stacking another fullscreen Dialog on top)
    • New
      Chat: More menu adds Rotate 90° (composes with prior rotation), Reverse page order, and Compress (structural). Menu now grouped into Continue editing / Structure / Finalize / Optimize
    • New
      Backend: chatPdfFill gains rotateFilledPdf, reverseFilledPdf, and compressFilledPdf public actions sharing the runFollowUpAction helper. Save options gate per-action ({useObjectStreams, objectsPerStream} for compress)
    • New
      Chat: chip filename and label track six action types now (filled, rotated, reordered, locked, sanitized, compressed) with proper Oxford-comma serialization
  24. v2026.05.09-7

    Chat PDF: ellipsis menu on the download chip — Edit, Lock, Sanitize

    The filled-PDF download chip picked up a "More" ellipsis modeled on the continuation tool's tool-picker. Open it on a filled chip and you get three follow-up actions: Edit drops the file into /edit-pdf via the continuation context (no re-upload), Lock flattens the form so the recipient can't change your answers, and Sanitize strips the PDF's identifying metadata (author, title, producer, timestamps). The chip's label and filename update to reflect what's been applied — "Filled and locked PDF", "Filled, locked, and sanitized PDF" — so the user always sees what they're about to download. Each follow-up action is one Convex action call: load the existing filled PDF, transform with pdf-lib, replace the storage blob, patch the message.

    All changes in version 2026.05.09-7

    • New
      Chat: download chip gains a More ellipsis (mirrors the continuation tool-picker) with Edit in editor, Lock the form, and Sanitize metadata
    • New
      Chat: Edit action hands the filled PDF to /edit-pdf through the existing continuation context — the editor consumes the blob on mount instead of bouncing the user through the dropzone
    • New
      Chat: Lock action runs pdf-lib form.flatten() on the server and replaces the chip's filled PDF in place; chip label flips to "Filled and locked PDF"
    • New
      Chat: Sanitize action strips Title / Author / Subject / Keywords / Creator / Producer / CreationDate / ModDate from the filled PDF's Info dictionary
    • New
      Backend: new public Convex actions chatPdfFill.flattenFilledPdf and chatPdfFill.sanitizeFilledPdf, plus internal helpers (_getMessageForFollowUp, _replaceMessageFilledPdf, _setMessageFollowUpPending / Error)
  25. v2026.05.09-6

    Chat PDF: ask the assistant to fill the form, get a downloadable PDF back

    Drop a fillable PDF into chat, hand the assistant the values you want plugged in, and a download chip appears in its reply with the form actually filled. The assistant emits a structured fill-pdf directive alongside its prose answer; the server loads the original PDF, fuzzy-matches each label to a real AcroForm field with pdf-lib, applies the values, and stores the filled document. The bubble shows a pulsing chip while it works, then resolves to a tappable card that downloads the result with a sensible filename. Forms without AcroForm fields, or labels we couldn’t match to anything on the page, surface a quiet warning instead of silently failing.

    All changes in version 2026.05.09-6

    • New
      Chat: AI can now produce a downloadable filled PDF when the user asks to complete the form — emits a <fill-pdf> directive that the server applies via pdf-lib AcroForm fuzzy-matching and returns as a stored file
    • New
      Chat: assistant bubble gains a download chip for filled PDFs with three states — pulsing "filling…" placeholder, tappable download card with filename, or an inline warning when the form has no fillable fields or no labels matched
    • New
      Backend: new chatPdfFill action (Node runtime) loads the original PDF from Convex storage, runs fuzzy label-to-field matching with bigram similarity, applies values to text/checkbox/radio/dropdown/option-list fields, and stores the result
    • New
      Backend: chatMessage rows gain isFilling / filledPdfStorageId / filledPdfFilename / fillError fields; new getFilledPdfDownloadUrl query returns an ownership-checked signed URL for the bubble
  26. v2026.05.09-5

    Chat PDF: warm paper canvas, editorial AI replies, deep-teal you

    The chat workspace got a top-to-bottom design pass. The flat all-white canvas became a warm paper-and-ink surface system: the gutter behind the PDF is now a soft cream, the page itself stays paper-white as the protagonist, and the chat panel sits on a slightly raised warm offwhite. AI answers no longer wear a chat-bubble — they read as editorial prose on a Newsreader serif body with a subtle accent rail down the side, and citation chips became small italic footnote numerals instead of bright blue badges. Your messages flip to a deep-teal bubble with a pinched corner so the asymmetry visually says "I asked, the document answered." The sidebar recesses into the canvas, active chats get a left bookmark-ribbon and a raised paper card, and the empty-state hero now opens with an oversized italic "a" behind "Ask the document anything." Composer pill picks up an inset highlight, the send button is a circular deep-teal disc that nudges on hover. Same panes, same shortcuts, very different emotional temperature.

    All changes in version 2026.05.09-5

    • New
      Chat: warm paper-and-ink surface tokens (chat-pdf-canvas / surface / sidebar / page / accent / accent-soft / accent-rail) with layered warm-tinted shadows and dark-mode equivalents
    • New
      Chat: AI replies render as editorial prose with Newsreader serif body, accent left rail, and italic footnote-style citation chips (no more bubble fill on assistant messages)
    • New
      Chat: user message bubble switches to deep teal with a pinched bottom-right corner so the user/AI asymmetry reads as conversation, not symmetric chat balloons
    • New
      Chat: sidebar drops into the recessed-canvas tone; active conversation now gets a left accent ribbon and a raised paper card; section labels render as Newsreader italic
    • New
      Chat: empty state opens with an oversized italic "a" drop-letter behind "Ask the document anything," prompt cards become outlined paper cards on accent-soft hover
    • Improved
      Chat: composer pill carries an inset highlight on the warm canvas, the send button becomes a circular deep-teal disc with a hover nudge, and the indexing progress bar/status chips switch from bright blue to the new accent system
    • New
      Chat (landing): the upload page rebuilds on the warm paper surface — eyebrow becomes a Newsreader italic line with accent dots, headline gains an italic teal "PDF." accent and a drop-letter motif, and the dashed dropzone becomes a raised paper card with an accent-soft upload medallion that lifts on hover
    • New
      Chat (landing): "Recent chats" gets an italic serif label flanked by a hairline divider, and the list card sits on the canvas with a raised paper shadow
    • Improved
      Chat: conversation row hover swaps to a translucent rule wash so it reads on both the sidebar surface and the lighter landing card without disappearing
  27. v2026.05.09-4

    All changes in version 2026.05.09-4

    • Fixed
      Chat PDF: tooltips on the selection toolbar (highlight swatches, bookmark) no longer get clipped by the toolbar — the shared Tooltip now portals to the body so it can escape any overflow-hidden ancestor
  28. v2026.05.09-3

    Chat workspace: top bar with layout switch, theme + sign-in always one click away

    A new top bar sits above the preview and chat panes. A three-way switch flips between PDF only, split view, and chat only — picks stick across reloads. Theme toggle and your account live up there too, alongside a keyboard-shortcuts shortcut. The old "Indexed — ask anything about this PDF" line was replaced with a small "✦ Ready" chip beside the filename, and a thin progress bar shows up only while the document is still indexing.

    All changes in version 2026.05.09-3

    • New
      Chat: top bar with PDF / split / chat layout switch, theme toggle, account button, and shortcuts hint
    • New
      Chat: layout choice persists across reloads and auto-uncollapses when a citation chip is clicked
    • New
      Chat (mobile): theme toggle and account button now reachable from the mobile header
    • Improved
      Chat: replaced the "Indexed — ask anything about this PDF" status line with a compact chip beside the filename + progress bar that only shows while indexing
  29. v2026.05.09-2

    Chat workspace: collapsible sidebar, resizable chat pane, fewer keystrokes

    The left sidebar now has a collapse button (or ⌘B), and the chat thread on the right is draggable — pull the divider to give the PDF more room or the chat more room. Your width sticks across reloads. The "New chat" shortcut moved off ⌘K (which usually means "search" in apps that have it) to ⌘⇧O, matching ChatGPT and Claude.

    All changes in version 2026.05.09-2

    • New
      Chat: draggable vertical divider between PDF preview and chat thread, with the chosen width persisted to localStorage
    • New
      Chat: collapse button on the desktop sidebar and a floating expand button on the left edge when collapsed
    • New
      Chat: highlights and bookmarks track the canvas across viewport resizes — annotations no longer drift off the text on window resize
    • Fixed
      Chat: highlights and bookmarks are now persisted on the indexed PDF and re-render on reload, with a right-margin fallback marker if the bbox cannot be re-resolved
    • Improved
      Chat: replaced ⌘K with ⌘⇧O for "New chat" so ⌘K stays free for a future command palette
  30. v2026.05.09-1

    Select any passage in a chat PDF to explain, highlight, or bookmark it

    Drag across text in the preview and a small toolbar appears above it. Tap Explain or Summarize and the selection goes to the AI as a quoted question. Pick a color to highlight the passage, or drop a bookmark to come back to it later. Both stick to the document, and a "Highlights & bookmarks" button at the top of the preview lists everything you have saved — click any entry to jump straight to its page. Right-click still works the same way for keyboard people. Replies from the AI now end with follow-up chips (Explain more, Give an example, Show source, Summarize this) so you can keep going without inventing a new prompt every turn.

    All changes in version 2026.05.09-1

    • New
      Chat PDF: floating selection toolbar with Explain, Summarize, Define, Highlight (4 colors), Bookmark, and a custom Ask, triggered by drag-select or right-click
    • New
      Chat PDF: highlights and bookmarks persist per indexed PDF and render on top of the preview, with a delete affordance on hover
    • New
      Chat PDF: "Highlights & bookmarks" panel in the preview header lists every saved annotation with click-to-jump and inline delete
    • New
      Chat PDF: assistant replies show static follow-up chips so the next question is one tap away
  31. v2026.05.09

    Chat citations now highlight the cited sentence, not the whole block

    Click a citation chip and you used to get the whole chunk, sometimes a multi-paragraph slab full of facts that had nothing to do with the answer. Citations now carry a verbatim quote, and the preview pane lands the highlight on that exact sentence. Two different chips on the same chunk hit two different sentences. When the quote can't be found (paraphrase, image-only PDF), the highlight drops back to the old chunk flash so you still see the right block.

    All changes in version 2026.05.09

    • New
      Chat: citation chips highlight the cited sentence. The model attaches a verbatim `q="..."` quote, the preview pane resolves it to a tight bbox instead of the whole chunk.
    • Improved
      Chat: citation tag parsing switched to an order-independent attribute scanner, so new cite attributes survive whatever order the model picks
    • Fixed
      Chat: two chips pointing at the same chunk no longer share one cached bbox. The resolution cache is keyed by `(elementId, quote)`, so sibling citations land on their own sentences
  32. v2026.05.08-13

    Chat with PDF — mobile, keyboard, and a polished workspace

    The chat workspace got a refresh. On phones, a tab toggle at the top swaps between the PDF preview and the chat thread, and tapping any citation chip flips you to the PDF so you actually see the source. The composer is a rounded pill with an embedded send button, an auto-growing textarea, and a kbd-hint footer. The empty state now offers four one-tap starter prompts. Recents in the sidebar bucket into Today, Yesterday, This week, This month, and Earlier. Keyboard shortcuts: ⌘K for new chat, ⌘B to toggle the sidebar, / to focus the composer, ? for the full reference. Hit ? anywhere on the page to see them.

    All changes in version 2026.05.08-13

    • New
      Chat: mobile tab switcher between PDF preview and chat thread; citation chips auto-flip to the PDF
    • New
      Chat: rounded-pill composer with auto-growing textarea, embedded send button, and kbd-hint footer
    • New
      Chat: empty state surfaces four starter prompts that pre-fill the composer with one tap
    • New
      Chat: keyboard shortcuts — ⌘K new chat, ⌘B toggle sidebar, / focus composer, ? open shortcut help
    • New
      Chat: recents in the sidebar are now bucketed by Today / Yesterday / This week / This month / Earlier
    • Improved
      Chat: thread pane split into ChatComposer + ChatEmptyState components to stay inside the 100-line component cap
    • Improved
      Chat: workspace shell rebuilt around a mobile-first three-pane layout with a Sheet drawer for the sidebar
  33. v2026.05.08-12

    Chat with PDF — sidebar, edit, regenerate

    The chat workspace now has a left rail with your recent conversations, a one-click way to start a new chat, and a back link to the rest of OxygenPDF — no more URL surgery to switch threads. Hover any user message to edit and resend it, hover the latest assistant reply to regenerate it. Copy lives on every bubble. Both edit and regenerate truncate the thread cleanly at the fork point so the conversation stays coherent.

    All changes in version 2026.05.08-12

    • New
      Chat: workspace sidebar with recent conversations, "New chat", and a back link to the home page
    • New
      Chat: edit any user message and regenerate the assistant reply — backend `editAndResend` action truncates the thread at the edited message and re-runs retrieval
    • New
      Chat: regenerate the latest assistant response — backend `regenerateResponse` action finds the preceding user question, deletes the stale reply, and re-runs the prompt
    • New
      Chat: copy any message to clipboard via a hover-revealed action button
    • New
      Chat: delete a conversation from the sidebar (gated behind a confirmation dialog)
    • New
      Chat landing page now lists recent conversations below the dropzone
    • Improved
      Chat thread pane split into `chat-message-bubble`, `chat-message-actions`, and `chat-assistant-body` to stay under the 100-line component cap
  34. v2026.05.08-11

    Chat with PDF — selection no longer balloons to the top of the page

    Selecting a paragraph in the preview was extending the selection up to every paragraph above it. Cause: pdfjs v5's TextLayer doesn't ship the `.endOfContent` anchor element older versions used to, so empty-space clicks (margins, gaps between paragraphs) anchored on the first text span in DOM order — i.e. the top of the page. We now create the anchor ourselves and toggle a `.selecting` class on pointerdown so the anchor expands to cover the whole layer during a drag.

    All changes in version 2026.05.08-11

    • Fixed
      Chat: PDF text-layer selection now stays where you started — added the `.endOfContent` anchor element pdfjs v5 doesn't auto-create, plus pointerdown/up listeners that toggle the `.selecting` class to expand the anchor during a drag
  35. v2026.05.08-10

    Chat with PDF — select text and ask about it

    PDF preview pages now have a transparent selectable text layer over the rendered canvas — drag-select like you would on any web page. Right-click on a selection and a small popover pops up with a question input. Type your question, hit Enter, and the selected passage flows into the chat thread as a quoted prefix to your question, so the AI can answer about that exact span.

    All changes in version 2026.05.08-10

    • New
      Chat: PDF preview pages are now text-selectable — pdfjs `TextLayer` is rendered transparently over the canvas, so drag-select, double-click-to-word, and copy-to-clipboard all work
    • New
      Chat: right-click a selection in the preview to open an "Ask about this passage" popover; submitting sends the selection (as a markdown blockquote prefix) plus your question to the chat thread
  36. v2026.05.08-9

    Chat with PDF — citations highlight the actual text

    Citations were flashing a vertical band sized to the chunk's share of the page — better than whole-page, still rough. The preview now matches the chunk's text against pdfjs's extracted text layer and flashes the actual text bbox: the exact paragraph or sentences the AI cited. Falls back to the vertical band if the PDF has no text layer (image-only scans).

    All changes in version 2026.05.08-9

    • New
      Chat: citation flashes now land on the actual cited text — preview pane resolves the chunk text against pdfjs `getTextContent` on click and caches the resolved bbox by elementId
    • New
      Chat: new `listChunkTextsForIndex` query returns the full chunk text (no embeddings) for client-side bbox resolution
  37. v2026.05.08-8

    Chat with PDF — block migration actually triggers now

    The block-citation migration shipped yesterday relied on `createOrReuseIndex` running on re-upload, but the frontend's `findIndexByHash` shortcut was bypassing it for any non-error cached row — so old PDFs kept getting page-level citations instead of upgrading. `findIndexByHash` now returns null for pre-block-level indexes, forcing the upload to flow through the migration path. Re-upload your PDF and you'll get sub-paragraph citation flashes on the next chat.

    All changes in version 2026.05.08-8

    • Fixed
      Chat: `findIndexByHash` now returns null for pre-block-level indexes (chunks with bare page numbers as elementIds), so re-upload actually triggers the block-upgrade migration instead of joining a stale row
  38. v2026.05.08-7

    Chat with PDF — block-level citations

    Citations used to flash the entire cited page when clicked, which was practically useless on dense pages. Each chunk now has its own pdfIndexElement with an approximate vertical-band bbox, so clicking a citation chip flashes the specific paragraph rather than the whole page. The model is told the block id of every chunk in its context (`<!-- block id="3-c-2" page="3" -->`) and cites with `<cite p="3" id="3-c-2"/>`. Existing PDFs auto-upgrade on next re-upload — no double-charge.

    All changes in version 2026.05.08-7

    • New
      Chat: citation chips now point at chunks, not pages — clicking flashes the specific paragraph (vertical-band bbox approximation, sized to the chunk's share of the page)
    • New
      Chat: model prompt now teaches the block-id format and instructs `<cite p="N" id="N-c-K"/>` so citations carry sub-page granularity
    • New
      Chat: full-context path (≤50 pages) sends every chunk in chunkIndex order with block markers, so the model can cite the exact paragraph anywhere in the doc
    • Improved
      Chat: createOrReuseIndex auto-detects pre-block-level indexes (chunks whose elementIds are bare page numbers) and re-runs OCR+chunking to backfill block elements — no extra charge for the migration
  39. v2026.05.08-6

    Chat with PDF — answers render properly, citations actually click

    Three rendering bugs collapsed into one bad screenshot: assistant messages were dumping raw markdown (literal `**Helga**`), every bare citation chip was getting a unique number even when it pointed at the same page (so you saw chips numbered 1–42 instead of one per page), and all chips were marked as "missing" so clicking did nothing. Now: messages render with markdown formatting, citation chips dedupe by page, and clicking one scrolls + flashes the cited page in the preview. Also told the model to stop stacking five citations on one claim.

    All changes in version 2026.05.08-6

    • Fixed
      Chat: assistant messages now render markdown (bold, italics, lists, headings) instead of dumping raw `**asterisks**` and unbroken text
    • Fixed
      Chat: citation chips now dedupe by elementId — bare `<cite p="N"/>` tags are resolved to the page-cover element so two citations of the same page share one numbered chip
    • Fixed
      Chat: citation chips are now actually clickable — the resolution path was treating bare cites as orphaned, leaving every chip in the disabled / "Citation not found" state
    • Improved
      Chat: tightened the citation prompt — one citation per claim instead of "cite every page where the info appears", which had the model emitting up to 11 chips next to a single character name
  40. v2026.05.08-5

    Chat with PDF — smarter answers, real citations

    Switched the chat model from gpt-4o-mini to Mistral Large for better instruction-following — the model now actually emits the <cite p="N"/> markers the system prompt asks for. For documents up to 50 pages, the entire OCR'd markdown gets stuffed into the prompt instead of vector search, so broad questions like "list all characters" stop missing the long tail. Longer docs use a wider top-20 retrieval (was top-8). Citation chips appear under the answer and clicking one scrolls + flashes the cited page in the preview.

    All changes in version 2026.05.08-5

    • New
      Chat: full-document context for short PDFs (≤50 pages) — entire OCR'd markdown is sent to the model, eliminating retrieval misses on broad questions
    • New
      Chat: vector retrieval bumped from top-8 to top-20 for documents longer than 50 pages
    • Improved
      Chat: switched chat model from gpt-4o-mini (OpenAI) to mistral-large-latest (Mistral). Same key as OCR, no extra setup, stronger instruction-following on the citation rules
    • Fixed
      Chat: tightened the system prompt — citations are now framed as non-negotiable with concrete examples, so the model stops dropping <cite p="N"/> markers on broad answers
  41. v2026.05.08-4

    Chat with PDF — chat works again, preview stays sharp

    Switched the chat backend from a flaky Replicate proxy of DeepSeek-V3 (which was rejecting our payload at the SiliconFlow upstream) to a direct OpenAI gpt-4o-mini call — same citation-grounded answers, faster, and one fewer API key to manage. Fixed the blank-white PDF preview by making the shared page renderer wake consumers up when the doc finishes loading. Reworked the indexing scan animation into a softer two-layer sweep that doesn't fight the underlying text.

    All changes in version 2026.05.08-4

    • Fixed
      Chat: replaced Replicate DeepSeek-V3 with OpenAI gpt-4o-mini for chat completions — Replicate's SiliconFlow upstream was returning "Message field is required" for our OpenAI-style payload
    • Fixed
      Shared PDF renderer: `renderPage` identity now bumps on internal version change, so consumer effects (PdfPageCanvas) re-fire when the doc finishes loading instead of leaving the canvas blank white
    • Improved
      Chat: redesigned the indexing scan animation — soft tint pulse + thin gradient line tracer
    • Improved
      Backend: dropped REPLICATE_API_TOKEN dependency from the chat path — only MISTRAL_API_KEY (OCR) and OPENAI_API_KEY (embeddings + chat) are needed now
  42. v2026.05.08-3

    Chat with PDF — preview pane polish

    Fixed the blank white preview that hit when the page-dimension load raced the canvas renderer — pages now paint as soon as they're ready. Added a soft cyan scanner-pass animation that sweeps each page while the index is being built, so the wait feels intentional. Cleaned up the redundant per-page "Failed" pill that was just repeating the doc-wide status on every card.

    All changes in version 2026.05.08-3

    • Fixed
      Chat: PDF preview no longer renders blank white — page dimensions are now read from the same pdfjs document the canvas paints from, eliminating a race that left the canvas unrendered
    • Fixed
      Chat: re-uploading a PDF that previously failed to index now actually retries — the cache-hit shortcut was joining errored rows and silently inheriting the old failure
    • Fixed
      Chat: thread pane shows the actual indexing error instead of a misleading 'Starting up…' message when the index is in an error state
    • New
      Chat: scanner-pass animation overlays each page while the index is being OCR'd or embedded
    • Improved
      Chat: dropped the per-page status pill from the preview — the doc-wide indexing state already lives in the header, repeating it on every page was noise
  43. v2026.05.08-2

    Chat with PDF — indexing is fast now

    Replaced the per-page vision-OCR loop with a single Mistral OCR call. A 50-page PDF now indexes in ~10–20 seconds instead of ~3 minutes. Chat unlocks the moment the first chunks are embedded — you can start asking questions while the rest of the document is still being processed in the background.

    All changes in version 2026.05.08-2

    • Improved
      Chat: switched OCR provider from DeepSeek-OCR (per-page Replicate predictions) to Mistral OCR (single whole-document API call) — kills the ~5s/page latency tax
    • New
      Chat: 'partial' index status — chat input unlocks after the first batch of chunks is embedded; remaining chunks finish in the background
    • Improved
      Chat: browser no longer renders or uploads page images — only the original PDF is uploaded, Mistral fetches it directly
  44. v2026.05.08

    Chat with PDF — rebuilt around persistent indexing

    Reload-safe, regenerate-safe, no re-OCR. Upload a PDF once and we index it in the background — content-hashed, so re-uploads of the same file are instant. The chat is now subscription-aware (free tier with monthly cap) and runs entirely on our infrastructure: server-orchestrated DeepSeek-OCR with proper rate-limit retry, OpenAI text-embedding-3-small for chunked retrieval, DeepSeek-V3 over only the relevant chunks. Grounded citations with click-to-source preserved.

    All changes in version 2026.05.08

    • Improved
      Chat: moved OCR + chat off the browser onto Convex actions — pages are no longer re-indexed on reload, regenerate, or new questions
    • New
      Chat: content-hash dedup so re-uploading the same PDF skips the entire pipeline and reuses the existing index
    • New
      Chat: vector retrieval (top-8 chunks per question) instead of stuffing the full markdown into every prompt — flat input cost regardless of doc length
    • New
      Chat: upload-first /chat UI with PDF preview on the left and chat on the right, replacing the previous chat-input-as-landing flow
    • Fixed
      Chat: 429 rate-limit hell — Replicate calls now run server-side, sequentially, with Retry-After-aware exponential backoff
    • Improved
      Chat: removed the BYOK Replicate proxy, the local Gemma fallback, the in-browser bbox cache, and the IndexedDB chat-files layer in favor of a single auth-gated cloud path
  45. v2026.05.07

    Cloud Chat with Click-to-Source Citations

    Bring your own Replicate token and the chat sidebar gains a cloud mode powered by DeepSeek-OCR + DeepSeek-V3. OCR indexes every page with bounding-box grounding so answers come with citation chips you can click to jump straight to the highlighted region on the source page. Same conversation, same slash commands — but with cited answers and an extensible provider layer so we can swap in Kimi or Claude later without touching the UI.

    All changes in version 2026.05.07

    • New
      Chat: new Cloud AI mode (BYOK Replicate) — DeepSeek-OCR indexes pages with bbox grounding, DeepSeek-V3 chats over the index with native tool-calling into the existing PDF processors
    • New
      Chat: citation chips appear under cloud answers; clicking a chip opens the cited page with the bbox highlighted
    • New
      Cloud AI: abstract `CloudAiProvider` layer with Replicate proxy through Convex — adding new providers (Kimi, Claude direct, OpenAI) is one new file
  46. v2026.05.06

    Workspace Size-Limit Errors Now Tell You What To Do

    Drop a file bigger than the free workspace cap and you used to get a dead-end "exceeds 10MB limit" banner. Hard tier blocks now pop an Upgrade to Pro dialog directly, with the cap spelled out and a one-click checkout path.

    All changes in version 2026.05.06

    • New
      Workspace: hitting the free file-size or file-count cap now opens the Upgrade to Pro dialog directly instead of showing a passive banner
    • Fixed
      Workspace: size-limit error no longer prints the filename twice and no longer fires an infra-failure analytics event for what is really a tier limit
  47. v2026.05.05

    Tools Open Cleanly From Any Entry Point

    Edit PDF, Compare, Compress, Redact, Remove Watermark, the PDF→Text/Word/Markdown family, and several shared rendering paths could all throw "No GlobalWorkerOptions.workerSrc specified" if you opened them as your first tool in a session. Every pdfjs entry point now configures its own worker instead of relying on a different code path to do it first.

    All changes in version 2026.05.05

    • Fixed
      PDF tools: "No GlobalWorkerOptions.workerSrc specified" error on direct tool entry across the fleet
  48. v2026.05.03

    Two New Alternative Guides on the Blog

    Deep-dive comparisons for people searching "Sejda alternative" and "Wondershare PDFelement alternative" — what each product actually is in 2026, what their free tiers really do, and where their privacy stories hold up or fall apart.

    All changes in version 2026.05.03

    • New
      Blog: Sejda PDF Editor alternative — pricing, the 3-task wall, watermarks on Edit and Sign
    • New
      Blog: Wondershare PDFelement alternative — the cloud AI behind the desktop UI, the 2025 RepairIt CVE incident, and the trial that watermarks everything

April 2026

  1. v2026.04.30

    Crisp PDF Pages at Any Zoom

    Edit PDF and PDF Reader now paint pages straight onto a canvas sized to your actual device pixels, so text stays sharp on Retina and at high zoom instead of going through a PNG that the browser had to smooth out.

    All changes in version 2026.04.30

    • Fixed
      Edit PDF: text no longer looks blurry on Retina or at high zoom
    • Fixed
      PDF Reader: render scale now tracks devicePixelRatio × zoom, and the pdfjs document is loaded once per file instead of on every page or zoom change
    • Fixed
      Edit PDF: navigating between pages no longer flashes a tiny stretched thumbnail — adjacent pages are pre-rendered and the fallback uses a sharper 400px thumbnail
    • Improved
      New shared PdfPageCanvas component and usePdfPageRenderer hook so every tool that displays a PDF page renders it crisply by default
  2. v2026.04.17

    Unified Action Bar Across Every Tool

    Every PDF tool now shares the same action bar — workspace, mobile, and desktop. Big accent-colored primary button with a ⌘↵ shortcut, plus a Start over button with ⌘⌫ on standalone pages.

    All changes in version 2026.04.17

    • Improved
      Every tool now uses the same ToolWorkspaceActionBar in the workspace and on its standalone page
    • New
      Cmd/Ctrl+Enter fires the primary action in every tool
    • New
      Cmd/Ctrl+Backspace triggers Start over on standalone tool pages
    • Improved
      Dropped the one-off inline action bars from compress, OCR, split, sign, and remove-watermark
    • Improved
      SVG to PDF preview restyled to match the shared action bar pattern
    • Improved
      Batch file tabs now follow the tool color — sticky count pill and accent underline on the active tab
  3. v2026.04.15

    Intelligent Text Extraction

    New Rust→WASM engine for smart PDF text extraction with layout analysis. PDF to Word, PDF to Markdown, and PDF to Text now produce significantly better output with proper headings, lists, and structure.

    Rich Tool Pages

    Every tool page now features in-depth articles, FAQs with structured data, and visual diagrams — making it easier to understand each tool and boosting discoverability.

    All changes in version 2026.04.15

    • New
      Rust→WASM PDF text extraction engine with intelligent layout analysis and content classification
    • New
      PDF to Word now uses markdown-aware extraction for better structure preservation
    • New
      PDF to Markdown and PDF to Text upgraded with the new extraction engine
    • New
      Article sections and FAQ sections with structured data (SEO) on all tool pages
    • New
      Collapsible article and FAQ sections for cleaner tool page layout
    • New
      Visual SVG diagrams across 15+ tool pages — Merge, Split, Sign, Protect, Edit, and more
    • New
      New blog articles: Convert PDF to JPG, Create Fillable PDF, Best Free PDF Reader, PDF to Text
    • New
      Blog link added to header and footer navigation
    • New
      License key management for purchasers via Polar integration
    • Improved
      Home page copywriting refreshed for clarity and conciseness
    • Improved
      Blog cover images converted to WebP for faster loading
    • Improved
      Tool conversion card simplified — removed Pro upsell for authenticated users
    • Fixed
      SEO improvements — robots.txt rules, canonical links, and updated sitemaps
  4. v2026.04.13

    Split Scanned Pages

    New tool for splitting two-up scanned pages into individual pages. Handles booklets, side-by-side scans, and A3-to-A4 splitting with guided configuration.

    Advanced PDF Compression

    Compress PDF now handles huge files (up to ~1 GB). Set a target file size and let the tool auto-optimize, convert to grayscale for line drawings, or use the new Extreme preset.

    All changes in version 2026.04.13

    • New
      Split Scanned Pages tool for separating two-up scans into individual pages
    • New
      Target file size mode — specify a size limit and auto-find optimal compression settings
    • New
      Grayscale option for massive savings on architectural drawings and line art
    • New
      Extreme compression preset (72 DPI, 35% quality) for screen-only viewing
    • New
      Loading progress bar with real-time feedback when opening large PDFs
    • New
      Large file upload nudge — guides free users toward Pro when processing big files
    • New
      Contextual upgrade prompts within tool pages for free users
    • Improved
      PDF processing switched from ArrayBuffer to blob URLs for better memory management across all tools
  5. v2026.04.10

    Cleaner Navigation

    Streamlined top navigation bar — secondary links collapsed into a compact "More" menu for a cleaner, less cluttered header.

    All changes in version 2026.04.10

    • Improved
      Top navigation decluttered — Download, Changelog, and Feedback collapsed into a "More" dropdown
    • Improved
      Header internals reorganized into smaller extracted components
    • New
      Announcement banner now has a dismiss button (persists per session)
  6. v2026.04.07

    Chat (Beta)

    Ask questions about your PDFs using on-device AI. Upload a file and chat — all processing stays local. Slash commands coming soon.

    All changes in version 2026.04.07

    • New
      Chat feature now available to all users (Beta) — no feature flag required
    • New
      Ask AI questions about PDF content with on-device vision models
    • Improved
      Renamed "Chat PDF" to "Chat" across navigation and UI
    • Improved
      Slash commands temporarily disabled — coming soon
  7. v2026.04.03

    Typography Refresh

    New font system with DM Sans, Fraunces, and IBM Plex Mono for sharper, more consistent typography across all platforms.

    Desktop Auto-Updates

    The desktop app now checks for and installs updates automatically with a splash screen and status notifications.

    All changes in version 2026.04.03

    • New
      Auto-update with IPC communication, status notifications, and install prompts
    • New
      Splash screen with theme-aware styling and fade-out transition
    • Improved
      Font families updated to DM Sans, Fraunces, and IBM Plex Mono across all apps
    • Improved
      Responsive layout improvements for file dropzone, tool cards, and announcement banner
    • Improved
      Grid structure and alignment overhaul for tool pages across devices
    • Improved
      Rotate PDF layout standardized with consistent padding and spacing
    • Improved
      Merge PDF layout and styling enhanced for mobile and desktop
    • Improved
      Replaced 'embedPages' with 'embedPdf' method across background color, fix page size, and booklet tools
    • Improved
      Dynamic gradient IDs using useId hook to prevent SVG conflicts
    • New
      Revamped download instructions with detailed macOS installation guide
    • Improved
      Tool upload card badge positioning and flex properties improved
    • Improved
      Padding and spacing standardized across all tool components

March 2026

  1. v2026.03.31

    Electron Desktop

    Rebuilt desktop app on Electron with native tabbed editing, platform detection, and improved build pipelines.

    License & Accounts

    License validation API, account-based activation, and rate-limited validation endpoints for Pro users.

    Tools Browse & Pinning

    Pin your favorite tools, filter by category, and browse the full toolkit from a redesigned tools page.

    All changes in version 2026.03.31

    • New
      Electron desktop app with native window controls and platform detection
    • New
      Tab bar with drag-and-drop reordering, search params, and window controls
    • New
      License validation API with rate limiting (5 per minute per IP)
    • New
      Account-based activation and sign-in flow
    • Improved
      Streamlined license validation logic and error handling
    • New
      Tool pinning in the browse page with persistent favorites
    • Improved
      Enhanced tool filtering with additional category support
    • Improved
      Pricing details, descriptions, and comparison metrics updated
    • New
      Early bird spots API for tracking claimed spots
    • Improved
      Early bird data migrated from hardcoded values to API integration
    • Improved
      Download manifest simplified with static asset mapping
    • Fixed
      PDF compatibility utilities for older browsers
    • Fixed
      Undefined page sizes and positions handled across multiple tools
  2. v2026.03.26

    Edit PDF

    Full annotation toolkit — add text, drawings, stamps, symbols, callouts, and freehand highlights with undo/redo and draft auto-save.

    Desktop App

    OxygenPDF now runs natively on macOS, Windows, and Linux with tabbed editing, keyboard shortcuts, and drag-and-drop tab reordering.

    Workflow Builder

    Chain multiple PDF operations into reusable workflows — build once, run on any file.

    All changes in version 2026.03.26

    • New
      Edit PDF tool with text, image, and drawing annotations
    • New
      Stamp and symbol presets with drag-and-drop placement
    • New
      Callout annotations with click-to-place and drag-to-place
    • New
      Freehand highlighter with customizable stroke width and dash patterns
    • New
      Unified undo/redo history for annotations and page operations
    • New
      Draft auto-save and restore for in-progress annotations
    • New
      Fit-to-page, fit-to-width zoom, and zoom presets
    • New
      Dynamic floating panels for pages and layers with resizable widths
    • New
      Native desktop app for macOS, Windows, and Linux
    • New
      Tabbed editing with drag-and-drop reordering and close guards
    • New
      Global keyboard shortcuts for undo, redo, save, and load
    • New
      Dirty tab tracking with unsaved-changes indicators
    • New
      Workflow builder with visual tool chaining and save/load
    • New
      Free workflow save limits with upgrade prompts for Pro
    • New
      OCR PDF tool with Tesseract, Florence-2, and SmolVLM engines
    • New
      OCR progress display with live preview, cancellation, and stuck detection
    • New
      OCR history tracking and engine selection across tools
    • New
      AI OCR support in PDF to Markdown, PDF to Text, and PDF to Word
    • New
      Insert Watermark tool with text, image, and pattern modes
    • New
      Remove Watermark tool with detection and before/after preview
    • New
      Create PDF tool with blank, template, and HTML modes
    • New
      Expandable template gallery with state management
    • New
      PDF to Form tool for converting fillable PDFs into web forms
    • New
      PDF Merge interleave and interleave-reverse modes with blank page option
    • New
      Page range support for delete, extract, and split operations
    • New
      Command palette for quick navigation and tool search
    • New
      Account-based activation and sign-in with OxygenPDF accounts
    • New
      Pricing page and early bird spots tracking
    • New
      Feedback dialog for collecting user input
    • New
      Inline file renaming in the workspace
    • New
      Floating action bars and bottom sheet settings across all tools on mobile
    • Improved
      Standardized password-protected PDF decryption across all tools
    • Improved
      Terminology updated from "upload" to "select" for privacy clarity
    • Fixed
      File input cleanup to prevent stale hidden inputs after selection or cancellation

Stop renting your PDF platform.

All 119+ tools free on web. Desktop Pro is $29 once — every desktop tool, the workspace, and batch processing.

  1. $29now
  2. $79after that

14-day money-back guarantee • Works offline • All platforms

We use analytics to understand how our tools are used and improve the experience. No personal files are ever sent.