Skip to main content

Documentation 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.

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 at 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):
git clone https://github.com/schej-it/timeful.app.git
cd timeful.app

Deployment Options

Accessing the Application

Once the stack is healthy, open:
URLDescription
http://localhost:3002Main Timeful application
http://localhost:3002/swagger/index.htmlInteractive 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 a Makefile that wraps common Docker Compose operations. Run make help to see all commands.
CommandDescription
make setupRun interactive initial setup via docker-setup.sh
make buildBuild Docker images from source
make upStart the stack (build from source)
make up-ghcrStart the stack using GHCR pre-built images
make downStop all containers
make down-ghcrStop containers (GHCR variant)
make restartRestart all services
make restart-ghcrRestart services (GHCR variant)
make logsFollow logs for all services
make logs-ghcrFollow logs for all services (GHCR variant)
make logs-backendFollow backend logs only
make logs-frontendFollow frontend logs only
make logs-dbFollow MongoDB logs only
make pullPull source changes, rebuild, and restart
make pull-ghcrPull latest GHCR images and restart
make statusShow container status
make status-ghcrShow container status (GHCR variant)
make backupDump MongoDB to ./backups/
make restoreRestore from the most recent backup
make shell-backendOpen a shell in the backend container
make shell-frontendOpen a shell in the frontend container
make shell-dbOpen a mongosh session against schej-it
make devStart in development mode with live logs
make dev-buildBuild and start in development mode
make cleanStop containers and delete all volumes ⚠️
make clean-ghcrStop containers and delete volumes (GHCR variant) ⚠️

Docker Image Tags

Both the backend and frontend images are published to GitHub Container Registry under the ghcr.io/lillenne/timeful.app namespace.
ImageTagDescription
ghcr.io/lillenne/timeful.app/backendlatestLatest stable build from main
ghcr.io/lillenne/timeful.app/frontendlatestLatest stable build from main
…/backendmainAlias for latest
…/backend<version>Pinned release (e.g. v1.2.0)
…/backend<branch>-<sha>Specific commit build
Pin to a specific version tag in production so that docker compose … pull does not automatically roll out an untested release.

Architecture

The Compose stack runs three containers that communicate over an internal bridge network named timeful-network. Pre-built images (docker-compose.ghcr.yml):
ContainerImageInternal portHost port
timeful-mongodbmongo:6.02701727017
timeful-backendghcr.io/…/backend:latest3002(not exposed)
timeful-frontendghcr.io/…/frontend:latest (Nginx)803002
Build from source (docker-compose.yml):
ContainerImageInternal portHost port
timeful-mongodbmongo:6.02701727017
timeful-backendbuilt locally3002(not exposed)
timeful-frontendnode:20-alpine (Vue dev server)80803002
The production frontend (GHCR image) uses Nginx to proxy /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

Build docs developers (and LLMs) love