One funnel for everything
Every state-changing op across the ecosystem lands on orbit:audit. Obs server consumes, indexes, archives to MinIO. Beacons are HMAC-signed; mismatched beacons drop with audit.
Semantic search
Type a symptom; the engine finds matching crash clusters via embeddings across crashes + runner_step_failed + audit_error.
Crashes
Stack-trace + message fingerprinted; new fingerprints surface here automatically.
| Crash | First | Last | Count | Surface |
|---|---|---|---|---|
exit 137 · docker buildx · sign step runtime: cgroup memory limit exceeded · oom_killer invoked | 2026-05-22 | 17:20 | 14 | runner |
e.au.in_pw · password mismatch · candidate@ user-input-only · expected after brute-force pattern | 2026-05-26 | 17:52 | 8 | auth |
obs-3 · sse stream eof · client peer reset backend reset connection after 60s idle — fix HSTS idle timeout | 2026-05-25 | 14:11 | 3 | edge |
tsig_key_mismatch · zone notify rejected secondary notify from 87.245.x.x · TSIG key wrong | 2026-05-28 | 17:09 | 1 | dns |
Beacon stream
Live SSE tail. Beacons are tenant-tagged, signed with the producer's Tier-B HMAC key; verification fails route the event to the rejected bin.
Archive
After 7 days hot retention in Redis, events flush to MinIO as gzipped Parquet shards keyed by date · tenant · source.
| Date | Tenant | Sources | Events | Size | Checksum |
|---|---|---|---|---|---|
| 2026-05-27 | all | 12 sources | 214,008,142 | 3.2 GB | blake3 · 8c2a… |
| 2026-05-26 | all | 12 sources | 198,142,401 | 3.0 GB | blake3 · 4f12… |
| 2026-05-25 | all | 12 sources | 189,884,212 | 2.9 GB | blake3 · 71fd… |
| 2026-05-24 | all | 11 sources | 142,012,884 | 2.1 GB | blake3 · 89a1… |
| 2026-05-23 | all | 11 sources | 128,442,001 | 1.9 GB | blake3 · 22c0… |
Audit
| Time | Event | Subject | Actor |
|---|---|---|---|
| 17:52 | beacon_rejected | hmac mismatch · from 87.245.x.x | system |
| 14:11 | archive_completed | 2026-05-27 · 214M events | scheduler |
| 12:02 | crash_cluster_new | brain-melt/publish · exit 137 | system |
| 08:14 | retention_trimmed | orbit:audit · 7d window | scheduler |
Page views
First-party, cookieless pageview analytics from the obs beacon. No third-party trackers, no fingerprinting — aggregate counts only, IP truncated at ingest.
| Page | Property | Views | Uniques | Avg time | Bounce |
|---|---|---|---|---|---|
| / | orbit.zuerich | 52,109 | 18,402 | 0m 38s | 41% |
| /launch-2026 | orbit.zuerich | 31,884 | 12,910 | 2m 04s | 22% |
| /shop | walzpunkt.ch | 14,221 | 5,003 | 1m 31s | 34% |
| /offerte | walzpunkt.ch | 8,440 | 2,981 | 3m 12s | 18% |
| /codex/eden | anno-2070 | 6,902 | 3,114 | 2m 47s | 29% |
Web vitals
Real-user Core Web Vitals at the 75th percentile, from the beacon's web-vitals hook. Thresholds per Google's good / needs-improvement / poor bands.
LCP
goodINP
needs workCLS
good| Page | LCP p75 | INP p75 | CLS p75 | Samples |
|---|---|---|---|---|
| orbit.zuerich/ | 1.6s | 142ms | 0.02 | 18,402 |
| walzpunkt.ch/shop | 2.4s | 288ms | 0.07 | 5,003 |
| anno-2070/codex | 3.1s | 196ms | 0.12 | 3,114 |
RPC latency
Per-method latency + error rate across the ecosystem's JSON-RPC / REST surfaces, sampled from the audit funnel envelopes. Slowest + erroring methods float to the top.
| Method | Service | Calls 24h | p50 | p95 | p99 | Err % |
|---|---|---|---|---|---|---|
| repo.push | orbit-git | 4,201 | 142ms | 880ms | 2.1s | 0.04% |
| token.mint | orbit-auth | 14,201 | 8ms | 22ms | 61ms | 0.00% |
| zone.resign | orbit-dns | 312 | 298ms | 512ms | 1.1s | 0.00% |
| run.dispatch | orbit-runner | 842 | 44ms | 180ms | 420ms | 1.2% |
| keyvault.unwrap | orbit-keyvault | 28,110 | 3ms | 9ms | 28ms | 0.00% |
Errors
Uncaught exceptions + rejected promises grouped by stack fingerprint, deduped across releases. Distinct from Crashes (native/process-level).
| Error | Type | Count 24h | Last seen | Release | Status |
|---|---|---|---|---|---|
| TypeError: cannot read 'id' of null | client | 412 | 2m ago | station@1.9.2 | unresolved |
| AbortError: signal aborted | client | 188 | 14m ago | station@1.9.2 | ignored |
| FetchError: 502 from upstream | server | 61 | 1h ago | orbit-git@0.8 | resolved |
| RangeError: invalid time value | client | 23 | 3h ago | vapply@0.3 | unresolved |
Auth
Sign-in + sign-up funnels, WebAuthn step-up rates, and failure reasons — derived from auth_* events on the funnel. No PII; counts only.
| Failure reason | Count 24h | Top tenant | Trend |
|---|---|---|---|
| e.au.in_pw · bad password | 142 | Orbit AG | flat |
| e.au.rl_lo · rate-limited | 31 | Orbit AG | ↑ spike 17:48 |
| e.au.we_fl · webauthn timeout | 28 | Heinrich Graf | flat |
| e.au.tk_dl · token denylisted | 13 | Brain-Melt | ↓ |
Privacy
The beacon honours Do-Not-Track and consent state; IPs are truncated at ingest and raw events expire on a fixed window. Swiss FADP + GDPR posture at a glance.
Controls in effect
enforcedConversions
Operator-defined goals + multi-step funnels built on beacon events. Drop-off surfaces per step so a stalling checkout or sign-up is obvious.
Funnel · Walzpunkt offer request
7d| Goal | Property | Completions 24h | Rate | Trend |
|---|---|---|---|---|
| Offer submitted | walzpunkt.ch | 63 | 9.2% | ↑ +0.8pts |
| Launch signup | orbit.zuerich | 128 | 4.1% | ↑ +1.2pts |
| NFC card activated | orbit.zuerich | 14 | 61% | flat |