A lightweight, self-hosted maintenance log for your vehicles: services, repairs, inspections, costs, photos and receipts – with multi-user login. Runs as a single Docker container.
Stack: plain HTML/CSS/JS · PocketBase (SQLite) · Docker (amd64, arm64, armv7)
Live demo: cm-demo.seals187.com – sign in with user demo, password demodemo.
The demo container is deleted and recreated every 30 minutes, so all changes are reset.
Requires Docker with the Compose plugin.
Linux
mkdir carmaint && cd carmaint
curl -fsSLO https://raw.githubusercontent.com/seals187/carMaint/main/docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/seals187/carMaint/main/.env.example -o .env
nano .env # set at least ADMIN_PASSWORD
docker compose up -dWindows (Docker Desktop, PowerShell)
mkdir carmaint; cd carmaint
Invoke-WebRequest https://raw.githubusercontent.com/seals187/carMaint/main/docker-compose.yml -OutFile docker-compose.yml
Invoke-WebRequest https://raw.githubusercontent.com/seals187/carMaint/main/.env.example -OutFile .env
notepad .env # set at least ADMIN_PASSWORD
docker compose up -dThen open http://localhost:8090 (or http://<server-ip>:8090) and sign in with the admin account from .env.
All settings live in .env – see .env.example for every option. The most important ones:
| Variable | Description |
|---|---|
ADMIN_USERNAME / ADMIN_PASSWORD |
First user (admin), created on first start. Password min. 8 characters |
CARMAINT_VERSION |
latest, a fixed version such as 0.1.7, or edge |
PORT |
Host port (default 8090) |
DEFAULT_CURRENCY |
EUR, CHF or USD |
DEFAULT_LANGUAGE |
de, en, es or fr (default en) – used when the browser language is not supported; users can switch in the app |
MAX_FILE_SIZE_MB |
Max. size per uploaded file in MB (default 20, max. 30) |
USER_STORAGE_LIMIT_MB |
Max. storage per user for photos and receipts in MB (default 0 = unlimited) |
ALLOWED_FILE_TYPES |
Allowed upload types: pdf, jpg, png (default pdf,jpg) |
TRUSTED_PROXY_HEADERS |
e.g. X-Forwarded-For when running behind a reverse proxy |
Apply changes with docker compose up -d. Forgot the admin password? Set ADMIN_RESET_PASSWORD=true
and a new ADMIN_PASSWORD, restart, then set it back to false.
For access from the internet, put a reverse proxy with HTTPS in front (e.g. Caddy, Traefik, nginx).
- Users: admins manage accounts under Settings → Users. Every user only sees their own vehicles.
- Demo account:
DEMO_USERNAME/DEMO_PASSWORDcreate a restricted user on startup;DEMO_DISABLEDhides settings such as Change password for it (see.env.example). - Backup: Settings → Backup exports/imports all data of a user as one JSON file.
All server data is stored in the Docker volume
carmaint_data. - Update:
docker compose pull && docker compose up -d
Have a question, an idea or found a bug? Want to contribute code, translations or feedback? The Discord server is the place to talk about CarMaint – everyone is welcome.
copy .env.example .env
powershell -ExecutionPolicy Bypass -File .\dev.ps1 # Windows, runs on http://localhost:8090Or build the image locally: docker build -t ghcr.io/seals187/carmaint:dev .
| Folder | Content |
|---|---|
pb_public/ |
Website (HTML, CSS, JS) |
pb_migrations/ |
Database schema and access rules |
pb_hooks/ |
Server logic (reads .env, creates the admin) |
Versioning follows SemVer (0.x = initial development); changes are listed in
CHANGELOG.md. Pushing a tag vX.Y.Z publishes the Docker image
(ghcr.io/seals187/carmaint) and a GitHub release. Pushes to main publish the edge image.
CarMaint is free software under the GNU Affero General Public License v3.0 (AGPL-3.0). If you run a modified version as a public service, you must make its source code available to its users.

