MCPcopy
hub / github.com/abi/screenshot-to-code

github.com/abi/screenshot-to-code @main sqlite

repository ↗ · DeepWiki ↗
1,055 symbols 4,074 edges 224 files 125 documented · 12%
README

screenshot-to-code

Convert screenshots, mockups, Figma designs, and screen recordings into clean, functional code using AI. The easiest way to try this is using the official, hosted product at screenshottocode.com →

https://github.com/user-attachments/assets/ec08a5e6-9606-41c5-b03a-1bf47dfeba75

Supported stacks:

  • HTML + Tailwind
  • HTML + CSS
  • React + Tailwind
  • Vue + Tailwind
  • Bootstrap
  • Ionic + Tailwind

Default AI models:

  • Gemini 3 Flash Preview and Gemini 3.1 Pro Preview - the best models
  • GPT-5.5 and GPT-5.4 Mini
  • Claude Opus 4.6, Claude Opus 4.8
  • z-image-turbo (using Replicate) for image generation

See the Examples section below for more demos.

Screenshot to Code also supports taking a screen recording of a website in action and turning that into a functional prototype.

google in app quick 3

🛠 Getting Started

Choose the path that fits what you want to do:

  • Run locally: best if you want to customize, self-host, or contribute.
  • Use the hosted app: the fastest way to try Screenshot to Code with no local setup. Open the hosted app →

Running locally requires API keys and a backend/frontend setup. The app has a React/Vite frontend and a FastAPI backend.

API keys

You need at least one model provider key (OpenAI, Anthropic, or Gemini). Gemini and Replicate are strongly recommended for the best quality of screenshot-to-code accuracy — Gemini powers asset extraction (reusing the real logos/images from your screenshot) and Replicate powers image generation, background removal, and image editing. Adding all four keys gives the best results and lets you compare multiple models per generation.

Key Required? What it unlocks
OPENAI_API_KEY One of these three GPT code-gen variants (GPT-5.5, GPT-5.4 Mini)
ANTHROPIC_API_KEY One of these three Claude code-gen variants (Opus 4.8, Fable 5, Sonnet 4.6)
GEMINI_API_KEY One of these three — strongly recommended Gemini code-gen variants (3 Flash, 3.1 Pro); extracts real assets from the screenshot; required for video mode
REPLICATE_API_KEY Strongly recommended Image editing, background removal, and Replicate-backed image generation — without it, edit_image and remove_background are unavailable, and image generation falls back to OpenAI if configured

With more keys, the app automatically picks a stronger mix of models per variant; with a single key it uses that provider's models only.

If you'd like to run the app with Ollama open-source models (not recommended due to poor-quality results), follow this comment.

