Heartbeats
Have the agent watch something on the schedule you set. It speaks up when there is something new and stays quiet otherwise — so you don't have to remember to look.
What it is for
Some things are worth knowing but happen rarely: someone in a forum starts complaining about the problem you solve, a page quietly changes. Watching for it is not worth your daily attention, but missing it costs you. A Heartbeat hands that job to the agent: it looks on the rhythm you give it and comes to you only when there is genuinely something new.
Creating one
Say it in a sentence — there is no form to fill in: what to watch, how often, and what is worth telling you about. It then appears under Heartbeats in the sidebar. Changing the rhythm or the criteria is another sentence, and it reads the change back to you to confirm.
Writing a good Heartbeat: source, criteria, prompt, tools
A Heartbeat is made of four things. You say them in the conversation, it writes them down and reads them back; changing any of them is one more sentence ("swap its source for…", "set its tools to…", "change the daily cap to…") and it reads the diff back to you.
- Source — An RSS/Atom address. With a source, the system fetches, compares and pre-filters by itself; quiet runs never wake the model. If one site has several boards, merge them into one address when you can (Reddit accepts r/a+b+c/new/.rss) — one upstream request instead of several. Feeds that need a login work too, such as the private RSS of your Reddit inbox — that link is a password, paste it once; if you copied it from old.reddit.com, change the host to www.reddit.com first (the old site answers 403 to anything that is not a browser).
- Criteria — One paragraph on what counts and what does not. The pre-filter reads only this, so write it like an acceptance test, not a task: "the poster is asking what virtual staging costs" works better than "watch pricing topics". Spell out what you do not want as well (ads, job posts, portfolio shares).
- Prompt — What the model does once something matched: the output format, the house style, what to do when something cannot be read. It is only an instruction — it cannot hand the model a tool; that is the next item.
- Tools — On a Heartbeat with a source, the matched run has no tools at all by default: the items are already fetched and judged, the model only has to speak. If you want it to read one level deeper after a match (say, the comments under a post before drafting), say "set the tools it may use at runtime to fetch_feed". Only listed tools exist, and the line at the top of its conversation shows them.
A Heartbeat finds and drafts. It never posts for you. Whether and what to send is your call after reading.
Three examples (say them as they are)
Silence is the normal state
Most runs find nothing, and on those it says nothing at all — no unread dot either. That is deliberate: something that reports "no updates" every hour is ignored within two days, and then the one run that mattered is ignored with it. The runs are visible in the conversation if you want them; they just don't interrupt you.
Managing a Heartbeat
Each one lives under Heartbeats in the sidebar. Hover and three controls appear; everything else is changed by saying so in the conversation:
- Pause / resume: a paused Heartbeat does not run and does not spend. Resuming schedules it from now — it does not replay the runs it missed
- Delete: there is a six-second undo. Deleting also drops the record of what it has already seen, so an identical new one will report everything currently there as new
- Change the rhythm, what it watches, or what is worth reporting: say it in its conversation and it reads the change back to you. These are not buttons on purpose — a button cannot express \u201cMonday mornings at nine\u201d, and reading it back is how you catch it mishearing you
- Mute one: a per-Heartbeat switch in notification settings. Muted means \u201ckeep running, just don't push it to me\u201d — not the same as paused
Where notifications go
By default findings land in the conversation. You can also add an incoming webhook from the icon on the Heartbeats row in the sidebar — Slack, Discord, Feishu, WeCom or DingTalk — and new findings are pushed there.
- Each Heartbeat can be muted on its own without affecting the others
- A notification that arrived counts as you having seen it. A Heartbeat only pauses itself when, several times in a row, nothing arrived and you never opened its conversation
How to connect it, what the message looks like, and what to check when nothing arrives: see Heartbeat notifications.
How it spends credits
Heartbeats come in two kinds depending on how they look, and they cost very differently. Worth knowing before you create one:
- A Heartbeat that watches an RSS/Atom feed (give it the feed URL when you create it): the system fetches, compares and filters by itself, so a quiet run costs next to nothing; the model is only called when something looks relevant, and that run is about 4–7 credits. Measured on an hourly Heartbeat: under 1 credit a day on a quiet feed, about 40 a day on a busy one
- Any other Heartbeat (one that needs the browser, the model’s judgement on every run, or generates images on a schedule): every run is an ordinary agent run of about 20–30 credits, and the runs that find nothing cost too; hourly, that is roughly 500–700 a day. The line at the top of its conversation says which kind it is
- A tighter rhythm spends faster: every 10 minutes is six times every hour
- You can pause or delete it from the sidebar at any time; once stopped it spends nothing
- You can give it a daily limit: say "spend at most 300 credits a day" in its conversation and it reads the limit back to you. Once reached, it stops for the day and carries on the next
Why a quiet check on a feed is nearly free. The system fetches the feed and compares it with what it has already seen; only entries it has not seen before go to a small decision model — TypeSafe's Jev — which answers one question per entry: does this match what you asked to watch? It reads text only, answers in well under a second, and costs a fraction of a credit for a whole batch. Nothing new, or nothing relevant, means the main model is never called and the run ends in a few seconds. Only entries that match, or that Jev is unsure about, are handed to the main model to read and report. If Jev is unavailable for a run, the main model judges the new entries itself — a few credits more, never a missed run. How it works and what we measured →
Current limits
- It is in Beta — usable, still being refined, and the behaviour may change
- The clock is minute-grained, so "09:00 sharp" drifts by a few minutes
- Tasks on pages that need a login require your computer awake and the extension enabled; a Heartbeat that only reads public sources does not
Let the agent use your browser → · How credits are charged →