Skip to content

feat: describe every picture in the deck library for screen readers - #238

Merged
ixuz merged 4 commits into
mainfrom
image-descriptions
Oct 22, 2026
Merged

ixuz merged 4 commits into
mainfrom
image-descriptions

Conversation

@ixuz

@ixuz ixuz commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

What and why

Three of the four library decks with pictures described none of them, so a screen reader said only "Picture on the front of the card". On those decks the picture is the question, so a card couldn't be studied without sight. The data has had a place for a description since card format 4 (solid-memo:frontImageDescription, backImageDescription), but nothing asked the library to use it.

The rule. The library's curation (LIBRARY_LANGUAGES in curationRules.ts) now asks for a description of every picture on a card, in English and in every other language the card's text is in, by its primary subtag: text in sv-se asks for sv, and untagged text asks for nothing.

  • As with a deck's title, description and keywords, npm run library:check asks this only of each deck's newest version, since published versions are frozen.
  • The Studio's check for the library asks it of a draft too (repoPolicy).
  • A missing description is a new problem, missingImageDescription, worded in the command and in all six Studio languages.
  • The release model now carries a card's pictures and their descriptions so the rule can read them.
  • The rule is documented in docs/deck-library.md (A version, Checks), docs/studio.md and docs/policy.md.

The decks. Each new version describes every picture without giving the answer away: what a sighted learner sees, never the country, title, painter, maker or place being asked for, nor a word of the title in any language.

  • World flags v3: 254 flags, in English and Swedish, written from each flag's official design and checked against the SVG the card shows.
  • Rijksmuseum collection v2: 93 pictures, in all six languages.
  • Famous paintings v4: 150 paintings, in all six languages.

How the descriptions were checked:

  • The art descriptions were written after looking at each picture. Each version's provenance has a review round that says how they were made, as the earlier rounds do.
  • A script compared every description with its card's back in the same language, and descriptions that used a word of the answer were reworded.
  • No card's front or back changed.
  • Each new version names the library's contact instead of an email, as new versions must.

The deck commits come before the rule, so the library check passes at every commit.

