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.

1

Sign in with Google

Create your free account in one click. No forms, no credit card.

2

Set up your API key

Copy your key from the dashboard and add it to Claude Code. Takes 2 minutes.

3

Tell Claude "deploy this"

Claude handles everything else. You get a live URL in about 30 seconds.

Detailed Setup

1

Create an Account

Sign up at dartup.dev using your Google account. Your first project is free - no credit card required!

2

Get Your API Key

After signing up, go to your Dashboard and create an API key. Copy it somewhere safe.

3

Install the MCP Plugin

Install our Claude Code plugin for the best experience:

Terminal
curl -fsSL https://dartup.dev/mcp/install.sh | bash

Then configure Claude Code with your API key (see detailed instructions below).

4

Deploy!

Navigate to your project directory and simply ask Claude to deploy:

In your project directory
Deploy this project to DartUp

Claude will automatically zip your project, upload it, and give you a live URL like myproject.dartup.dev

Recommended

Install the Claude Code Plugin

For the best experience, install our MCP server. Then just say "deploy this" - no need to remember API details.

1

Install the Plugin

Option A: One-line installer (recommended)

Terminal
curl -fsSL https://dartup.dev/mcp/install.sh | bash

Option B: Direct npm install

Terminal
npm install -g https://dartup.dev/mcp/dartup-mcp-1.3.0.tgz
2

Configure Claude Code

Add to your Claude Code settings file (~/.claude.json):

~/.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.

3

Restart & Deploy

Restart Claude Code, then in any project just say:

Tell Claude
Deploy this project

That'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:

CommandWhat 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. 1.Detects your project type (Node.js, Python, or static HTML/CSS/JS)
  2. 2.Creates a zip file of your project (excluding node_modules, .git, etc.)
  3. 3.Uploads the zip to the DartUp API with your API key
  4. 4.The server builds a Docker container for your app
  5. 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

Pro

Daemons & Bots

Discord bots, Telegram bots, background workers with persistent storage

Pro Feature

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

API call with type=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.

ParameterDefaultDescription
persistentVolumefalseEnable persistent storage (Pro only)
volumePath/app/dataWhere 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.

New in v1.5

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

TypeImageEnvironment Variable
postgresPostgreSQL 16DATABASE_URL
mysqlMySQL 8.0DATABASE_URL
redisRedis 7REDIS_URL

Usage

API call with database
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.

New in v1.4

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. 1.Detects frontend/ + backend/ (or client/server, web/api)
  2. 2.Runs npm install and npm run build in the frontend
  3. 3.Copies the build output to backend/public/
  4. 4.Deploys the backend with frontend assets bundled in

Supported combinations

FrontendBackendNotes
Vite / ReactExpressEnsure Express serves static files from /public
Vite / ReactNestJSAuto-configures @nestjs/serve-static
Vite / VueFastAPIServes from /static directory
Create React AppFlaskServes 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

POST /api/deploy
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:

POST /api/deploy with custom subdomain
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.

POST /api/deploy with environment variables
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:

JSON format
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

JSON 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.

POST /api/deploy with node_version
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.

POST /api/deploy with webhook
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.

GET /api/deploy/stream/{jobId}
# 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/1

Build & Runtime Logs

GET /api/deployments/{id}/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.

POST /api/deployments/{id}/rollback
# 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

GET /api/deploy
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:

SettingValue
Node.js18, 20 (default), or 22 - configurable via node_version
Python3.11 (Debian Slim)
Go1.21 (Alpine)
Rust1.75 (Alpine)
Build resources2 CPU, 4GB memory
Runtime resources512MB RAM, 0.5 CPU per container
Build timeout10 minutes
Max upload size50MB

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-mcp

Then 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