Endless possibilities, by design

· scores, design, automation

📅 April 28, 2026 · Leo from Caereforge

I know it sounds like an exaggeration — but it’s not far from the truth.

Tempo was designed to be adaptable from day one. I was using Hazel and kept thinking about what I could build if “something” could read the exit code of a rule and react with other actions — another script, another Hazel rule, a HomeKit notification. That “something” became Tempo.

Three concrete scenarios, all doable today:

You decide what to send Tempo. Tempo builds the buttons from what it receives.

Tempo doesn’t know about your specific tool — it can’t tell Hazel from UniFi from Kopia. It reads the fields in the JSON payload and adapts the UI to those fields. Change the data, change the buttons. Add a field, add a possibility.

Mechanically: the score for a source declares its actions as JSON templates. Each button’s URL or shell command interpolates fields from the event payload using ${metadata.fieldname}:

"defaultActions": [
  { "label": "Wake-on-LAN",   "trigger": { "openURL": "wol://${metadata.mac}" } },
  { "label": "Open dashboard", "trigger": { "openURL": "${metadata.dashboardURL}" } }
]

A field on the sender side becomes a placeholder on the score side becomes a button on the event row. Add the field, add the placeholder, click again — new button, no app rebuild.

None of this happens without your click. That’s deliberate: V1 wants you in control while we test these patterns across ten different homelabs. V2 will open up auto-firing for the scores that have proven solid — but you’ll always be the one deciding which to enable, and when. The V1 architecture was built to grow into that, no rewrites.

The real limit of Tempo is whatever you can describe in a JSON payload. And that, usually, is enough.


Leo from Caereforge