Self-hosted. Your keys. Your cloud.

Self-host your own AI workspace

Deploy Smoke Monkey to your preferred cloud. You keep billing, networking, and infrastructure — we ship the Docker image and the deployment config for each provider.

Official image rajdeepsadhu/smoke-monkey-canvas Zero cloud lock-in Bring your own LLM key
One-click deploy

Deploy Smoke Monkey to your preferred cloud

Pick a provider below. Every option runs the same official image, persists your agents in SQLite on a mounted volume, and exposes the live WebSocket stream.

Real deployment status — read this first

A one-click button only exists once a provider has published a template on their platform. Render is live today. Railway and Northflank need a template published to their marketplace, and a DigitalOcean 1-Click App needs Marketplace vendor approval — none of which Smoke Monkey controls. Rather than ship buttons that go nowhere, each option below states its exact status and gives you the working path today.

Render
Managed web service
● One-click ready

A working one-click deploy. Render's official Blueprint deploy URL reads the render.yaml at the root of this repo and provisions the web service, the persistent disk, and the health check for you.

  • 5 GB persistent disk mounted at /app/data
  • WebSockets on /ws — required for live agent streaming
  • No extra services — SQLite only
  • Paid plan required — free tier cannot hold a disk
Deploy to Render Opens Render’s Blueprint form · official Render deploy URL
Railway
Managed container platform
◷ Template ready · not published

Best fit for always-on agents: Railway exempts WebSocket connections from its idle and duration limits. The deployment config is ready — no template has been published to the Railway marketplace, so there is no one-click URL to link to.

  • .railway/railway.ts IaC shipped — image + 5 GB volume + health check
  • WebSockets stay open indefinitely, even while idle
  • One-click URL appears only after railway templates publish
  • Hobby+ recommended — Free is 0.5 GB RAM / 0.5 GB volume
Deploy to Railway Working setup path · ~4 minutes
DigitalOcean
App Platform / Droplet
● One-click ready

Launch directly on DigitalOcean App Platform via our .do/deploy.template.yaml, or provision an Ubuntu Droplet for dedicated root access and persistent SSD block storage.

  • 1-Click App Platform deploy via official Docker Hub image
  • Or run dedicated Droplet via Docker Compose + Caddy TLS
  • Droplet recommended for long-term SQLite database persistence
Deploy to DigitalOcean Official DigitalOcean App Platform 1-click link
Koyeb
Serverless container platform
● One-click ready

Instant one-click deploy with zero build step. Koyeb directly runs the official Docker Hub image with automatic TLS, health checks, and global edge routing.

  • Deploys official multi-arch Docker image in seconds
  • Automatic HTTPS and custom edge domain
  • Health check on /api/space
  • Attach persistent volume in service settings for SQLite retention
Deploy to Koyeb Official Koyeb 1-click deploy URL
Northflank
Managed container platform
◷ Template ready · not published

The full stack is expressed as a Northflank Template — service, persistent volume, port, and health probe — and it is committed to this repo. Northflank mints share links inside a user account, so no public URL can be pre-written.

  • northflank.template.json committed & schema-validated
  • No sleep — genuinely always-on, ideal for cron agents
  • Share link is generated in your account, not a public URL
  • Payment method required even on the free Sandbox tier
Deploy to Northflank Run the committed template · ~5 minutes

🐳 Or bring your own server — Docker / Manual Setup

Any Linux VM, NAS, homelab box, or bare-metal server with Docker. Works today, no provider approval, no vendor lock-in.

Docker / Manual Setup

Deploy to Render

● One-click ready

The fastest route to a hosted workspace. Render's Blueprint deploy URL is an official, documented Render feature and reads render.yaml from this repository.

  1. Click “Deploy to Render”

    Render opens its Blueprint form pre-filled from render.yaml. No configuration needed — the disk, health check, and environment are already declared.

  2. Pick a paid plan

    A persistent disk is required, and free web services cannot have one. Choose the smallest paid web service (Starter, 512 MB).

  3. Deploy and open your URL

    Render builds the repository Dockerfile, then gives you an *.onrender.com address. The first build takes a few minutes.

  4. Add an LLM API key

    Open any agent → Settings → Provider and paste a key. It is encrypted at rest in the SQLite database on the disk.

