A tiny standalone Dynatrace desk panel: active problems, golden signals and recent logs on a 1.14" screen you can glance at instead of opening a tab. Talks directly to your Grail tenant over HTTPS — no companion app, no sidecar.
● checkout ▮ 87% header dot + service, battery LAT 128 ms ▁▂▃▅▇▆ ▲ TPS 2.4k ▃▃▄▅▄▅ ► golden signals, top-worst service ERR 3.1 % ▁▁▂▁▃█ ▲ LAT p99 · TPS · ERR · 4xx 4xx 0.4 ▁▁▁▂▁▁ ►
On a Grail tenant, logs are DQL-only — so the device needs a DQL client no matter what. Given that, one read-only platform token + all-DQL is the least code and makes a true appliance: no laptop that has to be awake for the thing on your desk to work. Plug it into any USB charger and it just works.
The onboard NeoPixel is the beacon — green / amber / red for the worst severity on the current screen, blue when the data is stale.
HTTPS straight to {env}.apps.dynatrace.com with a scoped, read-only platform
token stored in NVS. Nothing baked into the firmware.
D2 previous · D0 next · D1 refresh (long-press → idle/mascot). Refreshed into RAM on the cadence you pick.
A launcher comes up on every reset — D2 up, D0 down, D1 select — and hands the device to whichever you pick.
Four screens built on-device from DQL, refreshed on a cadence you set on the device (default 5 min; buttons switch instantly). If there's no WiFi or tenant, it boots a demo mode instead of nagging you.
| Screen | What |
|---|---|
| active problems | fetch dt.davis.problems — active, deduped (24 h) |
| golden signals | top-worst service: LAT p99 · TPS · ERR · 4xx |
| last logs | fetch logs | filter loglevel in {ERROR,WARN} |
| idle | mascot + active-problem count |
A one-button noir endless runner. Agent Decoder runs the graveyard shift and you keep the SLO alive — D1 = jump, held = higher.
Clear gaps, steam vents and patrol drones; grab data shards and origami unicorns. A hit costs SLO (the NeoPixel is the SLO beacon); 0 % ends the shift with a rank. Best score persists to NVS. Fully offline.
The onboard NeoPixel is the “should I look up?” light, so you can read the panel from across the room without reading it at all. It shows the worst severity on the screen you are currently viewing — so it changes as you page through, rather than summarising the whole device.
| Colour | Meaning |
|---|---|
| green | All clear — nothing on this screen needs you. |
| amber | Warning — something on this screen is degraded but not broken. |
| red | Error — an active problem or a failing signal on this screen. |
| blue | Stale — the numbers on screen are old, because the tenant or WiFi could not be reached. Also shown while the config portal is open. |
Blue overrides everything. A green
light on stale data would be a lie — so when the panel cannot refresh, it says so
rather than showing you a reassuring colour based on numbers it no longer trusts. The panel
title also gains a ! and the footer names the reason.
Everything is provisioned over a captive portal from the launcher's Settings entry — no secrets are ever compiled in.
Join the open WiFi tinytrace-setup, open 192.168.4.1, and manage
WiFi networks and Dynatrace tenants — each a list you add
to, select from, or reset. Apply & restart.
Create a platform token scoped to
storage:logs:read, metrics:read, events:read,
buckets:read. Revocable from the tokens page.
No WiFi selected or reachable? The panel shows a canned DEMO MODE set of the four screens, so the device is useful on any desk.
setInsecure in normal builds. A stolen gadget is just a revocable, read-only token.A 3D-printed magnetic-mount case for the Feather, plus a pack of snap-on magnetic hats — each with a Dynatrace logo. Authored as a Bambu Studio project (8 parts, 6 plates).
One in the mount body, one in each hat — dropped in at a print pause and sealed over, no glue. Mind the polarity so the hat attracts.
| Plate | Pause |
|---|---|
| Main body — magnetic mount | layer 286 |
| Each hat | layer 9 |
Project & renders live in /enclosure.
| Item | Notes |
|---|---|
| Adafruit ESP32-S3 Reverse TFT Feather | 1.14" 240×135 ST7789, 3 buttons, NeoPixel, USB-C. The only required part (~€25). |
| USB-C + 5 V supply | Any phone charger. |
| LiPo battery (optional) | JST-PH 3.7 V. Mind the polarity. |
| 3D-printed case (optional) | ~€2 filament + a few magnets. |
cd firmware && pio run -e tinytrace -t upload
The S3's USB can't auto-reset into the bootloader while an app is crashing, so hold it there by hand:
hold BOOT → tap RESET → release BOOT → upload → tap RESET to run
init()
crash-loops on this S3 board. (Hard-won.)