Changelog

What has changed on this site and in the tools we give away.

October 2026

The usage log notes what kind of page was checked

Social card preview

  • The API's log records a label for the kind of page you asked about, from a fixed list such as film or post, otherwise other, and how many parts its path has.
  • It also records a salted one-way hash of the address, so repeat checks of one page can be counted. The page's address itself is not logged.

Opening a page keeps its collection selected

goosey

  • A page opened from a collection keeps that collection selected in the sidebar, with its pages listed beside it, rather than jumping back to All pages.
  • A list says when it was last checked in small type beside its page count, in bold once it is over a day old.
  • The sentences about a list's age and what a re-check costs are gone. The Re-check button shows the cost on hover.
  • The sidebar's levels panel says plainly what a level is and where to change one.
  • What the CI gate does is one line: it fails your build on any error in the pages in view.
  • After a re-check, a line under the page count says how many problems were fixed and which pages have new ones, linked.
  • The bookmarklet is no longer offered on touch screens without a mouse or trackpad, where there is no bookmarks bar to drag it to.

goosey shows the card before and after a re-check

goosey

  • When a re-check changes a page's title, description or image, the card it made before is shown beside the card it makes now.
  • Problems that more than one page shares sit above the cards. Press one to see only those pages, and re-check just them.
  • A bookmarklet on goosey's page checks whatever page you are on.
  • Press ? for the keyboard shortcuts, including new ones: r re-checks the page you are on, and c and l switch between cards and list.

Re-checking a long list is twice as fast, and holds still

goosey

  • A re-check works through two pages at a time, so a long list takes about half as long.
  • Only the cards and rows that change are redrawn while it runs; the rest stay put.
  • When the API is busy for a moment, goosey waits and asks again instead of marking the page as failed.
  • All pages and Unfiled are named at the head of their view, where a collection's name goes.
  • What is selected in the sidebar shows clearly in dark mode.
  • Every list says when it was last checked beside its name, each card says when it was, and the times keep up while the tab is open.

goosey's goose honks hello, and keeps honking while it works

goosey

  • The goose honks when goosey opens and when you click it, honks while a check, re-check or scan runs, and hops once when a page comes back clean.
  • During a re-check the cards keep their places, the ones still waiting are greyed, and the one being checked says so.
  • Scrolling past the app reaches a short account of what goosey checks and how.
  • A collection opens as cards each visit; a choice of list lasts until the tab closes.
  • Deleting a page is a small trash can on its row or card.
  • Also from Polymorphism sits in a card coloured for its product: teal for candor, butter for ebman, navy for Polymorphism.

The URL box moves to goosey's title bar

goosey

  • The box to paste a URL sits in the title bar, the same on every view.
  • With a filter on, press the summary beside the counts, such as Errors to fix, to show every finding again.
  • Click a collection's name to rename it; the pencil appears on hover.
  • The goose and the name take you home to All pages.
  • Each level has its own colour block: crimson for errors, orange for warnings and mint for passes.

goosey wears the site's colours

goosey

  • Square corners throughout, as the site's blocks and buttons have.
  • Actions are navy, quieter buttons are outlined, and Delete, Remove and errors are crimson.
  • Panes and passed findings sit on the site's card colour.

Collections are renamed in place, and pages deleted from the list

goosey

  • A collection's name heads its view, with a pencil to rename it; Unfile and Delete collection sit beside it.
  • Every row and card shows a red Delete on hover, with Undo.
  • The list view shows every page, and By problem sits in its own pane below the pages.
  • Hovering a link inside goosey no longer fills the status bar with an encoded address.
  • Typing a bare domain such as beaky.poly.io offers Scan all of it beside Check.

A collection can be removed with its pages

goosey

  • A collection has a red Delete collection button. It deletes the collection's pages and its own levels, and Undo stays on screen until the next thing you do.

Open in goosey takes the pages with it

Social card preview

  • The button beside Preview is Open in goosey: it opens every page in the box in goosey, up to the preview's twelve.
  • The goosey and API panels sit one above the other, each the full width.

A link can bring several pages

goosey

  • A link from the social card preview can carry several pages; goosey checks the ones it does not keep yet and lists them all.

Whole sites are scanned in goosey, and the API has its own panel

