Installation
How to install and run Kurrier on your own server.
Kurrier can be self-hosted on any modern Linux, macOS, or ARM device (including Raspberry Pi). It’s distributed as a Docker setup for convenience, but you can also run it manually from source if you prefer.
🧱 Kurrier’s core stack: Next.js + Nitro (API worker) + Postgres + Redis + IMAP/SMTP connectors
Prerequisites
Before you start, make sure you have:
- Docker and Docker Compose installed → Install Docker
- Git (for cloning the repository)
- At least 1 GB RAM and 1 vCPU (2 GB+ recommended for production)
- Optional: a domain name (for
mail.yourdomain.comor similar)
Quick start (Docker)
Clone the repository and copy the example environment file:
git clone --single-branch https://github.com/kurrier-org/kurrier.git
cd kurrier/db
cp example.env .env
cp -r init/* .
docker compose up -dOpen the .env file and update your secrets and passwords. You can also use the built-in secrets generator below to create a secure, production-ready passwords and secrets.
JWT_SECRET=replace_with_your_jwt_secret_key
APP_SECRET_ENCRYPTION_KEY=replace_with_your_app_secret_encryption_key🔐 Generate Secrets Automatically
If you don’t want to manually craft all the passwords and JWT keys, you can generate them instantly using the built-in generator below. It creates a secure, production-ready .env block. Make sure you update the rest of the variables.
🧩 Local vs. Hosted Setup
Kurrier can run in two modes — local and hosted (on a VPS etc with a domain name). Both work the same way, but differ in how external services like AWS SES, SendGrid, or Mailgun can reach your server.
🖥️ Local Setup
If you’re running Kurrier on your own laptop or private machine (http://localhost or internal IP), email providers can’t reach your API directly to deliver incoming messages or webhooks.
To solve this, Kurrier allows you to define your own public tunnel URL via any tunneling service such as ngrok, Cloudflare Tunnel, or LocalTunnel.
Example using ngrok:
ngrok http <port>You can also use any other tunneling service of your choice.
Update your .env file with the generated public URL:
LOCAL_TUNNEL_URL=https://your-ngrok-tunnel-url.ngrok-free.appWe highly recommend hosting Kurrier on a public server with a domain for production use as tunnels might not be reliable for production workloads and any downtime or change in the tunnel URL will break incoming email delivery and webhooks.
🖥️ Hosted Setup
When hosting Kurrier on a server or cloud instance (e.g. DigitalOcean, AWS, Hetzner, or your own VPS),
you should use your own domain and disable tunneling by removing or commenting out the LOCAL_TUNNEL_URL variable in your .env file.
WEB_URL=https://www.yourdomain.comDAV_URL also needs to be a publicly reachable address — it's the CalDAV/CardDAV
connection URL shown on the Sync Services page for configuring external clients
(Thunderbird, iOS, Android, etc). The default (http://localhost:5232) only works
for local setups. For a hosted deployment, set it to your own domain/port or a
reverse-proxied path, e.g. DAV_URL=https://dav.yourdomain.com.
Optional: hide Kurrier Drive
If your organization uses a separate file platform, such as Nextcloud, you can hide Kurrier Drive and its storage-management UI:
DISABLE_DRIVE=trueRestart the web container after changing this value. This setting only disables
Kurrier's Drive web interface. It does not disable the object storage used for
email, raw EML files, or attachments, and it does not delete existing Drive
data. Set the value back to false and restart the web container to restore the
Drive interface.
Optional: disable local login
For SSO-only deployments, you can hide the email/password login form and reject local login attempts server-side:
DISABLE_LOCAL_LOGIN=trueConfigure at least one Google or generic OIDC provider before enabling this option. Otherwise, the login page will report that no login methods are available. Restart the web container after changing the value.
This setting does not change signup availability. Use DISABLE_SIGNUP=true
separately when local account registration should also be disabled.
✅ Once you are all set with your environment variables you are now ready to run
docker compose up -d✅ To stop Kurrier, run
docker compose down🧭 Access the Dashboards
Once Docker finishes starting up, open the following URLs in your browser:
| Service | URL | Description |
|---|---|---|
| Kurrier Web Dashboard | http://localhost:3000/auth/login | Manage your mailboxes, messages, and settings |
To access Kurrier dashboard, signup and create your user account on http://localhost:3000/auth/signup