Here’s a tight, dev-oriented audit of the HTML you shared (Drupal 11 + USWDS). I’ve prioritized the biggest wins first and included drop-in snippets.
Top 12 fixes (highest impact)
- Hero / carousel LCP
- First carousel image is
loading="lazy". That delays your Largest Contentful Paint. - Fix: only the first slide’s image should be non-lazy + high priority; all others stay lazy.
<!-- First slide --> <img src="/path/slide-1.jpg" alt="..." width="1300" height="731" fetchpriority="high" decoding="async"> <!-- Other slides --> <img src="/path/slide-2.jpg" alt="..." width="1300" height="731" loading="lazy" decoding="async">
- Google CSE included twice
- The CSE script is printed in both the header and the main nav.
- Fix: include
https://cse.google.com/cse.js?cx=ffc4c79e29d5b3a8conce and reuse the searchbox containers.
- Social share uses
/node/16104
- Share links point to the raw node path, not the canonical homepage.
- Fix: swap node URLs for
https://www.cisa.gov/(or the clean alias).<!-- Example: Facebook --> https://www.facebook.com/sharer/sharer.php?u=https://www.cisa.gov/&title=CISA
- Add missing social cards
- You have
prefix="og:"but no Open Graph/Twitter card tags.<meta property="og:site_name" content="CISA"> <meta property="og:type" content="website"> <meta property="og:url" content="https://www.cisa.gov/"> <meta property="og:title" content="Cybersecurity & Infrastructure Security Agency (CISA)"> <meta property="og:description" content="America’s Cyber Defense Agency."> <meta property="og:image" content="https://www.cisa.gov/path/to/share-image.jpg"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:site" content="@CISAgov">
- Title polish
- Current:
Home Page | CISA. Prefer a shorter, brand-first title.<title>Cybersecurity & Infrastructure Security Agency (CISA)</title>
- Fonts (privacy/perf)
- Loading Google Fonts (
fonts.googleapis.com) on a .gov site adds cross-origin requests and privacy concerns. - Fix: self-host Montserrat/Public Sans or use USWDS’ system fonts; if keeping Google, add preconnects:
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
- Preconnect critical third-parties
- Speed up early connections for services you always hit:
<link rel="preconnect" href="https://www.googletagmanager.com"> <link rel="preconnect" href="https://dap.digitalgov.gov"> <link rel="preconnect" href="https://siteimproveanalytics.com"> <link rel="preconnect" href="https://cse.google.com">
- Reduced motion & controls for carousel
- Ensure accessible motion defaults and explicit controls.
@media (prefers-reduced-motion: reduce) { .c-homepage-slider * { animation: none !important; transition: none !important; } }Also add a visible Pause/Play button, and give “Previous/Next” buttonsaria-labellike “Previous slide” / “Next slide”.
- Duplicate global buttons block
- The same “Free Cyber Services / Secure by Design / …” block appears in header and nav. If that’s intentional for responsive layouts, mark one as
aria-hidden="true"when off-screen to avoid duplicate focus/verbosity for screen readers.
- SVG alt texts & brand logos
- Header logo alt is a long sentence. For brand marks, keep alts short (“CISA logo”) and move taglines into visible text. Decorative visuals should be
alt="".
- Inline
<center>& minor HTML hygiene
- Replace
<center>with utility classes (it appears in the mobile tagline block). Avoid deprecated tags.
- Security headers / CSP (report-only to start)
- Lock down third-party execution and start collecting reports.
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.googletagmanager.com https://dap.digitalgov.gov https://siteimproveanalytics.com https://cse.google.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; frame-src https://www.googletagmanager.com https://www.dhs.gov https://cse.google.com; connect-src 'self' https:; report-uri https://YOUR-collector.example/csp;
Accessibility & UX quick wins
- Carousel labelling: The slider uses
aria-roledescription="carousel"with per-slidearia-labelledby(good). Ensure the region has a descriptive label (e.g.,aria-label="Featured alerts and guidance"). - Keyboard: confirm left/right arrows and Home/End behaviors work; ensure focus isn’t trapped when the slider updates.
- External links: add
rel="noopener noreferrer"to social/footer externals (some have it, some don’t). - Color contrast: verify button variants (teal/green/red on dark) meet WCAG contrast (4.5:1 for text).
Performance quick wins
- Images: add
decoding="async"to all non-LCP images; usesizeson cards/teasers so the browser picks appropriate sources. - Hero preload (optional): if the first slide image isn’t very cache-hot, consider
<link rel="preload" as="image" href="/sites/default/files/.../slide-1.jpg" imagesrcset="/... 1300w, /... 700w" imagesizes="(min-width: 64rem) 1300px, 100vw"> - JS bundles: ensure
homepage-slider.es6.jsonly initializes once (no double binds), and that the slider code defers until after first paint.
Structured data (Organization)
Add an Organization schema to help search engines and assistants:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "GovernmentOrganization",
"name": "Cybersecurity & Infrastructure Security Agency",
"url": "https://www.cisa.gov/",
"logo": "https://www.cisa.gov/sites/default/files/images/SVG/header_logo_tagline_update.svg",
"sameAs": [
"https://www.facebook.com/CISA",
"https://x.com/CISAgov",
"https://www.linkedin.com/company/cybersecurity-and-infrastructure-security-agency",
"https://www.youtube.com/@cisagov",
"https://www.instagram.com/cisagov"
],
"parentOrganization": {
"@type": "GovernmentOrganization",
"name": "U.S. Department of Homeland Security",
"url": "https://www.dhs.gov/"
}
}
</script>
Small backlog (ready to ticket)
- Make first carousel image LCP: non-lazy +
fetchpriority="high". - Load Google CSE script once; reuse markup in both search boxes.
- Switch share links to
https://www.cisa.gov/(not/node/16104). - Add OG/Twitter tags and Organization JSON-LD.
- Update
<title>to “Cybersecurity & Infrastructure Security Agency (CISA)”. - Self-host fonts or add
preconnectto Google Fonts endpoints. - Add
prefers-reduced-motionrules + a Pause/Play control to the carousel. - Mark duplicated “global buttons” block
aria-hiddenwhen not visible. - Shorten logo alt; use
alt=""for purely decorative images. - Remove
<center>; replace with CSS utility classes. - Add
rel="noopener noreferrer"to all external anchors. - Pilot a CSP (Report-Only) policy; iterate on violations.
If you’d like, I can convert these into Jira tickets with acceptance criteria or provide a Drupal hook_preprocess_html() snippet to inject the SEO tags and JSON-LD cleanly.