Follow-ups, not in this pull request:

  • Broken picture: The Night Café (famous-paintings#q674846) shows no picture, because its link returns 404. The file was renamed on Wikimedia Commons to "Van Gogh - The Night Café (1888).jpg".
  • Studio: the question editor has no picture fields, so a draft with this problem shows it but can't be fixed there.
  • Identical flags: Norway and Svalbard and Jan Mayen, the United States and its Minor Outlying Islands, and Australia and Heard Island and McDonald Islands share a flag in the deck, so their descriptions are identical too.

Closes: #234

Checklist

  • One issue. This pull request addresses one issue, linked above.
  • One step. This pull request does not finish its issue, so it says Refs:, not Closes:. Leave this unchecked otherwise.
  • Done, as AGENTS.md defines it: npm run check passes (lint, Markdown and spelling included), npm run lint:reuse too if a file was added, and npm run crosscheck too if ns/ or decks/ changed. (npm run check passes at every commit; npm run crosscheck: 247 of 247 documents conform; the new files are deck versions, covered by their decks' lines in REUSE.toml, which npm run check:reuse checks)
  • Tests. New and changed code has its tests, and every package stays at 100% coverage (docs/testing.md).
  • Docs. The docs say what changed, and a new page in docs/ is listed in docs/docs.ttl. (no new page)
  • Languages. A new or changed message is in every locale: en, sv, ko, de, es and fr (packages/ui/src/i18n/).
  • Vocabulary and shapes. Any change to ns/ was agreed in an issue first; no published ns/shapes/*/vN.ttl or decks/*/vN.ttl was edited; generated files were regenerated, not edited. (ns/ is unchanged; the decks get new versions)
  • Breaking? Nothing in the public API breaks, or a commit says so (! and a BREAKING CHANGE: footer). npm run check:breaking sees a line of api/ that goes, but not a feature removed, nor a reader that reads less than before. (only additions: a problem code, fields of the release model)
  • Pod data. Any change to what the app writes to a pod comes with its migration (docs/migrations.md). (n/a: nothing the app writes changes)
  • Policy. Any change to an external rule the code follows (SM-2, the plural rules, a specification) is cited. (n/a: no external rule changes)
  • Licenses. New content is MIT, or a deck states its own license; a new file has its SPDX header (npm run lint:reuse), or a new deck its line in REUSE.toml; third-party content is credited. (each version keeps its deck's license and sources)
  • Architecture. Imports follow docs/boundaries.md and the layers of docs/architecture.md.
  • Run. I ran the app (npm run dev) and tried the change, and considered the user journeys.
  • Authorship. I read and understand every line of this pull request, and answer for it, whatever tools helped write it (CONTRIBUTING.md).
  • Commits. Each commit is one logical change, in Conventional Commits form (type(scope): subject, ! and a BREAKING CHANGE: footer if it breaks something), with an imperative subject and a body that explains why (CONTRIBUTING.md).

ixuz added 4 commits October 22, 2026 17:47
A flag on the front of a World flags card had no description, so a
screen reader said only "Picture on the front of the card", and a
card whose picture is the question could not be studied without
sight.

Version 3 describes each of the 254 flags in English and Swedish, the
languages its cards are in: its stripes, colors and emblems, never the
country, and never lettering that names it. The descriptions follow
each flag's official design, checked against the colors and shapes of
the SVG the card shows. No card's front or back changed. The version
names the library's contact instead of an email, as new versions must.

Refs: #234
A picture on the front of a Rijksmuseum collection card had no
description, so a screen reader said only "Picture on the front of the
card", and a card whose picture is the question could not be studied
without sight.

Version 2 describes each of the 93 pictures in the six languages its
cards are in: what a sighted learner sees, never the title, maker or
place asked for, nor a word of the title in any language. AI agents
wrote them after looking at each picture, and the version's
provenance says so in a review round of its own. No card's front or
back changed. The version names the library's contact instead of an
email, as new versions must.

Refs: #234
A painting on the front of a Famous paintings card had no description,
so a screen reader said only "Picture on the front of the card", and a
card whose picture is the question could not be studied without sight.

Version 4 describes each of the 150 paintings in the six languages its
cards are in: what a sighted learner sees, never the title or painter
asked for, nor a word of the title in any language. AI agents wrote
them after looking at each picture, and the version's provenance says
so in a review round of its own. No card's front or back changed. The
version names the library's contact instead of an email, as new
versions must.

Refs: #234
A picture without a description is read out only as "Picture on the
front of the card", so on a deck whose pictures are the questions a
card cannot be studied without sight. The data has had a place for a
description since card format 4, but nothing asked the library to use
it, so a new deck with pictures could ship without any.

The library's curation (LIBRARY_LANGUAGES) now asks each picture on a
card to be described in English and in every other language the
card's text is in, by its primary subtag. As with a deck's title,
description and keywords, npm run library:check asks it of each deck's
newest version only, since published versions are frozen, and the
Studio's check for the library asks it of a draft. A missing
description is a new problem, missingImageDescription, worded in the
command and in each of the Studio's languages. The release model now
carries a card's pictures and their descriptions so the rule can read
them.

Closes: #234
@ixuz ixuz added accessibility Barrier affecting people with disabilities enhancement New feature or request deck A wrong card, a missing card, or a new deck labels Oct 22, 2026
@ixuz
ixuz enabled auto-merge October 22, 2026 16:11
@ixuz
ixuz added this pull request to the merge queue Oct 22, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 22, 2026
@ixuz
ixuz added this pull request to the merge queue Oct 22, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 22, 2026
@ixuz
ixuz added this pull request to the merge queue Oct 22, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 22, 2026
@ixuz
ixuz added this pull request to the merge queue Oct 22, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 22, 2026
@ixuz
ixuz added this pull request to the merge queue Oct 22, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 22, 2026
@ixuz
ixuz added this pull request to the merge queue Oct 22, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 22, 2026
@ixuz
ixuz added this pull request to the merge queue Oct 22, 2026
Merged via the queue into main with commit a6c2cc2 Oct 22, 2026
64 of 66 checks passed
@ixuz
ixuz deleted the image-descriptions branch October 22, 2026 22:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

accessibility Barrier affecting people with disabilities deck A wrong card, a missing card, or a new deck enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Pictures in the deck library have no description for screen readers

1 participant