Global Life Tracker
A personal real-time dashboard built on an append-only event log, self-hosted and reachable only through a Cloudflare tunnel.
Context & objective
One dashboard to track my day-to-day life, reachable from anywhere, without opening a single port on my network.
What I built
- A Vue 3 front end talking to a Node.js WebSocket back end in Docker.
- An append-only event log in PostgreSQL: nothing is overwritten, and a pure JavaScript engine derives the live state from the events on demand.
- Layered Compose files: one base stack plus dev, prod and proxy overlays.
- A dedicated Caddy + cloudflared pair, so the app is only reachable through the Cloudflare tunnel, behind Cloudflare Access.
- Documentation treated as part of the code: contract docs are the source of truth, with an index and a rule against stale Markdown.
Challenges
- Hardening without breaking anything: no host ports, all Linux capabilities dropped, read-only root filesystem, non-root production image.
- Checking the Cloudflare Access token at the WebSocket upgrade, not only on normal HTTP requests.
- Local access: keeping it reachable from home through the tunnel despite my DNS wildcard rewrite.
What I learned
TODO(content): in your own words. Raw material: event sourcing, container hardening, Zero Trust access, keeping docs honest.