Install guide

Set up Herald, start to finish.

Everything from the backend to your first Job. Follow it top to bottom — most people are done in an afternoon.

⌁ About 45–90 minutes · one-time setup

What we'll cover

  1. What you'll need
  2. Install the backend
  3. Your bearer token
  4. Connect with Tailscale
  5. Get the apps
  6. Pair your phone
  7. Notifications (optional)
  8. Give it email (optional)
  9. Create & manage Jobs
1

What you'll need

Three essentials — that's it. The Herald apps just download; you only need the last two if you want push notifications on your phone (covered in step 7).

Already use Claude Code on this Mac? Then steps 1–2 are mostly done — you just point Herald at the claude you already have.
2

Install the backend

The backend is a small Node server that runs on your Mac and drives Claude for every chat and Job. Grab the code, install dependencies, and create your config file.

# clone and enter the project
git clone https://github.com/edbyrne/herald.git
cd herald

# install dependencies
npm install

# create your config from the template
cp .env.example .env

Open .env and set two things: your bearer token (next step) and HERALD_BIND=0.0.0.0 so your phone can reach it over Tailscale. Then start it:

# run it (stays in the foreground for now)
npm start

✓ Herald listening on :4123
Run it on boot. Once it's working, copy the included launch agent so Herald starts automatically and restarts if it ever stops:
cp launchd/me.edbyrne.herald.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/me.edbyrne.herald.plist
Don't set ANTHROPIC_API_KEY. Herald deliberately refuses to start if it's present — that's what keeps it using your Claude subscription rather than a metered API key.
3

Your bearer token

The bearer token is the single password that lets your apps talk to your backend. Nothing reaches Herald without it. Generate a long random one:

# generates a strong 64-character token
openssl rand -hex 32

9f2c…a1b7  ← copy this

Paste it into .env as HERALD_TOKEN=…. You'll enter the same token once in each app when you pair. Treat it like a password.

Keep the token in your password manager. If you ever think it's leaked, change it in .env, restart Herald, and re-pair your apps.
4

Connect with Tailscale

Tailscale creates a private, encrypted network just between your devices — so your phone can reach your Mac from anywhere without opening any ports or exposing anything to the public internet.

  1. Install Tailscale on your Mac from tailscale.com/download and sign in.
  2. Install the Tailscale app on your iPhone and sign in with the same account.
  3. On the Mac, note its Tailscale name — something like your-mac.tailnet-name.ts.net (or its 100.x.x.x address).

That hostname plus the port — http://your-mac.tailnet.ts.net:4123 — is the address your apps will use.

🔒
Because traffic stays inside your tailnet, only devices you've signed in can even see Herald. There is no public URL to find or attack.
5

Get the apps

The Herald Mac and iPhone apps are ready-to-install builds — no Xcode, no developer account, nothing to compile.

🔔
Want notifications on your phone? That's a separate, optional step — the open-source Herald Notify app in step 7. The main apps work fully without it.
6

Pair your phone

Open the app for the first time and it'll ask for two things:

Tap connect. You should see your (empty) chat list. Send a first message — “hello, are you there?” — and watch the reply stream in. That's your agent, running on your Mac, answering on your phone.

Do the same in the Mac app. Both apps point at the same backend, so your chats and Jobs stay in sync across them.
7

Notifications — the Herald Notify app

Optional

Herald keeps notifications sovereign: there is no notification server in the middle that anyone — us included — could read. The trade-off is that to get push on your phone you build one tiny open-source companion app, Herald Notify, signed with your Apple account and your push key. Notifications then travel your Mac → Apple → your phone, and no one else is ever in the loop.

Skip this entirely if you don't need phone push — chat and Jobs work fully without it, and the Mac app shows its own notifications while it's running.

What it is

A small receiver app. When a Job finishes or a reply lands, your backend sends a push straight to it; tapping the notification opens the main Herald app to the right place. It stays out of the way otherwise.

One-time setup

  1. Join the Apple Developer Program ($99/yr) — push keys require a paid account.
  2. Open the open-source Herald Notify project in Xcode, set it to your own team, and run it onto your iPhone.
  3. In your developer account, create an APNs key (a .p8 file); note its Key ID and your Team ID.
  4. Hand those to your backend so Herald can push with your key:
    # ~/.herald-secrets/apns.env  (+ the AuthKey_*.p8 file alongside)
    APNS_KEY_ID=<your-key-id>
    APNS_TEAM_ID=<your-team-id>
    APNS_BUNDLE_ID=<your-notify-bundle-id>
  5. Open Herald Notify, point it at your backend (the same address + token as the main app), and it registers itself. Notifications now flow — privately.
🔒
Because you sign Notify and hold the push key, a notification's text only ever travels from your own Mac to Apple to your phone. The Herald project never sees it.
8

Give it email

Optional

This is one of Herald's best tricks: give it an email address of its own and it can send, receive and reply to real email on its own — something Claude by itself can't do. Reply to a thread from any mail app and Herald acts on it and writes back.

What you'll need

Where the credentials go

Herald keeps email secrets outside the app folder, in a protected file on your Mac:

mkdir -p ~/.herald-secrets
# put these two lines in ~/.herald-secrets/email.env
GMAIL_ADDRESS=herald.yourname@gmail.com
GMAIL_APP_PASSWORD=<paste-the-16-char-app-password>

Restart Herald and it'll start watching that inbox. Every authenticated email from you becomes an instruction it acts on.

How you'll use it

Just email it, or ask it to handle mail in chat:

Email a summary of today's Portfolio Watch to me at the end of each run.
When my accountant replies to that thread, draft an answer and send it.
🔒
Herald only acts on mail it can verify is genuinely from you, so a stranger emailing the address can't issue it commands.
9

Create & manage Jobs

Jobs are recurring chats that run on a schedule. The clever part: you don't fill in forms — you just tell Herald what you want in plain English, and it sets the schedule, the prompt and the tools for you.

Make one

  1. Switch to the Jobs tab and tap . Give it a name (e.g. “Morning Briefing”).
  2. Open its chat and describe it:
Every weekday at 7am, summarise my unread email, today's calendar and any overnight Slack DMs into one short briefing.

Herald confirms the schedule and switches the Job on. From then on it runs itself.

Manage them

Change your mind later? Just tell it: “run this on Sundays instead,” or “also include my GitHub notifications.” It updates the Job itself.

That's it — you have an agent.

Leave the Mac running. Tomorrow morning, the work will already be done.