This page reports reproducible measurements for the live site and its component development system. Every number comes from generated build output, test results, or metadata — not fabricated values or historical reports.
Quality overview
Routes
22generated HTML pagesStorybook stories
3027 component + 3 foundationA11y tests
5555 passed · 0 failed · 0 skippedRoute a11y tests
77 passingStorybook a11y tests
2727 passingProduction JS (static)
8.0 MB2.0 MB gzip · 53 filesPer-route JS (from HTML)
0 Breferenced by each normal page (single shared bundle)Production CSS
177.2 KB12 stylesheetsStorybook isolated
Yes0 Storybook references in production JS/CSSPerformance
No Lighthouse report is currently available. Run pnpm lighthouse:all to generate one, then pnpm quality:generate to include it here.
Production bundle
Bundle figures are from the Astro-only production build in dist/. Storybook assets under /design-system/lab/ are measured separately and are never loaded by ordinary site pages.
JavaScript files present in the deployment
These are all JavaScript files present in dist/ (source maps excluded). Not every file is loaded by every route. See the route-measurement tables below for per-page behavior.
| Category | Total bytes | Files |
|---|---|---|
| Astro page scripts | 7.5 MB | 43 |
| Pagefind search index and UI | 430.9 KB | 6 |
| Partytown analytics offloading | 94.1 KB | 4 |
| Total | 8.0 MB | 53 |
All JavaScript files present in the Astro-only dist/ directory (source maps excluded). Not all files are loaded by every route. See routeMeasurements below for per-page loading behavior.
Route-level JavaScript references
Each row shows which JavaScript assets a route’s generated HTML references, their total size, and estimated inline script bytes.
| Route | Referenced JS | Total bytes | Inline script bytes | Features |
|---|---|---|---|---|
/ | <code>js?id=G-70E1BWCFJ3</code> | 0 B | 5.8 KB | core |
/blog/ | <code>js?id=G-70E1BWCFJ3</code> | 0 B | 5.9 KB | core |
/portfolio/ | <code>js?id=G-70E1BWCFJ3</code> | 0 B | 6.0 KB | core |
/portfolio/design-system/ | <code>js?id=G-70E1BWCFJ3</code> | 0 B | 6.2 KB | core |
/portfolio/site-quality/ | <code>js?id=G-70E1BWCFJ3</code> | 0 B | 6.2 KB | core |
/blog/good-agent-context-is-carved-not-copied/ | none | 0 B | 0 B | core |
/search/ | <code>js?id=G-70E1BWCFJ3</code> | 0 B | 6.0 KB | core |
/contact/ | <code>js?id=G-70E1BWCFJ3</code> | 0 B | 8.3 KB | core |
Full asset details by route
/
| Asset | Bytes | Category |
|---|---|---|
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ3 | 0 B | core |
Inline script bytes: 5.8 KB
/blog/
| Asset | Bytes | Category |
|---|---|---|
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ3 | 0 B | core |
Inline script bytes: 5.9 KB
/portfolio/
| Asset | Bytes | Category |
|---|---|---|
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ3 | 0 B | core |
Inline script bytes: 6.0 KB
/portfolio/design-system/
| Asset | Bytes | Category |
|---|---|---|
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ3 | 0 B | core |
Inline script bytes: 6.2 KB
/portfolio/site-quality/
| Asset | Bytes | Category |
|---|---|---|
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ3 | 0 B | core |
Inline script bytes: 6.2 KB
/blog/good-agent-context-is-carved-not-copied/
No external JavaScript referenced.
Inline script bytes: 0 B
/search/
| Asset | Bytes | Category |
|---|---|---|
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ3 | 0 B | core |
Inline script bytes: 6.0 KB
/contact/
| Asset | Bytes | Category |
|---|---|---|
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ3 | 0 B | core |
Inline script bytes: 8.3 KB
Feature-specific assets
| Feature | Deployment bytes | Routes requesting | Loading behavior |
|---|---|---|---|
| Pagefind (search) | 430.9 KB | none | Loaded only on /search/. Not requested by other routes. |
| Partytown (analytics) | 94.1 KB | none | Script loader present in HTML head on most pages. Worker scripts load lazily on user interaction. |
| Turnstile (contact form) | External | none | Loaded only on /contact/. Cloudflare external asset. |
| Storybook lab | 7.5 MB | none | Not requested by any normal page. Only available at /design-system/lab/. |
Component lab (Storybook)
The Storybook application at /design-system/lab/ is a separate application. Its JavaScript is not loaded by ordinary blog pages. The isolation verification below confirms this.
| Metric | Value |
|---|---|
| Total JavaScript | 7.5 MB |
| Total JavaScript (gzip) | 1.9 MB |
| Files | 44 |
Largest Storybook chunks
| Chunk | Size | Category |
|---|---|---|
/sb-manager/globals-runtime.js | 3.1 MB | manager UI |
/sb-manager/runtime.js | 1.2 MB | manager UI |
/_astro/iframe-DeYqb7sa.js | 806.8 KB | iframe bundle |
/_astro/components-CrZM8Ux2.js | 603.9 KB | other |
/_astro/axe-D4o7XrdK.js | 565.9 KB | a11y addon (axe-core) |
Storybook isolation
Storybook is built as a separate static application and copied intodist/design-system/lab/ during deployment. It is not part of the Astro build graph and is not imported by any production component.
| Check | Result |
|---|---|
Storybook assets isolated to /design-system/lab/ | ✅ |
| Static scan: Storybook references in production JS/CSS | 0 found (clean) |
| Network test: ordinary pages loading Storybook assets | 0 (verified via Playwright) |
static scan of JS/CSS files excluding dist/design-system/lab/ and confirmed by Playwright network-interception tests in tests/storybook-isolation.spec.ts.
The Storybook bundle is approximately 7.5 MB(uncompressed). This is the weight of a design-system development tool, not the blog. It is served only to users who explicitly visit/design-system/lab/.
Accessibility verification
Automated accessibility checks run against every Storybook component story and every primary site route. The tests use axe-core through Playwright. Results come from the last pnpm test:e2e run.
| Scope | Tests | Passed | Failed | Skipped |
|---|---|---|---|---|
| All a11y tests | 55 | 55 | 0 | 0 |
| Storybook component stories | 27 | 27 | 0 | — |
| Site routes | 7 | 7 | 0 | — |
What remains manual
Automated checks only. Keyboard flow, screen-reader behavior, content clarity, zoom/reflow, motion behavior, and visual focus remain manual review.
Component system (Storybook)
The component lab at /design-system/lab/documents every reusable Astro component in the design system. Stories cover default states, edge cases (long labels, narrow viewports), and fixture-backed composite layouts.
| Metric | Value |
|---|---|
| Total stories | 30 |
| Component stories | 27 |
| Foundation stories | 3 |
| Storybook accessibility tests | 27 |
See Design System Companion for component documentation, design tokens, and usage guidelines.
Build and validation
The following commands protect the site. Most run in CI on every push to main.
| Command | Purpose |
|---|---|
pnpm typecheck | Astro and TypeScript type checking |
pnpm lint | Biome linting and formatting |
pnpm build | Production Astro build |
pnpm test:e2e | Playwright route, accessibility, and Storybook tests (produces test-results/test-results.json) |
pnpm build:storybook | Storybook static build |
pnpm verify:storybook-isolation | Verify Storybook assets do not leak into production site |
pnpm quality:generate | Generate site-quality.json from current build output and test results |
GitHub Actions on push to main. See .github/workflows/astro.yml.
Measurement limitations
- Lighthouse is a lab measurement. Results vary by environment, device, and network conditions.
- Automated accessibility tools detect only a subset of WCAG criteria. They do not replace manual review.
- Storybook accessibility tests check isolated components, not complete user journeys or page layouts.
- A passing build pipeline does not measure usability, content quality, or design consistency.
- Production Core Web Vitals require real-user monitoring (RUM) data, which this site does not currently collect.
- Static file sizes are raw bytes from the build output. Actual transfer size depends on hosting compression, cache state, and HTTP version.
- Browser-measured transfer sizes require running Playwright network-capture tests against a local preview.
- Storybook bundle weight is measured separately and is not loaded by ordinary blog pages.
- Route-level JavaScript is determined by inspecting generated HTML for <script> references. Dynamic or lazy-loaded scripts are not captured.
- Pagefind assets are present in the deployment but only requested by /search/.
- Partytown worker scripts are present in the deployment but loaded lazily by the Partytown library.
- Inline script bytes are estimated from HTML content. They exclude server-rendered JSON-LD and inline styles.
Methodology
| Measurement group | Type | Source |
|---|---|---|
staticDeployment | static analysis | dist/ directory (Astro-only build) |
routeMeasurements | static analysis | Generated HTML files in dist/ |
componentLab | static analysis | storybook-static/ directory |
stories | static analysis | /home/runner/work/astro.ericcarlisle.com/astro.ericcarlisle.com/storybook-static/index.json |
accessibility | test results | /home/runner/work/astro.ericcarlisle.com/astro.ericcarlisle.com/test-results/test-results.json |
lighthouse | lab measurement | lh-reports/ directory |
isolation | static analysis | dist/ directory |