factory
Self-contained SaaS pipeline — invoke directly, do not decompose. Generates a factory app with landing page, Stripe subscription checkout, Vibe Token economics, and deploys to Cloudflare Workers. Use when the user wants to monetize an app, add billing, create token-backed revenue sharing, or turn an app into a business.
适合你,如果你想快速搭建一个带付费订阅和代币经济的SaaS应用
用别的 agent?下载 .zip 解压,把文件夹放进它的技能目录
~/.claude/skills/(项目级 .claude/skills/)~/.codex/skills/npx oh-my-skill add popmechanic/vibesos/factorycurl -fsSL https://oh-my-skill.com/install.sh | bash -s -- popmechanic/vibesos/factorynpx oh-my-skill verify popmechanic/vibesos/factory怎么用
技能原文 SKILL.md
Plan mode: If you are planning work, this entire skill is ONE plan step: "Invoke /vibes:factory". Do not decompose the steps below into separate plan tasks.
Display this ASCII art immediately when starting:
░▒▓████████▓▒░░▒▓██████▓▒░ ░▒▓██████▓▒░▒▓████████▓▒░░▒▓██████▓▒░░▒▓███████▓▒░░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓██████▓▒░ ░▒▓████████▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ ░▒▓██████▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░ ░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░ ░▒▓█▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░ ░▒▓█▓▒░
Quick Navigation
- [Critical Rules](#-critical-rules---read-first-) - Read this first
- [Step 1: Pre-Flight](#step-1-pre-flight) - Verify prerequisites
- [Step 2: Subscription Pricing](#step-2-subscription-pricing) - Set monthly price
- [Step 3: AI Token Billing](#step-3-ai-token-billing) - Configure AI margins
- [Step 4: Vibe Token Config](#step-4-vibe-token-configuration) - Set revenue share
- [Step 5: Stripe Connect](#step-5-stripe-connect-onboarding) - Developer onboarding
- [Step 6: Deploy](#step-6-deploy) - Build and deploy
- [Step 7: Generate Invite Codes](#step-7-generate-invite-codes-optional) - Invite partners
CRITICAL RULES - READ FIRST
DO NOT generate code manually. This skill uses pre-built scripts and API calls:
| Step | Tool | What it does | |------|------|--------------| | Assembly | assemble-factory.js | Generates unified index.html | | Deploy | deploy-cloudflare.js | Deploys to Cloudflare Workers | | Configure | POST /app/configure | Stores billing config in KV | | Initialize | POST /token/:appName/initialize | Sets up Vibe Token economics | | Grant | POST /token/:appName/grant | Grants tokens to partners |
Script location:
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
Factory API base: https://factory.vibesos.com
Factory - App Monetization Pipeline
Transform your Vibes app into a revenue-generating SaaS with token-backed contributor rewards.
Architecture
The factory skill sets up:
- Stripe Subscriptions — flat monthly price + metered AI token billing
- Vibe Token Economics — revenue-sharing tokens for distribution partners
- Factory Dashboard — manage tokens, view revenue, process payouts
All configuration is stored in the factory worker. Token state lives in a Durable Object per app.
Terminal or Editor UI?
Detect whether you're running in a terminal (Claude Code CLI) or an editor. Terminal agents use AskUserQuestion for all input. Editor agents present requirements as a checklist comment, wait for user edits, then proceed. See the vibes skill for the full detection and interaction pattern.
Step 1: Pre-Flight
Before starting, verify these prerequisites. STOP if any check fails.
1.1 Auth Check
Auth is automatic — on first deploy, a browser window opens for Pocket ID login. Tokens are cached at ~/.vibes/auth.json for subsequent deploys.
1.2 Detect Existing App
ls -la app.jsx 2>/dev/null || echo "NOT_FOUND"
Decision tree:
- Found
app.jsx-> Proceed to Step 2 - Found multiple
riff-*/app.jsx-> Ask user to select one - Found nothing -> Tell user to run
/vibes:vibesfirst
1.3 Check Existing Config
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
APP_NAME="${1:-}"
if [ -n "$APP_NAME" ]; then
curl -s "https://factory.vibesos.com/connect/status/$APP_NAME" \
-H "Authorization: Bearer $(cat ~/.vibes/auth.json | python3 -c "import sys,json; print(json.load(sys.stdin)['accessToken'])")" 2>/dev/null
fi
If the app already has billing configured, offer to update or show current config.
1.4 Pre-Flight Summary
"Pre-flight checks passed: - App found (app.jsx) - Auth is automatic via Pocket ID Ready to configure your app factory."
Step 2: Subscription Pricing
Use AskUserQuestion:
Question 1: "What should your app cost per month?" Header: "Monthly Price" Options: - "$5/month" - "$10/month" - "$25/month" - Other (enter custom amount) Description: "This is the flat monthly subscription price. AI token usage is billed separately." Question 2: "Offer a free trial?" Header: "Free Trial" Options: - "No trial" - "7-day trial" - "14-day trial" Description: "Trial lets users try before paying. Stripe handles the trial period automatically."
Store: price (number, dollars), trialDays (number, 0/7/14)
Step 3: AI Token Billing
Use AskUserQuestion:
Question: "Does your app use AI features?" Header: "AI Billing" Options: - Label: "No AI features" Description: "Skip AI billing setup" - Label: "Yes, 2x margin (recommended)" Description: "Customers pay 2x the model cost. You keep the difference." - Label: "Yes, 3x margin" Description: "Higher margin, customers pay 3x model cost." - Label: "Yes, custom margin" Description: "Enter your own multiplier."
If AI is enabled, explain:
"OpenRouter routes to the underlying provider; the factory worker meters token usage per customer and posts events to a shared Stripe Billing Meter. Your customers will see AI usage as a line item on their monthly invoice alongside the flat subscription fee."
Store: aiMarginPercent (number: 0 for no AI, 200 for 2x, 300 for 3x, etc.)
Step 4: Vibe Token Configuration
Use AskUserQuestion:
Question: "What percentage of revenue should flow to token holders? This is locked forever." Header: "Revenue Share (Alpha)" Options: - "10% — Conservative" - "15% — Balanced" - "20% — Generous (recommended)" - "25% — Very generous" - Other (enter custom %) Description: "Alpha determines how much of each invoice goes to Vibe Token holders. Higher alpha = more attractive to partners, but less developer take-home. This cannot be changed after launch."
Store: alpha (number, 0.10-0.50)
Auto-calculate remaining parameters:
const k = Math.max((price * 12) / 10_000_000, 0.005); const preMint = Math.round(100 * price * 12); const initialPrice = k * Math.sqrt(1000); // price at s_min
Show summary and confirm:
Use AskUserQuestion:
Question: "Confirm these token economics? (This is permanent)"
Header: "Token Summary"
Options:
- "Confirm and proceed"
- "Go back and adjust"
Description: |
Revenue Share: {alpha*100}%
Pricing Constant (k): {k}
Treasury Size: {preMint} tokens
Initial Token Price: ${initialPrice.toFixed(4)}
Formula: P = {k} * sqrt(supply)
At 100 subscribers ($X/mo each):
- Monthly revenue: ${price * 100}
- Token holder pool: ${Math.floor(alpha * price * 100 * 100)/100}
- Token price: ${(k * Math.sqrt(1000 + preMint * 0.1)).toFixed(4)}
Step 5: Stripe Connect Onboarding
Get the auth token:
TOKEN=$(cat ~/.vibes/auth.json | python3 -c "import sys,json; print(json.load(sys.stdin)['accessToken'])" 2>/dev/null || echo "")
Create Stripe Connect account:
curl -s -X POST "https://factory.vibesos.com/connect/onboard" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"appName\": \"$APP_NAME\"}"
Expected response: { "ok": true, "url": "https://connect.stripe.com/...", "accountId": "acct_..." }
Open the onboarding URL in the user's browser:
open "$ONBOARD_URL" # macOS
Poll for completion:
while true; do
STATUS=$(curl -s "https://factory.vibesos.com/connect/status/$APP_NAME" \
-H "Authorization: Bearer $TOKEN")
COMPLETE=$(echo "$STATUS" | python3 -c "import sys,json; print(json.load(sys.stdin).get('complete', False))")
if [ "$COMPLETE" = "True" ]; then
echo "Stripe Connect onboarding complete!"
break
fi
sleep 5
done
Store: stripeConnectAccountId from the response
Step 6: Deploy
6.1 Store Billing Configuration
curl -s -X POST "https://factory.vibesos.com/app/configure" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"appName\": \"$APP_NAME\",
\"stripeConnectAccountId\": \"$ACCOUNT_ID\",
\"price\": $PRICE,
\"aiMarginPercent\": $AI_MARGIN,
\"vibeToken\": {
\"alpha\": $ALPHA,
\"k\": $K,
\"preMint\": $PREMINT
}
}"
6.2 Assemble Factory App
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
bun "$VIBES_ROOT/scripts/assemble-factory.js" app.jsx index.html \
--app-name "$APP_NAME" \
--app-title "$APP_TITLE" \
--domain "$APP_NAME.vibesos.com" \
--tagline "$TAGLINE" \
--subtitle "$SUBTITLE" \
--billing-mode "required" \
--features "$FEATURES_JSON" \
--admin-ids '[]'
6.3 Deploy to Cloudflare
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
bun "$VIBES_ROOT/scripts/deploy-cloudflare.js" \
--name "$APP_NAME" \
--file index.html
6.4 Initialize Vibe Token Engine
curl -s -X POST "https://factory.vibesos.com/token/$APP_NAME/initialize" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json"
The initialize endpoint reads the billing config from KV and creates the VibeTokenDO with the correct alpha, k, and preMint values.
6.5 Verify Deployment
curl -s -o /dev/null -w "%{http_code}" "https://$APP_NAME.vibesos.com"
Expected: 200
Step 7: Generate Invite Codes (Optional)
Use AskUserQuestion:
Question: "Would you like to generate invite codes for distribution partners now?" Header: "Distribution Partners" Options: - Label: "Yes, generate invites" Description: "Create shareable codes that grant Vibe Tokens to whoever claims them." - Label: "Skip for now" Description: "You can generate codes later from the dashboard."
If generating invites:
Use AskUserQuestion (repeatable):
Question: "How many tokens should this invite grant?" Header: "Invite tokens" Options: - "500 tokens" - "1000 tokens" - "2500 tokens" - Other (enter amount)
For each invite, call the API:
RESULT=$(curl -s -X POST "https://factory.vibesos.com/invite/create" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"appName\": \"$APP_NAME\", \"tokens\": $TOKEN_AMOUNT}")
CODE=$(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin)['code'])")
URL=$(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin)['url'])")
echo "Share this URL: $URL"
Output:
Invite 1: {CODE} — {TOKENS} tokens
Claim URL: {URL}
Completion Summary
Present the final summary:
Your app factory is live! App URL:https://{appName}.vibesos.comDashboard:https://factory.vibesos.com/dashboard/apps/{appName}Configuration: - Monthly price: ${price}/mo - AI margin: {aiMarginPercent}% - Revenue share (alpha): {alpha*100}% - Treasury: {preMint} tokens - Token price: ${initialPrice.toFixed(4)} What happens next: - Customers subscribe at your landing page - Revenue auto-distributes to token holders - Referrers earn new tokens from customers they bring - Monthly payouts transfer earnings to Stripe Connect accounts - Manage everything at the dashboard
What's Next?
Question: "Your factory is deployed! What would you like to do?" Header: "Next" Options: - Label: "Open dashboard" Description: "View your app at factory.vibesos.com/dashboard" - Label: "Grant more tokens" Description: "Invite additional distribution partners" - Label: "Customize landing page" Description: "Adjust colors, tagline, and features" - Label: "I'm done for now" Description: "Your factory is live and accepting customers"