Roadmap · Website · Docs · Discord
- 👁️ 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 (coming soon) : Save time with reusable board templates
- ⚡️ Integrations (coming soon) : Connect your favourite tools
See our roadmap for upcoming features.
The easiest way to self-host Kan is with Docker Compose. This will set up everything for you including your postgres database.
- Create a new file called docker-compose.ymland paste the following configuration:
services:
  web:
    image: ghcr.io/kanbn/kan:latest
    container_name: kan-web
    ports:
      - "3000:3000"
    networks:
      - kan-network
    environment:
      NEXT_PUBLIC_BASE_URL: http://localhost:3000
      BETTER_AUTH_SECRET: your_auth_secret
      POSTGRES_URL: postgresql://kan:your_postgres_password@postgres:5432/kan_db
      NEXT_PUBLIC_ALLOW_CREDENTIALS: true
    depends_on:
      - postgres
    restart: unless-stopped
  postgres:
    image: postgres:15
    container_name: kan-db
    environment:
      POSTGRES_DB: kan_db
      POSTGRES_USER: kan
      POSTGRES_PASSWORD: your_postgres_password
    ports:
      - 5432:5432
    volumes:
      - kan_postgres_data:/var/lib/postgresql/data
    restart: unless-stopped
    networks:
      - kan-network
networks:
  kan-network:
volumes:
  kan_postgres_data:- Start the containers in detached mode:
docker compose up -d- Access Kan at http://localhost:3000
The application will be running in the background. You can manage the containers using these commands:
- To stop the containers: docker compose down
- To view logs: docker compose logs -f
- To restart the containers: docker compose restart
For the complete Docker Compose configuration, see docker-compose.yml in the repository.
Note: The Docker Compose configuration shown above is a minimal example. For a complete setup with all features (email, OAuth, file uploads, etc.), you'll need to create a
.envfile with the required environment variables. See the Environment Variables section below for the full list of available options.
- 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| Variable | Description | Required | Example | 
|---|---|---|---|
| POSTGRES_URL | PostgreSQL connection URL | Yes | postgres://user:pass@localhost:5432/db | 
| EMAIL_FROM | Sender email address | For Email | "Kan <[email protected]>" | 
| SMTP_HOST | SMTP server hostname | For Email | smtp.resend.com | 
| SMTP_PORT | SMTP server port | For Email | 465 | 
| SMTP_USER | SMTP username/email | For Email | resend | 
| SMTP_PASSWORD | SMTP password/token | For Email | re_xxxx | 
| NEXT_PUBLIC_BASE_URL | Base URL of your installation | Yes | http://localhost:3000 | 
| 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 | 
| 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 | xxx | 
| S3_SECRET_ACCESS_KEY | S3 secret key | For file uploads | xxx | 
| 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_AVATAR_BUCKET_NAME | S3 bucket name for avatars | For file uploads | avatars | 
| NEXT_PUBLIC_ALLOW_CREDENTIALS | Allow email & password login | For authentication | true | 
| NEXT_PUBLIC_DISABLE_SIGN_UP | Disable sign up | For authentication | false | 
See .env.example for a complete list of supported environment variables.
We welcome contributions! Please read our contribution guidelines before submitting a pull request.
Kan is licensed under the AGPLv3 license.
For support or to get in touch, please email [email protected] or join our Discord server.