gazel — short for gas gazelle — /ɡəˈzɛl/
A lightweight, self-hosted fuel expense and mileage tracker. Log fill-ups, track fuel efficiency and costs across your vehicles, and spot trends over time — all from a single binary with no external dependencies.
The gazel remembers every drop so you don't have to.
- Multi-vehicle tracking — manage all your cars, motorcycles, and trucks in one place
- Fill-up logging — record date, odometer, fuel amount, cost, and station
- Fuel efficiency — automatic MPG / L/100km calculation between fill-ups
- Cost tracking — cost per mile/km, monthly and yearly spend breakdowns
- Dashboard — at-a-glance overview with summary stats and recent activity
- Charts — visualize efficiency, cost, and fuel price trends over time
- Flexible units — switch between imperial and metric, choose your currency
- Multi-language — English and German
- Data portability — export and import your data as JSON
- Light & dark theme — follows your system preference, with manual override
- Installable PWA — add to home screen on mobile for a native-like experience
- Optional OIDC login — protect the UI and API with a standards-based identity provider
- Single binary — self-contained Rust service with embedded UI, just run it or use Docker
docker run -p 4110:4110 -v gazel-data:/data \
ghcr.io/simplyroba/gazel:latestOpen http://localhost:4110. Data is persisted in the gazel-data volume.
A docker-compose.yml is included in the repository.
docker compose up -d| Variable | Default | Description |
|---|---|---|
GAZEL_PORT |
4110 |
HTTP server listen port. |
GAZEL_DB_PATH |
/data/gazel.db |
Filesystem path to the SQLite database. |
GAZEL_LOG_LEVEL |
info |
tracing level filter for logs. |
GAZEL_AUTH_ENABLED |
false |
Enable OIDC login. |
GAZEL_EXTERNAL_URL |
— | Required public URL of Gazel, without a subpath. |
GAZEL_OIDC_ISSUER |
— | Required OIDC issuer URL. |
GAZEL_OIDC_CLIENT_ID |
— | Required confidential-client ID. |
GAZEL_OIDC_CLIENT_SECRET |
— | Required confidential-client secret. |
GAZEL_OIDC_PROVIDER_NAME |
OpenID Connect |
Name shown on the login button. |
GAZEL_OIDC_AUTO_REDIRECT |
false |
Skip the login-button click. |
Authentication is disabled by default. Enable OIDC or use an authenticating reverse proxy before exposing Gazel outside a trusted network.
Register <GAZEL_EXTERNAL_URL>/auth/callback with a confidential Authorization Code client supporting client_secret_basic or client_secret_post.
Use the issuer URL exactly as advertised, including any trailing slash. The provider must be reachable at startup.
Gazel serves HTTP behind a TLS-terminating reverse proxy. Public and provider URLs require HTTPS; the provider needs a publicly trusted certificate. HTTP URLs are accepted on localhost, 127.0.0.1, and ::1 for local development.
- All signed-in users share the same data. Restrict access to the OIDC client at your provider.
- Sessions end 12 hours after login or on restart. Use one instance or sticky routing; instances do not share sessions.
- Signing out ends only the Gazel session, not the provider session.
See CONTRIBUTING.md for dev setup, testing, and design system documentation.
Copyright (C) 2026 simplyRoba.
This project is developed spec-driven with AI assistance, reviewed by a critical human.

