Timeful ships as a three-container application — MongoDB, a Go backend, and a Vue.js frontend — all wired together with a single Docker Compose file. You can be running 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 under five minutes using the pre-built images from GitHub Container Registry (GHCR), or build everything locally if you need to customise the source.
Prerequisites
- Docker 20.10 or later
- Docker Compose v2.0 or later
- A cloned copy of the repository (for configuration files):
Deployment Options
- Pre-built Images (Recommended)
- Build from Source
The fastest path to a running instance. Images for both Step 2 — Configure the environmentStep 3 — Start the stackOr with the Makefile shortcut:Updating to the latest version
amd64 and arm64 are published automatically on every push to main.Step 1 — Pull the imagesAccessing the Application
Once the stack is healthy, open:| URL | Description |
|---|---|
http://localhost:3002 | Main Timeful application |
http://localhost:3002/swagger/index.html | Interactive API documentation |
The frontend container proxies all
/api and /sockets/ traffic to the backend, so only a single port (3002) needs to be reachable from your browser. The backend container is intentionally not exposed to the host.Makefile Command Reference
The repository ships with aMakefile that wraps common Docker Compose operations. Run make help to see all commands.
| Command | Description |
|---|---|
make setup | Run interactive initial setup via docker-setup.sh |
make build | Build Docker images from source |
make up | Start the stack (build from source) |
make up-ghcr | Start the stack using GHCR pre-built images |
make down | Stop all containers |
make down-ghcr | Stop containers (GHCR variant) |
make restart | Restart all services |
make restart-ghcr | Restart services (GHCR variant) |
make logs | Follow logs for all services |
make logs-ghcr | Follow logs for all services (GHCR variant) |
make logs-backend | Follow backend logs only |
make logs-frontend | Follow frontend logs only |
make logs-db | Follow MongoDB logs only |
make pull | Pull source changes, rebuild, and restart |
make pull-ghcr | Pull latest GHCR images and restart |
make status | Show container status |
make status-ghcr | Show container status (GHCR variant) |
make backup | Dump MongoDB to ./backups/ |
make restore | Restore from the most recent backup |
make shell-backend | Open a shell in the backend container |
make shell-frontend | Open a shell in the frontend container |
make shell-db | Open a mongosh session against schej-it |
make dev | Start in development mode with live logs |
make dev-build | Build and start in development mode |
make clean | Stop containers and delete all volumes ⚠️ |
make clean-ghcr | Stop containers and delete volumes (GHCR variant) ⚠️ |
Docker Image Tags
Both the backend and frontend images are published to GitHub Container Registry under theghcr.io/lillenne/timeful.app namespace.
| Image | Tag | Description |
|---|---|---|
ghcr.io/lillenne/timeful.app/backend | latest | Latest stable build from main |
ghcr.io/lillenne/timeful.app/frontend | latest | Latest stable build from main |
…/backend | main | Alias for latest |
…/backend | <version> | Pinned release (e.g. v1.2.0) |
…/backend | <branch>-<sha> | Specific commit build |
Architecture
The Compose stack runs three containers that communicate over an internal bridge network namedtimeful-network.
Pre-built images (docker-compose.ghcr.yml):
| Container | Image | Internal port | Host port |
|---|---|---|---|
timeful-mongodb | mongo:6.0 | 27017 | 27017 |
timeful-backend | ghcr.io/…/backend:latest | 3002 | (not exposed) |
timeful-frontend | ghcr.io/…/frontend:latest (Nginx) | 80 | 3002 |
docker-compose.yml):
| Container | Image | Internal port | Host port |
|---|---|---|---|
timeful-mongodb | mongo:6.0 | 27017 | 27017 |
timeful-backend | built locally | 3002 | (not exposed) |
timeful-frontend | node:20-alpine (Vue dev server) | 8080 | 3002 |
/api and /sockets/ to the backend, serves the pre-built Vue.js bundle from /usr/share/nginx/html, and caches static assets for one year. The development frontend runs the Vue CLI dev server directly.
Configuration
Set environment variables for OAuth, email, and premium features
Production Setup
Add a reverse proxy, custom domain, and HTTPS
Podman
Run rootless with Podman Compose or systemd Quadlets
Updates & Backups
Automate rolling updates and database snapshots