Mortonbot
A personal vehicle telemetry dashboard for an electric car.
Mortonbot is a self-hosted dashboard that collects, stores, and visualizes data from a personally-owned electric vehicle. It's a hobby project built for a single car: tracking energy efficiency, trip history, charging sessions, battery degradation over time, and the kind of detail you don't get from the official manufacturer app.
The project is private (access is gated to a single user over a private network), but the public hostname is required to host the OAuth callback and the public key used for vehicle command authorization. That's the entirety of what's served from this domain.
What it does
- Receives streaming telemetry from the vehicle (location, speed, battery state, charging state)
- Stores time-series data in a TimescaleDB hypertable with continuous aggregates and compression
- Detects discrete trips and charging sessions automatically from the raw stream
- Computes derived metrics: efficiency in Wh/mi, cost-per-trip, monthly summaries, battery health trends
- Renders an interactive dashboard with maps, charts, and per-trip detail pages
Technology
- Python (FastAPI)
- TimescaleDB / PostgreSQL
- React + TypeScript
- Vite + Tailwind CSS
- Docker Compose
- Caddy (HTTPS, Let's Encrypt)
- OpenStreetMap + Leaflet
- Tailscale (private access)
Why self-host?
Cloud-based vehicle data services are expensive, opaque about retention, and often disappear (or pivot) over time. Running my own collector means the data stays mine, the cost is bounded by the cheapest VPS plus a small server at home, and I can ask analytical questions that a consumer app would never expose.
It also turns out to be a fun systems project: streaming protocols, time-series schema design, OAuth flows for hardware APIs, and the small art of building a dashboard that's actually useful instead of a vanity metric wall.
Status
In active development as of 2026. The collector and database are running; the UI is being polished. This page exists primarily to host required service endpoints — there's no signup, no product, and no commercial intent.