kanbn/kan

The open source Trello alternative.

TypeScript

5,759

859 commits

updated Oct 2, 2026

See the code

README

github-background

Kan

The open-source project management alternative to Trello.

Roadmap · Website · Docs · Discord

License

Features 💫

  • 👁️ Board Visibility: Control who can view and edit your boards
  • 🤝 Workspace Members: Invite members and collaborate with your team
  • 🚀 Trello Imports: Easily import your Trello boards
  • 🔍 Labels & Filters: Organise and find cards quickly
  • 💬 Comments: Discuss and collaborate with your team
  • 📝 Activity Log: Track all card changes with detailed activity history
  • 🎨 Templates : Save time with reusable custom board templates
  • ⚡️ Integrations (coming soon) : Connect your favourite tools

See our roadmap for upcoming features.

Screenshot 👁️

hero-dark

Made With 🛠️

Self Hosting 🐳

One-click Deployments

The easiest way to deploy Kan is through Railway. We've partnered with Railway to maintain an official template that supports the development of the project.

Deploy on Railway

Docker Compose

Alternatively, you can self-host Kan with Docker Compose. This will set up everything for you including your postgres database and automatically run migrations.

  1. Create a .env file with your environment variables (see Environment Variables section below)

  2. Use the provided docker-compose.yml file or create your own with the following configuration:

services:
  migrate:
    image: ghcr.io/kanbn/kan-migrate:latest
    container_name: kan-migrate
    networks:
      - kan-network
    environment:
      - POSTGRES_URL=${POSTGRES_URL}
    depends_on:
      postgres:
        condition: service_healthy
    restart: "no"

  web:
    image: ghcr.io/kanbn/kan:latest
    container_name: kan-web
    ports:
      - "${WEB_PORT:-3000}:3000"
    networks:
      - kan-network
    env_file:
      - .env
    environment:
      - NEXT_PUBLIC_BASE_URL=${NEXT_PUBLIC_BASE_URL}
      - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
      - POSTGRES_URL=${POSTGRES_URL}
      - NEXT_PUBLIC_ALLOW_CREDENTIALS=true
    depends_on:
      migrate:
        condition: service_completed_successfully
    restart: unless-stopped

  postgres:
    image: postgres:15
    container_name: kan-db
    environment:
      - POSTGRES_DB=kan_db
      - POSTGRES_USER=kan
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    ports:
      - 5432:5432
    volumes:
      - kan_postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U kan -d kan_db"]
      interval: 5s
      timeout: 5s
      retries: 10
    restart: unless-stopped
    networks:
      - kan-network

networks:
  kan-network:

volumes:
  kan_postgres_data:
  1. Start the containers in detached mode:
docker compose up -d

The migrate service will automatically run database migrations before the web service starts. The application will be available at http://localhost:3000 (or the port specified in WEB_PORT).

Managing containers:

  • To stop the containers: docker compose down
  • To view logs: docker compose logs -f
  • To view logs for a specific service: docker compose logs -f web or docker compose logs -f migrate
  • To restart the containers: docker compose restart
  • To rebuild after code changes: docker compose up -d --build

For the complete Docker Compose configuration with all optional features, see docker-compose.yml in the repository.

Local Development 🧑‍💻

  1. Clone the repository (or fork)
git clone https://github.com/kanbn/kan.git
  1. Install dependencies
pnpm install
  1. Copy .env.example to .env and configure your environment variables
  2. Migrate database
pnpm db:migrate
  1. Start the development server
pnpm dev

Environment Variables 🔐