Official Render deploy URL
https://render.com/deploy?repo=https://github.com/RajdeepDevelopment/smoke-monkey-canvas
⚠️ What the paid plan buys you

Free web services spin down after 15 minutes and have an ephemeral filesystem, so SQLite would be destroyed on every spin-down and redeploy. The disk also pins the service to a single instance and means a brief pause on each deploy while the new instance starts. Both are the correct trade for keeping your agents.

ℹ️ Prefer the prebuilt image?

The Blueprint builds the repository Dockerfile. To deploy the published image instead, swap the service for runtime: image with image.url: docker.io/rajdeepsadhu/smoke-monkey-canvas:latest. Note that image-backed services cannot auto-deploy when a new tag is pushed. See render.yaml.

Deploy to Railway

◷ Template ready · not published

Railway is arguably the best fit for this app: WebSocket connections are exempt from its idle and duration limits, so an agent stream can stay open indefinitely.

◷ Why there is no one-click button yet

Railway has no template file format. Templates are built in the Railway dashboard, or from a live project via railway templates create, and only then published with railway templates publish. Publishing assigns the template a code, and railway.com/new/template/<CODE> becomes the one-click URL. Until that publish happens there is no URL to link to, so this page will not invent one.

Option A — connect this public repo (fastest)

  1. In Railway, choose New Project → Deploy from GitHub repo

    Authorise the GitHub App and pick RajdeepDevelopment/smoke-monkey-canvas. Railway builds the included Dockerfile.

  2. Attach a volume at /app/data

    Right-click the service → Attach Volume → mount path /app/data, 5 GB. Without this, agents and chat history are lost on every deploy.

  3. Set RAILWAY_RUN_UID=0

    Railway mounts volumes as root and this image runs as the non-root node user, so SQLite cannot write without this. Railway injects PORT automatically.

Option B — apply the shipped IaC file

The repo contains .railway/railway.ts, which declares the image source, the volume, the mount path, the health check, and the environment in one place.

terminal
# Install the official CLI, then authenticate
npm i -g @railway/cli
railway login
railway link        # or: railway init

# Preview the plan, then provision image + volume + service
railway config plan
railway config apply

Deploy to DigitalOcean

◷ Requires vendor approval

This option is for users who want their own VM / server — full root access, your own firewall, your own backups. Create a Droplet and run the production Docker stack on it.

◷ Why there is no DigitalOcean 1-Click button

A DigitalOcean 1-Click App is not a Docker image — it is a pre-baked Ubuntu snapshot built with Packer, and publishing one requires approval from DigitalOcean's Marketplace team. No such listing has been submitted, and that review is human-gated with no published timeline. Until it exists, the honest options are a Droplet you create yourself, or doctl with the same stack.

  • Submission requires a vendor application, an approved image snapshot, and marketplace review.
  • The official deploy button scheme cloud.digitalocean.com/droplets/new?image=<slug> only resolves for slugs DigitalOcean has already published.
  • DigitalOcean App Platform is not a substitute — it has no volume support and an ephemeral filesystem, so SQLite would be wiped on every deploy.

Create the Droplet

  1. Create an Ubuntu 24.04 Droplet

    Any size works; 1 GB RAM is a comfortable minimum. Note the public IP.

  2. Point a domain at it

    Add an A record for your hostname to the Droplet IP. Caddy needs this to obtain a Let’s Encrypt certificate.

  3. Open ports 80 and 443

    In DigitalOcean’s firewall (and the Droplet’s own ufw). Caddy handles both HTTP and HTTPS, including the /ws WebSocket upgrade.

  4. Run the production stack

    SSH in and bring up the compose file. It pulls the official image, mounts the data volume, and starts Caddy in front of it.

terminal
git clone https://github.com/RajdeepDevelopment/smoke-monkey-canvas.git
cd smoke-monkey-canvas/deploy

