
Entry view — the top bar shows your installed CLIs, the left pane is the editor, the middle is the template + design-system picker, the right is a live iframe preview. The same surface produces magazines, decks, posters, web prototypes, and Hyperframes frame scripts.
|

75 templates, searchable and filterable — pick by mode (prototype / deck / frame / social / office / doc) × scenario (design / marketing / engineering / product / personal). Every skill ships an example.html you can open straight from the repo to see what the agent will produce.
|

SSE streaming — agent stdout JSON-line is parsed for text deltas, appended into the iframe srcdoc in real time. You watch the page render line by line. Don't like where it's going? Interrupt and re-prompt — no wasted full generation.
|

One-click export — WeChat (juice-inlined CSS) · X / Weibo / Xiaohongshu (modern-screenshot → 2× PNG → ClipboardItem) · Zhihu (LaTeX image placeholders) · download .html · download .png. Paste straight in, no second pass of manual formatting.
|

Deck mode — 20 keynote skills, including Swiss International (Helvetica grid maximalism), Guizang Editorial (magazine ink), Open Slide Canvas (1920×1080 agent-native), Magazine Web, XHS Pastel, Hermes Cyber, Replit Style. ←/→ to navigate slides, presenter notes, PDF export.
|

Hyperframes frames — 10 motion frame scripts (liquid hero, NYT data chart, sticky-note flowchart, glitch title, cinema light-leak, macOS notification, brand logo outro, text-cursor VFX, 3D device mockup, …) conforming to heygen-com/hyperframes; hand off straight to Remotion to render .mp4.
|
## Quickstart
```bash
git clone https://github.com/nexu-io/html-anything
cd html-anything
pnpm install
pnpm dev
# → http://localhost:3000
```
Open the browser → the top bar auto-detects whichever coding-agent CLI you already have signed in → pick a template → paste content → ⌘+Enter.
**No API key required.** We reuse the session you already have logged in (Claude / Cursor / Codex / Gemini / Copilot subscriptions all work).
## Supported coding agents
On startup we scan `PATH` (including `~/.local/bin`, `~/.bun/bin`, `/opt/homebrew/bin`, `~/.npm-global/bin` — directories normally missed by GUI-launched Node) and surface every CLI we recognize:
| Agent | Detection binary | Invocation |
|---|---|---|
| **Claude Code** | `claude` | `claude -p --output-format stream-json` |
| **OpenAI Codex** | `codex` | `codex exec --json --sandbox workspace-write` |
| **Cursor Agent** | `cursor-agent` | `cursor-agent --print --output-format stream-json --force --trust` |
| **Gemini CLI** | `gemini` | `gemini --output-format stream-json --yolo` |
| **GitHub Copilot CLI** | `copilot` | `copilot --allow-all-tools --output-format json` |
| **OpenCode** | `opencode-cli` / `opencode` | `opencode run --format json --dangerously-skip-permissions -` |
| **Qwen Coder** | `qwen` | `qwen --yolo -` |
| **Aider** | `aider` | `aider --no-pretty --no-stream --yes-always --message-file -` |
> The detection strategy and per-CLI adapter shape are borrowed directly from [`nexu-io/open-design`](https://github.com/nexu-io/open-design) and [`multica-ai/multica`](https://github.com/multica-ai/multica): one privileged process spawns CLIs, JSON-line is the wire protocol, every CLI gets a thin adapter in [`src/lib/agents/argv.ts`](src/lib/agents/argv.ts).
If you've already done `claude login` / `cursor login` / `gemini auth` in your terminal, HTML Anything reuses that session. **No second copy of the API key required.**
## Skills
**75 skills under [`src/lib/templates/skills/`](src/lib/templates/skills/)**, each a folder following the Claude Code [`SKILL.md`](https://docs.anthropic.com/en/docs/claude-code/skills) convention plus an extended frontmatter (`mode` · `scenario` · `surface` · `preview` · `design_system`).
The two axes the picker uses:
- **mode** — `prototype` (web / SaaS landing / dashboard / data report / résumé / doc) · `deck` (20 horizontal-swipe presentations) · `frame` (10 Hyperframes motion frames) · `social` (4 social-card formats) · `office` (PM / engineering / finance / HR / operations document surfaces).
- **scenario** — `design` · `marketing` · `engineering` · `product` · `finance` · `hr` · `sale` · `personal`. Used to group skills in the picker.
### Web prototypes & marketing pages (prototype mode)
| Skill | Best for | Output |
|---|---|---|
| [`prototype-web`](src/lib/templates/skills/prototype-web/) | Generic web prototype (default) | Single-page HTML, 1440×900 desktop |
| [`saas-landing`](src/lib/templates/skills/saas-landing/) | SaaS landing page | Hero / features / pricing / CTA |
| [`waitlist-page`](src/lib/templates/skills/waitlist-page/) | Waitlist / early-access page | Minimal form + social proof |
| [`pricing-page`](src/lib/templates/skills/pricing-page/) | Pricing page | Multi-tier comparison tables |
| [`dashboard`](src/lib/templates/skills/dashboard/) | Admin / analytics console | Sidebar + dense data layout |
| [`docs-page`](src/lib/templates/skills/docs-page/) | Technical documentation | 3-column docs layout |
| [`blog-post`](src/lib/templates/skills/blog-post/) | Long-form blog post | Editorial layout |
| [`mobile-app`](src/lib/templates/skills/mobile-app/) | iOS / Android prototype | iPhone 15 Pro chrome |
| [`mobile-onboarding`](src/lib/templates/skills/mobile-onboarding/) | App onboarding flow | Splash · value · sign-in trio |
| [`gamified-app`](src/lib/templates/skills/gamified-app/) | Gamified app | Quest · XP · level trio |
| [`dating-web`](src/lib/templates/skills/dating-web/) | Dating / matchmaking dashboard | Left rail · KPIs · 30-day chart |
| [`magazine-poster`](src/lib/templates/skills/magazine-poster/) | Single-page magazine poster | 1080×1920 |
| [`poster-hero`](src/lib/templates/skills/poster-hero/) | Marketing poster | Single-page display poster |
| [`web-proto-editorial`](src/lib/templates/skills/web-proto-editorial/) | Editorial-style web | Serif display + grid |
| [`web-proto-brutalist`](src/lib/templates/skills/web-proto-brutalist/) | Brutalist web | Hard edges, black & white, anti-grid |
| [`web-proto-soft`](src/lib/templates/skills/web-proto-soft/) | Soft / warm web | Soft shadows, rounded, warm palette |
| [`article-magazine`](src/lib/templates/skills/article-magazine/) | Long-form magazine article | A4 / long-page |
| [`digital-eguide`](src/lib/templates/skills/digital-eguide/) | Digital e-guide | Cover + lesson spread |
| [`resume-modern`](src/lib/templates/skills/resume-modern/) | Minimal résumé | A4 210×297mm |
| [`email-marketing`](src/lib/templates/skills/email-marketing/) | Brand product-launch email | Center single-column, table fallback |
| [`wireframe-sketch`](src/lib/templates/skills/wireframe-sketch/) | Hand-drawn wireframe | Early-pass ideation |
### Decks (deck mode, 20 skills)
| Skill | Best for |
|---|---|
| [`deck-swiss-international`](src/lib/templates/skills/deck-swiss-international/) | Swiss International deck |
| [`deck-guizang-editorial`](src/lib/templates/skills/deck-guizang-editorial/) | Editorial-ink deck (from [op7418/guizang-ppt-skill](https://github.com/op7418/guizang-ppt-skill)) |
| [`deck-open-slide-canvas`](src/lib/templates/skills/deck-open-slide-canvas/) | 1920×1080 agent-native canvas (from [1weiho/open-slide](https://github.com/1weiho/open-slide)) |
| [`deck-magazine-web`](src/lib/templates/skills/deck-magazine-web/) | Magazine-style web deck |
| [`deck-hermes-cyber`](src/lib/templates/skills/deck-hermes-cyber/) | Hermes Cyber neon-luxe |
| [`deck-replit`](src/lib/templates/skills/deck-replit/) | Replit-style product walkthrough |
| [`deck-xhs-pastel`](src/lib/templates/skills/deck-xhs-pastel/) | Xiaohongshu pastel deck |
| [`deck-xhs-white`](src/lib/templates/skills/deck-xhs-white/) | Xiaohongshu pure-white deck |
| [`deck-xhs-post`](src/lib/templates/skills/deck-xhs-post/) | Xiaohongshu single-post deck |
| [`deck-tech-sharing`](src/lib/templates/skills/deck-tech-sharing/) | Tech-sharing deck |
| [`deck-product-launch`](src/lib/templates/skills/deck-product-launch/) | Product-launch event deck |
| [`deck-pitch`](src/lib/templates/skills/deck-pitch/) | Investor pitch |
| [`deck-blueprint`](src/lib/templates/skills/deck-blueprint/) | Blueprint / roadmap |
| [`deck-presenter-mode`](src/lib/templates/skills/deck-presenter-mode/) | Speaker-notes-aware |
| [`deck-course-module`](src/lib/templates/skills/deck-course-module/) | Course module deck |
| [`deck-dir-key-nav`](src/lib/templates/skills/deck-dir-key-nav/) | Directional key-nav deep browse |
| [`deck-graphify-dark`](src/lib/templates/skills/deck-graphify-dark/) | Dark, data-graphic-heavy deck |
| [`deck-obsidian-claude`](src/lib/templates/skills/deck-obsidian-claude/) | Obsidian / Claude-flavored notes |
| [`deck-safety-alert`](src/lib/templates/skills/deck-safety-alert/) | Incident / safety briefing |
| [`deck-simple`](src/lib/templates/skills/deck-simple/) | Minimal horizontal-swipe deck |
### Hyperframes video frames & VFX & device mockups (frame / vfx / mockup, 12 skills)
| Skill | Best for |
|---|---|
| [`frame-liquid-bg-hero`](src/lib/templates/skills/frame-liquid-bg-hero/) | Liquid background hero |
| [`frame-data-chart-nyt`](src/lib/templates/skills/frame-data-chart-nyt/) | NYT-style data chart |
| [`frame-flowchart-sticky`](src/lib/templates/skills/frame-flowchart-sticky/) | Sticky-note flowchart |
| [`frame-glitch-title`](src/lib/templates/skills/frame-glitch-title/) | Glitch title card |
| [`frame-light-leak-cinema`](src/lib/templates/skills/frame-light-leak-cinema/) | Cinema light-leak |
| [`frame-macos-notification`](src/lib/templates/skills/frame-macos-notification/) | macOS notification toast |
| [`frame-logo-outro`](src/lib/templates/skills/frame-logo-outro/) | Brand logo outro |
| [`motion-frames`](src/lib/templates/skills/motion-frames/) | Generic motion-design frame |
| [`video-hyperframes`](src/lib/templates/skills/video-hyperframes/) | Hyperframes frame-script schema |
| [`sprite-animation`](src/lib/templates/skills/sprite-animation/) | Pixel / 8-bit animation |
| [`vfx-text-cursor`](src/lib/templates/skills/vfx-text-cursor/) | Text-cursor VFX |
| [`mockup-device-3d`](src/lib/templates/skills/mockup-device-3d/) | 3D device-frame mockup |
> Frame scripts conform to the [`heygen-com/hyperframes`](https://github.com/heygen-com/hyperframes) spec and hand off straight to [`remotion-dev/remotion`](https://github.com/remotion-dev/remotion) to render `.mp4`.
### Social share cards (social mode)
| Skill | Best for |
|---|---|
| [`social-x-post-card`](src/lib/templates/skills/social-x-post-card/) | X / Twitter quote card (1600×900) |
| [`social-spotify-card`](src/lib/templates/skills/social-spotify-card/) | Spotify-Wrapped style card |
| [`social-reddit-card`](src/lib/templates/skills/social-reddit-card/) | Reddit thread card |
| [`social-carousel`](src/lib/templates/skills/social-carousel/) | 3-card 1080×1080 carousel |
| [`card-xiaohongshu`](src/lib/templates/skills/card-xiaohongshu/) | Xiaohongshu image-with-text card |
| [`card-twitter`](src/lib/templates/skills/card-twitter/) | Twitter pull-quote card |
| [`social-media-dashboard`](src/lib/templates/skills/social-media-dashboard/) | Social-ops dashboard |
| [`social-media-matrix`](src/lib/templates/skills/social-media-matrix/) | Multi-platform content matrix |
### Office & operations (office / doc mode)
| Skill | Scenario | Best for |
|---|---|---|
| [`doc-kami-parchment`](src/lib/templates/skills/doc-kami-parchment/) | personal | Warm-parchment editorial doc (from [tw93/kami](https://github.com/tw93/kami)) |
| [`pm-spec`](src/lib/templates/skills/pm-spec/) | product | PM spec doc + decision log |
| [`team-okrs`](src/lib/templates/skills/team-okrs/) | product | OKR scoresheet |
| [`meeting-notes`](src/lib/templates/skills/meeting-notes/) | operation | Meeting decision log |
| [`weekly-update`](src/lib/templates/skills/weekly-update/) | operation | Team weekly cadence |
| [`kanban-board`](src/lib/templates/skills/kanban-board/) | operation | Board snapshot |
| [`eng-runbook`](src/lib/templates/skills/eng-runbook/) | engineering | Incident runbook |
| [`finance-report`](src/lib/templates/skills/finance-report/) | finance | Exec finance summary |
| [`invoice`](src/lib/templates/skills/invoice/) | finance | Single-page invoice |
| [`hr-onboarding`](src/lib/templates/skills/hr-onboarding/) | hr | Role onboarding plan |
| [`data-report`](src/lib/templates/skills/data-report/) | finance / product | CSV/Excel → visual data report |
| [`live-dashboard`](src/lib/templates/skills/live-dashboard/) | operation | Live data dashboard |
| [`flowai-team-dashboard`](src/lib/templates/skills/flowai-team-dashboard/) | operation | Team workflow dashboard |
| [`ppt-keynote`](src/lib/templates/skills/ppt-keynote/) | personal | Generic Keynote-style deck |
**Adding a skill takes one folder.** Copy a similar skill, edit its `SKILL.md` frontmatter, restart `pnpm dev`, the picker shows it. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the bar a skill PR has to clear before we merge.
## Six load-bearing ideas
### 1 · We don't ship an agent. Yours is good enough.
On boot the browser calls `/api/agents`. The server scans `PATH` — including the dirs a GUI-launched Node usually misses (`~/.local/bin`, `~/.bun/bin`, `/opt/homebrew/bin`, `~/.npm-global/bin`) — and surfaces whichever CLIs it finds. Each CLI has one adapter (argv + stdin protocol + stream parser) in [`src/lib/agents/argv.ts`](src/lib/agents/argv.ts). The whole detection model is borrowed directly from [`nexu-io/open-design`](https://github.com/nexu-io/open-design) and [`multica-ai/multica`](https://github.com/multica-ai/multica): one privileged process spawns CLIs, JSON-line is the wire protocol.
### 2 · Skills are folders, not plugins.
Following Claude Code's [`SKILL.md` convention](https://docs.anthropic.com/en/docs/claude-code/skills) — `SKILL.md` + `assets/` + `references/` + `example.html`. Drop a folder into [`src/lib/templates/skills/`](src/lib/templates/skills/), restart `pnpm dev`, the picker shows it. `deck-guizang-editorial` is vendored directly from [`op7418/guizang-ppt-skill`](https://github.com/op7418/guizang-ppt-skill) with original LICENSE and authorship preserved.
### 3 · Hard constraints stop the model from freestyling.
Every template hardcodes:
- **CJK-first font stack** — `Noto Sans/Serif SC` / source-han for Chinese, `Inter` / `Manrope` for Latin.
- **8 px baseline grid** — every spacing, line-height, font-size is a multiple of 8.
- **Rounded corners · soft shadow · no pure black / pure white** — visual de-slop-ification.
- **Color contrast ≥ 4.5**, every interactive element has a real `:focus` state.
- **Must use the user's real data**, no lorem ipsum.
The discipline is lifted from [`alchaincyf/huashu-design`](https://github.com/alchaincyf/huashu-design)'s Junior-Designer mode + anti-AI-slop checklist. Constraints belong in the prompt — every `SKILL.md` writes them in.
### 4 · Streaming render = watch the AI draw.
`POST /api/convert` is SSE. The agent's stdout is line-delimited JSON; the server pulls out the text deltas and re-emits them as SSE events; the client appends to the iframe's `srcdoc`. The whole experience is the same as watching the agent type in a terminal, except the artifact is HTML, not Markdown. **Interrupt at any time** — you're not paying for a whole generation you don't want.
### 5 · One-click export = zero second-pass formatting.
- **WeChat MP** — `juice` inlines CSS + `data-tool` markers → paste into the editor, styles survive end to end.
- **X / Weibo / Xiaohongshu** — `modern-screenshot` renders the iframe to a 2× PNG → `ClipboardItem` → drop straight into the composer.
- **Zhihu** — same as above, plus `