Early development — not production-ready. The API, schema, and UI are subject to breaking changes without notice. We welcome issues and pull requests, but please expect rough edges.
A self-hosted, open-source helpdesk built for teams who want full control over their support infrastructure. Built from scratch with a modern TypeScript stack.
A shared inbox and ticket system deployable via a single docker compose up. Email arrives via IMAP, agents reply through a web UI, everything is stored in your own PostgreSQL database and S3-compatible object storage.
| Area | State |
|---|---|
| Database schema | ✅ stable enough to build on |
| Hono API | 🔨 basic CRUD, auth working |
| IMAP worker | 🔨 polling + parsing implemented |
| Mailer worker | 🔨 queue-based sending |
| Web UI | 🚧 login + conversation list only |
| Attachments | 🚧 inbound works, upload UI missing |
| Search / Tags | ❌ not started |
| Realtime (SSE) | ❌ not started |
- Frontend — Astro 5, Svelte 5, Tailwind 4
- API — Hono on Node.js
- Workers — pg-boss (PostgreSQL-native queue)
- Database — Drizzle ORM + PostgreSQL (Supabase-compatible)
- Storage — S3-compatible (Cloudflare R2, AWS S3, MinIO for local dev)
- Deployment — Docker Compose + Nginx
cp .env.example .env
# Edit .env — DATABASE_URL is the only required change for local dev
# (MinIO runs inside Docker; no external accounts needed)
docker compose upMinIO console: http://localhost:9001 — minioadmin / minioadmin
First user:
SEED_ADMIN_EMAIL=you@example.com \
SEED_ADMIN_PASSWORD=changeme \
pnpm --filter=@casoon/helpdesk-api seedpnpm install
pnpm dev # starts all apps in watch mode via TurborepoDatabase migrations:
pnpm db:generate # generate SQL from schema changes
pnpm db:migrate # apply migrations
pnpm db:studio # open Drizzle StudioPoint a VPS at this repo, copy .env.example to .env, fill in your managed PostgreSQL URL and S3 credentials, then:
docker compose -f docker-compose.yml up -dFor TLS, mount certificates into infra/nginx/certs/ and update infra/nginx/nginx.conf.
AGPL-3.0-only — see LICENSE.