VariableDescriptionRequiredExample
POSTGRES_URLPostgreSQL connection URLTo use external databasepostgres://user:pass@localhost:5432/db
REDIS_URLRedis connection URLFor rate limiting (optional)redis://localhost:6379 or redis://redis:6379 (Docker)
EMAIL_FROMSender email addressFor Email"Kan <hello@mail.kan.bn>"
SMTP_HOSTSMTP server hostnameFor Emailsmtp.resend.com
SMTP_PORTSMTP server portFor Email465
SMTP_USERSMTP username/emailNoresend
SMTP_PASSWORDSMTP password/tokenNore_xxxx
SMTP_SECUREUse secure SMTP connection (defaults to true if not set)For Emailtrue
SMTP_REJECT_UNAUTHORIZEDReject invalid certificates (defaults to true if not set)For Emailfalse
NEXT_PUBLIC_DISABLE_EMAILTo disable all email featuresFor Emailtrue
NEXT_PUBLIC_BASE_URLBase URL of your installationYeshttp://localhost:3000
NEXT_API_BODY_SIZE_LIMITMaximum API request body size (defaults to 1mb)No50mb
BETTER_AUTH_ALLOWED_DOMAINSComma-separated list of allowed domains for OIDC loginsFor OIDC/Social loginexample.com,subsidiary.com
BETTER_AUTH_SECRETAuth encryption secretYesRandom 32+ char string
BETTER_AUTH_TRUSTED_ORIGINSAllowed callback originsNohttp://localhost:3000,http://localhost:3001
GOOGLE_CLIENT_IDGoogle OAuth client IDFor Google loginxxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRETGoogle OAuth client secretFor Google loginxxx
DISCORD_CLIENT_IDDiscord OAuth client IDFor Discord loginxxx
DISCORD_CLIENT_SECRETDiscord OAuth client secretFor Discord loginxxx
GITHUB_CLIENT_IDGitHub OAuth client IDFor GitHub loginxxx
GITHUB_CLIENT_SECRETGitHub OAuth client secretFor GitHub loginxxx
OIDC_CLIENT_IDGeneric OIDC client IDFor OIDC loginxxx
OIDC_CLIENT_SECRETGeneric OIDC client secretFor OIDC loginxxx
OIDC_DISCOVERY_URLOIDC discovery URLFor OIDC loginhttps://auth.example.com/.well-known/openid-configuration
TRELLO_APP_API_KEYTrello app API keyFor Trello importxxx
TRELLO_APP_API_SECRETTrello app API secretFor Trello importxxx
S3_REGIONS3 storage regionFor file uploadsWEUR
S3_ENDPOINTS3 endpoint URLFor file uploadshttps://xxx.r2.cloudflarestorage.com
S3_ACCESS_KEY_IDS3 access keyFor file uploads (optional with IRSA)xxx
S3_SECRET_ACCESS_KEYS3 secret keyFor file uploads (optional with IRSA)xxx
S3_FORCE_PATH_STYLEUse path-style URLs for S3For file uploadstrue
S3_AVATAR_UPLOAD_LIMITMaximum avatar file size in bytesFor file uploads2097152 (2MB)
NEXT_PUBLIC_STORAGE_URLStorage service URLFor file uploadshttps://storage.kanbn.com
NEXT_PUBLIC_STORAGE_DOMAINStorage domain nameFor file uploadskanbn.com
NEXT_PUBLIC_USE_VIRTUAL_HOSTED_URLSUse virtual-hosted style URLs (bucket.domain.com)For file uploads (optional)true
NEXT_PUBLIC_AVATAR_BUCKET_NAMES3 bucket name for avatarsFor file uploadsavatars
NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAMES3 bucket name for attachmentsFor file uploadsattachments
NEXT_PUBLIC_ALLOW_CREDENTIALSAllow email & password loginFor authenticationtrue
NEXT_PUBLIC_DISABLE_SIGN_UPDisable sign upFor authenticationfalse
NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BYHide “Powered by kan.bn” on public boards (self-host)For white labellingtrue
KAN_ADMIN_API_KEYAdmin API key for stats and admin endpointsFor admin/monitoringyour-secret-admin-key
LOG_LEVELLog verbosity level (debug, info, warn, error)No (defaults to debug in dev, info in prod)info

See .env.example for a complete list of supported environment variables.

MCP Server (AI Control) 🤖

Kan ships with a Model Context Protocol (MCP) server that lets any MCP-compatible AI client (Claude Desktop, Codex, Cursor, GitHub Copilot, and others) read and control your Kan instance using natural language.

Run it with npx, no clone or global install required:

npx -y @kan/mcp

Configure it with two environment variables: KAN_BASE_URL (your Kan instance) and KAN_API_TOKEN (from Settings → API Keys). Then point your client's MCP config at the npx -y @kan/mcp command.

See the MCP Server docs for per-client config (Claude Desktop, Codex, and others), example prompts, the full tool reference, and troubleshooting.

Contributing 🤝

We welcome contributions! Please read our contribution guidelines before submitting a pull request.

Contributors 👥

Sponsors ❤️

image

Proudly sponsored by TestMu AI (formerly LambdaTest) - an AI-native testing cloud platform built for modern engineering teams. Covering everything from autonomous test creation and fast execution to testing AI agents like chatbots and voice assistants. If you're serious about testing, go check them out.

License 📝

Kan is licensed under the AGPLv3 license.

Contact 📧

For support or to get in touch, please email henry@kan.bn or join our Discord server.

better-auth
drizzle-orm
nextjs
open-source
tailwindcss
trpc
turborepo
typescript
zod

kanbn/kan

The open source Trello alternative.

TypeScript

5,759

859 commits

updated Oct 2, 2026

See the code

README

github-background

Kan