Social card preview

  • The button beside Preview opens goosey: a domain opens goosey's scan plan for that site, and a single page opens that page in goosey.
  • goosey keeps what a scan found, so a scan is no longer lost when the preview page reloads.
  • The API has a panel of its own beside goosey's, with a new icon.

The tool comes first, and goosey sits beside it

Social card preview

  • The tool follows a two-sentence introduction; what it checks, the platforms' caches, X without an account and the API fold away below it.
  • A panel says when to use goosey instead: it remembers what it found, says what changed, checks a whole site and fails a build on a broken card.

Sites and sections open like collections

goosey

  • A site, or a section of one such as /blog/, opens in the sidebar like a collection, with its own Re-check all.
  • Check for new pages reads the sitemap and finds the pages under that level you have not checked yet.
  • Card view has a Light / Dark switch, to see the cards on the kind of feed they will appear in.

The API can plan one section of a site

Social card preview

  • ?site= with a path, such as example.com/blog/, returns the pages the sitemap lists under it, so a new post can be found and checked without sampling the whole site.

Collections as cards

goosey

  • A collection can be shown as cards, to see every page's picture at a glance. goosey opens in that view.
  • Re-check sits in the sidebar, beside the list it covers.

The usage log notes where a short link leads

Social card preview

  • When a link redirects, the API's log now records the site it ended up on as well as the one you asked for. Nothing else it records has changed.

September 2026

goosey remembers your cards

goosey

  • goosey, at goosey.poly.io, keeps every page it checks in your browser, says what changed when you check again, and gives your build a check that fails when a card breaks.

Checking a platform's own pages now needs a key

Social card preview

  • Previews of TikTok, Instagram, Facebook, X and LinkedIn pages now need an API key. Checking how your own site's links unfurl, including on those platforms, is unchanged and free.
  • Fetching as a platform's crawler (ua=) is no longer pointed at that platform's own servers.

The API's address leads somewhere

Social card preview

  • Opening api.poly.io in a browser now takes you to the API reference, instead of a bare “Not Found”.

The writing has a feed

Site

  • Case studies and essays now have their own Atom feed, at /writing/feed.xml, so new pieces reach your reader.

It checks the things you cannot see

Social card preview

  • A see-through card image is flagged: platforms composite it on their own background, white on a light client and near-black on a dark one.
  • The preview now shows your image on both backgrounds, and the cards themselves switch between light and dark chrome.
  • New checks for duplicate og:image tags, an image URL that never changes when the picture does, a signed URL that will expire, and a slow image.
  • Two more taken from LinkedIn's own Post Inspector: a description under 100 characters, and a missing author tag.

It tells you when your description is cut off

Social card preview

  • A description longer than the two lines a card shows now says so, measured in the preview itself.
  • Responses carry titleLength and descriptionLength, so you can gate on your own budget rather than ours.
  • The reference shows how to fail a build on the result, and which gates stay stable as checks are added.

A result you can send someone

Social card preview

  • Every check now has its own URL — bookmark it, refresh it, or send it to whoever can fix the tag.
  • Several URLs and whole-site scans link the same way; back and forward work.
  • The link re-runs the check, so it always describes the page as it is now.

The commonest reason a card looks wrong is not your tags

Social card preview

  • Results now warn that platforms cache cards, so a post can still show the old picture after a fix.
  • Links to LinkedIn’s Post Inspector and Facebook’s Sharing Debugger, which force a refresh.
  • Pasting more than twelve URLs now says how many are being checked, instead of silently dropping the rest.

A cache bypass for the deploy-then-check loop

Social card preview

  • Add &fresh=1 to bypass the five-minute cache.
  • For the deploy → check → fix → re-check loop, where the second check used to report the state before your fix.
  • Costs a request against your daily allowance, like any other call.

What the API promises, written down

Social card preview

  • New checks arrive at warn or tip, never at error — so a build gating on “no errors” cannot go red on our release schedule.
  • Raising a check to error is a breaking change, published before it ships.
  • changes.json carries the dated log and every check with its level, so you can diff it against the ones you gate on.
  • Responses carry specVersion, specNext when a change is scheduled, and a spec pointer for machines.

Checking our own claims against the platforms’ documentation

Social card preview

  • A robots.txt rule on your image is now a warning, not an error — the card keeps its title and description and loses only the picture.
  • Crawler claims are now only as strong as each platform documents: X publishes that Twitterbot follows the robots.txt spec; Facebook reserves the right to bypass it.
  • A <head> longer than the 300 KB we read now says so, instead of reporting unreached tags as missing. The window was 200 KB.

