Stack256 · 003

Project management on your own infrastructure.

Kanbanica is a self-hostable, ClickUp-style project management app. Teams organize work in Workspaces, Projects, and Sprints — track it on a board, a list, or a calendar, and collaborate in real time without ever sending your data to a SaaS vendor.

What makes it different

Most of these follow from one decision: it is a real application you run on your own server, not a service someone else hosts.

  • Real-time sync, no refresh

    Updates flow to every open client over Server-Sent Events as teammates move tasks, comment, or change status — no reload and no polling loop burning CPU.

  • Workspaces · Projects · Sprints

    A flexible hierarchy lets you organize any team's work, viewed as a board, a list, or a calendar. Sprints plan work into time-boxed cycles with story points and automatic close.

  • Two-level permissions

    Workspace roles control membership and billing; per-project access scopes guests to only the projects they are invited to. No flat "admin" or "user" — the granularity matches how teams actually work.

  • Your auth, your way

    Magic link, Google OAuth, or email and password — all converging on one account per email address. Auth is not a product decision you have to bolt on later.

  • Everything configurable from the UI

    SMTP, Google OAuth, S3/R2 storage, and Web Push are all set from Settings → Integrations — no .env edit or restart required (except Google OAuth, which is read at process start).

  • Your files, your storage

    Local disk in development; S3 or Cloudflare R2 in production, one setting. Your uploads never leave the storage you chose.

Installing it

You need Docker, and nothing else. No Node.js, no PostgreSQL install, no build step — the image is prebuilt and PostgreSQL comes with it.

  1. Get the two files

    A compose file and an environment file. That is the whole setup.

    curl -O https://raw.githubusercontent.com/stack256org/kanbanica/main/docker-compose.yml
    curl -o .env https://raw.githubusercontent.com/stack256org/kanbanica/main/.env.docker.example
  2. Set three values

    APP_SECRET (32+ random characters, from openssl rand -hex 32), APP_URL, and DATABASE_URL. Everything else has a working default.

  3. Start it

    This pulls the image, starts PostgreSQL, prepares the database, and leaves the app and its worker running.

    docker compose up -d
  4. Make your own login

    A separate, deliberate step, so you see whether it worked rather than it failing quietly inside a background service.

    docker compose run --rm app \
      pnpm create:admin you@example.com "Your Name" "a-strong-password"

Already have a PostgreSQL? Point DATABASE_URL at it and add the .external-db overlay — the bundled database container is never started, and migrations still run automatically before the app boots.

What it needs

Host Anything that runs containers — Compose, Coolify, Dokploy, Portainer, Kubernetes, Swarm, ECS
Image ghcr.io/stack256org/kanbanica
Architectures amd64 and arm64, in every tag
Processes The app, a worker (background jobs and email), and a one-off migrate step
Database PostgreSQL 16+ — bundled, or point it at your own (Neon, Supabase, RDS)
File storage Local disk, S3, or Cloudflare R2 — one setting
Health check GET /api/health, unauthenticated, reports database reachability
Licence MIT

Have a look at the code

Kanbanica is the third of 256. The README covers backups, the public API, deploying elsewhere, and everything else in detail.