Skip to content
Back to Projects

day log · platform team

08:52first tab of the day

Heimdall

One page showing where every ticket and every service actually is.

Built and run it solo · Loweconex, a UK IoT platform business · 2025 → ongoing

Before standup, before email, the platform team opens the same page. It answers one question across 20 services and four environments: where is my ticket right now? More than 20 engineers use it every morning, and standup runs off it.

08:55try it first

The environments view, in your browser

This is the environments view, rebuilt so you can use it. It opens on PLAT-2033, a change that reached QA and stopped there. Pick a different ticket to trace it across the pipeline, or click any cell for the commit, the pods and who shipped it.
heimdall · environments
frozen snapshot
interactive demoA faithful rebuild with mock data. The real Heimdall reads live from Bitbucket, ArgoCD, Kubernetes and JIRA.
where is my ticket?
PLAT-2033Ledger end-of-day reconciliation· ledger-worker
devvia commit message
qavia pull request
preprod
prod

Crashlooping in qa (1/2 pods). The promotion gate is holding it back.

service
dev
qa
preprod
prod
payments-api
checkout-web
identity-svc
ledger-worker
search-api
notifications
inventory-svc
gateway
Synced · on latestProgressing · syncingDrifted · behind latestDegraded · pods unhealthyNo data · cluster metrics unreachableclick a ticket again to clear
08:57five tabs open

Five tabs, one question

Across 20 services and a dev → QA → preprod → prod pipeline, the state of any given ticket is spread across five systems. Bitbucket holds the commit and the PR, JIRA holds the ticket, and Kubernetes holds the pods that are running. In between sits the GitOps repo, which holds the desired state: the commit each environment is supposed to be on, which isn't always the one it's on.

Heimdall started as a small Python service that pushed the four DORA metrics (deploy frequency, lead time, change failure rate, time to restore) into Prometheus. The original collector was correct and nobody ever opened it. Building the UI is what turned it into something more than 20 engineers now use every day.

09:00standup, on one screen

A short tour

Six pages; these three do most of the work.

dashboard
Heimdall dashboard with pipeline stages, last-24h deploys and 30-day rollup
The pipeline at the top: how many tickets are at each stage, and how long each handover takes. Underneath, the last 24 hours of deploys and a 30-day rollup. DORA metrics in a glance, no Grafana detour required.
tickets
Heimdall tickets view grouped by environment with stuck callouts
Every open ticket grouped by environment, stuck ones first. The "PRs ready" card surfaces the PRs with approval and green CI just waiting on a merge, usually two or three a day.
environment detail
Heimdall environment detail with promotion-ready services and per-service health
Drilldown for one environment. "Ready to promote" lists the services where the next env can safely take the new commit. Below that, per-service health, error rate, p95, and pod resource pressure. The nan% at the top is in the real capture: every service in the table was at 0.00% for the hour, so the environment-level rate was dividing zero by zero. I left it in.

There's also a PR triage view sorted by what unblocks shipping rather than what's most recent, and an activity feed of every deploy, sync and promotion, which is the first place anyone looks during an incident.

architecture

How it's built

One Python service. A background job pulls from the upstream sources every ten minutes and writes everything down: once into a database, once into an in-memory cache the web app reads from. The web app itself does no fetching, no joins, no slow work. Pages stay fast under load because the work happens elsewhere.

Heimdall · system overview

Tap or click any box for a one-line explanation.

sources

background work

stores

web

The data model thinks of a deployment as a lifecycle, not an event: PR merged → tag updated → pods healthy → tests pass. A database view joins them all into one queryable thing, which is what powers the pages above.

source map

What it reads, and what it refuses to believe

Heimdall's real job is reconciling five systems that each hold one piece of the answer. The design decision that mattered was which one to believe when they disagree.

Jira

The ticket, so the whole thing can be asked in a human's terms: where is PLAT-2044 right now?

Bitbucket

PRs, merges and review state. This is where the bottleneck usually is, and it's the part people are least willing to guess at.

ArgoCD

Sync status and the revision each environment is meant to be running.

Not its health verdict. ArgoCD will report a service healthy while its new pods crashloop behind it, so Heimdall checks the pods directly instead.

Kubernetes

Pod state, read directly. This is what health means here, and it's why Heimdall can disagree with ArgoCD.

Test runs

Post-deploy verification. Heimdall records whether the tests came back green after the new pods came up.

Reading five systems means five things that can be down, so Heimdall has to be diagnosable by someone who has never seen its code. The README opens with "is it healthy?" and answers it in one curl: collection age, pool usage, every circuit breaker.

17:40end of the day

What changed

The team stopped pasting kubectl output into Teams to ask whether a deploy had worked. Standup got shorter. Release management started using the same view as the engineers, so fewer tickets fell down the gap between them.

18:05clocking off