The log written by the example job.Captured 5 September 2026
Input
RepositoryAny Git checkout.
Output
Run logPlain JSON you can read.
Interfaces
CLI + SDKTerminal or TypeScript.
No hosted service
Jobs run on your machine and never wait on a server.
A log for every run
Open it to see what went in, what came out, and when.
Your files stay put
Source files and credentials never leave your machine.
Local release
Install Relay and run your first job.
Requires Bun 1.3.14.
macOS
Terminal
curl -fsSL https://relay.example/install.sh | sh
Homebrew
brew install relay
Apple silicon and Intel, macOS 13 or later.
Linux
Terminal
curl -fsSL https://relay.example/install.sh | sh
Bun
bun add --global relay@1.2.3
x86_64 and ARM64, glibc 2.34 or later.
Windows
No native Windows build yet. Relay runs in WSL2.
WSL2 terminal
curl -fsSL https://relay.example/install.sh | sh
Runs on
macOS
Linux
Windowsvia WSL2
01
Initializerelay init
Create a workspace.
02
Runrelay run job-01
Run a job by name.
03
Inspectrelay inspect job-01
Read its log.
Agent setup
Ask your agent to set it up.
Install Relay from https://relay.example/install.sh.
Read the project instructions before making changes.
Run relay init in this workspace and create a job named sample.
Run the job, then show me its log.
Show full prompt
Install Relay from https://relay.example/install.sh.
Read the project instructions before making changes.
Run relay init in this workspace and create a job named sample.
Run the job, then show me its log.
CCClaude Code
claude mcp add relay -- relay serve
CCodex
codex mcp add relay -- relay serve
Primitives
Three objects cover most work.
People and agents use the same three objects, so a job you start by hand is one an agent can rerun.
01
Jobs
A named task with declared inputs and outputs.
02
Logs
The record of one run, readable by people and agents.
03
Schedules
Run a job on a schedule without a separate daemon.
Workflow
A job keeps its name everywhere.
Start it from the CLI and check on it from code; both see the same job.
Metallic wordmarks and exact-shape marks share a restrained rainbow reflection. Wordmarks use .hraness-foil-text, primary calls to action use .hraness-foil, and attachFoil eases the pointer inputs on data-foil targets.
The same shared system, with compact sans headings and a plain surface.
Article layer
Technique
Replaying webhooks without breaking signatures
Relay replays a failed webhook from the stored request body, so the retry sends the same bytes the provider signed.
By Hraness · Published · Updated
Drafted with AI from the source code and reviewed by an independent AI editorial review.
The problem
A provider signs the exact request body. Parsing the JSON and serializing it again changes whitespace and key order, and the signature check then fails on every retry.
Limit
This applies to providers that sign the raw body. Header-only schemes need no stored copy.
The approach
Store the body as bytes next to the parsed event, and send those bytes on replay.
await replay(event.id, { body: stored.raw });
Step
Stored
Sent on replay
Receive
Raw body and headers
Nothing
Retry
Attempt count
The stored raw body
What Relay keeps for each delivery, and what a replay sends.
The `.hraness-prose` grammar carries the shared `--hraness-type-*` scale to docs and guide surfaces that do not run the publication shell. Headings step up on wide windows and a serif face opts in with `data-hraness-reading-face="serif"`.
Section spacing
Sections separate on the shared space token; subsections tighten to the subsection space and small heads keep the text face.
Status pages
One page for missing addresses and recoverable errors. It leads with the product's main action, offers the closest known page for a mistyped link, and lists at most three places to start. Move the pointer over the glyph, or click it.