Changelog

New features, improvements, and fixes — everything we ship, as we ship it.

Subscribe via RSS
Clear Pick a year to narrow by month; a date range overrides both pickers.
Improved Fixed

Cleaner ingest chunks #

Ingest now builds its markdown with the same pipeline perceive uses and renders pages in a real browser, so JavaScript-rendered docs sites arrive complete and page titles, standfirsts and link-only table cells stop disappearing while cookie banners, "Was this page helpful?", icon-font glyphs and empty ## headings stay out of the chunks.

  • Nothing fails quietly any more. A text/plain or JSON URL such as llms.txt keeps its line structure instead of collapsing onto one line and chunking to nothing, a document made entirely of headings is chunked rather than shipped as an empty file, a page with no extractable text is reported as skipped instead of completing silently, and two URLs that redirect to the same page are ingested and billed once.
  • Uploaded files improved alongside. PDFs no longer turn a rotated margin stamp into a heading, extract a figure as a table of reversed one-letter cells, or promote prose to headings in documents that mix type sizes, and landscape pages are extracted rather than dropped; Word heading styles no longer leak ** into chunk metadata, embedded images no longer inline megabytes of base64, PowerPoint soft line breaks no longer leave control characters, and a saved page uploaded as HTML gets the same treatment as crawling it.
  • Two new options, matching perceive's: only_main_content and truncate_data_arrays.
Improved Fixed

Cleaner perceive markdown #

Perceive's markdown now reflects what a reader sees rather than how the page was built, and it does so on every page instead of only the ones a particular extractor happened to win. Interface furniture is gone under only_main_content: buttons and tab strips, "Copy page" and "On this page" actions, keyboard shortcut hints, "Was this page helpful?" rating widgets, screen-reader-only labels such as the "Section titled ..." link many docs themes attach to every heading, skip links, breadcrumbs, and blocks a site marks data-nosnippet or data-pagefind-ignore. Structure holds up too: code fences keep their language whichever convention a site uses, so ```python arrives instead of a bare fence; a card link becomes a linked title followed by its description instead of one run-together [DatabaseXYZ provides...] link, with the destination URL preserved; headings stay on one line rather than emitting a bare ## with the text stranded below; and adjacent elements spaced by CSS no longer concatenate into YesNo or EvaluationDeploymentProduction. Zero-width spaces, icon-font glyphs and empty elements that rendered as stray __ are dropped, and duplicate blocks from responsive desktop/mobile twins are collapsed. Inactive tab panels are now kept, so a page's Python and JavaScript samples both reach the markdown instead of only whichever tab was selected at render time. Two new options: truncate_data_arrays collapses long numeric runs such as raw embedding vectors printed in notebook output cells to a leading sample plus a count, following only_main_content unless you set it explicitly, and allow_degraded controls whether an anti-bot challenge with no page content behind it is returned as-is or fails with 502 instead of passing the interstitial off as the page.

Measured across fourteen live documentation and marketing pages, output shrank 67% overall, with one notebook page dropping 94% once its embedding vectors were truncated; the two pages that grew did so because content had previously been lost, regaining a dropped H1, twelve section headings and a table.

New Improved Fixed

Perceive returns main content by default #

The markdown_fit output is gone. Perceive's markdown now strips navigation, headers, footers, sidebars and cookie banners on its own, controlled by only_main_content, which defaults to true; send false for the untouched page, and a strip that removes too much falls back to the full page with a warning. direct_download is new on single-URL perceive and returns the artifact bytes in the same response instead of a signed URL round trip, as long as exactly one artifact output was requested. Results now carry status_code, deductions and options_echo, so a 404, a soft 404 or a login wall shows up as the reason a render scored low, and those pages no longer reach tier 3 extraction. Unknown request keys return 422 naming the field instead of being quietly ignored. Shipped in CLI 1.1.0, MCP server 0.5.0, the n8n node 1.1.0 and nine SDKs.

New Improved Fixed

MCP server 0.3.1 ships a routing guide #

