A baseline is not an alert.
Relay learns the current state before triggering future changes. For numerical rules, it looks for a transition into the matching condition rather than firing at every polling interval.
Automation with a reason.
Not just a trigger.
A source changes. A rule evaluates it. An action either runs or is deliberately held. Relay makes every step inspectable, lets you rehearse failure cases and exports an automation you can operate yourself. No account, external SDK or hosted dependency.
Start with a real task, not an empty canvas. Every recipe is editable, testable and exportable as code.
Configure the job on the left. Watch its route change on the right, then run the evidence through the decision gate before exporting.
Only use a receiver you control. Webhook delivery is at-least-once and the receiver should deduplicate event IDs.
Identify feed entries
Baseline and prior state
New IDs, optional keyword
Markdown research note
Rehearse against an editable source response before deploying. No remote source is fetched and no local action or webhook is executed here.
Compare three outcomes against the same rule: first observation, identical replay and a genuine change. The final decision must be justified by the evidence.
Evaluate a sample or run the guided walkthrough to inspect a decision.
Export a complete Python 3.9+ runner, your rules, operating instructions and an MIT licence. The worker checks the source, keeps local state, records its decisions and writes the configured output. No account, external package or BondStats API key is needed. A running computer or server is required for unattended execution.
# Rehearse without writing state python3 relay_runner.py --config relay_config.json --dry-run # Establish a local baseline python3 relay_runner.py --config relay_config.json --once # Watch while this computer stays on python3 relay_runner.py --config relay_config.json --watch
Relay learns the current state before triggering future changes. For numerical rules, it looks for a transition into the matching condition rather than firing at every polling interval.
The exported runner records checks, held decisions and errors in local JSONL logs. A failed source request is not interpreted as a meaningful new event.
The runner uses Python's standard library. External sources may change, polling can miss intermediate states and webhook delivery requires receiver-side deduplication.