Website Builder
Autonomously build and ship a polished web app.
The idea and design are determined automatically using a dice-based system.
Workflow
0. First-Time Setup (Onboarding Wizard)
Before doing anything else, check whether the skill has been configured.
Config file location:
CODEBLOCK0
If .skill-config does not exist (or the user explicitly asks to re-run setup with --setup), run the interactive onboarding wizard below.
Onboarding Wizard
Ask the user each question in order. Collect the answers, then write them all to .skill-config at the end. Present each question clearly — one at a time, conversationally.
Step A — Vercel Token (required)
"To deploy your sites, I need your Vercel token.
You can find it at: https://vercel.com/account/tokens
What is your Vercel token?"
Save as VERCEL_TOKEN.
Step B — Google Analytics (optional)
"Would you like to enable Google Analytics on your sites? This is optional — it lets you track page views and user behaviour.
(yes / no)"
- - If no → skip to Step C. Leave
GA_MEASUREMENT_ID and GOOGLE_APPLICATION_CREDENTIALS blank. - If yes → ask:
"What is your Google Application Credentials JSON file path?
(e.g. /home/you/.config/gcloud/service-account.json)"
Save as GOOGLE_APPLICATION_CREDENTIALS.
"What is your GA4 Measurement ID?
(e.g. G-XXXXXXXXXX — found in Google Analytics → Admin → Data Streams)"
Save as GA_MEASUREMENT_ID.
Step C — Supabase Waitlist (optional)
"Every site includes a 'Join the Waitlist' section so visitors can sign up.
Would you like to connect this to Supabase so emails are actually saved? This is optional — the section always appears, but without credentials submissions won't be stored.
(yes / no)"
- - If no → skip. Leave
SUPABASE_URL and SUPABASE_ANON_KEY blank. The waitlist UI will still be included on every site. - If yes → ask:
"What is your Supabase project URL?
(e.g. https://abcdefgh.supabase.co)"
Save as SUPABASE_URL.
"What is your Supabase anon/public key?
(found in Supabase → Project Settings → API → Project API Keys)"
Save as SUPABASE_ANON_KEY.
Saving the Config
After collecting all answers, write the config file:
CODEBLOCK1
Confirm to the user:
"✅ Setup complete! Your config has been saved.
You can re-run setup anytime by saying 'set up the website builder' or passing --setup to the script."
Then proceed with the rest of the workflow.
If .skill-config already exists
Load it and continue. No questions needed.
CODEBLOCK2
1. Check for Vercel Token
Verify that deployment is possible.
- - Confirm
$VERCEL_TOKEN is set (from config or environment). - If not available: stop and inform the user to run setup.
Never deploy without authentication.
2. 🎲 Roll 1 — What to Build
Generate a number from 1–5:
CODEBLOCK3
| Roll | What to build |
|---|
| 1, 2 | 🤖 AI Tool |
| 3 |
🏗️
OpenClaw Web Tool |
| 4, 5 | 💰
Niche Clone |
If Roll = 1 or 2 → AI Tool
Research current AI opportunities.
Search:
CODEBLOCK4
Find something original and useful that can realistically be built as a web app.
Examples:
- - AI workflow generators
- AI niche productivity tools
- AI dev utilities
- AI writing or research helpers
The result must be practical and usable, not just a landing page.
If Roll = 3 → OpenClaw Tool
Research inspiration from the OpenClaw project.
Run:
CODEBLOCK5
Then build something that extends or promotes the OpenClaw ecosystem, such as:
- - Interactive docs
- Prompt playground
- Demo tool
- Developer utility
- Visual onboarding experience
The result should help developers understand or use OpenClaw faster.
If Roll = 4 or 5 → Niche Clone
Do not use a predefined list. Research what's actually making money right now.
Run multiple searches across these sources:
CODEBLOCK6
Look for:
- - StarterStory.com — real founders sharing actual MRR, growth, and what's working
- Crunchbase — recently funded startups (seed/Series A) in AI/SaaS — funding = validated demand
- Indie Hackers — $10k–$100k MRR solo/small-team products
- Product Hunt — trending tools with strong upvote momentum
Selection criteria:
- 1. The product has demonstrated revenue or traction (not just hype)
- A clear underserved niche exists (industry, role, geography, workflow)
- The niche version can be meaningfully differentiated — not just a rebrand
Then:
- 1. Pick the most promising product with clear revenue signal
- Identify a specific underserved niche — be precise:
- ❌ "small businesses"
- ✅ "independent veterinary clinics"
- 3. Build a focused version targeting that niche exactly
The niche is the moat — the narrower, the better.
Example:
Research finds → Otter.ai ($50M ARR, meeting transcription)
Instead of:
AI meeting transcription
Build:
AI meeting transcription for real estate showings — auto-generates buyer feedback summaries and follow-up emails for agents
3. 🎲 Roll 2 — Color Palette
Roll two more times.
Primary Color
CODEBLOCK7
| Roll | Color | Hex | Vibe |
|---|
| 1 | Electric Blue | #2563EB | Trustworthy, tech, precise |
| 2 |
Deep Violet | #7C3AED | Creative, premium, mysterious |
| 3 | Emerald | #059669 | Growth, calm, fresh |
| 4 | Crimson Red | #DC2626 | Bold, urgent, powerful |
| 5 | Amber | #D97706 | Confident, warm, energetic |
| 6 | Cyan / Teal | #0891B2 | Clean, modern, sharp |
Background Mode
CODEBLOCK8
| Roll | Mode | Style |
|---|
| 1, 2, 3 | ☀️ Light | White or #FAFAFA base, dark text |
| 4, 5, 6 |
🌙 Dark |
#070B14 or deep neutral base, light text |
Pair the primary with 1–2 derived accent colors and a neutral set.
The palette should feel curated and intentional — never generic.
4. 🔨 Building Web Apps
Before building, check previous builds:
CODEBLOCK9
Do not duplicate existing ideas.
Stack
- - React + TypeScript + Vite
- Tailwind CSS (via npm)
- Framer Motion for animations
- lucide-react for icons
- Pexels for stock photos (link only, never download)
Design Standards (non-negotiable)
- - Full-viewport animated Hero — bold headline, subheadline, primary CTA
- Fixed Nav with smooth scroll and CTA button
- Features / How It Works with icons or a 3-step flow
- Social Proof — testimonials, logos, or user counts
- Waitlist Signup Section — ALWAYS included, no exceptions (see below)
- CTA section mid-page + bottom — urgent, outcome-focused copy
- Footer — links, legal, socials
- Optional: Demo section (interactive product simulation), Pricing, FAQ
- Apple/Stripe level polish — every page a bespoke masterpiece
- 8px grid, fluid responsive, mobile-first
- Scroll-triggered animations, hover states, microinteractions
- Benefit-driven copy — outcomes not features
✉️ Waitlist Signup Section (Required — Always)
Every single site must include a waitlist signup section. This is non-negotiable, regardless of whether Supabase credentials are configured.
The section should be visually prominent — a full-width band, typically placed between the main CTA and the footer. It should:
- - Have a compelling headline (e.g. "Be the first to know", "Get early access", "Join the waitlist")
- Have a subheadline matching the product's value proposition
- Have an email input + submit button
- Show a success state after submission
Placement: Between the mid-page CTA and the Footer (or at the bottom of the hero if the page is short).
Component file: src/components/Waitlist.tsx
Project Structure
CODEBLOCK10
Wiring: With Supabase Credentials
If $SUPABASE_URL and $SUPABASE_ANON_KEY are set, the form should POST to Supabase.
Assume the table is named waitlist with columns email, app_name, and app_url. The agent should note in the output that the user may need to create this table in Supabase if it doesn't exist.
SQL to create the table:
CODEBLOCK11
The fetch call in the component — always include app_name and app_url:
CODEBLOCK12
INLINECODE26 should be a constant at the top of the Waitlist component, set to the product name (e.g. const APP_NAME = 'ErrorLens').
Inject the values at build time via Vite env vars — never hardcode in source:
In vite.config.ts, expose:
CODEBLOCK13
Use __SUPABASE_URL__ and __SUPABASE_ANON_KEY__ in the component.
Wiring: Without Supabase Credentials
If credentials are absent, still include the full waitlist UI. The form should render and look identical, but on submit show:
"✅ Thanks! We'll be in touch soon."
(The submission does nothing server-side — it's a polished placeholder.)
Log a note in build output:
⚠️ Waitlist is UI-only — set SUPABASE_URL and SUPABASE_ANON_KEY to enable real sign-ups
Analytics (Optional)
Check for both conditions before adding any analytics code:
- 1.
$GA_MEASUREMENT_ID is set - INLINECODE32 is set or the file exists
If either is missing → skip analytics entirely. Do not add any tracking code.
Only when both are present, add the following to index.html before </body>, replacing <MEASUREMENT_ID> with the actual value:
CODEBLOCK15
Check at build time:
CODEBLOCK16
5. Deploy
Important: Deploy the pre-built dist/ folder, NOT the project root. Vercel rebuilds from source on their servers where your env vars don't exist — Supabase credentials and analytics would be baked in as empty strings. Deploying dist/ sends the already-built static files with credentials properly baked in.
CODEBLOCK17
Why this works: npm run build runs locally where env vars are set, so Vite's define bakes Supabase/GA values into the JS bundle. The vercel.json in dist/ tells Vercel to skip rebuilding and serve the files directly.
6. After Every Build
- - Add to
memory/side-hustle-builds.md (name, URL or path, idea, date) - Log in INLINECODE43
- Update
lastBuild in INLINECODE45
7. After Deployment Return
- - Deployed URL
- Dice roll results
- The generated idea
- How the product works
- Why it could succeed
- Color palette used
- Analytics: enabled or skipped (state which env var was missing if skipped)
- Waitlist: confirm the section is included; state whether Supabase is wired or placeholder mode. If wired, remind the user to create the
waitlist table in Supabase if not already done. The table must include app_name text not null and app_url text columns.
Commands
CODEBLOCK18
Notes
- - Onboarding runs once — after setup, the config is reused automatically.
- Re-setup: say "set up the website builder" or pass
--setup to the script. - Waitlist section is mandatory on every site — no exceptions.
- Never hardcode secrets or tokens into source files.
- Never embed the Supabase anon key directly in JSX — always use Vite define injection.
- Prefer polished dark UI defaults unless user asks otherwise.
- For larger projects, scaffold first, then iterate in follow-up turns.
See references/workflow.md for detailed operational guidance.
网站构建器
自主构建并交付一个精致的网页应用。
创意和设计将使用骰子系统自动确定。
工作流程
0. 首次设置(入门向导)
在执行任何操作之前,检查该技能是否已配置。
配置文件位置:
~/.openclaw/workspace/skills/idle-web-developer/.skill-config
如果 .skill-config 不存在(或用户明确要求使用 --setup 重新运行设置),则运行以下交互式入门向导。
入门向导
按顺序向用户提问每个问题。收集答案,最后将所有答案写入 .skill-config。清晰呈现每个问题——一次一个,以对话方式。
步骤 A — Vercel 令牌(必填)
要部署您的网站,我需要您的 Vercel 令牌。
您可以在以下位置找到它:https://vercel.com/account/tokens
您的 Vercel 令牌是什么?
保存为 VERCEL_TOKEN。
步骤 B — Google Analytics(可选)
您是否希望在您的网站上启用 Google Analytics?这是可选的——它可以让您跟踪页面浏览量和用户行为。
(是 / 否)
- - 如果否 → 跳转到步骤 C。将 GAMEASUREMENTID 和 GOOGLEAPPLICATIONCREDENTIALS 留空。
- 如果是 → 询问:
您的 Google 应用程序凭据 JSON 文件路径是什么?
(例如 /home/you/.config/gcloud/service-account.json)
保存为 GOOGLEAPPLICATIONCREDENTIALS。
您的 GA4 衡量 ID 是什么?
(例如 G-XXXXXXXXXX — 在 Google Analytics → 管理 → 数据流中找到)
保存为 GAMEASUREMENTID。
步骤 C — Supabase 候补名单(可选)
每个网站都包含一个加入候补名单部分,以便访问者注册。
您是否希望将其连接到 Supabase,以便实际保存电子邮件?这是可选的——该部分始终显示,但没有凭据时提交的内容将不会被存储。
(是 / 否)
- - 如果否 → 跳过。将 SUPABASEURL 和 SUPABASEANON_KEY 留空。候补名单 UI 仍将包含在每个网站上。
- 如果是 → 询问:
您的 Supabase 项目 URL 是什么?
(例如 https://abcdefgh.supabase.co)
保存为 SUPABASE_URL。
您的 Supabase 匿名/公共密钥是什么?
(在 Supabase → 项目设置 → API → 项目 API 密钥中找到)
保存为 SUPABASEANONKEY。
保存配置
收集所有答案后,写入配置文件:
bash
CONFIG=~/.openclaw/workspace/skills/idle-web-developer/.skill-config
cat > $CONFIG <
VERCELTOKEN=${VERCELTOKEN}
GOOGLEAPPLICATIONCREDENTIALS=${GOOGLEAPPLICATIONCREDENTIALS}
GAMEASUREMENTID=${GAMEASUREMENTID}
SUPABASEURL=${SUPABASEURL}
SUPABASEANONKEY=${SUPABASEANONKEY}
EOF
向用户确认:
✅ 设置完成!您的配置已保存。
您可以随时通过说设置网站构建器或向脚本传递 --setup 来重新运行设置。
然后继续执行工作流程的其余部分。
如果 .skill-config 已存在
加载它并继续。无需提问。
bash
source ~/.openclaw/workspace/skills/idle-web-developer/.skill-config
1. 检查 Vercel 令牌
验证部署是否可行。
- - 确认 $VERCEL_TOKEN 已设置(来自配置或环境)。
- 如果不可用:停止并通知用户运行设置。
绝不未经身份验证就部署。
2. 🎲 掷骰 1 — 构建什么
生成一个 1–5 的数字:
bash
python3 -c import random; print(random.randint(1,5))
🏗️
OpenClaw 网络工具 |
| 4, 5 | 💰
利基克隆 |
如果掷骰结果 = 1 或 2 → AI 工具
研究当前的 AI 机会。
搜索:
web_search trending AI tools 2026
找到一些原创且有用、可以实际构建为网页应用的内容。
示例:
- - AI 工作流生成器
- AI 利基生产力工具
- AI 开发实用程序
- AI 写作或研究助手
结果必须是实用且可用的,而不仅仅是一个落地页。
如果掷骰结果 = 3 → OpenClaw 工具
从 OpenClaw 项目中寻找灵感。
运行:
gh issue list -R openclaw/openclaw --limit 20
然后构建一些扩展或推广 OpenClaw 生态系统的内容,例如:
- - 交互式文档
- 提示词沙盒
- 演示工具
- 开发者实用程序
- 可视化入门体验
结果应帮助开发者更快地理解或使用 OpenClaw。
如果掷骰结果 = 4 或 5 → 利基克隆
不要使用预定义列表。 研究当前实际盈利的产品。
跨以下来源运行多次搜索:
web_search most profitable micro SaaS 2025 site:starterstory.com
web_search bootstrapped SaaS revenue 2025 site:starterstory.com
web_search fastest growing AI SaaS startups 2025 site:crunchbase.com
web_search profitable niche SaaS ideas 2025
寻找:
- - StarterStory.com — 真实创始人分享实际 MRR、增长和有效方法
- Crunchbase — 最近在 AI/SaaS 领域获得融资的初创公司(种子轮/A 轮)——融资 = 已验证的需求
- Indie Hackers — 月经常性收入 1 万至 10 万美元的个人/小团队产品
- Product Hunt — 具有强劲点赞势头的热门工具
选择标准:
- 1. 产品已展示出收入或吸引力(不仅仅是炒作)
- 存在一个明确的服务不足的利基市场(行业、角色、地域、工作流)
- 利基版本可以有意义地进行差异化——不仅仅是品牌重塑
然后:
- 1. 选择最有前景且具有明确收入信号的产品
- 确定一个特定的服务不足的利基市场——要精确:
- ❌ 小型企业
- ✅ 独立兽医诊所
- 3. 构建一个专门针对该利基市场的聚焦版本
利基就是护城河——越窄越好。
示例:
研究发现 → Otter.ai(5000 万美元 ARR,会议转录)
不要构建:
AI 会议转录
而是构建:
针对房地产展示的 AI 会议转录——自动为经纪人生成买家反馈摘要和跟进邮件
3. 🎲 掷骰 2 — 调色板
再掷两次。
主色
bash
python3 -c import random; print(random.randint(1,6))
| 掷骰结果 | 颜色 | 十六进制 | 氛围 |
|---|
| 1 | 电光蓝 | #2563EB | 可信赖、科技、精确 |
| 2 |
深紫罗兰 | #7C3AED | 创意、高级、神秘 |
| 3 | 翡翠绿 | #059669 | 成长、平静、清新 |
| 4 | 深红色 | #DC2626 | 大胆、紧急、强大 |
| 5 | 琥珀色 | #D97706 | 自信、温暖、充满活力 |
| 6 | 青色/蓝绿色 | #0891B2 | 干净、现代、锐利 |
背景模式
bash
python3 -c import random; print(random.randint(1,6))
| 掷骰结果 | 模式 | 风格 |
|---|
| 1, 2, 3 | ☀️ 浅色 | 白色或 #FAFAFA 底色,深色文字 |
| 4, 5, 6 |
🌙 深色 | #070B14 或深中性底色,浅色文字 |
将主色与 1–2 个衍生强调色 和一组中性色搭配。
调色板应感觉精心策划且有意图——绝不泛泛。
4. 🔨