{"id":353,"slug":"2026-performance-budget-smb-site","title":"Reference: 2026 performance budget — SMB marketing site (Candid default targets)","kind":"reference","scope":"business","status":"current","audiences":["claude-code","dev","candid-team"],"topics":["core-web-vitals","agency-methodology"],"reference_body":"**For a typical SMB marketing site (5-25 pages, contact-form lead-gen, light blog) targeting CrUX p75 \"Good\" on mid-range Android over 4G:**\n\n| Budget Category | Target | Rationale |\n|---|---|---|\n| Total uncompressed page weight (HTML+CSS+JS+initial images) | **≤ 1.0 MB** | Median mobile page is 2.56 MB ([[web-almanac-2025-mobile-page-weight-2-56mb]]); cutting in half is the moat |\n| JavaScript (compressed, initial bundle) | ≤ 150 KB | Per-script 100 KB ceiling (Chrome Aurora) |\n| JavaScript (uncompressed, total) | ≤ 500 KB | Forces island/partial-hydration decisions |\n| CSS (compressed) | ≤ 50 KB | Critical CSS inlined |\n| Above-the-fold images (combined, AVIF/WebP) | ≤ 250 KB | Hero ≤ 150 KB |\n| Web fonts (total) | ≤ 100 KB; ≤ 2 weights | Variable fonts where possible; Latin subset |\n| Third-party requests | ≤ 5 | GTM + GA + 1 chat/pixel; nothing else without ROI math |\n| Third-party bytes (combined) | ≤ 150 KB compressed | Includes GTM fired tags |\n| Total HTTP requests | ≤ 35 on first load | Under HTTP/2 / HTTP/3 multiplexing |\n| TTFB (p75) | **≤ 200 ms** | Requires edge/CDN/static-first hosting |\n| **LCP (p75 field)** | **≤ 2.0 s** | Internal target 20% under Google's 2.5s |\n| **INP (p75 field)** | **≤ 150 ms** | 25% under Google's 200ms |\n| **CLS (p75 field)** | **≤ 0.05** | Half of Google's 0.10 |\n\n**Governance:** Budget enforced in CI via Lighthouse CI or DebugBear GitHub integration. **Build fails if any budget exceeds threshold.** Quarterly third-party-script audit. One-script-in, one-out rule. See [[rule-enforce-performance-budgets-in-ci]].","rationale_body":null,"metadata":null,"links":{"outgoing":[{"slug":"web-almanac-2025-mobile-page-weight-2-56mb","title":"Web Almanac 2025: median mobile page weight crossed 2,559 KB in July 2025 (+7.8% YoY)","kind":"reference","scope":"business","link_type":"depends-on"},{"slug":"cwv-thresholds-2026-confirmed-unchanged","title":"2026 CWV thresholds (confirmed unchanged): LCP ≤ 2.5s, INP ≤ 200ms, CLS ≤ 0.1 at p75 field data","kind":"reference","scope":"business","link_type":"depends-on"},{"slug":"platform-cwv-pass-rates-june-2025","title":"June 2025 platform CWV pass rates (SEJ): Duda 83.63%, Shopify 75.22%, Wix 70.76%, Squarespace 67.66%, Drupal 59.07%, WordPress 43.44%","kind":"reference","scope":"business","link_type":"depends-on"}],"incoming":[{"slug":"rule-enforce-performance-budgets-in-ci","title":"RULE: Performance budgets enforced in CI. Build fails on budget violation. Documented budgets without CI enforcement do not work.","kind":"rule","scope":"business","link_type":"depends-on"},{"slug":"research-brief-page-speed-moat","title":"Research brief: Page Speed as a Moat — why CWV separates the agencies from the freelancers (piece 9 of 15)","kind":"reference","scope":"business","link_type":"relates-to"},{"slug":"anubiz-elementor-500kb-2000-dom-elements","title":"Anubiz Host: Elementor adds 500KB+ of CSS/JS to every page; simple pages can have 2000+ DOM elements","kind":"reference","scope":"business","link_type":"relates-to"},{"slug":"speculation-rules-moderate-eagerness-default","title":"Speculation Rules with eagerness:\"moderate\" is the 2026 default for instant navigation; ~82% LCP improvement in CoreDash field data","kind":"reference","scope":"business","link_type":"relates-to"},{"slug":"inp-150ms-target-not-200ms-floor","title":"Candid build standard: INP ≤ 150ms target (200ms is the failing floor); LCP ≤ 2.0s; CLS ≤ 0.05","kind":"rule","scope":"business","link_type":"relates-to"}]},"created_at":"2026-05-22T20:03:33.388Z","updated_at":"2026-05-22T20:03:33.388Z"}