This page reports reproducible measurements for the deployable production build and its component development system. Every number comes from generated build output, test results, or metadata — not fabricated values or historical reports. Performance figures are lab measurements of the built static output; they are not production Core Web Vitals or live-network measurements.

Measurement date
August 10, 2026 at 03:26 PM UTC
Source commit
9b3613e
Environment
Node v24.18.0, astro static
Type
Static analysis of build output, HTML inspection, and test-result parsing. Not real-user monitoring.

Quality overview

Routes

25generated HTML pages

Storybook stories

3128 component + 3 foundation

A11y tests

319319 passed · 0 failed · 0 skipped

Route a11y tests

88 passing

Storybook a11y tests

2828 passing

Production JS (static)

1.2 MB330.8 KB gzip · 19 files

Per-route JS (from HTML)

1.2 KBreferenced by each normal page (single shared bundle)

Production CSS

155.7 KB13 stylesheets

Storybook isolated

Yes0 Storybook references in production JS/CSS

Performance

Lighthouse measures the deployable production build (the static output in dist/) by serving it through a temporary local server during the build pipeline. The route labels below are paths on that built site. These are lab measurements of the deployment candidate, not production Core Web Vitals and not live-network performance.

/404.html/

Measured: 8/10/2026, 3:21:30 PM· Device: mobile · Throttling: simulate

Performance

74/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

66/ 100

LCP

1.8 sLargest Contentful Paint

CLS

0.019Cumulative Layout Shift

TBT

1.3 sTotal Blocking Time

FCP

1.7 sFirst Contentful Paint

/about/

Measured: 8/10/2026, 3:21:43 PM· Device: mobile · Throttling: simulate

Performance

98/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

1.7 sLargest Contentful Paint

CLS

0.064Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.7 sFirst Contentful Paint

/blog/

Measured: 8/10/2026, 3:22:30 PM· Device: mobile · Throttling: simulate

Performance

97/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.3 sLargest Contentful Paint

CLS

0.010Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.8 sFirst Contentful Paint

/blog/250mm-trading-card-box/

Measured: 8/10/2026, 3:21:55 PM· Device: mobile · Throttling: simulate

Performance

96/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.6 sLargest Contentful Paint

CLS

0.036Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.5 sFirst Contentful Paint

/blog/better-agent-results-start-with-better-context/

Measured: 8/10/2026, 3:22:07 PM· Device: mobile · Throttling: simulate

Performance

95/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.6 sLargest Contentful Paint

CLS

0.033Cumulative Layout Shift

TBT

Total Blocking Time

FCP

2.1 sFirst Contentful Paint

/blog/good-agent-context-is-carved-not-copied/

Measured: 8/10/2026, 3:22:18 PM· Device: mobile · Throttling: simulate

Performance

93/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.8 sLargest Contentful Paint

CLS

0.025Cumulative Layout Shift

TBT

Total Blocking Time

FCP

2.3 sFirst Contentful Paint

/blog/why-do-i-need-all-this-usb-and-sd-media-holder/

Measured: 8/10/2026, 3:22:42 PM· Device: mobile · Throttling: simulate

Performance

98/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.4 sLargest Contentful Paint

CLS

0.033Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.4 sFirst Contentful Paint

/contact/

Measured: 8/10/2026, 3:22:53 PM· Device: mobile · Throttling: simulate

Performance

99/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

1.7 sLargest Contentful Paint

CLS

0.010Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.7 sFirst Contentful Paint

/

Measured: 8/10/2026, 3:23:04 PM· Device: mobile · Throttling: simulate

Performance

96/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.3 sLargest Contentful Paint

CLS

0.078Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.8 sFirst Contentful Paint

/lab/context/

Measured: 8/10/2026, 3:23:16 PM· Device: mobile · Throttling: simulate

Performance

97/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

63/ 100

LCP

2.0 sLargest Contentful Paint

CLS

0.073Cumulative Layout Shift

TBT

Total Blocking Time

FCP

2.0 sFirst Contentful Paint

/lab/site-inventory/

Measured: 8/10/2026, 3:23:27 PM· Device: mobile · Throttling: simulate

Performance

98/ 100

Accessibility

87/ 100

Best Practices

96/ 100

SEO

54/ 100

LCP

1.8 sLargest Contentful Paint

CLS

0.056Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.8 sFirst Contentful Paint

/lab/youtube-facade-test/

Measured: 8/10/2026, 3:23:39 PM· Device: mobile · Throttling: simulate

Performance

100/ 100

Accessibility

98/ 100

Best Practices

96/ 100

SEO

54/ 100

LCP

