ESP32-S3 · REVERSE TFT FEATHER

TINYTRACE

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     ▁▁▁▂▁▁  ►

01Why standalone

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.

GLANCEABLE

Is the light red?

The onboard NeoPixel is the beacon — green / amber / red for the worst severity on the current screen, blue when the data is stale.

DIRECT

No sidecar

HTTPS straight to {env}.apps.dynatrace.com with a scoped, read-only platform token stored in NVS. Nothing baked into the firmware.

THREE BUTTONS

No touch

D2 previous · D0 next · D1 refresh (long-press → idle/mascot). Refreshed into RAM on the cadence you pick.

02One image, two apps

A launcher comes up on every reset — D2 up, D0 down, D1 select — and hands the device to whichever you pick.

THE PANEL

Tinytrace

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.

ScreenWhat
active problemsfetch dt.davis.problems — active, deduped (24 h)
golden signalstop-worst service: LAT p99 · TPS · ERR · 4xx
last logsfetch logs | filter loglevel in {ERROR,WARN}
idlemascot + active-problem count
JUST FOR FUN

Trace Runner

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.

variable jumpparallax city rain & lightningSLO = health rank ladder

► Play Trace Runner in your browser

THE BEACON

What the light means

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.

ColourMeaning
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.

03Configure & connect

Everything is provisioned over a captive portal from the launcher's Settings entry — no secrets are ever compiled in.

SETTINGS

Config portal

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.

READ-ONLY

Scoped token

Create a platform token scoped to storage:logs:read, metrics:read, events:read, buckets:read. Revocable from the tokens page.

OFFLINE

Demo mode

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.

TLS validates the tenant against a pinned root-CA bundle — no setInsecure in normal builds. A stolen gadget is just a revocable, read-only token.

04The case

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).

MAGNETS

3 × 1 mm neodymium discs

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.

PlatePause
Main body — magnetic mountlayer 286
Each hatlayer 9

Project & renders live in /enclosure.

05Build one

Hardware

ItemNotes
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 supplyAny phone charger.
LiPo battery (optional)JST-PH 3.7 V. Mind the polarity.
3D-printed case (optional)~€2 filament + a few magnets.

Flash it

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
Use Adafruit_ST7789, not TFT_eSPI — its init() crash-loops on this S3 board. (Hard-won.)