Deploy with Claude Code
Put your projects online instantly by asking Claude. No complicated setup, no extra tools to learn. Just say "deploy" and your app is live.
How it works
Three steps. That's it.
Sign in with Google
Create your free account in one click. No forms, no credit card.
Set up your API key
Copy your key from the dashboard and add it to Claude Code. Takes 2 minutes.
Tell Claude "deploy this"
Claude handles everything else. You get a live URL in about 30 seconds.
Detailed Setup
Create an Account
Sign up at dartup.dev using your Google account. Your first project is free - no credit card required!
Get Your API Key
After signing up, go to your Dashboard and create an API key. Copy it somewhere safe.
Install the MCP Plugin
Install our Claude Code plugin for the best experience:
curl -fsSL https://dartup.dev/mcp/install.sh | bashThen configure Claude Code with your API key (see detailed instructions below).
Deploy!
Navigate to your project directory and simply ask Claude to deploy:
Deploy this project to DartUpClaude will automatically zip your project, upload it, and give you a live URL like myproject.dartup.dev
Install the Claude Code Plugin
For the best experience, install our MCP server. Then just say "deploy this" - no need to remember API details.
Install the Plugin
Option A: One-line installer (recommended)
curl -fsSL https://dartup.dev/mcp/install.sh | bashOption B: Direct npm install
npm install -g https://dartup.dev/mcp/dartup-mcp-1.3.0.tgzConfigure Claude Code
Add to your Claude Code settings file (~/.claude.json):
{
"mcpServers": {
"dartup": {
"command": "dartup-mcp",
"env": {
"DARTUP_API_KEY": "jd_your_api_key_here"
}
}
}
}Replace jd_your_api_key_here with your actual API key from the Dashboard.
Restart & Deploy
Restart Claude Code, then in any project just say:
Deploy this projectThat's it! Claude will use the plugin to automatically zip, upload, and deploy your project.
Available Commands
Once the MCP plugin is installed, you can use these commands with Claude:
| Command | What it does |
|---|---|
"Deploy this project" | Zip and deploy the current directory to DartUp |
"Deploy github.com/user/repo" | Clone and deploy directly from a GitHub URL New |
"List my deployments" | Show all your deployed projects with URLs and status |
"Show logs for my-app" | View recent logs from a deployment for debugging |
"Restart my-app" | Restart a deployment container |
"Delete deployment my-app" | Remove a deployment permanently |
"Set DATABASE_URL=xxx for my-app" | Update environment variables (auto-restarts) |
What Claude Does Behind the Scenes
When you ask Claude to deploy, it performs these steps automatically:
- 1.Detects your project type (Node.js, Python, or static HTML/CSS/JS)
- 2.Creates a zip file of your project (excluding node_modules, .git, etc.)
- 3.Uploads the zip to the DartUp API with your API key
- 4.The server builds a Docker container for your app
- 5.Your app goes live at
yourproject.dartup.dev
Supported Project Types
Node.js
Express, Next.js, Fastify, or any Node app with a package.json
Python
Flask, FastAPI, Django with requirements.txt
Static
HTML, CSS, JavaScript. Just have an index.html
Daemons & Bots
Discord bots, Telegram bots, background workers with persistent storage
Daemon Deployments
Deploy long-running background services like Discord bots, Telegram bots, or message gateways. Unlike web apps, daemons don't need to expose HTTP ports - they just run continuously.
Supported daemon types
Node.js
- • Discord.js / Eris bots
- • Telegraf / node-telegram-bot-api
- • WhatsApp Web.js / Baileys
- • BullMQ / Agenda workers
Python
- • discord.py / Pycord bots
- • python-telegram-bot / Aiogram
- • Celery / RQ workers
- • Custom daemon scripts
Deploying a daemon
curl -X POST https://dartup.dev/api/deploy \
-H "Authorization: Bearer jd_your_api_key" \
-F "name=my-discord-bot" \
-F "type=daemon" \
-F "persistentVolume=true" \
-F "env[DISCORD_TOKEN]=your_bot_token" \
-F "file=@bot.zip"Or just tell Claude: "Deploy this Discord bot with persistent storage"
Persistent Volumes
Daemons often need to store session data, databases, or cache files that survive restarts. Enable persistent volumes to get 1GB of dedicated storage per project.
| Parameter | Default | Description |
|---|---|---|
persistentVolume | false | Enable persistent storage (Pro only) |
volumePath | /app/data | Where the volume is mounted in your container |
Common mount paths: /app/data (general),/app/.wwebjs_auth (WhatsApp),/app/auth_info (Baileys)
Resource limits: All deployments are capped at 512MB RAM and 0.5 CPU. Daemons that exceed these limits will be restarted automatically.
Sidecar Databases
Attach a managed database to your deployment with a single parameter. DartUp creates the database, generates secure credentials, and injects the connection URL into your app automatically.
Supported Databases
| Type | Image | Environment Variable |
|---|---|---|
postgres | PostgreSQL 16 | DATABASE_URL |
mysql | MySQL 8.0 | DATABASE_URL |
redis | Redis 7 | REDIS_URL |
Usage
curl -X POST https://dartup.dev/api/deploy \
-H "Authorization: Bearer jd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"github_url": "https://github.com/user/my-app",
"database": "postgres"
}'Or just tell Claude: "Deploy this app with a PostgreSQL database"
Pro feature: Sidecar databases are only available to Pro subscribers. Each database has 256MB RAM limit.
Fullstack Monorepo Support
DartUp now automatically handles projects with separate frontend/ and backend/ folders. It builds the frontend, copies the output to the backend, and deploys everything as a single app.
How it works
- 1.Detects
frontend/+backend/(or client/server, web/api) - 2.Runs
npm installandnpm run buildin the frontend - 3.Copies the build output to
backend/public/ - 4.Deploys the backend with frontend assets bundled in
Supported combinations
| Frontend | Backend | Notes |
|---|---|---|
| Vite / React | Express | Ensure Express serves static files from /public |
| Vite / React | NestJS | Auto-configures @nestjs/serve-static |
| Vite / Vue | FastAPI | Serves from /static directory |
| Create React App | Flask | Serves from /static directory |
Need a database? Pass a DATABASE_URL from services likeNeon,Supabase, orPlanetScale via environment variables.
API Reference
For advanced users or custom integrations, here's the direct API:
Deploy a Project
curl -X POST https://dartup.dev/api/deploy \
-H "Authorization: Bearer jd_your_api_key" \
-F "name=my-project" \
-F "file=@project.zip"Deploy with Custom URL Pro
Subscribers can use the subdomain parameter to choose their own URL:
curl -X POST https://dartup.dev/api/deploy \
-H "Authorization: Bearer jd_your_api_key" \
-F "name=my-project" \
-F "subdomain=my-custom-url" \
-F "file=@project.zip"Your app will be available at my-custom-url.dartup.dev. Subdomains must be 3-40 characters, lowercase letters, numbers, and hyphens only.
Environment Variables New
Pass secrets and configuration securely using environment variables. These are injected into your container at runtime and never exposed publicly.
curl -X POST https://dartup.dev/api/deploy \
-H "Authorization: Bearer jd_your_api_key" \
-F "name=my-project" \
-F "file=@project.zip" \
-F "env[DATABASE_URL]=postgres://user:pass@host/db" \
-F "env[API_SECRET]=sk-xxxxxxxxxxxx" \
-F "env[STRIPE_KEY]=sk_live_xxxx"You can also pass environment variables as JSON:
curl -X POST https://dartup.dev/api/deploy \
-H "Authorization: Bearer jd_your_api_key" \
-F "name=my-project" \
-F "file=@project.zip" \
-F 'envVars={"DATABASE_URL":"postgres://...","API_SECRET":"sk-xxx"}'In your app, access these as process.env.DATABASE_URL (Node.js) or os.environ['DATABASE_URL'] (Python). Variable names must start with a letter or underscore and contain only letters, numbers, and underscores.
Response
{
"success": true,
"deployment": {
"id": "clx123abc",
"name": "my-project",
"subdomain": "my-project",
"url": "https://my-project.dartup.dev",
"status": "running"
}
}Node Version Selection
Choose your Node.js version (18, 20, or 22). Defaults to 20 if not specified.
curl -X POST https://dartup.dev/api/deploy \
-H "Authorization: Bearer jd_your_api_key" \
-H "Content-Type: application/json" \
-d '{"github_url": "https://github.com/user/app", "node_version": "22"}'Webhook Notifications
Get notified when your deployment completes or fails. Pass a webhook_url and DartUp will POST the result to your endpoint.
curl -X POST https://dartup.dev/api/deploy \
-H "Authorization: Bearer jd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"github_url": "https://github.com/user/app",
"webhook_url": "https://myserver.com/deploy-hook"
}'Real-Time Build Logs (SSE)
Stream deployment progress in real-time. The jobId is returned in the deploy response.
# Stream real-time progress (Server-Sent Events)
curl -N https://dartup.dev/api/deploy/stream/1
# Poll job status
curl https://dartup.dev/api/deploy/status/1Build & Runtime Logs
# Get build logs (npm install output, errors, etc.)
curl "https://dartup.dev/api/deployments/ID/logs?type=build" \
-H "Authorization: Bearer jd_your_api_key"
# Get runtime logs (container stdout/stderr)
curl "https://dartup.dev/api/deployments/ID/logs?lines=200" \
-H "Authorization: Bearer jd_your_api_key"Rollback Pro
Roll back to any previous build. Each deployment is versioned automatically.
# Rollback to previous build
curl -X POST https://dartup.dev/api/deployments/ID/rollback \
-H "Authorization: Bearer jd_your_api_key"
# Rollback to specific build number
curl -X POST https://dartup.dev/api/deployments/ID/rollback \
-H "Authorization: Bearer jd_your_api_key" \
-H "Content-Type: application/json" \
-d '{"build_number": 2}'List Deployments
curl https://dartup.dev/api/deploy \
-H "Authorization: Bearer jd_your_api_key"Build Environment
Every deployment builds in an isolated Docker environment with these specs:
| Setting | Value |
|---|---|
| Node.js | 18, 20 (default), or 22 - configurable via node_version |
| Python | 3.11 (Debian Slim) |
| Go | 1.21 (Alpine) |
| Rust | 1.75 (Alpine) |
| Build resources | 2 CPU, 4GB memory |
| Runtime resources | 512MB RAM, 0.5 CPU per container |
| Build timeout | 10 minutes |
| Max upload size | 50MB |
Known issues with native modules: Packages like better-sqlite3, sharp, bcrypt, and canvas require native compilation and may fail on Alpine Linux. DartUp warns about these automatically during builds. Consider pure JS alternatives (e.g., bcryptjs instead of bcrypt).
Example Prompts for Claude
Here are some ways you can ask Claude to deploy:
"Deploy this project to DartUp""Ship this to my-cool-app.dartup.dev""Deploy this as a static site""Update my deployment at mysite.dartup.dev""Deploy with DATABASE_URL and API_KEY as environment variables""Deploy this Discord bot as a daemon with persistent storage""Deploy my Telegram bot with TELEGRAM_TOKEN"MCP Plugin Troubleshooting
"dartup-mcp: command not found"
The plugin may not be installed correctly. Try:
# Check if installed
npm list -g dartup-mcp
# Reinstall
npm install -g https://dartup.dev/mcp/dartup-mcp-1.3.0.tgz"DARTUP_API_KEY is required"
Your ~/.claude.json is missing the API key. Make sure the env block contains your key, then restart Claude Code.
"Connection refused" or timeouts
Check that dartup.dev is accessible. If the site works but API calls fail, your API key may be invalid - generate a new one from your Dashboard.
Plugin not showing in Claude Code
1. Verify ~/.claude.json has valid JSON syntax
2. Make sure the file is saved
3. Completely quit and restart Claude Code (not just reload)
Uninstalling the plugin
npm uninstall -g dartup-mcpThen remove the dartup entry from your ~/.claude.json.
General Troubleshooting
Build fails
Make sure your project has all required files: package.json for Node.js, requirements.txt for Python, or index.html for static sites. Use the "Show logs for my-app" command to see build errors.
API key not working
Check your API key is correct in your Dashboard. Free tier includes 1 API key. If you've reached your project limit, upgrade or delete an existing deployment.
Subdomain already taken
Try a different project name or add a unique suffix. Claude will suggest alternatives if your first choice is taken.
Keeping secrets safe
Never put API keys or secrets directly in your frontend code - they'll be visible to anyone. For backend apps, use environment variables: pass them via env in the deploy command. These are injected securely into your container and never exposed publicly.
App crashes or won't start
Check the logs using "Show logs for my-app". Common issues: missing dependencies, wrong start command, or port not set to 80. Your app must listen on port 80 (set via PORT environment variable).
Ready to deploy?
Get Started