Snapshot (stack & wiring)
- Framework: Gatsby 5.x (SSR + hydrated SPA),
gatsby-plugin-imagefor responsive images (placeholders + lazy). - CSS: A large inlined global stylesheet + Bootstrap utilities; custom type stack (GT America, Sectra) self-hosted via
@font-face. - Search: GET
/search?query=...with accessible legend/labeling. - Nav: Accordion/mega menu (“Today’s CIA”, “Careers”, “Legacy”, “Newsroom”, “Library”), hamburger menu for mobile, skip-nav present.
- .onion:
meta http-equiv="onion-location"advertises Tor mirror (👍). - JS toggles:
noscriptfallbacks render anchor links; JS shows “Contact/Report Information” buttons (.no-showpattern). - Assets: Social icons inline SVG; favicon/manifest + touch icons.
What’s on the page (IA)
- Hero: “We are the Nation’s first line of defense” + CTA “Find your calling.”
- Sections:
- Our Agency / Our Legacy explainer blocks.
- Our Stories card grid.
- World Factbook promo.
- Footer: Four columns (Agency, Careers, Resources, Helpful Links), policy links, social (Instagram, Facebook, X/Twitter, LinkedIn, YouTube, Flickr, Telegram).
A11y & UX checks
- Good: Skip link, visible focus styles, form labels,
aria-livestatus holder,aria-expandedon accordion triggers, keyboardable menu items (tabindex="0"on role=button divs). - Fix these:
- Typos: Multiple
aria-hidenshould bearia-hidden. - Role=button divs: You already set
tabindex="0", but ensure Space/Enter also trigger click via key handlers for parity with native buttons. - Accordion ARIA: When toggling, update both
aria-expandedand setaria-controlsto an ID that exists/uniquely maps (looks good—but keep it in sync). - Link purpose: Some links rely on surrounding visual context (e.g., “Read More”). They’re okay inside cards, but consider
aria-label/aria-describedbyso the destination is explicit to SRs. - Color contrast: Verify red accents on dark backgrounds meet 4.5:1 (most do; double-check on hover states).
- Typos: Multiple
SEO & sharing (high-impact)
- Misspelling:
<meta name="desciription">→description(breaks your primary snippet!). - Empty OG/Twitter tags:
og:title/description/image/urlandtwitter:*are blank—populate for rich shares. - Canonical: Add
<link rel="canonical" href="https://www.cia.gov/">. - Structured data: Consider a small
OrganizationJSON-LD (logo, sameAs, contact).
Perf notes
- Images: Gatsby images + lazy load is great. Give priority to the above-the-fold hero (or switch its placeholder to dominant color/blur that fades faster).
- Fonts: Self-hosted WOFF2—👍. Consider
font-display: swap(if not already in your@font-face) and preload the critical header font. - Third-party: Minimal. You could add preconnect for any CDNs you hit (if/when you add analytics) to shave RTT.
- CSS size: Big inlined utility sheet is common with Gatsby, but ensure only used utilities are shipped (tree-shaken), and keep critical CSS inlined with the rest deferred.
Security hardening
- Keep the .onion hint (great). Also set strict headers at the edge:
Content-Security-Policy(script/style/img/connect-src etc., allowlist Gatsby inline styles wisely)Strict-Transport-Security: max-age=31536000; includeSubDomains; preloadPermissions-Policy,Referrer-Policy: no-referrer,X-Content-Type-Options: nosniff- Consider SRI on long-lived third-party scripts (if you add any).
Progressive enhancement
- Your noscript fallbacks are solid. One nit: you use both
.no-show(hyphen) and.noShow(camel). Standardize the class naming so CSS/JS don’t drift.
Tiny correctness nits
- Ensure only one meaningful
<h1>per page (you use one in hero; good). - Social link labels are present (👍). If you rebrand “Twitter” to “X”, update the
aria-labelto match. - Verify all
aria-controlsIDs exist and are unique (raa-*looked good in the paste).
Quick links spotted
- Careers:
/careers/ - World Factbook:
/the-world-factbook/ - Stories:
/stories/ - FOIA Reading Room:
/readingroom/ - Report Information:
/report-information - Contact CIA:
/contact-cia
If you want, I can turn this into a short a11y/perf test script (keyboard paths + expected ARIA state changes) you can hand to QA.