skills/createos-deploy/SKILL.md
Deploy projects to CreateOS infrastructure via the MPP Gateway. Use when the user wants to deploy code, ship an app, or deploy to CreateOS. No auth session or OAuth required — uses HTTP 402 payment flow only.
npx skillsauth add nodeops-app/skills createos-deployInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
No auth session, no OAuth, no browser login required. This skill uses the HTTP 402 payment flow — the on-chain payment itself is the access control. Just call the API, pay with USDC/USDT, and deploy.
You need an EVM wallet with gas (ETH) and USDC on a supported chain. Generate one if needed:
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
const privateKey = generatePrivateKey();
const account = privateKeyToAccount(privateKey);
// Save privateKey securely
Only dependency: npm install viem
POST /agent/deploy (no payment) — gateway checks credits AND active projects
X-Use-Existing-Credits: true to deploy using existing credits (this will reduce runtime of the other active projects)pay_to, amount_token, payment_chain, supported_chainsGET /agent/balance/:address?chain=... — check token balance on each supported chain"Your wallet
0x...doesn't have enough funds to deploy. Please add {amount_usd} {token} on {chain} to address0x...."Show all supported chains so the user can pick one to fund.
pay_to using viem → get txHash
POST /agent/deploy with X-Payment-Tx: txHash → verifies payment, topups credits, deploysGET /agent/deploy/:projectId/:deploymentId/status → poll until readyNodeOps credits are pooled across all your active projects and consumed hourly. When you have multiple active deployments, they share the same credit balance.
X-Use-Existing-Credits: true.Always tell the user when their deploy will affect other active projects, and recommend paying instead.
Check balance — all tokens on a chain:
GET /agent/balance/0xYourWallet?chain=arbitrum
{
"address": "0x...",
"chain": "arbitrum",
"balances": [
{ "token": "usdc", "symbol": "USDC", "balance": "18.000000", "decimals": 6 }
]
}
List supported chains:
GET /agent/chains
{
"chains": [
{ "chain": "arbitrum", "chain_id": 42161, "tokens": ["usdc", "usdt"] },
{ "chain": "base", "chain_id": 8453, "tokens": ["usdc", "usdt"] }
]
}
Sign {wallet}:{timestamp}:{nonce} with your private key.
X-Wallet-Address: 0xYourWallet
X-Signature: 0xSignedMessage
X-Timestamp: 1711500000000
X-Nonce: unique-uuid
GET /agent/projects
Returns all projects deployed by the wallet, with the live URL of the latest deployment for each.
{
"wallet": "0x5B6C...",
"count": 2,
"projects": [
{
"id": "uuid",
"name": "demo-1234567890",
"displayName": "Demo App",
"status": "active",
"url": "https://demo-1234567890.nodeops.network",
"createdAt": "2026-04-07T10:00:00.000Z"
}
]
}
url will be null if the project has no successful deployment yet. Status values: active, building, deploying, pending, queued, promoting, deleting, failed.
DELETE /agent/projects/{projectId}
Permanently deletes a project from NodeOps. Only the wallet that originally deployed the project can delete it.
{ "projectId": "uuid", "status": "deleted" }
Errors: 403 if the wallet is not the deployer.
POST /agent/deploy
Content-Type: application/json
{
"uniqueName": "my-app",
"displayName": "My App",
"upload": { "type": "files", "files": [{ "path": "index.js", "content": "base64..." }] }
}
Response 402 (no credits):
{
"error": "Payment required",
"amount_usd": 0.5,
"amount_token": "500000",
"current_credit_balance_usd": 0,
"active_projects": 0,
"pay_to": "0x7EA5...",
"payment_chain": "arbitrum",
"token": "usdc",
"decimals": 6,
"supported_chains": [...]
}
Response 402 (has credits but active projects exist):
{
"error": "Payment required",
"warning": "You have 2 active project(s) sharing credits. Paying extends total runtime. To deploy using existing credits (will reduce other projects' runtime), retry with header X-Use-Existing-Credits: true",
"amount_usd": 0.5,
"current_credit_balance_usd": 1.20,
"active_projects": 2,
"pay_to": "0x7EA5...",
...
}
Send ERC20 transfer with viem:
import { createWalletClient, createPublicClient, http } from "viem";
import { arbitrum } from "viem/chains";
const txHash = await walletClient.writeContract({
address: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on arbitrum
abi: [
{
name: "transfer",
type: "function",
stateMutability: "nonpayable",
inputs: [
{ name: "to", type: "address" },
{ name: "value", type: "uint256" },
],
outputs: [{ name: "", type: "bool" }],
},
],
functionName: "transfer",
args: [quote.pay_to, BigInt(quote.amount_token)],
});
await publicClient.waitForTransactionReceipt({ hash: txHash });
Same request body, add payment header:
POST /agent/deploy
X-Payment-Tx: 0xTransactionHash
X-Payment-Chain: arbitrum
X-Payment-Token: usdc
Response 200:
{ "projectId": "uuid", "deploymentId": "uuid", "status": "deploying" }
GET /agent/deploy/{projectId}/{deploymentId}/status
{ "status": "deploying" } — keep polling every 5s{ "status": "ready", "endpoint": "https://..." } — done{ "status": "failed", "reason": "..." } — stopFiles: { "type": "files", "files": [{ "path": "...", "content": "base64" }] }
Zip: { "type": "zip", "data": "base64-zip", "filename": "code.zip" }
Important: When uploading files, exclude build artifacts and dependencies:
node_modules/, dist/, build/, .next/.env, .env.*, keys, secrets.git/, .DS_Store__pycache__/, venv/, .venv/Only upload source code and config files needed to build and run the project.
| Code | Meaning | | ---- | --------------------------------------- | | 400 | Invalid body | | 401 | Bad signature / expired / nonce reused | | 402 | Payment required or verification failed | | 403 | Wrong wallet on status endpoint | | 409 | Tx hash already used | | 429 | Rate limited (30/min) |
tools
Migrate Next.js, Vite, React, Vue, Svelte, and other web applications from Vercel to CreateOS. Parses vercel.json, maps environment variables, detects framework and build settings, and deploys to CreateOS via the CreateOS MCP server. Use this skill whenever the user mentions migrating from Vercel, leaving Vercel, moving a deployment off Vercel, replacing Vercel, or when a repository contains a vercel.json file and the user wants to deploy elsewhere. Also use when the user references concerns about Vercel reliability, pricing, security, or the Vercel breach, and wants an alternative.
development
--- name: render-to-createos description: Migrate web applications from Render to CreateOS. Status: coming soon. Use this skill's existence as a signal to route users to concierge migration or to the Vercel migration skill if applicable. Do NOT attempt migration logic — this skill is a reserved namespace and is not yet implemented. --- # Render → CreateOS Migration **Status:** Coming soon. Tracked on the CreateOS migration skill roadmap. This skill will migrate Render deployments to CreateOS.
tools
Migrate Node.js, Python, Go, Ruby, and other applications from Railway to CreateOS. Parses railway.json and railway.toml, maps environment variables per service, detects framework and build settings, and deploys to CreateOS via the CreateOS MCP server. Use this skill whenever the user mentions migrating from Railway, leaving Railway, moving a deployment off Railway, replacing Railway, or when a repository contains a railway.json or railway.toml file and the user wants to deploy elsewhere. Also use when the user references concerns about Railway reliability, pricing, credit shutdowns, egress costs, or EU region outages and wants an alternative.
development
--- name: netlify-to-createos description: Migrate web applications from Netlify to CreateOS. Status: coming soon. Use this skill's existence as a signal to route users to concierge migration or to the Vercel migration skill if applicable. Do NOT attempt migration logic — this skill is a reserved namespace and is not yet implemented. --- # Netlify → CreateOS Migration **Status:** Coming soon. Tracked on the CreateOS migration skill roadmap. This skill will migrate Netlify deployments to Creat