1.8 sLargest Contentful Paint

CLS

Cumulative Layout Shift

TBT

Total Blocking Time

FCP

0.9 sFirst Contentful Paint

/portfolio/

Measured: 8/10/2026, 3:24:02 PM· Device: mobile · Throttling: simulate

Performance

93/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.3 sLargest Contentful Paint

CLS

0.098Cumulative Layout Shift

TBT

Total Blocking Time

FCP

2.2 sFirst Contentful Paint

/portfolio/design-system/

Measured: 8/10/2026, 3:23:50 PM· Device: mobile · Throttling: simulate

Performance

99/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

1.5 sLargest Contentful Paint

CLS

0.069Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.5 sFirst Contentful Paint

/portfolio/site-quality/

Measured: 8/10/2026, 3:24:13 PM· Device: mobile · Throttling: simulate

Performance

90/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.7 sLargest Contentful Paint

CLS

0.093Cumulative Layout Shift

TBT

Total Blocking Time

FCP

2.7 sFirst Contentful Paint

/posts/3d-printing/250mm-trading-card-box/

Measured: 8/10/2026, 3:24:26 PM· Device: mobile · Throttling: simulate

Performance

92/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.9 sLargest Contentful Paint

CLS

0.028Cumulative Layout Shift

TBT

Total Blocking Time

FCP

2.4 sFirst Contentful Paint

/posts/3d-printing/why-do-i-need-all-this-usb-and-sd-media-holder/

Measured: 8/10/2026, 3:24:38 PM· Device: mobile · Throttling: simulate

Performance

93/ 100

Accessibility

100/ 100

Best Practices

96/ 100

SEO

100/ 100

LCP

2.9 sLargest Contentful Paint

CLS

0.025Cumulative Layout Shift

TBT

Total Blocking Time

FCP

2.2 sFirst Contentful Paint

/search/

Measured: 8/10/2026, 3:24:49 PM· Device: mobile · Throttling: simulate

Performance

96/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

66/ 100

LCP

2.6 sLargest Contentful Paint

CLS

0.007Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.9 sFirst Contentful Paint

/speaking/

Measured: 8/10/2026, 3:25:01 PM· Device: mobile · Throttling: simulate

Performance

95/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.5 sLargest Contentful Paint

CLS

0.040Cumulative Layout Shift

TBT

Total Blocking Time

FCP

2.0 sFirst Contentful Paint

/tags/

Measured: 8/10/2026, 3:25:58 PM· Device: mobile · Throttling: simulate

Performance

98/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

1.8 sLargest Contentful Paint

CLS

0.020Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.8 sFirst Contentful Paint

/tags/3d-printing/

Measured: 8/10/2026, 3:25:12 PM· Device: mobile · Throttling: simulate

Performance

99/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

100/ 100

LCP

2.2 sLargest Contentful Paint

CLS

0.050Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.1 sFirst Contentful Paint

/tags/ai-agents/

Measured: 8/10/2026, 3:25:35 PM· Device: mobile · Throttling: simulate

Performance

98/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

69/ 100

LCP

2.1 sLargest Contentful Paint

CLS

0.013Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.8 sFirst Contentful Paint

/tags/ai/

Measured: 8/10/2026, 3:25:23 PM· Device: mobile · Throttling: simulate

Performance

98/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

69/ 100

LCP

2.1 sLargest Contentful Paint

CLS

0.013Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.8 sFirst Contentful Paint

/tags/documentation/

Measured: 8/10/2026, 3:25:46 PM· Device: mobile · Throttling: simulate

Performance

99/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

69/ 100

LCP

2.1 sLargest Contentful Paint

CLS

0.010Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.1 sFirst Contentful Paint

/tags/software-development/

Measured: 8/10/2026, 3:26:09 PM· Device: mobile · Throttling: simulate

Performance

97/ 100

Accessibility

100/ 100

Best Practices

100/ 100

SEO

69/ 100

LCP

2.1 sLargest Contentful Paint

CLS

0.075Cumulative Layout Shift

TBT

Total Blocking Time

FCP

1.8 sFirst Contentful Paint

The CI pipeline enforces a Lighthouse performance budget: performance ≥ 95, accessibility ≥ 95, SEO ≥ 100, best-practices ≥ 95. See lighthouserc.js.


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.

CategoryTotal bytesFiles
Astro page scripts744.5 KB9
Pagefind search index and UI430.9 KB6
Partytown analytics offloading94.1 KB4
Total1.2 MB19

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.

