Pitstop lets you log fuel-ups, watch your fuel economy, and stay on top of vehicle maintenance — all running on your hardware and open to anyone who wants to self-host it. It supports multiple users, each with a private garage of vehicles, handles everything from gas trucks to pure EVs, and installs to your phone's home screen so logging a fill-up at the pump takes seconds.
It ships as a single Docker container designed to sit behind a Cloudflare tunnel, and runs just as happily on a bare VM, LXC, or metal.
Status: feature-complete beta — all six build phases are implemented and tested. See
docs/DESIGN.mdfor the full design document.
- Fast pump logging — a mobile-first quick-add flow with live price math: enter any two of gallons / price-per-gallon / total and the third fills itself in.
- Real fuel economy — per-fill and average MPG, cost per mile, monthly and lifetime spend, with correct handling of partial and missed fill-ups.
- Is premium worth it? — Pitstop tracks economy per fuel grade and compares them by cost per mile, so it tells you in real dollars whether cheaper-but-lower or pricier-but-higher fuel actually saves you money in your car.
- Live "which grade to buy" advisor — at the pump, punch in today's posted prices and Pitstop uses your car's measured MPG per grade to recommend the cheapest to run right now — including the break-even price premium would need to hit to win.
- Maintenance & reminders — service history plus reminders by mileage, time, or both, with upcoming / due / overdue status.
- Every vehicle type — gas, diesel, hybrid, plug-in hybrid, and pure EV (charge sessions in kWh). Each vehicle only shows the fields relevant to its type.
- Fully editable — mistyped an odometer or price? Tap any past entry to fix or delete it, and your stats recompute automatically. Nothing is write-once.
- Multi-user — each person gets their own private garage, and the admin can reset a forgotten password or view the app as any user to help them out.
- Own your data — flexible CSV import with column mapping (plus presets for the formats other fuel trackers export) and full CSV/JSON export.
- Installable PWA — add it to your home screen; no app store, no native app.
- Backend: Python + FastAPI (SQLModel/SQLAlchemy, Alembic)
- Database: SQLite by default, Postgres optional
- Frontend: React + Vite + TypeScript, built as an installable PWA
- Packaging: one Docker container (also runs on bare VM / LXC / metal)
All core functionality is built and tested: auth & multi-user, vehicles, the
quick-add fuel/charge flow with tested economy math, maintenance & reminders
with notifications, per-grade cost-per-mile comparison and the live buy
advisor, CSV import/export, charts, an installable offline-capable PWA, and an
admin panel. See docs/DESIGN.md for the design document,
and ROADMAP.md for known issues and what's next.
The whole app — API and web UI — is one container on one port.
git clone https://github.com/nightgarage/pitstop.git
cd pitstop
docker compose up -dOpen http://localhost:8080, and the first-run screen walks you through creating
the admin account. Data (SQLite database + generated secret) lives in the
pitstop_data volume. Configuration is entirely environment variables — see
.env.example for every option (registration toggle, Postgres via
DATABASE_URL, subpath, and so on). The interactive API docs are served at
/api/docs.
The account created on first run is the admin. To get anyone else in, either:
- Add them yourself — in the app, go to Settings → Admin → Add a user: enter their email and a display name, and Pitstop creates the account on the spot and shows you a one-time temporary password to pass along. Registration stays closed the whole time. They get the welcome tour on first sign-in and can change the password in Settings.
- Let them sign up — switch Open registration to On in the same admin
page (or set
ALLOW_REGISTRATION=true), have them create an account from the login screen, then close it again if you don't want strangers signing up.
Either way, every account gets its own private garage — users never see each other's vehicles.
Two tools sit on each row in Settings → Admin → Users:
- Reset password issues a new password and shows it once, for you to pass along; the user is asked to choose their own the next time they sign in, and is notified in-app that it happened. Stored passwords are argon2 hashes, so an existing password can never be read back — resetting is the only way to get a locked-out user in.
- View as this user switches your session to their account, so you can see exactly what they see. A banner across the top names whose account you are in and takes you back with one tap.
While you are viewing as someone else your admin powers are suspended, the session expires after an hour, and admins can't be viewed as at all.
Backend (Python 3.12+) and frontend run separately during development:
# API on :8000
cd backend
python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
alembic upgrade head
uvicorn pitstop.main:app --reload
# Web UI on :5173 (proxies /api to :8000)
cd frontend
npm install
npm run devRun the backend tests with pytest from backend/.
See docs/DEPLOY.md for the full deployment guide: Docker
behind a Cloudflare tunnel (or any reverse proxy, with subpath support), the
non-Docker pip install + systemd path, health checks, and backups. A demo
instance with sample data is one env var away (SEED_DEMO=true).
Contributions are welcome — see CONTRIBUTING.md. The best
place to start is an item from ROADMAP.md; open an issue to
claim it. Please keep changes aligned with the design doc.
AGPL-3.0 © 2026 Pitstop contributors
In plain terms: self-hosting Pitstop is completely unrestricted — run it, modify it, use it for anything, personal or at work, no obligations. The copyleft only bites if you distribute a modified version or offer one to others as a network service; then you have to publish your changes under the same license. It's here so Pitstop stays open, not to get in your way.




