Landing Website โ Frontend Checklist & TODO
Based on Front-End Checklist, Front-End Performance Checklist, and Hugo Best Practices.
Priority: ๐ด High ยท ๐ก Medium ยท ๐ข Low
1. HEAD & Meta Tags
- Doctype ๐ด โ HTML5 doctype is present at the top of all pages
- Charset ๐ด โ UTF-8 declared as the first meta tag in
<head> - Viewport ๐ด โ
width=device-width, initial-scale=1is set - Viewport
viewport-fit๐ข โ Addviewport-fit=coverfor notched devices:<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> - Title ๐ด โ Every page has a unique, descriptive
<title>(< 55 characters) - Meta description ๐ด โ Per-page descriptions provided (< 150 characters)
-
keywordsmeta tag ๐ก โ Either populated dynamically from tags/categories or removed entirely (Google ignores it, but an empty tag looks unprofessional) - Canonical URL ๐ด โ
<link rel="canonical">present to avoid duplicate content - Language attribute ๐ด โ
<html lang="...">set correctly for the page language - Alternate hreflang ๐ข โ Hreflang tags present for all translations
-
x-defaulthreflang ๐ก โ<link rel="alternate" hreflang="x-default" href="..." />present for international landing page fallback (Google recommendation) -
twitter:cardmeta tag ๐ก โtwitter:cardtype declared (e.g.,summary_large_image). Required for Twitter/X preview cards - Open Graph tags ๐ก โ
og:type,og:title,og:description,og:image,og:url,og:locale,og:site_namepresent -
og:image:widthandog:image:height๐ข โ Dimensions specified so crawlers render immediately without downloading - CSS before JS ๐ด โ All CSS
<link>tags loaded before any<script>tags in<head>
2. Favicons & Web App Manifest
- Favicon files ๐ก โ All required sizes present (16x16, 32x32, 192x192, 512x512, apple-touch-icon, favicon.ico)
- Web manifest ๐ก โ
site.webmanifestexists and is linked - Manifest
nameandshort_name๐ด โ Both fields populated with the site name (required for PWA install prompts and bookmarking) - Theme color ๐ข โ
<meta name="theme-color">set to match brand
3. HTML Quality
- Semantic HTML5 ๐ด โ Appropriate use of
<header>,<footer>,<section>,<main>,<aside>,<nav>,<article> - 404 error page ๐ด โ Custom 404 page exists with inline CSS (no external stylesheet dependency)
- 5xx error page ๐ก โ Custom 500 error page exists with inline CSS
- No boilerplate/template remnants ๐ด โ All placeholder text, debug strings, and framework boilerplate removed from production templates
- No dead code ๐ข โ Unused template blocks, variables, and commented-out code removed
-
noopener noreferreron external links ๐ด โ Alltarget="_blank"links includerel="noopener noreferrer"to prevent tab nabbing -
<noscript>fallback ๐ก โ A minimal fallback message provided for users with JavaScript disabled - No unused source files ๐ข โ Unused SCSS/JS source files removed from the project
- All strings internationalized ๐ก โ No hardcoded UI strings in templates; all user-facing text pulled from i18n files
- W3C HTML validation ๐ด โ All pages pass W3C validator without errors
- Broken link check ๐ด โ No broken internal or external links (use W3C Link Checker)
- Clean production code ๐ข โ HTML comments and unnecessary whitespace removed in production output
4. CSS
- CSS preprocessor ๐ข โ Using a CSS preprocessor (Sass/SCSS/Less) for maintainability
- Autoprefixer ๐ด โ Vendor prefixes generated automatically via Autoprefixer or PostCSS
- Minification ๐ด โ All CSS minified in production
- Fingerprinting / cache busting ๐ก โ CSS filenames include content hash for cache invalidation
- SRI (Subresource Integrity) ๐ก โ CSS
<link>tags includeintegrityattribute - Single CSS bundle ๐ด โ All CSS concatenated into a single file (or minimal files for HTTP/2)
- CSS Reset / Normalize ๐ด โ A CSS reset, normalize, or reboot is included and up to date
- Unused CSS removed ๐ก โ Unused CSS selectors purged (via PurgeCSS or similar). Full framework imports trimmed to needed components
- Critical CSS ๐ก โ Above-the-fold CSS inlined in
<head>for faster First Contentful Paint (FCP) -
font-displayproperty ๐ก โ Web fonts (including icon fonts) usefont-display: swapto prevent FOIT (Flash of Invisible Text) - No inline CSS in
<body>๐ด โ All styles in external files or<head>(except critical CSS) - Unique IDs ๐ด โ All element IDs are unique per page
- Responsive design ๐ด โ Tested at 320px, 768px, 1024px, 1440px breakpoints
- Print stylesheet ๐ก โ Print-specific styles provided
- CSS validation ๐ก โ CSS passes W3C CSS Validator
- LTR/RTL support ๐ก โ If multilingual, tested for RTL languages
5. JavaScript
- No inline JS in
<body>๐ด โ JavaScript code in external files, not mixed with HTML - Minification ๐ด โ All JS files minified in production
- Fingerprinting / SRI ๐ด โ JS filenames hashed and
integrityattribute present - Non-blocking loading ๐ด โ Scripts loaded with
deferorasyncattribute - Bundled into minimal files ๐ด โ All JS concatenated/bundled to minimize HTTP requests
- No
javascript:void(0)๐ก โ Using properhref="#"withevent.preventDefault()or<button>elements instead - Updated libraries ๐ก โ All JS libraries are up to date with latest stable versions
- Dependency size audit ๐ข โ External libraries are necessary and as lightweight as possible (consider Vanilla JS for simple features)
- ESLint / linting ๐ก โ No errors flagged by a JS linter
- No console.log in production ๐ข โ Debug logging removed from production builds
6. Images
- Image optimization ๐ด โ All images compressed without visible quality loss (target: < 200 KB per image)
- Modern formats ๐ก โ Using WebP (or AVIF) with fallbacks where appropriate
- No duplicate format files ๐ข โ If multiple formats exist for the same image, implement
<picture>with fallback or remove unused formats - SVG optimization ๐ก โ Large SVG files optimized with SVGO
-
loading="lazy"๐ก โ Below-the-fold images use native lazy loading - Descriptive
alttext ๐ด โ All<img>tags have meaningful, descriptive alt text (not just the brand name) -
widthandheightattributes ๐ก โ Dimensions specified on images to prevent Cumulative Layout Shift (CLS) - Responsive images ๐ก โ Using
srcsetand<picture>to serve appropriately sized images per viewport - Hugo image processing ๐ก โ Using Hugo’s built-in
.Resize/.Fit/.Fillfor serving optimally sized images (Hugo-specific) - No oversized images in content ๐ด โ Blog/content images are appropriately sized (not raw camera/design exports)
7. Video & Media
- Video hosting strategy ๐ด โ Large videos hosted on CDN or streaming platform (YouTube/Vimeo) rather than self-hosted in
static/ - Video compression ๐ก โ Self-hosted videos compressed with modern codecs (H.265/VP9), with WebM fallback
-
preloadoptimization ๐ก โ Videos not auto-loaded usepreload="none"orpreload="metadata"to save bandwidth - Video file size ๐ด โ Self-hosted video files kept under 5 MB each where possible
8. Performance
- Resource hints ๐ก โ
<link rel="preconnect">and/or<link rel="dns-prefetch">added for critical external domains (analytics, CDN, API) - Page weight < 1.5 MB ๐ด โ Initial page load (HTML + CSS + JS + images) kept under 1.5 MB, ideally under 500 KB
- Page load time < 3 seconds ๐ด โ Full page load under 3 seconds on 3G connection
- TTFB < 1.3 seconds ๐ด โ Time To First Byte under 1.3 seconds
- HTML minification ๐ก โ Hugo minify config enabled:
1 2 3minify: disableXML: true minifyOutput: true - Gzip/Brotli compression ๐ด โ Server delivers compressed responses (verify with
curl -H "Accept-Encoding: gzip" -I) - HTTP cache headers ๐ก โ Static assets have appropriate
Cache-Controlheaders - Google PageSpeed score โฅ 90 ๐ด โ PageSpeed Insights score โฅ 90 on both mobile and desktop
- Core Web Vitals ๐ด โ LCP, INP, and CLS metrics within “Good” thresholds
- Cookie size ๐ก โ Each cookie under 4096 bytes; domain has fewer than 20 cookies
- Minimal HTTP requests ๐ด โ Every requested file is essential; no unnecessary requests
- CDN ๐ก โ Static assets served from a CDN for global performance
- Same-protocol assets ๐ด โ All assets served over HTTPS; no mixed content
9. SEO
- Sitemap ๐ด โ
sitemap.xmlgenerated and submitted to Google Search Console - robots.txt ๐ด โ
robots.txtpresent and not blocking important pages - robots.txt environment check ๐ก โ Verify that production environment variables are set so robots.txt allows crawling (not
Disallow: /) -
enableRobotsTXTin Hugo config ๐ก โ Enabled inconfig.yamlso Hugo uses the custom robots.txt template - Structured data (JSON-LD) ๐ด โ Schema.org markup present and validated with Rich Results Test
- Schema.org accuracy ๐ก โ Author names, sameAs URLs, and image references in JSON-LD are correct (not empty or placeholder values)
- Sitemap configuration ๐ก โ Hugo sitemap config set with
changefreqandpriority:1 2 3sitemap: changefreq: weekly priority: 0.5 - Heading hierarchy ๐ก โ Proper heading order (single
<h1>per page,<h2>โ<h3>โ etc.) without skipping levels - HTML sitemap ๐ก โ An HTML sitemap page is accessible via the footer
- Google Analytics / Search Console ๐ข โ Analytics installed and Search Console configured
10. Accessibility (a11y)
- Skip navigation link ๐ด โ “Skip to main content” link at the top of the page:
1<a href="#content" class="visually-hidden-focusable">Skip to main content</a> - Focus styles ๐ด โ
:focusoutlines visible on all interactive elements; not suppressed by custom CSS - Color contrast ๐ก โ All text/background combinations pass WCAG AA contrast ratio (4.5:1 for normal text, 3:1 for large text)
- ARIA labels on icon-only links ๐ก โ Links/buttons using only icons have
aria-labelfor screen readers - Keyboard navigation ๐ด โ All interactive elements (nav, modals, forms, buttons) reachable and operable with keyboard only
- Screen reader testing ๐ก โ Pages tested with at least one screen reader (VoiceOver, NVDA, ChromeVox)
- Form labels ๐ด โ All form inputs have associated
<label>elements oraria-label - Heading structure ๐ด โ Headings used in proper order for document outline (not for visual styling)
- WAVE / axe audit ๐ก โ Automated accessibility testing passed with WAVE or axe
- Progressive enhancement ๐ก โ Core functionality (navigation, content) works without JavaScript
11. Security
- HTTPS everywhere ๐ด โ All pages and assets served over HTTPS
- SRI (Subresource Integrity) ๐ก โ External/CDN CSS and JS include
integrityandcrossoriginattributes -
noopener noreferrer๐ด โ Alltarget="_blank"links includerel="noopener noreferrer" - Content Security Policy (CSP) ๐ก โ CSP headers configured to restrict resource loading sources
- HSTS header ๐ก โ
Strict-Transport-Securityheader set withmax-ageโฅ 31536000 -
X-Content-Type-Options๐ข โnosniffheader set to prevent MIME-type sniffing -
X-Frame-Options๐ข โDENYorSAMEORIGINheader set to prevent clickjacking - Security headers audit ๐ก โ Scan with securityheaders.com and Mozilla Observatory
12. Hugo-Specific Best Practices
- Content archetypes ๐ก โ Archetypes defined for each content type (blog, page, etc.) with pre-filled front matter:
1 2 3 4 5 6 7 8 9 10# archetypes/blog.md --- title: "{{ replace .Name "-" " " | title }}" description: "" date: {{ .Date }} draft: true archived: false toc: true tags: [] --- -
canonifyURLs๐ก โ Consider enablingcanonifyURLs: truein config for consistent URL handling - External link render hook ๐ก โ Custom
render-link.htmlinlayouts/_default/_markup/to addtarget="_blank" rel="noopener noreferrer"to external links in markdown content - Content for all configured languages ๐ก โ All languages in config have corresponding content directories, or unused languages are disabled
-
.gitignorecoverage ๐ข โ Build artifacts ignored:public/,resources/,node_modules/, generated JS/CSS inassets/ - Content organization ๐ข โ Images stored alongside their markdown files (page bundles), not in a separate global folder
- Hugo Pipes for assets ๐ก โ Using
resources.Minify,resources.Fingerprint, andresources.Concatfor CSS/JS processing - Conditional asset loading ๐ข โ Page-specific scripts and styles wrapped in Hugo conditionals to avoid loading on every page
13. Build & CI/CD
- Pinned CI image ๐ด โ CI container uses a specific version (e.g.,
node:20-alpine), notlatest - Hugo binary available in CI ๐ก โ Hugo is correctly installed/available in the CI build environment
- Production environment variables ๐ก โ
HUGO_ENV=production(or equivalent) set in CI so that:robots.txtallows crawling- Analytics scripts are activated
- Minification/optimization is enabled
- Build size monitoring ๐ข โ Bundle size tracked and checked on each build (consider size-limit or similar)
- Build reproducibility ๐ก โ
package-lock.jsoncommitted andnpm ciused instead ofnpm installin CI
14. Fonts & Typography
- WOFF2 format ๐ด โ Web fonts served in WOFF2 format (with WOFF fallback for older browsers)
- Webfont total size < 300 KB ๐ก โ All font files (including icon fonts) combined under 300 KB
-
font-display: swap๐ก โ All@font-facedeclarations includefont-display: swap - Preconnect for font CDN ๐ก โ If using Google Fonts or similar:
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - System font stack considered ๐ข โ Evaluated whether a system font stack is sufficient vs. custom web fonts (better performance)
- Icon font audit ๐ข โ If using an icon font, verify full font is needed; consider inline SVG for a small number of icons
15. Pre-Launch Summary Checklist
| # | Item | Status |
|---|---|---|
| 1 | Web manifest has valid name/short_name | โฌ |
| 2 | No boilerplate/placeholder text in templates | โฌ |
| 3 | rel="noopener noreferrer" on all external links | โฌ |
| 4 | All images optimized (< 200 KB each) | โฌ |
| 5 | Videos compressed or externally hosted | โฌ |
| 6 | Skip navigation link present | โฌ |
| 7 | CI uses pinned image version | โฌ |
| 8 | Production env variables set in CI | โฌ |
| 9 | Core Web Vitals in “Good” range | โฌ |
| 10 | robots.txt allows crawling in production | โฌ |
| 11 | PageSpeed score โฅ 90 (mobile + desktop) | โฌ |
| 12 | Accessibility audit passed (WAVE/axe) | โฌ |
| 13 | Structured data validated (Schema.org) | โฌ |
| 14 | Security headers audit passed | โฌ |
| 15 | All forms have labels and proper input types | โฌ |