Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
google-labs-code avatar

Stitch::Extract Static Html

  • 5k installs
  • 7.8k repo stars
  • Updated July 21, 2026
  • google-labs-code/stitch-skills

Convert a running web app into a single self-contained HTML file with inlined CSS and base64 images.

About

This skill extracts fully rendered static HTML from any locally running web application by inlining all CSS stylesheets and converting images to base64 data URIs. It offers two strategies: Strategy A uses Puppeteer to snapshot the DOM with computed styles (recommended, zero setup), while Strategy B uses a browser subagent for pages requiring interaction before capture. The workflow involves starting the local dev server, confirming it renders correctly, then running the snapshot script with configurable viewport, wait times, and optional class/styling overrides. Useful for capturing specific UI states, creating shareable HTML versions, or preparing assets for Stitch integration without maintaining a live server. Puppeteer-based snapshot captures fully computed styles and inlines all CSS - no MockPage needed Automatically converts images and srcset entries to base64; removes broken URLs gracefully Framework-agnostic

  • Puppeteer-based snapshot captures fully computed styles and inlines all CSS - no MockPage needed
  • Automatically converts images and srcset entries to base64; removes broken URLs gracefully
  • Framework-agnostic works with React, Vue, Next.js, Svelte, Storybook with framework-specific timing tweaks
  • Browser subagent option for interactive pages requiring clicks, form fills, or navigation before capture
  • Configurable via flags: viewport size, wait times, dark mode class, fixed element removal, full-height capture

Stitch::Extract Static Html by the numbers

  • 4,981 all-time installs (skills.sh)
  • +354 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Ranked #98 of 2,277 Frontend Development skills by installs in the Skillselion catalog
  • Security screen: MEDIUM risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
At a glance

stitch::extract-static-html capabilities & compatibility

Capabilities
inline all link stylesheets to style blocks · convert img src and srcset to base64 data uris · remove script tags and dev overlays · resolve relative css url() paths before inlining · capture dark mode and custom html classes · remove fixed/sticky elements like banners
Use cases
ui design · web design · documentation
Runs
Runs locally
From the docs

What stitch::extract-static-html says it does

Extract self-contained static HTML from a built web application or React components by inlining CSS and images.
skill description
npx skills add https://github.com/google-labs-code/stitch-skills --skill stitchextract-static-html

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs5k
repo stars7.8k
Security audit2 / 3 scanners passed
Last updatedJuly 21, 2026
Repositorygoogle-labs-code/stitch-skills

What it does

Convert running web applications or React components into self-contained static HTML files with inlined CSS and base64 images for sharing or Stitch upload.

Who is it for?

Developers capturing UI states, preparing shareable HTML snapshots, exporting React component layouts, archiving page versions.

Skip if: Pages requiring continuous server interaction, complex client-side state management, authenticated-only content without bypass.

When should I use this skill?

User asks to save HTML, export a page, prepare Stitch assets, or capture a specific UI state from a running app.

What you get

A portable HTML file with no external dependencies, ready for sharing or Stitch integration.

  • Self-contained .html file with inlined stylesheets and base64 images
  • Optional: multiple HTML files for different routes or UI states

By the numbers

  • Two extraction strategies: Puppeteer (recommended, highest fidelity) and Browser Subagent (interactive)
  • Supports 6+ frameworks: React, Vue, Next.js, Nuxt, Svelte, SvelteKit, Storybook

Files

SKILL.mdMarkdownGitHub ↗

Extract Static HTML

Extract a self-contained static HTML file from any web application.

Which Strategy to Use

You MUST ask the user to choose which strategy to use before proceeding. Present the options clearly, recommend Strategy A as the preferred default, and provide a brief pros/cons summary for each option to help them make an informed decision.

Strategy A (Puppeteer)Strategy B (Browser Subagent)
WhenApp runs locally, no auth wallNeed to interact with page first (click, fill forms)
FidelityHighest — computed styles resolvedHigh — rendered DOM
SetupZero — no mock neededZero — no mock needed
FrameworkAnyAny
OutputWrites to file — no size limitMay truncate in agent context
[!WARNING]
Checkpoint — User Confirmation Required.
You MUST ask the user which strategy they prefer before proceeding.
Present the comparison table above, recommend Strategy A as the default, and
wait for explicit approval. Do NOT make the decision yourself or proceed
until the user confirms.

***

Strategy A: Puppeteer Snapshot (Recommended)

Launches headless Chrome, captures the fully rendered DOM, and produces a self-contained HTML file with all CSS inlined and images as base64. Works with any framework — no MockPage.jsx needed.

Prerequisites

  • App running locally (e.g., npm run dev)
  • Node.js with puppeteer available (check: node -e "require('puppeteer')")

Workflow

1. Start the App and note the port.

[!WARNING]
Checkpoint — User Confirmation Required.
After starting the local server, you MUST pause and ask the user for
confirmation before running the snapshot script or launching a browser
subagent. Report the URL and port to the user so they can verify the app
is running and rendering correctly. Do NOT proceed to the snapshot
step until the user confirms.

