Run Musubi on your own server.
The desktop web app, API, Postgres and an HTTPS gateway in one Docker Compose stack. Use prebuilt images with no cloning or build step. Your calendar data stays on infrastructure you control — MIT-licensed, yours to keep.
# 1 — download the stack, environment and gateway config
curl -O https://raw.githubusercontent.com/frgtn-dot-dev/musubi/main/docker-compose.yml
curl -o .env https://raw.githubusercontent.com/frgtn-dot-dev/musubi/main/.env.example
mkdir -p ops/gateway
curl -o ops/gateway/Caddyfile https://raw.githubusercontent.com/frgtn-dot-dev/musubi/main/ops/gateway/Caddyfile
# 2 — edit .env: database credentials, BETTER_AUTH_SECRET,
# BETTER_AUTH_URL (your https:// origin), PUBLIC_HOST (hostname)
# 3 — start the whole stack
docker compose up -dThe hosted service stays free during early access — self-hosting is for when you'd rather run it yourself.
What you're running.
The whole app, together
The web app and API share one public origin behind Caddy, with Postgres for your calendars. The API runs database migrations on startup.
Your data, your keys
Calendar data and uploaded media stay in persistent volumes on your server. Connect external calendar providers only when you want their sync features.
Simple upgrades
Back up your database and media, then pull the new images and restart — docker compose pull && docker compose up -d. One API process per database, enforced by an advisory lock.
What you need.
PUBLIC_HOST to its hostname and BETTER_AUTH_URL to the matching HTTPS origin. The included Caddy gateway handles certificates and routes both the web app and API.Going further.
Deploying with Dokploy? Use docker-compose.dokploy.yml from the repo instead of the plain stack. The full walkthrough — environment variables, HTTPS, backups and upgrades — lives in the self-hosting runbook. Stuck? Open an issue on GitHub or ask in the Discord.