Postlad/Accessibility

Accessibility

Postlad aims to meet WCAG 2.1 Level AA across postlad.com, the dashboard at app.postlad.com, public share pages and embedded charts. This page says which parts we have checked, how we checked them, and which parts we know fall short.

Last updated 2026-08-22. Problems, questions and things this page gets wrong: hello@postlad.com, which reaches a person.

1. How this was assessed

Self-assessment, on 2026-08-22, by the team. Three things were done: the source of every page and every stylesheet was read for the markup and CSS each claim below depends on; every screen was driven with the keyboard alone, tabbing from the top of the document; and each one was looked at again at 200 % browser zoom, at a 320 px window width, in system dark mode, and with the operating system set to reduce motion.

It has not been tested with a screen reader. Nobody here has driven Postlad with NVDA, JAWS, VoiceOver or TalkBack, and no disabled user has been asked to try it. That is the largest gap in this page and it is the reason several rows in the table below say Partially supports rather than Supports: the code does the right thing as far as reading it can show, and reading it is not the same as hearing it.

No third party has audited Postlad, no conformance certificate exists, and nothing here is a signed VPAT. The table in section 5 is our own reading of our own code, published because a procurement officer would rather have that than nothing.

2. What works

Colour and contrast

Every text-and-background pair in the product was measured against the WCAG 2.1 formula and recorded in the brand kit, so a change that breaks one is visible. AA asks for 4.5:1 on body text and 3:1 on borders and controls.

Measured contrast ratios, light mode and dark mode
Pair Light Dark
Body text on the page15.59:116.05:1
Captions and labels6.75:18.05:1
Links and accent text6.72:18.03:1
Text on a filled button7.02:18.10:1
The green that means live data5.12:17.89:1
Navigation on the navy header11.11:1, and 14.55:1 for the current item
Input borders and focus outlines3.06:13.00:1

There are two palettes because one does not work in both modes: the accent blue is #245C8D on paper and #7FB3E0 on navy, and each fails AA in the other mode. Dark mode follows your system setting; the dashboard also has a manual light/dark switch.

Colour never carries a meaning on its own. A stream's liveness is a coloured dot and the word beside it. A chart's fields are named in the legend, not only tinted. The status page prints the state of each component as a word next to its dot. An embedded chart names its dot for anyone not seeing the colour.

Keyboard

  • Skip to content is the first thing in the document on every page of this site, on every screen you see once you are signed in, and on every public share page. The sign-in page does not have one and does not need one: there is nothing above the form to skip past but the logo.
  • The focus outline is never removed. Everything you can reach with Tab draws a ring in the accent colour when you reach it by keyboard.
  • Charts are readable without a mouse. Every chart is a tab stop that announces itself as a group and says the arrow keys read it. Left and right step from one reading to the next, Home and End jump to the ends, Escape puts the crosshair away, and the readout is a live region, so the value, the unit and the timestamp are announced as you move. This works the same way inside an embedded chart on someone else's page.
  • Wide tables and code blocks are tab stops too, so the part that runs off the right edge on a narrow window can be scrolled with the arrow keys rather than only by dragging.
  • There is no keyboard trap. The product has no modal dialogs and no script anywhere that moves focus, so nothing can catch it. Escape closes the settings panel and the add-chart picker.
  • Signing in works with JavaScript turned off. Both sign-in forms are ordinary HTML forms that post to the server, and the confirmation step has a real button rather than an automatic redirect.

Structure and labelling

  • Every page declares lang="en" and has one h1, with no heading level skipped between there and the bottom.
  • Header, navigation, main content and footer are real landmarks, and a page with two navigations names both.
  • Every table header cell says which way it heads — scope="col" or scope="row" — on all 233 of them.
  • Every form field in the dashboard has a real <label> tied to it. The sign-in fields also carry autocomplete="email" and autocomplete="one-time-code", so a password manager and a phone's code-from-SMS suggestion both work. This marketing site has no forms at all.
  • The navigation item for the page you are on is marked as current, not just coloured differently.
  • Every image on this site has an alt attribute, and the decorative ones — the mascot in a header, the tick beside a list item — have an empty one so they are skipped rather than described. The dashboard ships no <img> elements at all; its artwork is inline SVG, marked as an image with a name where it means something and hidden where it does not.

Motion, zoom and text

  • Reduced motion is honoured everywhere. If your system asks for it, the landing page's typing demo renders finished and static instead of typing, its chart stops sliding, the caret disappears, the pulsing live dot holds still, the chart's roll transition is never armed, and the mascot stops floating.
  • Nothing flashes. The fastest animation anywhere is one cycle every 2.4 seconds, well under the three-per-second threshold.
  • Pinch zoom is never disabled. No page on either host sets user-scalable=no or a maximum scale.
  • Text scales and the page reflows. Sizes are in relative units, so raising your browser's default font size moves the whole layout. At 200 % zoom and in a 320 px window every page collapses to one column with no sideways scrolling of the page itself.
  • No webfont. Both sites use the fonts already on your machine, so text renders immediately, at whatever size you have asked for, with nothing to load and nothing to fail.

Time, and being left alone

Nothing you are reading has a time limit on it. There is no session countdown, no auto-advancing carousel and no page that refreshes itself out from under you. Sign-in links and codes expire after 15 minutes and a new one can be asked for at any time — WCAG allows a time limit that exists for security, and that is the only one here. Charts fetch new readings on their own, stop doing it while the tab is in the background, and never move the page while you are in it.

3. Known limitations