2. Run the Snapshot Script:

    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173 \
      --output .stitch/home.html \
      --wait 2000

3. Multiple pages — run once per route:

    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173 --output .stitch/home.html --wait 2000
    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173/pricing --output .stitch/pricing.html --wait 2000
    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173/dashboard --output .stitch/dashboard.html --wait 2000 --html-class dark

Script Flags

FlagDefaultDescription
--url(required)URL to capture
--output(required)Output file path
--wait1000Extra wait (ms) after network idle. Increase for lazy-loading apps.
--viewport1280x800Viewport size as WIDTHxHEIGHT
--html-classClass(es) for <html> element (e.g., dark)
--remove-fixedfalseRemove fixed/sticky elements (cookie banners, chat widgets)
--full-heightfalseResize viewport to full scroll height
--titleOverride page title

What It Does Automatically

  • Inlines all <link rel="stylesheet"><style> blocks
  • Converts <img> src and `srcset` → base64 data URIs (skips fonts)
  • Inlines <source srcset> URLs as base64
  • Removes failed/dead srcset entries so the browser falls back to the inlined src
  • Removes <script> tags, Vite overlay, Next.js dev indicators
  • Resolves relative CSS url() paths before inlining

Framework Notes

FrameworkNotes
React + ViteWorks out of the box. --wait 1000.
Next.js--wait 3000 for SSR hydration. URL: http://localhost:3000. <img srcset> from /_next/image is auto-inlined as base64.
Vue / NuxtWorks out of the box.
Svelte / SvelteKitWorks out of the box.
StorybookUse story URL: --url http://localhost:6006/?path=/story/...
SSR (Webpack)May need longer --wait.

Troubleshooting

IssueSolution
Images missingIncrease --wait
Images show as broken after server stopsVerify srcset was inlined — check log for "Inlined N images". If srcset URLs failed, they are auto-removed so src (inlined) is used.
Next.js /_next/image not inlinedEnsure the dev server is running when snapshot runs — the script fetches optimized images from the running server.
Dark mode not applied--html-class dark
Cookie banner in output--remove-fixed
Page requires loginUse the Static Fallback (appendix below)
Cannot find module 'puppeteer'npm install -g puppeteer

***

Strategy B: Browser Subagent Capture

Use when you need to interact with the page (click buttons, fill forms, navigate tabs) before capturing. The browser subagent gives you full control but output may truncate for large pages.

Workflow

1. Start the App locally. 2. Navigate using a browser subagent. 3. Interact as needed (click, scroll, fill forms). 4. Extract DOM: document.documentElement.outerHTML

[!WARNING]
Large pages may truncate. To handle this:
- Remove <style> tags before extraction: document.querySelectorAll('style').forEach(el => el.remove())
- Re-add styles statically (Tailwind CDN link, source CSS)

5. Save to file.

***

Appendix: Static Fallback (MockPage.jsx)

[!NOTE]
This method is a last resort for when the app cannot run locally (broken deps, missing backend, auth walls with no bypass). It requires manually flattening React components into a single JSX file. Prefer Strategy A whenever possible.

When to Use

  • App can't run locally at all
  • Page requires auth with no mock/bypass
  • You need a specific UI state that's impossible to reach by navigation (error screens, empty states)

Quick Reference

npx tsx <SKILL_DIR>/scripts/extract_inline_html.ts \
  --index-css src/css/App.css \
  --extra-css index.html \
  --outdir .stitch \
  --page src/MockPage.jsx:Page.html:"Page Title"

Key flags: --no-tailwind (non-Tailwind apps), --html-class dark (dark mode), --css-files (extra CSS files).

Auto-detection: Tailwind config is auto-detected. @apply directives automatically use <style type="text/tailwindcss">.

MockPage.jsx Rules

1. Include the full layout — header, sidebar, footer (read App.js first) 2. Flatten all conditionals — pick one state, remove all ternaries and && guards 3. Hardcode all data — replace {variable} with concrete values, unroll .map() loops 4. Preserve logos — use <img> with local paths (post-process will inline them) 5. Remove floating elements — cookie banners, chat widgets, feedback buttons

Post-Processing

Inline local images:

npx tsx <SKILL_DIR>/scripts/post_process.ts \
  .stitch/Page.html --base-dir <app-directory>

Related skills

FAQ

Do I need to set up a mock component?

No - Strategy A (Puppeteer) works with any running app. MockPage.jsx is a last resort for apps that cannot run locally.

Will images work after the server stops?

Yes - the script inlines all images as base64 data URIs and removes failed srcset entries so the fallback src is used.

Which strategy should I use?

Strategy A (Puppeteer) is recommended as the default - it requires zero setup and works with any framework. Use Strategy B only if you need to interact with the page first (click, fill forms).

Is Stitch::Extract Static Html safe to install?

skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

Frontend Developmentfrontenddevops

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.