How to use Relay.
From a first safe rehearsal to a working automation on your own computer. Seven practical chapters explain what to configure, what the result means, how to verify a real action and what to do when something fails.
← Return to control roomFrom rehearsal to a real result.
Each chapter explains what to do, what should happen and how to verify the outcome. Start with the local-file example if you want a deterministic test without depending on a third-party website.
01Your first working automation: archive a changed file
This example proves that Relay can detect a real change and write a real output. It requires only a plain-text file and Python 3.9 or newer.
- Create a source file. Save a UTF-8 text file named
relay-test.txton your computer. PutVersion 1inside. Note its actual path; on macOS it might be~/Desktop/relay-test.txt, while on Windows it might beC:\Users\YOUR_NAME\Desktop\relay-test.txt. Your Desktop location may differ, particularly with cloud sync. - Choose the recipe. Select File integrity. Under Job specification, enter the actual file path, keep Content actually changes, choose Archive changed local file, set a dedicated output folder such as
./relay-test-outputand leave Safe first observation checked. - Rehearse in the browser. In the Decision Lab, click Run the three-step walkthrough. With safe baseline enabled, expect a held baseline, a held duplicate and a triggered change. This is a simulation using sample data, not a read of your actual file.
- Export and extract. Use Download working automation ZIP. Extract it into its own folder and open a terminal there. The ZIP contains
relay_runner.py,relay_config.json,README.txtandLICENSE.txt. - Execute three checks. Run the
--oncecommand shown in chapter 04. The first run stores the baseline. Run it again without changing the file: no event should fire. Now replace the file content withVersion 2and run it once more: one change event and a snapshot should be written.
state.json stores the baseline, runs.jsonl records each check, events.jsonl records actual triggers and snapshots/ contains the archived changed text. A first baseline should not produce a change snapshot.Why this matters: A working interface is not evidence of a working automation. The archived file and the event ledger are the proof that the exported runner performed an action.
02Choose the right source, rule and output
Relay watches one source per job. The source determines which rules make sense; the output determines what is written when a rule passes. All remote sources must be publicly accessible over HTTPS (local HTTP is permitted for localhost).
| Source | What Relay observes | Recommended rule |
|---|---|---|
| RSS / Atom | New entries identified by GUID, link or title; optional keyword filter | New feed item |
| Public JSON | Selected value via a path such as $.data.rate or $.items[0].value | Change, phrase or numeric threshold |
| Public web page | Text extracted from returned HTML; scripts are not executed | Content change or phrase |
| Local text / CSV | UTF-8 file contents on the computer running the worker | Content change or phrase |
What can an action produce?
JSONL event record writes structured events to events.jsonl. Markdown research note writes a short source-linked note under notes/. CSV dataset row appends to events.csv. Archive changed local file writes a text snapshot under snapshots/ and is available only for local files. Every job also keeps its state and run history.
Check every controls the interval when you use --watch. Output folder is a path on your own machine; a relative path is resolved from the directory where the Python process starts. Use a different output folder for each independent job.
03Read the Decision Lab like an engineer
The Decision Lab evaluates editable sample content against your rule. Its purpose is to make the decision observable before the worker is deployed; it never writes your local output or dispatches a webhook.
| Decision | Meaning | What to check |
|---|---|---|
| HOLD | The input was valid, but no new qualifying event exists. | Was this the baseline, an unchanged replay or a condition that remained false? |
| TRIGGER | A qualifying event was detected in the simulation. | Does the Flight Recorder show the correct source and comparison? |
| REJECT | The configuration or sample could not be evaluated safely. | Correct the input or rule before exporting. |
Use Run the three-step walkthrough to compare a first observation, an unchanged repeat and a meaningful change. With Safe first observation enabled, the expected pattern for the file-change example is HOLD → HOLD → TRIGGER. Use Inject failure to confirm malformed evidence is rejected. The Flight Recorder explains each gate and the Evidence Report can preserve the rehearsal outcome.
Why thresholds do not fire repeatedly: A value staying above 5 is not a fresh crossing every five minutes. A numerical rule triggers when the condition changes from false to true. Likewise, a repeated feed item is not a new publication.
04Export and run on Windows, macOS or Linux
After exporting, extract the ZIP and open a terminal in the extracted directory containing relay_runner.py and relay_config.json. The worker uses the Python standard library; there is no pip install step.
macOS / Linux — Terminal
Check that Python 3.9+ is installed, then run one real check. The first run normally establishes the baseline.
python3 --version python3 relay_runner.py --config relay_config.json --dry-run python3 relay_runner.py --config relay_config.json --once
--dry-run reads the real source but writes no state, logs or webhooks. --once performs a real check and persists its decision.
Windows — PowerShell or Command Prompt
Open a terminal in the extracted folder. If the Python Launcher is installed, use:
py -3 --version py -3 relay_runner.py --config relay_config.json --dry-run py -3 relay_runner.py --config relay_config.json --once
If py -3 is unavailable, install Python 3.9+ from the official Python website and use the available python command. Ensure the local file path in your configuration points to the real Windows location.
What is inside the export?
relay_config.json stores the selected source, rule, interval and action. relay_runner.py performs the real work. README.txt documents operation and LICENSE.txt provides the MIT licence. Export JSON config saves only the configuration; it is not a runnable automation on its own.
--once run prints its decision in the terminal and adds a record to runs.jsonl. When an event fires, inspect events.jsonl and the selected output file or folder.05Keep an automation running after the browser closes
Relay is local-first, not a hosted 24/7 service. The website can be closed after export. Monitoring continues only while your Python process runs or an operating-system scheduler launches it on a powered-on computer or server.
Continuous mode while a terminal stays open
python3 relay_runner.py --config relay_config.json --watch
On Windows, replace python3 with py -3 if needed. Stop with Ctrl+C. Closing the terminal or shutting down the device stops this mode.
Scheduled execution across sessions
- Windows: Open Task Scheduler, create a task triggered at your desired interval, set the program to your Python executable (or launcher), add
relay_runner.py --config relay_config.json --onceas arguments, and set Start in to the extracted Relay directory. Test the task manually. - macOS: Use a user
launchdagent withProgramArgumentspointing to Python, the absolute path torelay_runner.py,--config, the absolute config path and--once. SetWorkingDirectoryto the Relay folder and a suitableStartInterval; load the agent and inspect its logs. - Linux: Use cron or a systemd timer. Example for a 15-minute cron schedule (replace both paths):
*/15 * * * * cd /ABSOLUTE/PATH/relay && /usr/bin/python3 relay_runner.py --config relay_config.json --once
Use an interval appropriate for the source and its terms of use. Do not launch overlapping runs of the same job. Relay has a single-instance lock for each output folder, but scheduling should still avoid unnecessary collisions.
06Diagnose a held action, missing file or failed run
| Symptom | Likely cause and next check |
|---|---|
| No event file on first run | Expected with Safe first observation: Relay records a baseline before acting. Check runs.jsonl and state.json. |
| HOLD after a change | Confirm the monitored file or JSON value really changed, the selected rule matches, and the source path points to the correct location. |
| Source unavailable | Check HTTPS address, network, access permissions, rate limits and whether the remote service returns the expected content. |
| JSON path not found | Inspect the source response and correct paths such as $.data.rate. A numeric threshold requires a numeric selected value. |
| Configuration changed | The saved state belongs to a different source/rule/job. Use a new output folder or deliberately reset the baseline. |
| Webhook not delivered | Check receiver availability and state.json for pending deliveries. The receiver must deduplicate repeated event IDs. |
Reset the baseline deliberately
python3 relay_runner.py --config relay_config.json --reset-baseline --once
This clears the stored baseline state and runs another check; previous event and run logs remain. Do not reset merely to force a duplicate event. On Windows use py -3 if required.
Where to look: runs.jsonl records successful checks, held decisions and errors; events.jsonl contains triggered events. The selected action creates notes/, events.csv or snapshots/ when appropriate. The Decision Lab history is separate and exists only in the browser session.
07Operating limits, permissions and data ownership
No account or hosted lock-in: Relay builds and simulates in the browser. The exported worker runs on your machine using Python 3.9+ standard libraries. There is no Relay cloud account, paid API requirement or automatic telemetry in the runner.
- Source permissions: Monitor only sources you may access. Respect site terms, robots guidance, copyright and sensible polling intervals. Markdown output contains source metadata and a short excerpt, not a licence to republish full articles.
- Data and credentials: Configurations and local outputs remain on your machine after export. Do not put credentials in source URLs or share configuration files containing private endpoints. Remote sources use HTTPS except for localhost testing.
- Technical limits: Sources are limited to 2 MB per response and RSS/Atom processing to 500 entries per check. HTML is read as returned text; JavaScript-rendered page content is not executed. A remote source may change format, disappear or reject automated requests.
- Webhook delivery: Optional HTTPS webhooks send event data to a receiver you control. Delivery is at-least-once; the receiver should deduplicate using
X-Relay-Event-ID. The browser's Decision Lab never sends webhooks. - Reliability: Relay records decisions and failures but does not guarantee uninterrupted monitoring, exactly-once delivery or detection of every intermediate state. Keep the computer online and inspect the run ledger periodically.
Ready to operate? Rehearse first, export second, verify the local output third.
Start with a mission ↗