The open-source project management alternative to Trello.

Roadmap · Website · Docs · Discord

License

Features 💫

  • 👁️ Board Visibility: Control who can view and edit your boards
  • 🤝 Workspace Members: Invite members and collaborate with your team
  • 🚀 Trello Imports: Easily import your Trello boards
  • 🔍 Labels & Filters: Organise and find cards quickly
  • 💬 Comments: Discuss and collaborate with your team
  • 📝 Activity Log: Track all card changes with detailed activity history
  • 🎨 Templates : Save time with reusable custom board templates
  • ⚡️ Integrations (coming soon) : Connect your favourite tools

See our roadmap for upcoming features.

Screenshot 👁️

hero-dark

Made With 🛠️

Self Hosting 🐳

One-click Deployments

The easiest way to deploy Kan is through Railway. We've partnered with Railway to maintain an official template that supports the development of the project.

Deploy on Railway

Docker Compose

Alternatively, you can self-host Kan with Docker Compose. This will set up everything for you including your postgres database and automatically run migrations.

  1. Create a .env file with your environment variables (see Environment Variables section below)

  2. Use the provided docker-compose.yml file or create your own with the following configuration:

services:
  migrate:
    image: ghcr.io/kanbn/kan-migrate:latest
    container_name: kan-migrate
    networks:
      - kan-network
    environment:
      - POSTGRES_URL=${POSTGRES_URL}
    depends_on:
      postgres:
        condition: service_healthy
    restart: "no"

  web:
    image: ghcr.io/kanbn/kan:latest
    container_name: kan-web
    ports:
      - "${WEB_PORT:-3000}:3000"
    networks:
      - kan-network
    env_file:
      - .env
    environment:
      - NEXT_PUBLIC_BASE_URL=${NEXT_PUBLIC_BASE_URL}
      - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
      - POSTGRES_URL=${POSTGRES_URL}
      - NEXT_PUBLIC_ALLOW_CREDENTIALS=true
    depends_on:
      migrate:
        condition: service_completed_successfully
    restart: unless-stopped

  postgres:
    image: postgres:15
    container_name: kan-db
    environment:
      - POSTGRES_DB=kan_db
      - POSTGRES_USER=kan
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    ports:
      - 5432:5432
    volumes:
      - kan_postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U kan -d kan_db"]
      interval: 5s
      timeout: 5s
      retries: 10
    restart: unless-stopped
    networks:
      - kan-network

networks:
  kan-network:

volumes:
  kan_postgres_data:
  1. Start the containers in detached mode:
docker compose up -d

The migrate service will automatically run database migrations before the web service starts. The application will be available at http://localhost:3000 (or the port specified in WEB_PORT).

Managing containers:

  • To stop the containers: docker compose down
  • To view logs: docker compose logs -f
  • To view logs for a specific service: docker compose logs -f web or docker compose logs -f migrate
  • To restart the containers: docker compose restart
  • To rebuild after code changes: docker compose up -d --build

For the complete Docker Compose configuration with all optional features, see docker-compose.yml in the repository.

Local Development 🧑‍💻

  1. Clone the repository (or fork)
git clone https://github.com/kanbn/kan.git
  1. Install dependencies
pnpm install
  1. Copy .env.example to .env and configure your environment variables
  2. Migrate database
pnpm db:migrate
  1. Start the development server
pnpm dev

Environment Variables 🔐