Each of these is something a real person could hit. The alternative is given with it.

  • No screen-reader testing. See section 1. If you use one and something here is wrong, that report is worth more to us than any other kind, and it will be acted on rather than filed.
  • A public chart has no data table under it. The individual readings behind a public share page are not marked up as a table. What to do instead: the arrow keys read the chart reading by reading; the line under each chart states the first and last timestamps and the highest and lowest values; and CSV export is on every chart page, on every plan, with no account needed for a public stream — it is the complete set of numbers and it is the alternative we would point an auditor at. Signed in, the stream's Data page does show the readings as an ordinary table.
  • Values that refresh in place are not announced. On a chart page the current reading and its age update every few seconds, and on the billing confirmation screen the message changes when the plan goes active. A screen reader is not told. What to do instead: reloading the page reads the current state, and the chart's own arrow-key readout is announced properly. This is WCAG 4.1.3 and it is the criterion we most clearly do not meet.
  • Form errors are not tied to their field. An error is a full sentence at the top of the form and it is read when the page is read, because the page reloads to show it. It is not marked as an alert and the field it belongs to is not marked invalid, so the connection between the two is visual.
  • Wide tables and code samples scroll sideways instead of reflowing, on a narrow window. WCAG permits this for tables and code, and both are keyboard-scrollable, but it is still two-dimensional scrolling and worth saying.
  • The dashboard's settings panel, on a phone. It opens over the page rather than beside it, and focus is not moved into it, so a screen reader can still reach what is behind it. Escape closes it, and everything in it is also reachable by tabbing.
  • An embedded chart is inside someone else's page. We give the frame a title that says whether it holds a chart or a single reading, and the chart inside it takes focus and answers the arrow keys. The page around it is not ours and we cannot speak for it.
  • The status page rewrites itself every couple of minutes. The headline is announced when it changes; the list of components underneath is not, because announcing four rows twice a minute would be worse than not announcing them.

4. Telling us about a problem

Write to hello@postlad.com. It reaches a person, not a ticket queue, and there is no form to fill in and no account needed to send it.

What happens next:

  • A reply within five working days, from a person who has read the message.
  • If it blocks you, the reply says what to use instead in the meantime — an export, a different page, or a change we make that week.
  • If it turns out this page overstates something, this page changes and the date at the top changes with it.

The most useful message names the page, says what you were trying to do, and says what you are using — browser, screen reader and version, zoom level, anything relevant. A message that says only "the charts do not work" is still worth sending; we will ask.

5. Conformance, criterion by criterion

The WCAG 2.1 Level A and AA success criteria, grouped by guideline, with the same three words a VPAT uses. Partially supports here usually means the code does the right thing but no screen reader has confirmed it.

WCAG 2.1 Level A and AA guidelines, our status for each, and why
Guideline Status Note
1.1 Text alternatives Partially supports Decorative images carry an empty alt; charts are named and readable with the arrow keys. A chart's readings are not a table on the public page — CSV export is the complete alternative.
1.2 Time-based media Not applicable There is no audio and no video on this site, in the dashboard, or in an embed.
1.3 Adaptable Supports Landmarks, one h1 per page with no level skipped, scope on every table header, a label tied to every field, autocomplete on the sign-in fields.
1.4 Distinguishable Supports The measured ratios in section 2. Colour is never the only signal. Zoom is never disabled and the layout reflows to one column at 320 px.
2.1 Keyboard accessible Supports Everything is operable from the keyboard, charts included. No modals and no script that moves focus, so no trap. No single-character shortcuts.
2.2 Enough time Partially supports Nothing you are reading is timed; sign-in codes expire in 15 minutes and can be re-requested, which the standard allows. Moving content stops for a reduced-motion setting, but there is no pause control on the page itself.
2.3 Seizures Supports Nothing flashes. The fastest animation is one cycle every 2.4 seconds.
2.4 Navigable Supports Skip link on every page, a unique title per page, focus order that follows the reading order, links that make sense read alone, and a visible focus indicator.
2.5 Input modalities Supports No path-based gestures, nothing driven by tilting or shaking a device, and every visible label matches the name the control reports.
3.1 Readable Supports lang="en" on every page. Nothing is written in a second language.
3.2 Predictable Supports Nothing changes context because a control took focus or a value changed. The header and footer are the same on every page and in the same order.
3.3 Input assistance Partially supports Every field is labelled and every error is a sentence that says what to do next. Errors are not marked as alerts and are not tied to their field programmatically.
4.1 Compatible Partially supports Custom controls carry a name, a role and a state. Values that refresh in place are not announced, which is 4.1.3 and the clearest of our gaps.

Read with section 3: a row marked Supports means we checked it by reading the code and driving the page with a keyboard, at 200 % zoom, in dark mode and with reduced motion. It does not mean an auditor agreed, because none has been asked.

6. The standards this is written against

  • WCAG 2.1, Level AA — the W3C's Web Content Accessibility Guidelines. This is the target, and section 5 is the criterion-by-criterion answer.
  • EN 301 549 — the European accessibility requirements for ICT procurement. Its requirements for web content are WCAG 2.1 Level AA, so section 5 answers those too. Postlad is a web application with no separate desktop client, no telephony and no hardware, so the rest of the standard does not apply to it.
  • Section 508 of the US Rehabilitation Act, as revised in 2017, which adopts WCAG 2.0 Level AA for web content. WCAG 2.1 AA contains all of WCAG 2.0 AA, so meeting the target above meets that one.

Nothing here is a claim of certification. No independent audit has been carried out, no conformance report has been issued, and no VPAT has been signed. If your procurement process needs one, say so at hello@postlad.com and you will get a straight answer about what we can and cannot produce rather than a document made to look like something it is not.

What is stored and who else sees it is on the privacy page. What you are buying is on the terms page. What is up right now is on the status page.