# Set SMOKE_DOMAIN to your hostname, then start
cp .env.example .env
nano .env
docker compose -f docker-compose.vps.yml up -d
ℹ️ Optional PostgreSQL for SQL MCP tools

Canvas itself needs no database server. If you attach SQL-based MCP servers to your agents, start the bundled PostgreSQL with the postgres profile and set POSTGRES_PASSWORD in .env first — the stack is pinned to scram-sha-256, so Postgres fails loudly rather than starting passwordless. It stays on the private Docker network and is never published to the internet.

Deploy to Northflank

◷ Template ready · not published

The entire stack is representable as a single Northflank Template, and that file is committed to this repository — a deployment service, a persistent volume mounted at /app/data, a public HTTP port, and a readiness probe.

ℹ️ Why no public one-click link

Northflank generates template share links inside your own team after you create the template, and that URL format is not documented publicly. Committing the template to the repo and letting Northflank’s GitOps pick it up is the supported route, so this page links to the file rather than a URL we cannot verify.

  1. Commit / fork the template

    northflank.template.json lives at the repository root and validates against Northflank’s published template schema.

  2. Create the template from it

    Run it once in the Northflank UI, or use the official CLI. The project, volume, and service are created together. northflank login opens a browser to pick an API token, so create one in Account settings → API tokens first.

  3. Copy the share link

    Northflank generates it after creation. Anyone with a Northflank account can open it, add the template to their team, and run it.

terminal
# Create the Northflank template from the committed file
npm i -g @northflank/cli
northflank login
northflank create template -f northflank.template.json
⚠️ Cost notes before you deploy
  • A payment method is required to create resources, even on the free Sandbox tier.
  • The template uses nf-compute-50 (1 GB). The 256 MB minimum is too tight for Node plus SQLite.
  • Storage is billed separately (~$0.15/GB/month) and network egress at ~$0.06/GB. Calls to OpenAI or Anthropic count as egress, so set a billing alert.
  • Northflank never sleeps services, which makes it a good fit for cron-scheduled agents.

Docker / Manual Setup

● Available now

No provider approval, no marketplace, no waiting. Works on any machine with Docker — a VPS, a NAS, a homelab box, or your laptop.

Quickest — single container

terminal
docker run -d \
  --name smoke-monkey-canvas \
  --restart unless-stopped \
  -p 3333:3333 \
  -v smoke_canvas_data:/app/data \
  rajdeepsadhu/smoke-monkey-canvas:latest

Then open http://localhost:3333. The named volume is what keeps your agents across restarts — do not skip -v.

Production — TLS + optional PostgreSQL

deploy/docker-compose.vps.yml runs the canvas image behind Caddy, which obtains a certificate automatically and proxies the WebSocket stream.

terminal
# Production stack: canvas + Caddy with automatic TLS
cd deploy
cp .env.example .env      # set SMOKE_DOMAIN
docker compose -f docker-compose.vps.yml up -d

# Add PostgreSQL for SQL-based MCP servers
docker compose -f docker-compose.vps.yml --profile postgres up -d

# Logs and shutdown
docker compose -f docker-compose.vps.yml logs -f canvas
docker compose -f docker-compose.vps.yml down

From source — no Docker

Requires Node.js 22 or newer (for the built-in node:sqlite module).

terminal
# Run instantly, no install
npx smoke-monkey-canvas

# Or install from source
git clone https://github.com/RajdeepDevelopment/smoke-monkey-canvas.git
cd smoke-monkey-canvas
npm install && npm run build
npm start
Under the hood

What every deployment includes

No matter which provider you pick, the runtime contract is identical. That is the point of shipping one image and one health endpoint.

