WebForge (Python)
Capture any website's visual blueprint — screenshots + design tokens — for AI coding agents.
WebForge screenshots a URL across desktop, tablet, and mobile viewports, extracts its design tokens (an area-weighted colour palette, top fonts, and image assets), optionally crawls a whole domain, and packages everything into a clean ZIP blueprint that tools like Claude Code, Cursor, or Codex can use to rebuild sites with pixel fidelity.
This is the Python port of the WebForge Chrome extension's capture engine, powered by Playwright.
Installation
pip install webforge-theatom
The package installs as
webforge-theatombut is imported aswebforge:import webforge
WebForge drives a real Chromium browser, so after installing the package you need Playwright's browser binary once:
playwright install chromium
Installing from a local checkout during development:
cd python pip install -e . playwright install chromium
Quick start
import webforge
# Capture a single page across desktop, tablet and mobile.
result = webforge.capture("example.com")
print(result.title) # "Example Domain"
print(result.colors) # ['#ffffff', '#000000', ...] (prominence-ordered)
print(result.fonts) # ['Inter', 'Outfit', ...]
print(result.images) # image URLs + inline data-URIs
# Save a ZIP blueprint (screenshots + metadata.json).
result.to_zip("example.zip")
# ...or write the raw files to a folder.
result.save("example/")
Crawl a whole domain:
site = webforge.crawl("example.com", max_pages=10)
print(len(site.pages), "pages captured")
site.to_zip("example-site.zip")
Command line
webforge example.com # capture -> WebForge_example.com.zip
webforge example.com -o out.zip # choose the output path
webforge example.com --desktop # desktop viewport only
webforge example.com --png # PNG instead of JPEG
webforge example.com --crawl --max 10 # crawl up to 10 pages
webforge --version
API reference
webforge.capture(url, *, mode="all", viewports=None, extract_hover=True, image_format="jpeg", quality=62, timeout=15.0, executable_path=None, headless=True) -> CaptureResult
Capture a single page.
| Argument | Default | Description |
|---|---|---|
url |
— | Target URL; a missing scheme becomes https://. |
mode |
"all" |
"all" = desktop + tablet + mobile; "desktop" = 1440 only. |
viewports |
None |
Explicit iterable of Viewport (overrides mode). |
extract_hover |
True |
Prime hover to surface sprite/hover-only artwork. |
image_format |
"jpeg" |
"jpeg" (smaller) or "png". |
quality |
62 |
JPEG quality 0–100 (ignored for PNG). |
timeout |
15.0 |
Navigation timeout (seconds); on timeout it captures current state. |
executable_path |
None |
Custom Chromium binary; defaults to Playwright's. |
headless |
True |
Run the browser headless. |
webforge.crawl(url, *, max_pages=5, custom_urls=None, mode="desktop", ...) -> CrawlResult
Breadth-first crawl of same-origin links, capturing each page (up to max_pages). Accepts the same capture options.
Result objects
CaptureResult—url,title,captured_at,screenshots({viewport: bytes}),colors,fonts,images. Methods:.to_zip(path),.save(dir),.metadata().CrawlResult—domain,pages(list[CapturedPage]),sitemap. Methods:.to_zip(path),.design_tokens(),.metadata().Viewport—key,width,height. The defaults are inwebforge.DEFAULT_VIEWPORTS.
Errors
All inherit from webforge.WebForgeError:
InvalidURLError— empty or non-http(s) URL.BrowserNotInstalledError— Playwright/Chromium missing (runplaywright install chromium).CaptureError— navigation, render, or screenshot failed.
ZIP blueprint layout
Single page
WebForge_<domain>/
├── desktop.jpg
├── tablet.jpg
├── mobile.jpg
└── metadata.json
Crawl (multi-page)
WebForge_<domain>/
├── sitemap.json
├── metadata.json # domain-wide design tokens
└── pages/
├── home/
│ ├── desktop.jpg
│ └── metadata.json
└── <slug>/
└── ...
This mirrors the layout produced by the WebForge browser extension.
Configuration examples
# Fast desktop-only PNG capture, no hover pass, short timeout.
webforge.capture(
"example.com",
mode="desktop",
image_format="png",
extract_hover=False,
timeout=8.0,
)
# Custom viewport set.
from webforge import Viewport
webforge.capture("example.com", viewports=[Viewport("wide", 1920, 1080)])
# Point at a system Chrome instead of Playwright's bundled Chromium.
webforge.capture("example.com", executable_path="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome")
Troubleshooting
| Symptom | Fix |
|---|---|
BrowserNotInstalledError / "Executable doesn't exist" |
Run playwright install chromium. |
| Capture times out on heavy pages | Increase timeout=; WebForge still returns the current state rather than failing. |
| A site blocks automated visits (Cloudflare, bot walls) | WebForge already spoofs a real user agent and hides the WebDriver flag, but some sites can't be captured headless — try headless=False, or use the browser extension which runs in your own session. |
| Missing colours/fonts | Some tokens live in cross-origin stylesheets the browser won't expose; this matches the extension's behaviour. |
| Empty/black screenshots | The page likely needs longer to render — raise timeout=. |
Development
cd python
pip install -e ".[dev]"
playwright install chromium
pytest -m "not integration" # fast unit tests, no browser
pytest -m integration # end-to-end (needs Chromium)
License
MIT © Zaki Sheriff
Metadata
Release files for webforge-theatom 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| webforge_theatom-0.1.4.tar.gz | 21.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| webforge_theatom-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.5 kB
Release files / webforge_theatom-0.1.4.tar.gz
| Download URL | webforge_theatom-0.1.4.tar.gz |
|---|---|
| Size | 21.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fa96cf525135418af11b9fbe3a6466f7de4eecfa7232db0d20b49749ab2fdfe8
|
|
BLAKE2b-256 checksum How to use checksums |
f4b8d5fcefc3d0510941db760a801246bf7d287f30d2606192b146420e88f1b5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.5
|
Release files / webforge_theatom-0.1.4-py3-none-any.whl
| Download URL | webforge_theatom-0.1.4-py3-none-any.whl |
|---|---|
| Size | 21.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2b3ec71c28258137208c40b5d1a8ae53daf27f253d1c25c427157de50edbb8fd
|
|
BLAKE2b-256 checksum How to use checksums |
6b8b76ee87d17e15850b6e3aeb3d3c39d1a0e67b621c68de4268b7a633fe01de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.5
|