Run the backend (I use Poetry for package management; run pip install --upgrade poetry if you don't have it):

cd backend
echo "OPENAI_API_KEY=sk-your-key" > .env
echo "ANTHROPIC_API_KEY=your-key" >> .env
echo "GEMINI_API_KEY=your-key" >> .env
echo "REPLICATE_API_KEY=r8_your-key" >> .env
poetry install
# Install the Chromium browser used by the screenshot preview tool.
# On Linux, use `poetry run playwright install --with-deps chromium` to also
# install the required system libraries (needs sudo/apt).
poetry run playwright install chromium
poetry env activate
# run the printed command, e.g. source /path/to/venv/bin/activate
poetry run uvicorn main:app --reload --port 7001

You can also set up OpenAI, Anthropic, and Gemini keys using the settings dialog in the frontend (click the gear icon after loading the app). Replicate must be configured in backend/.env as REPLICATE_API_KEY. The Settings dialog also shows whether screenshot preview is available on your backend.

Screenshot preview (optional) lets the agent render its own generated page in a headless browser and visually check its work. It's enabled automatically once Chromium is installed (the playwright install chromium step above, or automatically in the Docker image). If Chromium is missing, the app just skips the tool — the Settings dialog shows whether it's available.

Run the frontend:

cd frontend
yarn
yarn dev

Open http://localhost:5173 to use the app.

If you prefer to run the backend on a different port, update VITE_WS_BACKEND_URL in frontend/.env.local.

Docker

If you have Docker installed, run this from the root directory:

echo "OPENAI_API_KEY=sk-your-key" > .env
docker-compose up -d --build

The app will be up and running at http://localhost:5173. Note that you can't develop the application with this setup, as file changes won't trigger a rebuild.

🙋‍♂️ FAQs

  • I'm running into an error when setting up the backend. How can I fix it? Try this. If that still doesn't work, open an issue.
  • How do I get an OpenAI API key? See https://github.com/abi/screenshot-to-code/blob/main/Troubleshooting.md
  • How can I configure an OpenAI proxy? If you're not able to access the OpenAI API directly, for example because of country restrictions, you can try a VPN or configure the OpenAI base URL to use a proxy. Set OPENAI_BASE_URL in backend/.env or directly in the UI in the settings dialog. Make sure the URL has v1 in the path, for example: https://xxx.xxxxx.xxx/v1.
  • How can I update the backend host that my frontend connects to? Configure VITE_HTTP_BACKEND_URL and VITE_WS_BACKEND_URL in frontend/.env.local. For example, set VITE_HTTP_BACKEND_URL=http://124.10.20.1:7001.
  • Seeing UTF-8 errors when running the backend? On Windows, open the .env file with Notepad++, then go to Encoding and select UTF-8.
  • How can I provide feedback? For feedback, feature requests, and bug reports, open an issue or ping me on Twitter.

📚 Examples

NYTimes

Original Replica
Screenshot 2023-11-20 at 12 54 03 PM Screenshot 2026-06-15 at 3 06 37 PM

Instagram

https://github.com/user-attachments/assets/a335a105-f9cc-40e6-ac6b-64e5390bfc21

Hacker News

https://github.com/user-attachments/assets/205cb5c7-9c3c-438d-acd4-26dfe6e077e5

Extension points exported contracts — how you extend this code

Settings (Interface)
(no doc)
frontend/src/types.ts
DesignSystem (Interface)
(no doc)
frontend/src/types.ts
PromptAsset (Interface)
(no doc)
frontend/src/types.ts
PromptContent (Interface)
(no doc)
frontend/src/types.ts
PromptHistoryMessage (Interface)
(no doc)
frontend/src/types.ts

Core symbols most depended-on inside this repo

ensure_str
called by 57
backend/agent/state.py
cn
called by 43
frontend/src/lib/utils.ts
_get_event_attr
called by 36
backend/agent/providers/openai.py
normalize_url
called by 24
backend/routes/screenshot.py
execute
called by 19
backend/agent/tools/runtime.py
build_prompt_messages
called by 16
backend/prompts/pipeline.py
getVariantLabel
called by 15
frontend/src/lib/models.ts
summarize_text
called by 15
backend/agent/tools/summaries.py

Shape

Function 658
Method 203
Class 104
Interface 64
Route 20
Enum 6

Languages

Python67%
TypeScript33%

Modules by API surface

backend/routes/generate_code.py53 symbols
backend/tests/test_token_usage.py35 symbols
backend/routes/evals.py30 symbols
frontend/src/tests/qa.test.ts29 symbols
backend/routes/export.py28 symbols
backend/tests/test_tool_image_outputs.py24 symbols
frontend/src/components/evals/PromptReportsPage.tsx23 symbols
backend/tests/test_prompts.py22 symbols
frontend/src/components/evals/BestOfNEvalsPage.tsx20 symbols
backend/tests/test_model_selection.py20 symbols
frontend/src/App.tsx19 symbols
backend/uploaded_assets/store.py18 symbols

Dependencies from manifests, versioned

@codemirror/commands6.10.3 · 1×
@codemirror/lang-html6.4.6 · 1×
@codemirror/state6.6.0 · 1×
@codemirror/view6.41.1 · 1×
@radix-ui/react-accordion1.1.2 · 1×
@radix-ui/react-alert-dialog1.0.5 · 1×
@radix-ui/react-checkbox1.0.4 · 1×
@radix-ui/react-collapsible1.0.3 · 1×
@radix-ui/react-dialog1.0.5 · 1×
@radix-ui/react-hover-card1.0.7 · 1×
@radix-ui/react-icons1.3.0 · 1×

For agents

$ claude mcp add screenshot-to-code \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact