The open source Trello alternative.
See the codeThe open-source project management alternative to Trello.
Roadmap · Website · Docs · Discord
See our roadmap for upcoming features.
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.
Alternatively, you can self-host Kan with Docker Compose. This will set up everything for you including your postgres database and automatically run migrations.
Create a .env file with your environment variables (see Environment Variables section below)
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:
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:
docker compose downdocker compose logs -fdocker compose logs -f web or docker compose logs -f migratedocker compose restartdocker compose up -d --buildFor the complete Docker Compose configuration with all optional features, see docker-compose.yml in the repository.
git clone https://github.com/kanbn/kan.git
pnpm install
.env.example to .env and configure your environment variablespnpm db:migrate
pnpm dev
| Variable | Description | Required | Example |
|---|---|---|---|
POSTGRES_URL | PostgreSQL connection URL | To use external database | postgres://user:pass@localhost:5432/db |
REDIS_URL | Redis connection URL | For rate limiting (optional) | redis://localhost:6379 or redis://redis:6379 (Docker) |
EMAIL_FROM | Sender email address | For Email | "Kan <hello@mail.kan.bn>" |
SMTP_HOST | SMTP server hostname | For Email | smtp.resend.com |
SMTP_PORT | SMTP server port | For Email | 465 |
SMTP_USER | SMTP username/email | No | resend |
SMTP_PASSWORD | SMTP password/token | No | re_xxxx |
SMTP_SECURE | Use secure SMTP connection (defaults to true if not set) | For Email | true |
SMTP_REJECT_UNAUTHORIZED | Reject invalid certificates (defaults to true if not set) | For Email | false |
NEXT_PUBLIC_DISABLE_EMAIL | To disable all email features | For Email | true |
NEXT_PUBLIC_BASE_URL | Base URL of your installation | Yes | http://localhost:3000 |
NEXT_API_BODY_SIZE_LIMIT | Maximum API request body size (defaults to 1mb) | No | 50mb |
BETTER_AUTH_ALLOWED_DOMAINS | Comma-separated list of allowed domains for OIDC logins | For OIDC/Social login | example.com,subsidiary.com |
BETTER_AUTH_SECRET | Auth encryption secret | Yes | Random 32+ char string |
BETTER_AUTH_TRUSTED_ORIGINS | Allowed callback origins | No | http://localhost:3000,http://localhost:3001 |
GOOGLE_CLIENT_ID | Google OAuth client ID | For Google login | xxx.apps.googleusercontent.com |
GOOGLE_CLIENT_SECRET | Google OAuth client secret | For Google login | xxx |
DISCORD_CLIENT_ID | Discord OAuth client ID | For Discord login | xxx |
DISCORD_CLIENT_SECRET | Discord OAuth client secret | For Discord login | xxx |
GITHUB_CLIENT_ID | GitHub OAuth client ID | For GitHub login | xxx |
GITHUB_CLIENT_SECRET | GitHub OAuth client secret | For GitHub login | xxx |
OIDC_CLIENT_ID | Generic OIDC client ID | For OIDC login | xxx |
OIDC_CLIENT_SECRET | Generic OIDC client secret | For OIDC login | xxx |
OIDC_DISCOVERY_URL | OIDC discovery URL | For OIDC login | https://auth.example.com/.well-known/openid-configuration |
TRELLO_APP_API_KEY | Trello app API key | For Trello import | xxx |
TRELLO_APP_API_SECRET | Trello app API secret | For Trello import | xxx |
S3_REGION | S3 storage region | For file uploads | WEUR |
S3_ENDPOINT | S3 endpoint URL | For file uploads | https://xxx.r2.cloudflarestorage.com |
S3_ACCESS_KEY_ID | S3 access key | For file uploads (optional with IRSA) | xxx |
S3_SECRET_ACCESS_KEY | S3 secret key | For file uploads (optional with IRSA) | xxx |
S3_FORCE_PATH_STYLE | Use path-style URLs for S3 | For file uploads | true |
S3_AVATAR_UPLOAD_LIMIT | Maximum avatar file size in bytes | For file uploads | 2097152 (2MB) |
NEXT_PUBLIC_STORAGE_URL | Storage service URL | For file uploads | https://storage.kanbn.com |
NEXT_PUBLIC_STORAGE_DOMAIN | Storage domain name | For file uploads | kanbn.com |
NEXT_PUBLIC_USE_VIRTUAL_HOSTED_URLS | Use virtual-hosted style URLs (bucket.domain.com) | For file uploads (optional) | true |
NEXT_PUBLIC_AVATAR_BUCKET_NAME | S3 bucket name for avatars | For file uploads | avatars |
NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME | S3 bucket name for attachments | For file uploads | attachments |
NEXT_PUBLIC_ALLOW_CREDENTIALS | Allow email & password login | For authentication | true |
NEXT_PUBLIC_DISABLE_SIGN_UP | Disable sign up | For authentication | false |
NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY | Hide “Powered by kan.bn” on public boards (self-host) | For white labelling | true |
KAN_ADMIN_API_KEY | Admin API key for stats and admin endpoints | For admin/monitoring | your-secret-admin-key |
LOG_LEVEL | Log 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.
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.
We welcome contributions! Please read our contribution guidelines before submitting a pull request.
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.
Kan is licensed under the AGPLv3 license.
For support or to get in touch, please email henry@kan.bn or join our Discord server.
(top 24 of 51)
11,397 followers · starred Jun 2025
470 followers · starred Jul 2026
626 followers · starred Jun 2025
365 followers · starred Dec 2025
The open source Trello alternative.
See the codeThe open-source project management alternative to Trello.
Roadmap · Website · Docs · Discord
See our roadmap for upcoming features.
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.
Alternatively, you can self-host Kan with Docker Compose. This will set up everything for you including your postgres database and automatically run migrations.
Create a .env file with your environment variables (see Environment Variables section below)
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:
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:
docker compose downdocker compose logs -fdocker compose logs -f web or docker compose logs -f migratedocker compose restartdocker compose up -d --buildFor the complete Docker Compose configuration with all optional features, see docker-compose.yml in the repository.
git clone https://github.com/kanbn/kan.git
pnpm install
.env.example to .env and configure your environment variablespnpm db:migrate
pnpm dev
| Variable | Description | Required | Example |
|---|---|---|---|
POSTGRES_URL | PostgreSQL connection URL | To use external database | postgres://user:pass@localhost:5432/db |
REDIS_URL | Redis connection URL | For rate limiting (optional) | redis://localhost:6379 or redis://redis:6379 (Docker) |
EMAIL_FROM | Sender email address | For Email | "Kan <hello@mail.kan.bn>" |
SMTP_HOST | SMTP server hostname | For Email | smtp.resend.com |
SMTP_PORT | SMTP server port | For Email | 465 |
SMTP_USER | SMTP username/email | No | resend |
SMTP_PASSWORD | SMTP password/token | No | re_xxxx |
SMTP_SECURE | Use secure SMTP connection (defaults to true if not set) | For Email | true |
SMTP_REJECT_UNAUTHORIZED | Reject invalid certificates (defaults to true if not set) | For Email | false |
NEXT_PUBLIC_DISABLE_EMAIL | To disable all email features | For Email | true |
NEXT_PUBLIC_BASE_URL | Base URL of your installation | Yes | http://localhost:3000 |
NEXT_API_BODY_SIZE_LIMIT | Maximum API request body size (defaults to 1mb) | No | 50mb |
BETTER_AUTH_ALLOWED_DOMAINS | Comma-separated list of allowed domains for OIDC logins | For OIDC/Social login | example.com,subsidiary.com |
BETTER_AUTH_SECRET | Auth encryption secret | Yes | Random 32+ char string |
BETTER_AUTH_TRUSTED_ORIGINS | Allowed callback origins | No | http://localhost:3000,http://localhost:3001 |
GOOGLE_CLIENT_ID | Google OAuth client ID | For Google login | xxx.apps.googleusercontent.com |
GOOGLE_CLIENT_SECRET | Google OAuth client secret | For Google login | xxx |
DISCORD_CLIENT_ID | Discord OAuth client ID | For Discord login | xxx |
DISCORD_CLIENT_SECRET | Discord OAuth client secret | For Discord login | xxx |
GITHUB_CLIENT_ID | GitHub OAuth client ID | For GitHub login | xxx |
GITHUB_CLIENT_SECRET | GitHub OAuth client secret | For GitHub login | xxx |
OIDC_CLIENT_ID | Generic OIDC client ID | For OIDC login | xxx |
OIDC_CLIENT_SECRET | Generic OIDC client secret | For OIDC login | xxx |
OIDC_DISCOVERY_URL | OIDC discovery URL | For OIDC login | https://auth.example.com/.well-known/openid-configuration |
TRELLO_APP_API_KEY | Trello app API key | For Trello import | xxx |
TRELLO_APP_API_SECRET | Trello app API secret | For Trello import | xxx |
S3_REGION | S3 storage region | For file uploads | WEUR |
S3_ENDPOINT | S3 endpoint URL | For file uploads | https://xxx.r2.cloudflarestorage.com |
S3_ACCESS_KEY_ID | S3 access key | For file uploads (optional with IRSA) | xxx |
S3_SECRET_ACCESS_KEY | S3 secret key | For file uploads (optional with IRSA) | xxx |
S3_FORCE_PATH_STYLE | Use path-style URLs for S3 | For file uploads | true |
S3_AVATAR_UPLOAD_LIMIT | Maximum avatar file size in bytes | For file uploads | 2097152 (2MB) |
NEXT_PUBLIC_STORAGE_URL | Storage service URL | For file uploads | https://storage.kanbn.com |
NEXT_PUBLIC_STORAGE_DOMAIN | Storage domain name | For file uploads | kanbn.com |
NEXT_PUBLIC_USE_VIRTUAL_HOSTED_URLS | Use virtual-hosted style URLs (bucket.domain.com) | For file uploads (optional) | true |
NEXT_PUBLIC_AVATAR_BUCKET_NAME | S3 bucket name for avatars | For file uploads | avatars |
NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME | S3 bucket name for attachments | For file uploads | attachments |
NEXT_PUBLIC_ALLOW_CREDENTIALS | Allow email & password login | For authentication | true |
NEXT_PUBLIC_DISABLE_SIGN_UP | Disable sign up | For authentication | false |
NEXT_PUBLIC_WHITE_LABEL_HIDE_POWERED_BY | Hide “Powered by kan.bn” on public boards (self-host) | For white labelling | true |
KAN_ADMIN_API_KEY | Admin API key for stats and admin endpoints | For admin/monitoring | your-secret-admin-key |
LOG_LEVEL | Log 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.
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.
We welcome contributions! Please read our contribution guidelines before submitting a pull request.
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.
Kan is licensed under the AGPLv3 license.
For support or to get in touch, please email henry@kan.bn or join our Discord server.
(top 24 of 51)
11,397 followers · starred Jun 2025
470 followers · starred Jul 2026
626 followers · starred Jun 2025
365 followers · starred Dec 2025