Skip to content

Quick Start

Get Doable running on your machine in under 5 minutes.

The fastest path: Docker

You only need Docker (any version with Compose v2 built in, such as Docker Desktop 4.0+ or any recent Docker CE).

Linux, macOS, or Windows via WSL2

git clone https://github.com/doable-me/doable.git
cd doable
./deployment/docker/setup.sh

Native Windows (no WSL, no Git Bash)

git clone https://github.com/doable-me/doable.git
cd doable
.\deployment\docker\setup.ps1

PowerShell 5.1 (built into Windows 10/11) is enough. See Windows Quick Start for the full PowerShell walkthrough with -Domain, -DoableHost, -InstallTrust, and -Prebuilt flag examples.

What the script does

When prompted, press Enter to default to localhost. The script will:

  1. Generate deployment/docker/.env with secure random secrets (JWT_SECRET, ENCRYPTION_KEY, INTERNAL_SECRET, DOABLE_KEK, POSTGRES_PASSWORD, DOABLE_APP_PASSWORD, INSTALL_BOOTSTRAP_TOKEN).
  2. Download mkcert (one-time), install its local CA into your OS + browser trust stores, and issue a leaf cert for localhost at deployment/docker/certs/. Chrome, Edge, Firefox, and Safari all trust it after a single browser restart.
  3. Build the Docker images (~5-10 minutes the first time, or ~30s with --prebuilt / -Prebuilt once ghcr.io/doable-me/doable-* images are public).
  4. Start PostgreSQL, the API, the WebSocket server, the Next.js web app, and the Caddy TLS terminator.
  5. Wait for the one-shot migrate container to apply DB migrations cleanly before reporting success.

When it finishes, open https://localhost. No certificate warning, because mkcert already installed trust.

Why HTTPS even on localhost? Some browser features Doable uses (clipboard, service workers, modern crypto) require a secure context.

First user becomes platform owner

Visit https://localhost/signup. The first account to sign up is auto-promoted to platform owner. No SSH, no SQL, no editing .env files. After signup you're guided through a 5-step setup wizard at /setup: Welcome, Sign-in, AI Provider, Cloudflare, Plans & Billing.

Without an AI key Doable still runs. You can browse the dashboard, sign up, and create projects, but the chat agent has nothing to talk to. Easiest path: use the AI provider step of the setup wizard at /setup (50+ providers including OpenAI, Anthropic, Gemini, OpenRouter, MiniMax, Groq, DeepSeek, plus local servers like Ollama, LM Studio, vLLM).

Or pre-export any of these before re-running setup.sh / setup.ps1 and the wizard's AI step starts pre-configured (first non-empty wins):

ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
GEMINI_API_KEY=...
MINIMAX_API_KEY=sk-cp-...
# OPENROUTER_API_KEY, TOGETHER_API_KEY, GROQ_API_KEY, DEEPSEEK_API_KEY,
# MISTRAL_API_KEY, COHERE_API_KEY, XAI_API_KEY, PERPLEXITY_API_KEY,
# DEEPINFRA_API_KEY, NVIDIA_API_KEY, MOONSHOT_API_KEY, ZHIPU_API_KEY,
# OPENCODE_ZEN_API_KEY, FIREWORKS_API_KEY, CEREBRAS_API_KEY

Or edit deployment/docker/.env after install and restart the API container:

docker compose -f deployment/docker/docker-compose.yml restart api ws

See AI / Providers for details on each provider.

Stop / clean up

# Stop containers (data preserved)
docker compose -f deployment/docker/docker-compose.yml down

# Stop and DELETE all data (database, projects, thumbnails, ACME state)
docker compose -f deployment/docker/docker-compose.yml down -v

Common issues

Symptom Fix
Browser shows certificate warning on localhost mkcert trust install was skipped or Chrome hasn't been restarted since. Re-run setup.sh / setup.ps1, then close every Chrome window and reopen.
502 Bad Gateway right after start Wait 30 seconds. The API is still booting; Caddy returns 502 until the api healthcheck passes.
Set JWT_SECRET in docker/.env (or similar VAR is required) Re-run ./deployment/docker/setup.sh (or setup.ps1) so it regenerates deployment/docker/.env. The compose file uses ${VAR:?required} and aborts on any empty secret.
Migration container exited with code 1 Usually a stale postgres_data volume from a previous install with a different password. Run docker compose -f deployment/docker/docker-compose.yml --env-file deployment/docker/.env down -v and rerun setup.
Port 80 or 443 already in use Stop any host-side nginx / apache / Caddy first (sudo systemctl stop nginx), or run with --skip-ssl to bind Caddy to 127.0.0.1 only.

More in Troubleshooting.

What's next?