@enconvert/mcp 0.3.1 includes SKILL.md, a routing table telling an agent which of the 24 tools to reach for. It exists because agents were calling convert_document on web pages and looping perceive_url one URL at a time instead of using perceive_batch. It also names the failures that are hard to diagnose from an error message alone: file paths must be absolute, a pk_ key authenticates but 403s on all 18 web tools, quota errors are not worth retrying, and watchers cannot run more often than every 60 minutes. The file ships inside the npm tarball, so it arrives with the install. Listing in the MCP Registry works again as well, after the server description was cut to the 100 character limit that had rejected 0.3.0 with a 422.

New

EnConvert node for n8n #

@enconvert/n8n-nodes-enconvert 1.0.0 is on npm as an n8n community node. One node covers 16 operations across files, images, web pages, whole websites, search and jobs, with an EnConvert API credential whose Test button calls /v1/whoami. An unsupported conversion fails in the editor with a list of what that file can be converted to, instead of a server error. Scrape results are inlined, so a screenshot arrives as a real binary field and markdown as {{ $json.markdown }} with no second HTTP Request node, and anything too big for n8n Cloud's 16 MB item limit can come back as a link that expires after 15 minutes. PDF page options an office input cannot honor are dropped with a warning on the item rather than erroring. Crawl output can be emitted one chunk per item straight into a vector store. The node attaches to an AI Agent node as a tool, and it ships zero runtime dependencies, which is what n8n Cloud requires.

Improved Fixed

Markdown conversions are smaller and faster #

markdown-to-html no longer runs Pygments highlighting. The generated page never included a Pygments stylesheet, so all of those token spans rendered with no color at all while making the HTML about 3.6x larger and peak memory about 6x higher. A 763 KB file with 128 code blocks took 29 seconds and 1578 MB, and now takes 5 seconds and 252 MB. Fenced blocks come out as

, which client side highlighters like Prism or highlight.js can pick up, and code heavy documents that used to die with a 504 convert. PDF to Markdown releases each page's cache as it goes and pulls table content out immediately instead of holding live page objects for the whole document, so peak memory tracks the largest page rather than the file. Spreadsheet and CSV to Markdown stop parsing at the 5000 row cap. One edge case changed there: blank rows are dropped after the cap, so a sheet with blank rows scattered through the first 5001 rows renders fewer body rows than it used to.

Fixed

A failed batch creation no longer strands queued pages #

The batch envelope is written before the per-URL rows now. With the old order, a failure between the two steps left operation rows that nothing could resume or sweep, because the resume path only walks envelopes. Those rows consumed the caller's quota and sat in queued forever.

Security Fixed

Batch credentials are no longer stored #

Basic auth, cookies and headers sent with a /v2/perceive batch were written into the job record as JSON and outlived the request, readable by anyone with database or backup access. They are stripped before the record is saved, and only the names of the dropped keys are kept. If the gateway restarts mid-batch and that batch used credentials, its unfinished URLs come back as failed with batch used credentials that are not stored; resubmit the batch instead of quietly rendering login walls for pages you paid to have rendered authenticated.

Fixed Security

Reusing a job_id returns 409 instead of clobbering a row #

job_id is client supplied, so re-sending your own after a timeout is normal, and it now resets the poll row idempotently instead of logging a duplicate key violation. A job_id that belongs to a different project returns 409 job_id already in use and leaves that project's row untouched. The success and failure writers are scoped by project as well, so a guessed ID can no longer flip someone else's job to failed with a caller supplied error message, or point it at a download URL signed for the wrong project.

New Fixed

Runaway renders and post-processing have hard ceilings #

Full page screenshots are capped at 25000 px tall and single page PDFs at 60000 px, tunable with SCREENSHOT_MAX_HEIGHT_PX and PDF_MAX_SINGLE_PAGE_HEIGHT_PX. Infinite scroll pages report heights of 50000 px and up, and a full page raster costs width times height times 4 bytes in one allocation, which took the whole worker down instead of returning anything. Ghostscript grayscale post-processing now times out after 120 seconds, and the child process is killed and reaped on timeout or cancellation, so a pathological PDF fails with an explicit error instead of pinning CPU and outliving the request that started it.