Kan
The open source Trello alternative.
Install / Use
/learn @kanbn/KanREADME
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 👁️
<img width="1507" alt="hero-dark" src="https://github.com/user-attachments/assets/8490104a-cd5d-49de-afc2-152fd8a93119" />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.
<a href="https://railway.com/deploy/kan?referralCode=bZPsr2&utm_medium=integration&utm_source=template&utm_campaign=generic"> <img src="https://railway.app/button.svg" alt="Deploy on Railway" height="40" /> </a>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.
-
Create a
.envfile with your environment variables (see Environment Variables section below) -
Use the provided
docker-compose.ymlfile 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:
- 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 webordocker 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 🧑💻
- Clone the repository (or fork)
git clone https://github.com/kanbn/kan.git
- Install dependencies
pnpm install
- Copy
.env.exampleto.envand configure your environment variables - Migrate database
pnpm db:migrate
- Start the development server
pnpm dev
Environment Variables 🔐
| 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 sec
Related Skills
node-connect
334.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
82.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
Writing Hookify Rules
82.1kThis skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
openai-whisper-api
334.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
