Garage Logbook is a self-hosted web app for keeping every vehicle's maintenance and service history in one place. Log what you did, what it cost, and when — attach receipts and photos, and keep a clean record for each car, bike, or truck in the household. Built with Flask and Docker, with multi-user support and role-based access.
Features
- Multi-user — isolated garages per user, with admin cross-user visibility
- Vehicle management — year, make, model, VIN, purchase date and photos
- Maintenance records — date, mileage, vendor, cost, notes and photo galleries
- PDF receipt upload and a lightbox image gallery per record
- Dashboard with vehicle/record/spend stats over configurable time ranges
- Live search & sort, plus duplicate record for repeat jobs
- CSV import/export with field mapping and a dry-run preview
- Role-based access — Admin and Editor, with granular per-user permissions
- First-login security, light/dark theme saved per user, and a mobile-responsive layout
Requirements
Docker and Docker Compose.
Install with Docker Compose
Download the compose file and env template, then set a secret key:
mkdir ~/garage-logbook && cd ~/garage-logbook
curl -O https://raw.githubusercontent.com/hyprlab/garage-logbook/main/docker-compose.yml
curl -O https://raw.githubusercontent.com/hyprlab/garage-logbook/main/.env.example
cp .env.example .env
python3 -c "import secrets; print(secrets.token_hex(32))" # -> paste into .env as SECRET_KEY
The compose file:
services:
garage-logbook:
image: hyprlab/garage-logbook:latest
container_name: garage-logbook
restart: unless-stopped
ports:
- "${APP_PORT:-5000}:5000"
volumes:
- garage-data:/data
env_file:
- .env
volumes:
garage-data:
driver: local
Start it and open http://localhost:5000 (default login admin / admin — change it immediately):
docker compose up -d
You can also build from source (docker compose up -d --build) or run natively with Python 3.10+.
Configuration
| Variable | Required | Default | Purpose |
|---|---|---|---|
SECRET_KEY |
Yes | — | Flask session encryption key |
APP_PORT |
No | 5000 |
Host port the app listens on |
DATABASE_PATH |
No | /data/garage_logbook.db |
Database path inside the container |
UPLOAD_FOLDER |
No | /data/uploads |
Upload path inside the container |
Updating & backups
docker compose pull && docker compose up -d
All data lives in the garage-data volume. To back it up:
docker compose stop
docker run --rm -v garage-logbook_garage-data:/data -v $(pwd):/backup \
alpine tar czf /backup/garage-logbook-backup.tar.gz -C /data .
docker compose up -d
Tech stack & license
Flask · SQLite · HTML/CSS/JS on Docker. Free and open source under the GNU AGPL-3.0. Full docs and releases on GitHub.