Deployment requirements for Smoke Monkey Canvas
RequirementValueWhy it matters
Docker imagerajdeepsadhu/smoke-monkey-canvasMulti-arch: linux/amd64 and linux/arm64
Listen portPORT (default 3333)Railway, Render, and DigitalOcean inject this automatically
Persistence/app/dataSQLite database — must be a mounted volume/disk
Database pathSMOKE_CANVAS_DBSet to /app/data/canvas.db on every provider here
Health checkGET /api/spaceReadiness endpoint used by every platform
WebSocket/wsLive agent streaming — supported on all four providers
REST API/api/*Agents, sessions, skills, MCP, settings
RedisNot requiredNo queue or cache dependency
PostgreSQLOptionalOnly if you attach SQL-based MCP servers to agents
SecretsEncrypted in SQLiteAPI keys added via the UI are encrypted at rest
After you deploy

Four steps to your first agent

Identical on every provider. Takes about two minutes.

  1. 1Open your deployment URLRender, Railway, and Northflank give you a hostname on deploy. For a VPS it is the domain you pointed at the server.
  2. 2Add an LLM API keyOpen any agent → Settings → Provider and paste a key for NVIDIA, OpenAI, Anthropic, Gemini, Groq, DeepSeek, or OpenRouter. It is encrypted at rest. Ollama needs no key.
  3. 3Create your first agentClick + New Agent on the canvas toolbar, pick a model, write a system prompt, then Run or just start chatting.
  4. 4Back up your volumeYour agents and chat history live in one SQLite file on the mounted volume. Enable provider snapshots or schedule sqlite3 canvas.db ".backup" so a bad deploy cannot cost you your workspace.
FAQ

Questions before you deploy

Which provider is a real one-click deploy right now?

Render. It uses Render’s official Blueprint deploy URL and reads the render.yaml at the root of this repository, so the whole stack is provisioned from one click.

Railway and Northflank both need a template published to their platform before a one-click URL exists, and DigitalOcean 1-Click Apps require Marketplace vendor approval. Each of those is shown with its true status and a working setup path instead of a button that would not work.

Why is DigitalOcean not a one-click option when the others are?

Distribution models differ. Railway and Northflank let a maintainer publish a template to a self-serve marketplace in minutes. DigitalOcean 1-Click Apps are pre-baked Ubuntu snapshots built with Packer, and becoming a Marketplace vendor requires DigitalOcean’s approval. That is a separate application with no published SLA, and no listing has been submitted, so this page does not claim otherwise.

In the meantime a plain Ubuntu Droplet gives you the same result with more control, which is what the DigitalOcean section walks you through.

Will my agents survive a redeploy?

Yes, as long as a persistent volume or disk is mounted at /app/data. Every option on this page configures that mount. Your agents, chat sessions, canvas positions, and encrypted API keys live in a single SQLite file there.

The one environment where this cannot work is a platform without volume support — which is why DigitalOcean App Platform is explicitly not recommended here: its filesystem is ephemeral and is wiped on every deploy.

Do I need my own LLM API key?

Yes. Smoke Monkey Canvas orchestrates agents, it does not host models. Bring a key for NVIDIA, OpenAI, Anthropic, Gemini, Groq, DeepSeek, or OpenRouter — entered in the agent settings UI (encrypted at rest) or supplied as an environment variable such as OPENAI_API_KEY. If you run Ollama locally, no key is needed.

Do I need Redis or PostgreSQL?

No. The cron scheduler, the WebSocket broadcast server, and all persistence run inside the single Node.js process backed by SQLite. PostgreSQL is optional and only useful if you attach SQL-based MCP servers to your agents; the Docker stack includes it behind a profile you can switch on.

Is there a hosted version I can just sign up for?

No, deliberately. Smoke Monkey is built to be self-hosted, and the license does not permit offering it as a commercial hosted service. Deploy it to your own account on any of the providers above and you own the data, the keys, and the bill.

Can I move between providers later?

Yes. Everything is in one SQLite file. Stop the service, copy /app/data/canvas.db off the volume, start it on another provider, and place the file at the same path. The deployment configs differ, but your workspace is portable.

What license is this under?

The Sustainable Use License. It is free for personal projects, research, and internal business tooling, and you may modify and redistribute it non-commercially. You may not offer Canvas as a commercial hosted service or SaaS product without a commercial license.

Ready when you are

One command locally, or one click to Render. Everything else is your own server.