Why These Recommendations
Most quality problems on apps and websites are not exotic. They are the same preventable issues turning up again and again: text nobody can read over a photo, buttons that look like plain links, two competing page titles, a footer credit pasted in twice, a layout that falls apart on a phone. These recommendations collect the checks that catch those problems before your visitors do.
They are written for teams doing app development or website work of any size. None of them need special tools — most need only a browser, a phone, and the discipline to verify on the real page instead of assuming.
1. Accessibility — WCAG 2.2 AA
Accessibility is the foundation, not a final pass. If people cannot read the text, see the focus, or use the page with a keyboard, nothing else on the page matters. Build to WCAG 2.2 AA from the start: real contrast, real labels, and a page that works without a mouse.
- Hold color contrast to at least 4.5:1 for body text and 3:1 for large text and UI components.
- Give every image alt text that describes it, and mark purely decorative images as decorative.
- Make sure the whole page works by keyboard alone, with a focus indicator that is always visible.
- Put a skip link on every page so keyboard and screen-reader users can get straight to the content.
- Give form fields real labels, with help text under the label that explains what to enter and why.
- Never convey information by color alone — pair color with text, an icon, or a pattern.
- Use headings, landmarks, and a page title that actually describe the page.
2. Headers & Content Structure
Headings are the page's outline — for visitors skimming, for search engines, and for screen readers navigating by heading. One clear H1, a hierarchy that never skips a level, and no repeated header wording keeps that outline honest and easy to scan.
- Use exactly one H1 per page, and make it match what the page is about.
- Keep header hierarchy in order — H1, then H2, then H3 — with no skipped levels.
- Header words can't repeat: no two headers on a page use the same words.
- Don't duplicate the page header with an in-body title saying the same thing.
- Set FAQ questions and headers in bold text so they stand out as structure, not decoration.
- Titles and labels should say what the thing actually is — never a bare, vague label.
5. Layout & Mobile
Most visitors arrive on a phone. A page that scrolls sideways, squeezes text, or ships a sideways photo fails the majority of its audience. Design and verify at phone width first — 390px is a good working standard — and open every image before it goes on a page.
- The page must fit phone width (390px) with no horizontal scrolling.
- Where menus and filter rows are designed to scroll horizontally, they scroll in one row.
- Text sizes stay readable on phone and desktop alike.
- Images are the right way up, sharp, and verified by opening them — never chosen by filename.
6. Analytics & Tracking
Analytics only helps if it is measuring the right property on the right pages. One tag per site, using that site's own Measurement ID — and confirm it is actually firing, because an installed tag that never sends data is worse than none: it looks like zero traffic.
- Install the Google Analytics tag with the site's own Measurement ID, and verify it is firing.
- Remove duplicate or leftover tags from other properties.
7. Voice & Accuracy
A site speaks for the organization, not for whoever happened to edit the page. Write in the site's own voice, publish only facts you can stand behind, and verify every name, date, and number against its source before it goes live.
- Site copy is written in the site's own voice. For society and genealogy sites, that means a neutral, organization-wide voice — never one person's perspective.
- Genealogy content states documented facts only — no guessing, no invented color.
- Call visitors what the site calls them — guests, never customers, where that applies.
- Verify names, dates, and numbers against the source before publishing.
ARIA
ARIA fills the gaps native HTML cannot — but only when it is accurate. Wrong ARIA is worse than none at all: a stale expanded state or a label pointing at an ID that doesn't exist tells screen-reader users things that are not true. Reach for a real HTML element first, and add ARIA only where HTML runs out.
- Give icon-only buttons and links an aria-label that says what they do.
- Mark decorative elements aria-hidden — and never leave them focusable while hidden.
- Menu and disclosure buttons use aria-expanded, and it changes with state.
- Mark the current page in nav with aria-current="page".
- Check that every aria-labelledby and aria-describedby points at an ID that actually exists.
- Never put role="button" (or a similar role) on elements that can't be used by keyboard.
- Status messages and toasts use a live region so screen readers announce them.
- Use ARIA only where native HTML can't do the job — a real button beats a div with a role.
Practical Testing — Do This, Look For This
Automated checkers catch only part of accessibility. The rest shows up when a person actually uses the page: tabbing through it, zooming in, shrinking the window, and submitting the form wrong on purpose. These are the hands-on passes to run on every page — do each one, and look for what it is meant to catch.
- Keyboard walk: unplug the mouse and Tab through the whole page — every control reachable, focus always visible, nothing traps.
- Check that the focus order follows the reading order on the page.
- Make sure the focused element is never hidden behind a sticky header or banner (WCAG 2.2 — focus not obscured).
- Run a screen reader pass — NVDA on Windows or VoiceOver on Mac/iPhone: the headings list makes sense, images announce their alt text, buttons say what they do.
- Zoom to 200%, then 400%: nothing overlaps, no two-way scrolling, text doesn't get cut off.
- Shrink the window to 320px wide: content reflows to one column and still works.
- Measure touch targets: at least 24 × 24 CSS pixels (the WCAG 2.2 minimum), 44px preferred.
- Anything you can drag must also work with a simple tap or click (WCAG 2.2 — dragging movements).
- Submit forms empty and with errors: errors are named in text (not color alone), tied to the field, and focus moves to the error summary.
- Keep contact and help options in the same place on every page (WCAG 2.2 — consistent help).
- Never ask twice for information already given (WCAG 2.2 — redundant entry).
- Sign-in works without a memory or puzzle test — offer an email link, a code, or a passkey (WCAG 2.2 — accessible authentication).
- Turn on prefers-reduced-motion: animations stop or calm down.
- Turn CSS off, or load on a slow connection: content order still makes sense and the page is usable.
- Check one page with an automated tool — the aCo Accessibility Checker or WAVE — AND by hand: automated tools catch only part of it.
8. Before Anything Goes Live
Publishing is the step where careful work gets lost — an editor that rewrites your code, an autosave that never happened, a preview link that doesn't match production. Protect the work: back up first, edit in code view, and verify the change on the rendered page on the real domain.
- Save a backup before editing anything live — a theme XML download or a copy of the file.
- Edit in code/HTML view only on platforms that offer one; visual editors can silently break page code.
- Save at least every 5 minutes on platforms without autosave, such as Blogger.
- Verify every change in a real browser on the custom domain — deploy-preview subdomains are not proof.
- Check staging first, then verify production after the deploy.
The Full Checklist
This is the complete Site QA Checklist, published in full. Run every item before a site or page is called done, and verify on the rendered live page (custom domain), in a real browser — never by fetched HTML alone. Prefer paper? The document version is the same checklist, formatted for print.
1. Accessibility — WCAG 2.2 AA
- Color contrast: body text at least 4.5:1; large text and UI components at least 3:1
- Every image has alt text that describes it (decorative images marked decorative)
- Page works by keyboard alone; focus is always visible
- Skip link present on every page
- Form fields have real labels; help text sits under the label and explains what to enter and why
- Nothing is conveyed by color alone
- Headings, landmarks, and page title describe the page
2. Headers & Content Structure
- Exactly one H1 per page, and it matches what the page is about
- Header hierarchy is in order (H1 → H2 → H3, no skipped levels)
- Header words can't repeat — no two headers on a page use the same words
- No duplicate in-body title duplicating the page header
- FAQ questions/headers are bold text
- Titles and labels say what the thing actually is — never a bare vague label
3. Buttons & Links
- Buttons read as real buttons: filled pill/block shape, contrasting text
- Buttons are never blue and never underlined — including the label text
- Button labels are Title Case
- Buttons do not touch each other (clear spacing)
- Social media links are icons only, never text links
- Links are descriptive (no bare "click here")
4. Footer & Credits
- Exactly ONE site credit: "Website by aCo Digital · Supported by aCo App" with the small aCo logo, linking to https://aco.digital and https://app.aco.digital
- No duplicate "Designed by" / "Website by" lines anywhere on the page
- NO Netlify badge — never, on any site
- No "we never sell your data/email" promises anywhere on the site
5. Layout & Mobile
- Page fits phone width (390px) — no horizontal scrolling
- Menus and filter rows scroll horizontally in one row where designed to
- Text sizes are readable on phone and desktop
- Images are the right way up, sharp, and verified by opening them (never chosen by filename)
Navigation & Wayfinding
- Skip navigation link present ("skip nav")
- Skip-to-top / back-to-top link present ("skip top")
- Page has breadcrumbs
- Page nav label and page H1 match
- Nav shows an active style for the current page (aria-current plus a visual distinction)
6. Analytics & Tracking
- Google Analytics tag is installed with the site's own Measurement ID and is firing
- No duplicate or leftover tags from other properties
7. Voice & Accuracy
- Site copy is in the site's own voice (Doty Society and genealogy: neutral, Society-wide — never one person's perspective)
- Genealogy content states documented facts only — no guessing, no invented color
- Visitors are called guests, never customers, where that applies
- Names, dates, and numbers verified against the source
ARIA
- Icon-only buttons and links have an aria-label that says what they do
- Decorative elements are aria-hidden — and never focusable while hidden
- Menu and disclosure buttons use aria-expanded, and it changes with state
- Current page in nav uses aria-current="page"
- aria-labelledby / aria-describedby point at IDs that actually exist
- No role="button" (or similar) on elements that can't be used by keyboard
- Status messages and toasts use a live region so screen readers announce them
- ARIA is only used where native HTML can't do the job — a real button beats a div with a role
Practical Testing — Do This, Look For This
- Keyboard walk: unplug the mouse; Tab through the whole page — every control reachable, focus always visible, nothing traps
- Focus order: the tab order follows the reading order on the page
- Focus not obscured: the focused element is never hidden behind a sticky header or banner (WCAG 2.2)
- Screen reader pass: NVDA (Windows) or VoiceOver (Mac/iPhone) — headings list makes sense, images announce their alt text, buttons say what they do
- Zoom to 200%, then 400%: nothing overlaps, no two-way scrolling, text doesn't get cut off
- Shrink to 320px wide: content reflows to one column and still works
- Touch targets: at least 24 × 24 CSS pixels (WCAG 2.2 minimum), 44px preferred
- Dragging: anything you can drag also works with a simple tap/click (WCAG 2.2)
- Forms: submit empty and with errors — errors are named in text (not color alone), tied to the field, and focus moves to the error summary
- Consistent help: contact/help options sit in the same place on every page (WCAG 2.2)
- No redundant entry: the site never asks twice for information already given (WCAG 2.2)
- Sign-in works without a memory or puzzle test — email link, code, or passkey offered (WCAG 2.2 accessible authentication)
- Reduced motion: with prefers-reduced-motion on, animations stop or calm down
- Turn CSS off / view on a slow connection: content order still makes sense and the page is usable
- Check one page with an automated tool (the aCo Accessibility Checker or WAVE) AND by hand — automated tools catch only part of it
8. Before Anything Goes Live
- Backup saved before editing anything live (theme XML / file copy)
- Edits made in code/HTML view only (Blogger and aCo pages — never the visual editor)
- Blogger work saved at least every 5 minutes (no autosave)
- Change verified in a real browser on the custom domain — deploy-preview subdomains are not proof
- Staging checked first; prod verified after deploy