Agent-first · local macOS

Blood Rush for
agent output.

Give every agent, job, and webhook a local channel. Blood Rush keeps the message, payload, run status, and notification policy in one native Mac surface.

Needs Attention queueMessage + payload detailAgent and webhook channelsLocal SQLite history
Run Blood Rush locally
clone, run, ping → · agents, jobs, webhooks · local-first
live preview Agent Output
Blood Rush
2 attention 22 events
4
Needs Attention All Output Agents
Agent runs · last hour
The problem

Background work is getting noisy.
Give it channels.

Agents finish runs, providers fire webhooks, jobs fail quietly, and every source leaves a different breadcrumb. Blood Rush gives that output one local surface.

Without Blood Rush
Scattered output.
TERMINAL research-agent run_731 completed
SLACK #agents · pricing scout needs review
LOGS build-agent · failed after 6m 12s
GITHUB issue triage bot added 14 labels
BROWSER open artifact.html to inspect output
LINEAR BR-284 · follow-up generated
STRIPE invoice.paid · provider tab still open
NOTION meeting notes agent left 2 comments
CRON daily digest job wrote output.json
With Blood Rush
One local surface.
Pricing Scout RUSH
now
Competitor pricing brief ready.
7 products · 3 pricing patterns · needs review
Read the message, inspect the payload, handle what needs you.
How it works

Run it locally. Give agents a channel. Read output.

01
Run locally
Start the relay and native Mac app from the repo. No account, hosted dashboard, or browser pairing.
+
02
Create agent channels
Give each agent, job, or integration a channel. Channels and Settings open the same creation flow.
03
Post run output
Send JSON with title, body, status, run_id, and optional bloodrush profile hints. Inspect the message and payload together.
Local setup

Start local.
Point an agent at it.

The open-source shape is deliberately plain: a local SQLite file, a Bun relay on localhost, and the native Mac client. Create a channel for each agent, copy its URL, and send JSON from anything that can POST.

~/dev/blood-rush
$ pnpm start
# create "pricing-scout" in the app
$ pnpm webhook:urls --channel pricing-scout
# optional public webhook URL
$ pnpm tunnel:cloudflared
$ pnpm webhook:urls --base https://your-tunnel.trycloudflare.com
$ curl http://localhost:8787/in/<token>/pricing-scout \
-H "content-type: application/json" \
-d '{ "title": "Brief ready", "status": "needs_review", "run_id": "run_123" }'
{ "ok": true }
↳ Pricing Scout. Needs attention.
What's inside

Agent output, handled like product work.

Agent channels
Every agent gets a real place to land.
Create a channel for a build agent, pricing scout, support triage, or image worker. Each one gets its own slug, glyph, color, and policy.
Notify · attention Sound · glass Kind · agent Mode · silent
Attention policies
Notify all, stay silent, or only interrupt when an agent reports failed, blocked, error, or needs_review.
{{}}
Agent-shaped copy
Agents can send raw {title, body}, or you can template event copy from any {dot.path} in the payload.
Run history
Infinite local history by default.
Inspect raw payloads in the detail pane. Filter by agent channel, attention state, run id, or "the one with that email I half-remember."
Native, not Electron
Swift + SwiftUI.
4 MB
on disk
22 MB
RAM idle
Local-first
Your event log lives on your machine.
The relay runs locally, stores agent output locally, and talks to the menu bar app over localhost.
Channels

Agent channels first. Provider presets beside them.

Give every agent a named URL, then keep provider webhooks in the same desk. Stripe, Polar.sh, Lemon Squeezy, Dodo Payments, Creem, and GitHub ship as integration channels with sensible default copy and verification where it matters.

Hover any card to see example output from that channel.

Stripe
Stripe
12 today
Stripe now
Stripe just lit up. €49.
pro_monthly · marie@studio.fr
Polar
Polar
7 today
Polar now
Polar pinged. $29.
pro · @noa.k
Lemon Squeezy
Lemon Squeezy
4 today
Lemon Squeezy now
Squeezed. $190 annual.
pro_yearly · ben@anver.studio
Dodo Payments
Dodo Payments
6 today
Dodo Payments now
Dodo just paid out. €49.
pro_monthly · marie@studio.fr
Creem
3 today
Creem now
Creem just lit up. $190.
annual · ben@anver.studio
GH
GitHub
9 today
GitHub now
GitHub issue opened.
bloodrush · #284 · @noa
Agent / webhook
any agent slug
Agent now
Agent run needs review.
title + body + status + run_id
Questions, calmly answered

FAQ

How do I connect an agent?
Create an Agent channel, copy its webhook URL, then POST JSON with title, body, status, run_id, and any payload fields you want to inspect later.
How do I add a channel?
Open Channels and click the plus button, or open Settings and click Add channel. Both places open the same Create channel sheet, with Custom plus provider presets for integrations.
Which payment processors work today?
Stripe, Polar, Lemon Squeezy, Dodo Payments, and Creem all ship as integration channels. Paste your local or tunneled webhook URL, drop in the signing secret, done. Anything else? POST JSON to any named channel.
Is this just IFTTT for my menu bar?
Kind of. IFTTT and Zapier are great at piping events. Blood Rush is the local surface your agents and automations pipe into. We don't replace them, we give their output a quieter home.
Why not just a Slack channel?
Slack is a workspace. It wants threads, mentions, channels, and replies. Blood Rush is for agent output you need to scan, inspect, mark handled, and move past.
What about Windows or Linux?
Mac first. The bar is high — native Swift, real notification permissions, menu bar polish. We'll consider other platforms when v1 ships.
Where does my event data live?
On your machine. The relay runs locally, stores event history in your local database, and streams it to the menu bar app over localhost.
Can I send my own custom events?
Yes. Generic and agent channels take JSON with title, plus optional body, url, event_type, level, status, run_id, and bloodrush profile hints. The channel is whichever /in/<token>/<channel> URL you POST to.
What if my Mac is asleep?
Local-first means sleepy Macs are sleepy. If the relay or tunnel is offline, outside services cannot deliver. That tradeoff is part of keeping the tool small, free, and yours.

Give your agents
a local desk.

Clone the repo, run the relay, create an agent channel, and send JSON. Add a tunnel when Stripe, GitHub, or another provider needs to reach your Mac.