The fastest path to a running Timeful instance is to pull the pre-built images from GitHub Container Registry and supply a single required secret — your encryption key. The steps below have you up and reachable atDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/ptshen/timeful-plus/llms.txt
Use this file to discover all available pages before exploring further.
http://localhost:3002 in about five minutes, including image pull time.
Prerequisites
Before you begin, confirm the following are available on your machine:
- Docker 20.10+ — Install Docker
- Docker Compose v2 — bundled with Docker Desktop; verify with
docker compose version - openssl — available by default on macOS and most Linux distributions
- Google Cloud account (optional) — required only for OAuth login and calendar integration; anonymous event scheduling works without it
- At least 2 GB RAM and 10 GB free disk space for the MongoDB data volume
Setup Steps
Clone the repository
Clone the Timeful source — even when using pre-built images you need the Compose file and configuration templates:Alternatively, if you only want the pre-built images without the full source, pull them directly:
Create your .env file and set ENCRYPTION_KEY
Copy the example environment file and generate a cryptographically secure encryption key:Open
.env in your editor and confirm the key was written correctly. The ENCRYPTION_KEY value is used to encrypt sensitive data stored in MongoDB and is the only required variable for basic anonymous scheduling..env
(Optional) Add Google OAuth credentials
Skip this step if you only need anonymous event scheduling. To enable user accounts and Google Calendar / Outlook integration, add the following to your Then update
.env:.env
config.js (copy it from config.example.js) so the Vue frontend knows which OAuth client IDs to use:config.js
Start the application
Launch all three containers — MongoDB, backend API, and frontend — using the pre-built image Compose file:Or use the equivalent Makefile shortcut:To build from source instead (useful for local development or custom patches):Docker will start three containers on the
timeful-network bridge network:| Container | Image | Role |
|---|---|---|
timeful-mongodb | mongo:6.0 | Persistent data store |
timeful-backend | ghcr.io/lillenne/timeful.app/backend:latest | Go/Gin REST API |
timeful-frontend | ghcr.io/lillenne/timeful.app/frontend:latest | Nginx + Vue 2 SPA |
Verification
Confirm everything is running correctly with these two commands:Makefile Command Reference
All common lifecycle tasks are wrapped in theMakefile. Use make help to print the full list at any time.
| Command | Description |
|---|---|
make setup | Interactive setup wizard — creates .env from template |
make up | Build images from source and start all services |
make up-ghcr | Start using pre-built GHCR images (recommended) |
make down | Stop all running containers |
make restart | Restart all containers without rebuilding |
make logs | Stream logs from all containers |
make logs-backend | Stream backend API logs only |
make logs-db | Stream MongoDB logs only |
make status | Print container status table |
make backup | Dump the schej-it database to ./backups/backup-YYYYMMDD-HHMMSS/ |
make restore | Restore the most recent backup (overwrites current data) |
make pull-ghcr | Pull latest GHCR images and restart (recommended for updates) |
make pull | git pull, rebuild from source, and restart |
make shell-db | Open a mongosh session inside the MongoDB container |
make shell-backend | Open a shell inside the backend container |
make shell-frontend | Open a shell inside the frontend container |
make clean | Remove all containers and volumes — deletes all data ⚠️ |
make dev | Start with live log output attached to the terminal |
Next Steps
Docker Self-Hosting
Production setup with Nginx reverse proxy, SSL termination, custom domains, and CORS configuration.
Configuration Reference
Complete reference for every environment variable in
.env.example, including email, Stripe, and analytics options.Troubleshooting
Solutions for common issues: OAuth redirect mismatches, port conflicts, and database connection failures.