Installation
Install Calendarpit with Docker Compose, Homebrew, or a standalone executable.
Calendarpit is available through Docker, Homebrew, and standalone downloads. See GitHub Releases for the current version.
- Docker Compose: Use it for a container environment.
- Homebrew: Use it for a local CLI.
Both include the API, OAuth server, admin UI, and SQLite. Neither requires Bun, Node.js, Google credentials, or a separate database. Calendarpit is not distributed through npm.
Docker
docker run --rm \
-p 127.0.0.1:4173:4173 \
-v calendarpit-data:/data \
ghcr.io/iktakahiro/calendarpit:latestThe image:
- Targets Linux amd64 and arm64, including Docker on Apple Silicon.
- Runs as a non-root user.
- Persists SQLite in
/data/calendarpit.sqlite. - Is tagged
latestand with each release version. Pin a version tag when CI needs a fixed version.
Keep the named volume to retain data across container recreation. For disposable tests, use -e CALENDARPIT_DATABASE=:memory:.
The host port is published only on loopback. Inside the container, Calendarpit explicitly binds 0.0.0.0.
Docker Compose
Add this service and volume to your compose.yaml:
services:
calendarpit:
image: ghcr.io/iktakahiro/calendarpit:latest
ports:
- '127.0.0.1:4173:4173'
volumes:
- calendarpit-data:/data
volumes:
calendarpit-data:docker compose up -d calendarpit
docker compose logs calendarpit
docker compose downdown preserves the volume. down -v deletes its saved data.
The image includes a health check. To wait for Calendarpit in another service, use depends_on: { calendarpit: { condition: service_healthy } }.
If you override the container port, set CALENDARPIT_PORT as well as the port mapping. The health check then uses the same port.
Addresses depend on who makes the request
| Request origin | Calendarpit address |
|---|---|
| Browser or app running on the host | http://127.0.0.1:4173 |
| App in the same Compose network | http://calendarpit:4173 |
- Keep the browser's OAuth authorization URL on the host-accessible address.
- A containerized backend uses the Compose address for token exchange and Calendar API requests.
- The OAuth
redirect_urimust exactly match the fixture's registered URI. It must also be accessible to the browser.
Webhook receivers
Webhook addresses are resolved by Calendarpit:
- Receiver service in Compose: For a service named
app, allowCALENDARPIT_WATCH_HOSTS=appand registerhttp://app:<port>/<path>. - Process on the host: Docker Desktop provides
host.docker.internal. On Linux Docker Engine, addextra_hosts: ["host.docker.internal:host-gateway"]. Allow that hostname withCALENDARPIT_WATCH_HOSTS.
The receiving process must listen on an address reachable from the container. See Watch notifications.
Homebrew
brew install iktakahiro/tap/calendarpit
calendarpit serveThe tap installs a standalone executable for macOS or Linux. Bun and Node.js are not required.
Run it in your project's directory so the default SQLite path belongs to that project.
To update:
brew update
brew upgrade iktakahiro/tap/calendarpitStandalone download
From GitHub Releases, download the archive that matches your OS and CPU, together with SHA256SUMS. Verify the archive checksum before you extract it. For example, on Apple Silicon:
shasum -a 256 calendarpit-0.9.0-darwin-arm64.tar.gz
tar -xzf calendarpit-0.9.0-darwin-arm64.tar.gz
./bin/calendarpit serveCompare the printed hash with the matching line in SHA256SUMS.
Windows archives contain bin/calendarpit.exe. No Bun, Node.js, or asset directory is required.
Updates and storage
When you choose to upgrade:
- Docker: Update the exact image tag.
- Homebrew: Use
brew upgrade.
Before upgrading, stop Calendarpit and back up its SQLite directory or Docker volume.
Never run two instances against the same database file.
See Storage and restarts and Run and configure.