Listening & pings

What he reads, who can ask him things, and what he may do for them.

Edward reads and sends iMessages as you. He uses the Apple ID that Messages on the host Mac is signed into, and his messages go out from your own account, signed as Edward. With Messages turned on, anyone can write @Edward in a chat with you and he answers there. Decide that you want this before you turn it on.

Listening

Three listeners store what arrives, and do nothing else. Each is off until you turn it on in the Edward tab: Messages and Email under Attention → Listening → Configuration, Gmail under Attention → Gmail → Watch my inbox.

ListenerHowNeeds
iMessageReads ~/Library/Messages/chat.db every 10 secondsFull Disk Access; Messages signed into your Apple ID; EDWARD_OWNER_HANDLES
Mail.appReads Mail’s own index for unread inbox mailFull Disk Access; Mail.app kept running
GmailGoogle’s API, with “Watch my inbox” onAn OAuth client of your own (gmail-setup.md)

What is stored feeds the mind: Edward can read it when you ask (“what did Rowan say about Saturday?”), and, if you turn noticing on, he reads each batch for what matters (see The mind). A message thread waiting on you shows on Today as one card per thread, and “Done” clears it.

Mail can never trigger him: anyone can type @edward in a subject line, so only an iMessage can ask Edward anything.

Pings

A ping is an iMessage that asks Edward something:

  • @Edward from anyone in any chat (yours included)
  • anything you write in your own self-chat
  • a reply to one of Edward’s messages

Each ping gets its own turn, with the chat’s recent lines, its people, the photos and PDFs in it, and the links in the message, and his answer goes back into that chat. Pings are recorded the moment the message is stored, and answered by their own runner, so they are never lost in a busy batch. A ping closes when his reply is confirmed delivered (read back from Messages), or when he records that he chose not to answer. If a send went out and something failed after it, he says he was cut off rather than answering twice.

Your own pings carry your authority: what you tell him in your self-chat or in your own @Edward is remembered as yours. A promise he makes in a chat (“I’ll check at five”) is kept in that chat.

Friends’ pings

A friend’s @Edward is someone else’s text driving a turn on your Mac, so it gets less:

  • No shell, file editor, Chrome or screens, and look only at what they sent or a link. Those act as you on your machine. EDWARD_FRIENDS_FULL_TOOLSET=on gives friends everything, at the risk that a message (or a page it points him at) drives a shell running as you.
  • No new conversations: anything he sends goes into that chat, or one that addressed him in the last 24 hours. He never writes to someone who asked him nothing, and leaves no task or reminder behind.
  • Limits: six turns an hour per chat, more than three friends’ pings in five minutes stops him there (and tells you), and friends’ turns spend Edward’s own share of the daily cap, never your reserve.
  • Unknown numbers are held for you, with a note at most once a day per sender, unless the chat is a group with someone from your contacts in it.
  • Your standing instructions come along: if you told him to stay out of a chat, he stands down there and tells you.

What a friend’s ping can still do is read what Edward reads (your chats, memories and calendar) and answer from it. His prompt asks for discretion, but a prompt is not a wall: think about who can reach him before you turn Messages on.

Switches

  • EDWARD_PINGS=off stops the runner; pings are still recorded, and the mind answers mentions instead. To stop answering altogether, turn Messages off in Listening.
  • EDWARD_PING_FRIEND_TURNS_PER_HOUR (6), EDWARD_PING_CONCURRENCY (2), and the iMessage skill, which gates reading and sending.
  • GET /api/health/report counts how every ping ended, by who asked, and how fast he answered.

Photos, PDFs, voice messages and video

Attachments in a chat are understood, not skipped:

  • Photos (HEIC, stickers, GIF frames) are converted with macOS’s sips and seen as pictures; a ping turn gets up to six images and one PDF inline.
  • PDFs are read whole (up to 15 MB and 100 pages).
  • Voice messages and videos are heard through ElevenLabs’ Scribe (once voice is set up) and seen through a small Swift helper built by setup.sh (frames from a video).
  • Links are read first, from public addresses only, and never a sign-in or confirmation link, or one from an unknown number.

Images leave saved history as a line with their reference, so old conversations stay small. EDWARD_MEDIA=off brings back plain placeholders.

Other ways in

  • Twilio gives Edward a number of his own for SMS and WhatsApp. Webhooks are refused without a valid Twilio signature, and only your own numbers get an answer; anyone else’s text is held, unanswered.
  • The WhatsApp bridge (whatsapp-mcp) reads and sends WhatsApp as you, once you run and pair it.
  • Alexa can ask Edward through a custom skill, but inbound requests are not signature-verified yet: see Guard rails.

Want Edward on an Apple ID of his own, so people text him rather than you? That is a project; Adapting to your Mac has a prompt for it.


The long form: heartbeat.md, pings.md and media.md.