Every check now has a name a script can rely on

Social card preview

  • Each entry in the checks array carries an id — title.long, image.refused-allowlisted, robots.image-blocked — alongside its English.
  • Key off the id, because the wording changes: four messages were reworded in one afternoon this month.
  • Renaming an id is treated as a breaking change.

What every platform resolves, and where Slack has never said

Social card preview

  • The preview shows what X, Facebook, LinkedIn, WhatsApp and Slack each resolve from your tags, grouped by answer rather than repeated five times.
  • Where og:image and twitter:image point at different files, both are fetched and measured.
  • Slack has never published which namespace wins, so where yours disagree the tool says it does not know.

A refusal is retried as the platforms' own crawlers

Social card preview

  • If a site turns our crawler away, the tool asks again as Facebook’s and X’s before saying anything about your card.
  • Allowlisting the crawlers it recognises and blocking bots outright look identical from our side and mean opposite things for you.
  • Same fix for an image your CDN refuses, which was reported the same wrong way.

Check a whole site from its sitemap

Social card preview

  • Give the tool a bare domain: it reads the sitemap, groups URLs by shape and checks one page per template.
  • A four-thousand-page blog is usually one template, and checking all of it proves the same thing four thousand times over.
  • It says which shapes it skipped and how many pages it did not look at.

See what is left of your allowance before you hit it

Social card preview

  • GET /og/quota returns your limit, usage, what remains and when it resets — and does not count against the allowance.
  • A refused call names that endpoint, so a script can back off against a number instead of guessing.
  • It also says how to raise the limit, which the API itself never used to tell you.

Portrait photos are no longer reported as landscape

Social card preview

  • A phone photo is usually stored a quarter turn from the way it displays, and the tool was judging the stored numbers.
  • That called portrait images landscape and aimed the crop advice at the wrong two edges.
  • Orientation is now read from the file, the way the platforms read it.

Pages that used to take the checker down

Social card preview

  • Three shapes of crafted markup could crash a request; a forty-six-byte robots.txt could hang one until it timed out.
  • Both fixed, both now covered by generated cases — a quarter of a million per run.
  • The daily allowance was counted against a value the caller could set; it is now stamped at the edge.

August 2026

Deploy freezes now hold when the marker is damaged

ebman

  • A freeze marker with an unreadable timestamp was treated as stale and deleted, so enforcement stopped silently.
  • Freezes now fail closed, and a rollout halted by one exits non-zero instead of reporting success.
  • A freeze declared mid-rollout stops the regions still to come.

Five new checks, including the one you can't see yourself

Social card preview

  • Each page is fetched twice, once as a platform crawler and once as a browser, and the tool reports where they differ.
  • That catches the failure you cannot see yourself: a consent wall or bot gate breaks a card only when shared.
  • robots.txt is read, and a rule disallowing your image path is reported.
  • A failed image says which of blocked, too large or not-an-image it was.
  • Title length is counted in glyphs, so emoji no longer trigger a truncation warning they did not earn.
  • og:url is checked against the page it was found on, not just the domain.

Social card preview is linked from the home page

Site

  • It was one click deep under Products.
  • It is free and needs no sign-up, so it now sits on the front page where people arrive.

API keys, and a documented free allowance

Social card preview

  • The API stays open and anonymous by default.
  • Identifying yourself raises the daily allowance; a free key raises it further.
  • Keys are issued by hand, revocable, and counted per key rather than per address.

Faster pages, and fixes for keyboard and screen-reader users

Site

  • The 404 page’s game moved into its own bundle: every other page ships 21 KB of script instead of 114 KB.
  • Preloaded the font that decides when a page looks finished.
  • Fixed a duplicate element id, a chart that shifted the layout as it loaded, and a wordmark invisible in dark mode.

Agent-native setup with MCP

ebman

  • ebman mcp setup gets an agent talking to Elastic Beanstalk in one command.
  • ebman is listed in the MCP Registry.

Just shipped shows real versions

Site

  • The home page strip shows each product’s live version and release date, read at build time.
  • It replaces a hand-written label that went stale.

July 2026

Releases and changelogs

candor

  • Every candor engine’s releases and changelog in one place, at candor.poly.io/releases/.

Follow along in a reader: Atom feed.

Releases have their own changelogs: candor and ebman.