About blink-deploy
blink-deploy is a skill for deploying externally built frontend projects to Blink hosting. It explains CLI deployment, preview versus production URLs, and how to avoid mixing the CLI path with Blink sandbox activation.
Key features
- 01Deploy built frontend output with blink deploy
- 02Distinguish preview and production destinations
- 03Avoid overwriting CLI deploys with sandbox activation
- 04Identify expected build output directories
- 05Troubleshoot empty or stale deployments
Use cases
- 01Publish a built frontend to Blink hosting
- 02Choose whether to update preview or production
- 03Diagnose a missing or stale deployed site
MCP support
The skill documents the blink_versions_restore and hosting status or activation MCP tools. Frontend deployment itself is performed with the blink CLI, not an MCP deploy tool.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ blink-new/ blink-plugin --skill blink-deployAfter installing, type/blink-deployin Claude Code to confirm it loaded.
Details
From the project READMEMCP Tools
blink_versions_restore — Restore a project to a previously saved version snapshot (use blink_versions_list to find version IDs).
Frontend deployment is done via CLI — blink deploy ./dist --prod. The MCP has no deploy tool because agents deploy using the CLI after building.
Getting Started
# Build your app
npm run build
# Deploy to production — always pass project ID explicitly to avoid "No project context" errors
blink deploy <project_id> ./dist --prod
# OR: link the project first, then deploy without ID
blink link <project_id>
blink deploy ./dist --prod
# That's it — no activation step. Do NOT run `blink hosting activate` or call the
# blink_hosting_activate MCP tool after this (see "Two hosting systems" below) — both
# spellings hit the same endpoint, which rebuilds from the Blink sandbox and overwrites
# what you just deployed.
# Preview deploy — publishes to the project's own blinkusercontent.com URL (no activation
# needed, but this IS the project's default live site, not a throwaway — see below)
blink deploy <project_id> ./dist
# List saved version snapshots
blink versions list
# Restore a version snapshot (version rollback)
blink versions restore <version_id>
Two hosting systems — do NOT mix them
Blink has two separate hosting paths. Never run blink hosting activate or call the
blink_hosting_activate MCP tool after blink deploy — both spellings hit the same endpoint.
Path A — CLI deploy (for externally-built apps)
blink deploy <project_id> ./dist --prod
# → live immediately at https://{project_slug}.blinkpowered.com
# → NO further steps needed. Do NOT run `blink hosting activate` or call blink_hosting_activate.
The URL is printed by the CLI after deploy. blink_hosting_status will keep showing inactive
permanently for a CLI-deployed project — the deploy route never writes that field, so this isn't a
transient lag to wait out. The real cause is the project's billing lifecycle, not deploy state; the
site is live regardless. Do not "fix" an inactive status by running hosting activation — see
above.
Path B — Blink sandbox activation (for projects built in the Blink AI editor)
blink_hosting_activate # only for sandbox-based projects
# → triggers a fresh build from the Blink sandbox and deploys
Why you must not mix them:
blink_hosting_activate rebuilds from the Blink sandbox and overwrites the S3 files that blink deploy uploaded. Calling activate after a CLI deploy replaces your app with the Blink AI template.
Summary
| Scenario | Command | URL |
|---|---|---|
| App built externally (Vite/Next/React) | blink deploy <id> ./dist --prod | {slug}.blinkpowered.com |
| App built in Blink AI editor | blink_hosting_activate | {slug}.blinkpowered.com |
| Preview / default URL | blink deploy <id> ./dist (no --prod) | {projectId}.blinkusercontent.com |
Deploy Pipeline
1. npm run build → generates ./dist (or .next, out/, build/)
2. blink deploy ./dist → uploads to Blink hosting
3. URL printed → {projectId}.blinkusercontent.com (preview), or {slug}.blinkpowered.com with --prod (or custom domain)
Preview vs Production
Neither flag is a safe/isolated sandbox — both overwrite a real, live URL. A preview deploy
publishes to the SAME blinkusercontent.com URL the Blink AI editor's own publish path writes to
(and the UI shows as the project's default domain) — running blink deploy ./dist without
--prod replaces whatever is live there right now.
| Flag | Behavior | URL |
|---|---|---|
| (none) | Publishes to the project's default URL — no activation, but not throwaway either | {projectId}.blinkusercontent.com |
--prod | Publishes ONLY to the production/custom-domain URL — does NOT also update the default URL above, which stays on whatever was last deployed there | {slug}.blinkpowered.com + custom domains |
# Publishes to the project's blinkusercontent.com URL — this replaces what's live there now
blink deploy ./dist
# → https://{projectId}.blinkusercontent.com
# Production — replaces live site
blink deploy ./dist --prod
# → https://{slug}.blinkpowered.com
Framework Build Outputs
| Framework | Build Command | Output Dir |
|---|---|---|
| React (Vite) | vite build | ./dist |
Next.js (output: 'export') | next build | ./out |
| Vue | vite build | ./dist |
| Svelte | vite build | ./build |
| Astro | astro build | ./dist |
| Plain HTML/CSS/JS | — | ./ |
For Next.js static export, ensure next.config.ts has output: 'export'.
Backend Deploy
Backend (Hono on CF Workers) has its own deploy command — see blink-backend skill.
blink backend deploy
Full Production Checklist
# 1. Ensure env vars are set
# 2. Build
npm run build
# 3. Deploy frontend
blink deploy ./dist --prod
# 4. Deploy backend (if applicable)
blink backend deploy
# 5. Set up custom domain (optional)
blink domains add myapp.com
Common Issues
| Issue | Fix |
|---|---|
| Empty deploy | Check build output directory exists and has files |
| 404 after deploy | Verify correct output dir (dist/, out/, build/) |
| Env vars missing | Set secrets in project settings before build |
| Stale deploy | Ensure --prod flag for production updates. If it's specifically the default blinkusercontent.com URL that's stale after a --prod deploy, that's expected — --prod doesn't touch it (see Preview vs Production); run a plain blink deploy (no flag) to update it too |