Back to blog
Product Updates

Accessible by Default, Not by Audit

Folio used to fill in alt text for you — from a caption, a block title, or the literal word 'Figure'. It looked done and it helped nobody. Now an image goes live only when a person has actually described it, or has explicitly said it needs no description.

F

Folio Team

August 26, 2026 5 min read

Every image owes one thing to the people who can't see it: a sentence saying what it is. It's the oldest accessibility rule on the web, it takes ten seconds, and it gets skipped constantly — not out of malice, but because nothing stops you.

Folio's problem was worse than skipping it. We were filling it in.

Helpful defaults that helped nobody

Two places in Folio put images in front of students.

A figure built in Figure Studio inherited its caption as alt text. With no caption, it got the word "Figure."

An image in a course unit inherited the block's title. So a screenshot inside a block called "Week 3" was described, to a screen reader, as "Week 3."

Both look completely fine from the author's side. The field has something in it. Nothing is flagged. You move on.

From the other side they're noise. "Figure" tells a blind student that an image exists and nothing else — which they already knew, because their screen reader just announced an image. A caption read aloud twice is a caption read aloud twice. The alt text was present, technically valid, and carried no information.

That's the worst of the three available states, and it's worth sitting with why. Missing alt text at least announces itself as missing — to an author, to a linter, to anyone checking. A generated default doesn't just fail to help. It removes the signal that would have told someone to help.

The rule now

An image goes live in Folio when one of two things is true:

  • somebody wrote alt text for it, or
  • somebody explicitly marked it decorative.

That's the whole rule. Both insertion points share one implementation — the Figure Studio insert gate and the course-unit write path — so the two can't drift apart, and on the course side the check runs on the server rather than only in the dialog.

The second option matters more than it looks. Blank alt text is genuinely correct for an ornamental image: a divider or a background flourish should be silent, and forcing a description onto it makes the page worse for exactly the people the rule exists to protect.

But it has to be a choice. That's the design: empty and decorative are two separate states in Folio, not one blank string. Silently accepting a blank makes the default dishonest. Making someone tick a box keeps it honest — and takes about as long.

We didn't grey out the button

The obvious implementation is to disable Insert until the field is filled. We deliberately didn't.

A disabled button can't be focused, so a screen reader user tabbing through the dialog never lands on it, and it explains nothing when they arrive — it just sits there, dim, for reasons you're expected to infer. Building an accessibility feature out of an inaccessible control would be a joke at our own expense.

So the button stays live. Clicking it blocks the insert, says why inline, and moves focus to the field that needs filling.

What this doesn't do

It doesn't retroactively fix a course. The gate binds images as they're inserted or edited; ones already sitting in documents are untouched. Claiming otherwise would be its own dishonest default.

It also can't tell good alt text from bad. Typing "image" into the box satisfies it. No gate can judge that, and we'd rather name the limit than imply a guarantee we can't keep. What it does guarantee is that a person decided — which is strictly more than an inferred caption ever meant.

For institutions

Alt text is the authoring end. The other end is the environment the content is read in, so institution admins now set floors that apply across their entire Folio space:

  • Reduced motion. Animation off for everyone, not only for people who found the setting in their OS. It's applied to the page before first paint, so there's no flash of the thing you asked not to see.
  • A contrast floor. WCAG AA or AAA. It's enforced in both directions: brand colours that fail the floor can't be saved, and the floor can't be raised while the current colours breach it. Nobody gets to configure their institution into unreadability by accident.
  • A minimum type scale. Standard, large, or extra-large as the baseline everyone starts from.

These are institution-wide and they bind. A policy an individual course can quietly opt out of isn't a policy.

Why we built it this way

This is the same move we keep making.

Folio's integrity work doesn't detect dishonesty after the fact; it makes authorship provable while you write. In a Kaptur class, attendance isn't a list the room submits about itself — it's what the media server observed, reported over a signed webhook. In both cases the point is to make the honest outcome the structural one, so it doesn't depend on anybody remembering.

Accessibility is usually the opposite. It's an audit: a report, a score, a remediation backlog — months after the content shipped and long after the student needed it. Audits are useful. They're also the wrong place to put the work, because by the time the report lands, the person who knew what the image showed has moved on to next semester.

Ten seconds at insert time beats a spreadsheet in June.

Ready to write better research?

Folio's Scholar plan is free, forever. Sign up and start in minutes.

Start writing free