MyVibe Publish
Publish web content (HTML file, ZIP archive, or directory) to MyVibe.
Usage
bash
/myvibe:myvibe-publish --file ./dist.zip # Publish ZIP
/myvibe:myvibe-publish --file ./index.html # Publish HTML
/myvibe:myvibe-publish --dir ./dist # Publish directory
/myvibe:myvibe-publish --url https://example.com/app # Import from URL
/myvibe:myvibe-publish --dir ./dist --new # Force new Vibe
/myvibe:myvibe-publish --dir ./dist --did z2qaXXX # Update specific Vibe
Options
| Option | Alias | Description |
|---|
| | Path to HTML file or ZIP archive |
| | Directory to compress and publish |
| | URL to import and publish |
| | MyVibe URL (default: https://www.myvibe.so/) |
| | Project title |
| | Project description |
| | Visibility: public or private (default: public) |
| | Vibe DID for version update (overrides auto-detection) |
| | Force create new Vibe, ignore publish history |
Workflow Overview
- Detect Project Type → if no build needed, start screenshot in background
- Build (if needed) → then start screenshot in background
- Metadata Analysis → extract title, description, tags
- Confirm Publish → show metadata, get user confirmation
- Execute Publish → script auto-reads screenshot result
- Return Result → show publish URL
First tool call - execute in parallel:
- : source file or main files in directory
- :
git remote get-url origin 2>/dev/null || echo "Not a git repo"
- :
node {skill_path}/scripts/utils/fetch-tags.mjs --hub {hub}
Step 1: Detect Project Type
| Check | Project Type | Next Step |
|---|
| with HTML/ZIP | Single File | → Start screenshot, then Step 3 |
| Has , , or with index.html | Pre-built | → Step 2 (confirm rebuild) |
| Has with build script, no output | Buildable | → Step 2 (build first) |
| Multiple or workspace config | Monorepo | → Step 2 (select app) |
| Has at root, no | Static | → Start screenshot, then Step 3 |
Start screenshot for non-build projects (run_in_background: true):
bash
node {skill_path}/scripts/utils/generate-screenshot.mjs --dir {publish_target} --hub {hub}
For single file source (
):
bash
node {skill_path}/scripts/utils/generate-screenshot.mjs --file {publish_target} --hub {hub}
IMPORTANT: Use
when the source is a single HTML file, and
when it is a directory. The flag must match the
in the publish config so that both scripts calculate the same hash for the screenshot result file.
Step 2: Build (if needed)
Detect package manager from lock files, build command from package.json scripts.
- Pre-built: "Rebuild or use existing output?"
- Buildable: "Build before publishing?"
- Monorepo: "Which app to publish?"
After build completes, start screenshot in background, then proceed to Step 3.
Step 3: Metadata Analysis
Extract title
Priority:
→
→ package.json name → first
Generate description (50-150 words, story-style)
Cover: Why (motivation) → What (functionality) → Journey (optional)
Sources: conversation history, README.md, source code, package.json, git log
Guidelines:
- Natural, conversational tone
- Focus on value and story, not technical specs
- Avoid generic "A web app built with React"
Extract githubRepo
From git remote or package.json repository field. Convert SSH to HTTPS format.
Match tags
Fetch tags:
node {skill_path}/scripts/utils/fetch-tags.mjs --hub {hub}
| Tag Type | Match Method |
|---|
| techStackTags | Match package.json dependencies against tag slug |
| platformTags | From conversation context (Claude Code, Cursor, etc.) |
| modelTags | From conversation context (Claude 3.5 Sonnet, GPT-4, etc.) |
| categoryTags | Infer from project (game libs → game, charts → viz) |
Step 4: Confirm Publish
Display metadata and use
:
Publishing to MyVibe:
──────────────────────
Title: [value]
Description:
[50-150 word story]
GitHub: [URL or "Not detected"]
Cover Image: [Will be included if ready]
Tags: Tech Stack: [...] | Platform: [...] | Category: [...] | Model: [...]
Options: "Publish" / "Edit details"
Step 5: Execute Publish
Check dependencies: If
missing, run
first.
No need to check screenshot background task result - the publish script automatically waits for and reads the screenshot result. Execute publish directly:
Pass config via stdin:
bash
node {skill_path}/scripts/publish.mjs --config-stdin <<'EOF'
{
"source": { "type": "dir", "path": "./dist", "did": "z2qaXXXX" },
"hub": "https://www.myvibe.so",
"metadata": {
"title": "My App",
"description": "Story description here",
"visibility": "public",
"githubRepo": "https://github.com/user/repo",
"platformTags": [1, 2],
"techStackTags": [3, 4],
"categoryTags": [5],
"modelTags": [6]
}
}
EOF
- optional - for explicit version updates
- auto-read from
/tmp/myvibe-screenshot-{hash}.json
- Screenshot result file cleaned up after publish
Step 6: Return Result
After publish script completes, check the script output for these messages:
Success Message
Always include the Vibe URL in your response:
Published successfully!
🔗 [URL]
Upgrade Prompt (Important)
The script prints an upgrade prompt when updating an existing Vibe without version history enabled:
📦 Previous version overwritten. Want to keep version history?
Upgrade to Creator → {hub}/pricing
You MUST include this upgrade information in your response to the user if the script output contains it. This helps free-tier users discover the version history feature.
Error Handling
| Error | Action |
|---|
| Dependencies missing | Run in scripts directory |
| 401/403 Auth error | Token auto-cleared, re-run to authorize |
| Build failed | Analyze error, offer fix, or publish source as-is |
| Screenshot failed | Skip coverImage, proceed without it |
| agent-browser missing | Run npm install -g agent-browser && agent-browser install
|
| Private mode is only available for Creator and Studio users | See "Private Mode Error Handling" below |
Private Mode Error Handling
When publishing with
fails with "Private mode is only available for Creator and Studio users", use
to let the user choose:
Question: "Private publishing requires a Creator or Studio subscription. How would you like to proceed?"
| Option | Label | Description |
|---|
| 1 | Publish as Public | Your Vibe will be visible to everyone. You can change this later after upgrading. |
| 2 | View Upgrade Options | Open the pricing page to explore subscription plans with private publishing. |
Actions based on selection:
- Option 1: Re-run publish with , inform user the Vibe is now public
- Option 2: Display the pricing URL and stop the publish flow
Notes
- Always analyze content for meaningful title/description - never use directory names
- Confirm with user before publishing
- Default hub: https://www.myvibe.so/
- Tags cached 7 days locally
- Publish history in for auto version updates
- Use to force new Vibe instead of updating