RouteReferenced JSTotal bytesInline script bytesFeatures
/<code>js?id=G-70E1BWCFJ3</code>0 B5.8 KBcore
/blog/<code>js?id=G-70E1BWCFJ3</code>0 B5.9 KBcore
/portfolio/<code>js?id=G-70E1BWCFJ3</code>, <code>YouTubeFacade.astro_astro_type_script_index_0_lang.BKBlQNWG.js</code>1.2 KB6.1 KBcore
/portfolio/design-system/<code>js?id=G-70E1BWCFJ3</code>0 B6.2 KBcore
/portfolio/site-quality/<code>js?id=G-70E1BWCFJ3</code>0 B6.2 KBcore
/blog/better-agent-results-start-with-better-context/<code>js?id=G-70E1BWCFJ3</code>, <code>ec.0vx5m.js</code>2.5 KB9.1 KBcore
/search/<code>js?id=G-70E1BWCFJ3</code>0 B6.0 KBcore
/contact/<code>js?id=G-70E1BWCFJ3</code>0 B8.3 KBcore
Full asset details by route

/

AssetBytesCategory
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ30 Bcore

Inline script bytes: 5.8 KB

/blog/

AssetBytesCategory
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ30 Bcore

Inline script bytes: 5.9 KB

/portfolio/

AssetBytesCategory
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ30 Bcore
/_astro/YouTubeFacade.astro_astro_type_script_index_0_lang.BKBlQNWG.js1.2 KBcore

Inline script bytes: 6.1 KB

/portfolio/design-system/

AssetBytesCategory
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ30 Bcore

Inline script bytes: 6.2 KB

/portfolio/site-quality/

AssetBytesCategory
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ30 Bcore

Inline script bytes: 6.2 KB

/blog/better-agent-results-start-with-better-context/

AssetBytesCategory
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ30 Bcore
/_astro/ec.0vx5m.js2.5 KBcore

Inline script bytes: 9.1 KB

/search/

AssetBytesCategory
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ30 Bcore

Inline script bytes: 6.0 KB

/contact/

AssetBytesCategory
https://www.googletagmanager.com/gtag/js?id=G-70E1BWCFJ30 Bcore

Inline script bytes: 8.3 KB

Feature-specific assets

FeatureDeployment bytesRoutes requestingLoading behavior
Pagefind (search)430.9 KBnoneLoaded only on /search/. Not requested by other routes.
Partytown (analytics)94.1 KBnoneScript loader present in HTML head on most pages. Worker scripts load lazily on user interaction.
Turnstile (contact form)ExternalnoneLoaded only on /contact/. Cloudflare external asset.
Storybook lab7.5 MBnoneNot 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.

MetricValue
Total JavaScript7.5 MB
Total JavaScript (gzip)1.9 MB
Files46
Largest Storybook chunks
ChunkSizeCategory
/sb-manager/globals-runtime.js3.1 MBmanager UI
/sb-manager/runtime.js1.2 MBmanager UI
/_astro/iframe-DhapBL6U.js807.3 KBiframe bundle
/_astro/axe-CU0zJHZz.js565.6 KBa11y addon (axe-core)
/_astro/components-Q0HZ7DLQ.js558.1 KBother

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.

CheckResult
Storybook assets isolated to /design-system/lab/
Static scan: Storybook references in production JS/CSS0 found (clean)
Network test: ordinary pages loading Storybook assets0 (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.

ScopeTestsPassedFailedSkipped
All a11y tests31931900
Storybook component stories28280
Site routes880

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 KISS Design System. Stories cover default states, edge cases (long labels, narrow viewports), and fixture-backed composite layouts.

MetricValue
Total stories31
Component stories28
Foundation stories3
Storybook accessibility tests28

See the KISS Design System reference 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.

CommandPurpose
pnpm typecheckAstro and TypeScript type checking
pnpm lintBiome linting and formatting
pnpm buildProduction Astro build
pnpm test:e2ePlaywright route, accessibility, and Storybook tests (produces test-results/test-results.json)
pnpm build:storybookStorybook static build
pnpm verify:storybook-isolationVerify Storybook assets do not leak into production site
pnpm quality:generateGenerate 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 groupTypeSource
staticDeploymentstatic analysisdist/ directory (Astro-only build)
routeMeasurementsstatic analysisGenerated HTML files in dist/
componentLabstatic analysisstorybook-static/ directory
storiesstatic analysis/home/runner/work/astro.ericcarlisle.com/astro.ericcarlisle.com/storybook-static/index.json
accessibilitytest results/home/runner/work/astro.ericcarlisle.com/astro.ericcarlisle.com/test-results/test-results.json
lighthouselab measurementlh-reports/ directory
isolationstatic analysisdist/ directory