All use cases

time.of_day

The same card, a different target at noon

A sticker on the table, the same one for twelve months. Weekdays 11–14 the lunch menu, from 17 the dinner menu, otherwise the website. The hour is the restaurant's. A poster in Zurich set to UTC evaluates “from 5pm” two hours off.

Where it hangs
Table card, bar sign, door.
Why the paper stays
The menu changes several times a day. Reprinting would mean every shift.

Live resolution

time.of_day = 12:00
time.tz = Europe/Zurichgeo.country = CHdevice.os = ioslang.primary = de
  1. 1Lunch, 11–14
  2. 2Evening, from 17:00
  3. alwaysOtherwise
https://adler.ch/lunch
A folded card standing on a cafe table, carrying the code
The same code on every shot.Table card, bar sign, door.

The ruleset

Valid, storable, mandatory rule last.

Not a description of what the engine could do — this is the text a code carries. The first matching rule wins, and the last one always matches.

ruleset · version 1

{
  "rules": [
    {
      "when": { "time.of_day": { "between": ["11:00", "14:00"] } },
      "then": { "type": "redirect", "url": "https://adler.ch/lunch" }
    },
    {
      "when": { "time.of_day": { "gt": "17:00" } },
      "then": { "type": "redirect", "url": "https://adler.ch/dinner" }
    },
    {
      "when": "always",
      "then": { "type": "redirect", "url": "https://adler.ch" }
    }
  ]
}

The timezone sits on the code, not on the server: time.tz comes from the workspace when the code is created and stays with it afterwards — the code is glued to a wall and does not move.

Also

Same axis, different situation.

Happy hour
16–18 the promo list, otherwise the regular one. An hour is a rule, not a second code.
Pharmacy
After 19:00 to the emergency service. The door stays the same door.
Notice case
The PDF is replaced on Mondays, not the case.

All use cases

Reprinting is the expensive part. Stop doing it.