An open-source static website builder powered by Claude Code. Clone it, describe what you want, and ship a production-ready site in minutes.
Built with Astro, Tailwind CSS v4, and shadcn/ui. Deployed to Cloudflare CDN.
Documentation and more on https://hakuto.dev/. Also an announcement post.
Live example how a Hakuto repo looks like for a real website: https://github.com/teamniteo/site-hakuto
Hakuto ships as a Claude Code plugin. Install once, scaffold new sites anywhere.
# Inside Claude Code:
/plugin marketplace add teamniteo/hakuto
/plugin install hakuto@hakutoThen in an empty directory:
mkdir my-site && cd my-site
claude/hakuto:init
Followed by:
bun install
bun run devOpen localhost:4321 to see the site.
Hakuto is a Claude Code plugin bundling skills, a subagent, and an Astro scaffold. Skills (design rules, component patterns, copy, analytics, etc.) live in the plugin and update via /plugin update hakuto. The scaffolded CLAUDE.md ties everything together inside your site repo.
- Install the plugin — one time, global
/hakuto:init— drops an Astro + Cloudflare starter into an empty directory- Describe your site — "Build me a landing page for a coffee roaster" and
website-buildertakes over - Ship it —
wrangler deploypushes to Cloudflare Workers
| Layer | Technology |
|---|---|
| Framework | Astro 6.x |
| Styling | Tailwind CSS v4 |
| Components | shadcn/ui (48 components) |
| Hosting | Cloudflare Workers |
| Runtime | Bun |
.claude-plugin/
├── plugin.json # Plugin manifest
└── marketplace.json # Single-plugin marketplace
commands/
└── init.md # /hakuto:init scaffolder
skills/ # 9 site-building skills
agents/ # Astro file editor subagent
scaffold/ # Astro project copied by /hakuto:init
src/
├── assets/ # Images, favicon source
├── components/
│ ├── ui/ # shadcn/ui React components
│ └── *.astro # Astro page sections
├── layouts/ # Base layout with SEO, fonts, schema
├── pages/ # File-based routing
└── index.css # Theme tokens (Tailwind v4 @theme)
CLAUDE.md # Agent spec for your site
AGENTS.md # Auto-generated page index
site-specification.md # Design decisions & style guide
worker/ # Cloudflare Worker entry
bun run dev # Start dev server
bun run build # Production build
bun run check # TypeScript checks
bun run lint # Lint with Biome
bun run format # Format with BiomeThe Claude Code agent has access to specialized skills for common tasks:
- website-builder — Core page creation workflow
- brand-designer — Generate custom color palettes
- professional-copywriter — Conversion-optimized copy
- section-form — Contact forms and signups
- section-blog — Multi-page blog system
- section-docs — Documentation with sidebar nav
- plausible-analytics — Privacy-friendly analytics
- seo-audit — SEO validation
- scaffold-sync — Pull selective scaffold updates from the installed plugin into existing sites
- prelaunch-checklist — Pre-launch validation (wrangler, forms, legal pages, placeholder scrub, gates)
These steps apply only when using Customer.io for forms.
- Choose a stable ASCII-safe form name. The HTML form
namefield must match it; the form skill handles this for you. For example, submitting to/~/form-contactcreates acontactform in Customer.io. - Merge and deploy the form to the live site, then submit the production form once. Customer.io only shows forms that have received data.
- In Customer.io, open Integrations from the sidebar, then click Forms in the main view. Click the form you created.
- Go to Campaigns and press Create campaign.
- In the campaign, open the Workflow tab and set up the messages. A workflow can include email or Slack messages.
- For email, set a subject. The subject can use any event data, for example
New sponsor-order from {{event.email}}. - In the email editor, use the event on the left side to preview the data that triggered the workflow.
- Add this body to the email template to dump all submitted values. Use
+to customize the message:
{% for pair in event %}
{{ pair[0] }}: {{ pair[1] }}
{% endfor %}- Use the email editor
...menu to send a test email. - Use the Sent tab to see sent or drafted messages.
- To enable sending, the campaign must not be in draft. Go to Actions and start the campaign.
MIT