VariableDescriptionRequiredExample
POSTGRES_URLPostgreSQL connection URLTo use external databasepostgres://user:pass@localhost:5432/db
REDIS_URLRedis connection URLFor rate limiting (optional)redis://localhost:6379 or redis://redis:6379 (Docker)
EMAIL_FROMSender email addressFor Email"Kan <hello@mail.kan.bn>"
SMTP_HOSTSMTP server hostnameFor Emailsmtp.resend.com
SMTP_PORTSMTP server portFor Email465
SMTP_USERSMTP username/emailNoresend
SMTP_PASSWORDSMTP password/tokenNore_xxxx
SMTP_SECUREUse secure SMTP connection (defaults to true if not set)For Emailtrue
SMTP_REJECT_UNAUTHORIZEDReject invalid certificates (defaults to true if not set)For Emailfalse
NEXT_PUBLIC_DISABLE_EMAILTo disable all email featuresFor Emailtrue
NEXT_PUBLIC_BASE_URLBase URL of your installationYeshttp://localhost:3000
NEXT_API_BODY_SIZE_LIMITMaximum API request body size (defaults to 1mb)No50mb
BETTER_AUTH_ALLOWED_DOMAINSComma-separated list of allowed domains for OIDC loginsFor OIDC/Social loginexample.com,subsidiary.com
BETTER_AUTH_SECRETAuth encryption secretYesRandom 32+ char string
BETTER_AUTH_TRUSTED_ORIGINSAllowed callback originsNohttp://localhost:3000,http://localhost:3001
GOOGLE_CLIENT_IDGoogle OAuth client IDFor Google loginxxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRETGoogle OAuth client secretFor Google loginxxx
DISCORD_CLIENT_IDDiscord OAuth client IDFor Discord loginxxx
DISCORD_CLIENT_SECRETDiscord OAuth client secretFor Discord loginxxx
GITHUB_CLIENT_IDGitHub OAuth client IDFor GitHub loginxxx
GITHUB_CLIENT_SECRETGitHub OAuth client secretFor GitHub loginxxx
OIDC_CLIENT_IDGeneric OIDC client IDFor OIDC loginxxx
OIDC_CLIENT_SECRETGeneric OIDC client secretFor OIDC loginxxx
OIDC_DISCOVERY_URLOIDC discovery URLFor OIDC loginhttps://auth.example.com/.well-known/openid-configuration
TRELLO_APP_API_KEYTrello app API keyFor Trello importxxx
TRELLO_APP_API_SECRETTrello app API secretFor Trello importxxx
S3_REGIONS3 storage regionFor file uploadsWEUR
S3_ENDPOINTS3 endpoint URLFor file uploadshttps://xxx.r2.cloudflarestorage.com
S3_ACCESS_KEY_IDS3 access keyFor file uploads (optional with IRSA)xxx
S3_SECRET_ACCESS_KEYS3 secret keyFor file uploads (optional with IRSA)xxx
S3_FORCE_PATH_STYLEUse path-style URLs for S3For file uploadstrue
S3_AVATAR_UPLOAD_LIMITMaximum avatar file size in bytesFor file uploads2097152 (2MB)
NEXT_PUBLIC_STORAGE_URLStorage service URLFor file uploadshttps://storage.kanbn.com
NEXT_PUBLIC_STORAGE_DOMAINStorage domain nameFor file uploadskanbn.com
NEXT_PUBLIC_USE_VIRTUAL_HOSTED_URLSUse virtual-hosted style URLs (bucket.domain.com)For file uploads (optional)true
NEXT_PUBLIC_AVATAR_BUCKET_NAMES3 bucket name for avatarsFor file uploadsavatars
NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAMES3 bucket name for attachmentsFor file uploadsattachments
NEXT_PUBLIC_ALLOW_CREDENTIALSAllow email & password loginFor authenticationtrue
NEXT_PUBLIC_DISABLE_SIGN_UPDisable sign upFor authenticationfalse
NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BYHide “Powered by kan.bn” on public boards (self-host)For white labellingtrue
KAN_ADMIN_API_KEYAdmin API key for stats and admin endpointsFor admin/monitoringyour-secret-admin-key
LOG_LEVELLog verbosity level (debug, info, warn, error)No (defaults to debug in dev, info in prod)info

See .env.example for a complete list of supported environment variables.

MCP Server (AI Control) 🤖

Kan ships with a Model Context Protocol (MCP) server that lets any MCP-compatible AI client (Claude Desktop, Codex, Cursor, GitHub Copilot, and others) read and control your Kan instance using natural language.

Run it with npx, no clone or global install required:

npx -y @kan/mcp

Configure it with two environment variables: KAN_BASE_URL (your Kan instance) and KAN_API_TOKEN (from Settings → API Keys). Then point your client's MCP config at the npx -y @kan/mcp command.

See the MCP Server docs for per-client config (Claude Desktop, Codex, and others), example prompts, the full tool reference, and troubleshooting.

Contributing 🤝

We welcome contributions! Please read our contribution guidelines before submitting a pull request.

Contributors 👥

Sponsors ❤️

image

Proudly sponsored by TestMu AI (formerly LambdaTest) - an AI-native testing cloud platform built for modern engineering teams. Covering everything from autonomous test creation and fast execution to testing AI agents like chatbots and voice assistants. If you're serious about testing, go check them out.

License 📝

Kan is licensed under the AGPLv3 license.

Contact 📧

For support or to get in touch, please email henry@kan.bn or join our Discord server.

better-auth
drizzle-orm
nextjs
open-source
tailwindcss
trpc
turborepo
typescript
zod

Significant stargazers

(top 24 of 51)

Matteo Collina

11,397 followers · starred Jun 2025

Sebastian Schuberth

470 followers · starred Jul 2026

Timothée Mazzucotelli

626 followers · starred Jun 2025

Nathan Broadbent

365 followers · starred Dec 2025