Brain Task Reminders
Open tasks a brain is waiting on, tracked in one place and gathered into a single daily digest at the time you choose, by email or in-app.
A brain often needs something it doesn't have yet — a photo, an answer only one person has, a document to upload. Brain task reminders give that "waiting on" state a durable home: it's tracked, mirrored where you can read it, and swept into reminders on its own schedule instead of depending on someone remembering to bring it up.
Opening and closing a task
Two MCP tools do the work mid-session:
open_brain_task—brain_id,description,addressee("owner"or"share"),due_date(optional,YYYY-MM-DD), andschedule(optional — see Cadence below). Addressing a task to"share"requires ashare_idfrom a priorshare_braincall — the recipient must already be shared with the brain.close_brain_task—task_id. Closing removes the task from the next digest, the brain's note, any still-staged reminder for it, and the top-of-session surface, and ticks its box in the brain's Obsidian checklist if it has one.
open_brain_task({
brain_id: "<uuid>",
description: "Photo of the front lawn, wide angle",
addressee: "owner",
due_date: "2026-10-01",
schedule: "remind me Friday"
})
Where open tasks show up
- The brain's compiled note carries an
## Open Taskssection, split into "Yours" (owner-addressed) and "Owed by others" (share-addressed), regenerated from the table — never hand-edited. It updates immediately when a task opens, closes, or reopens, not just on the next full compile. - The admin UI —
/admin/brain-tasks(linked from/admin/brain) lists every open task across your brains, with Close, Silence, and Reopen actions, plus a Staged Reminders panel described below. - The next session with that brain surfaces open tasks at the top, via the same compiled-note section
get_brainreturns.
An Obsidian checklist for a brain
A brain can keep its tasks in a note in your Obsidian vault, as ordinary checkboxes. Pick the note on /admin/brain-tasks under Obsidian checklists, or call patch_brain with tasks_note_id. The note has to be one that lives in your vault, so the file stays yours: BlackOps edits the task lines and leaves every other line alone, apart from the email redaction every BlackOps write to your vault applies.
Each task line ends in a block ID that links it to its task:
- [ ] Reconnect LinkedIn 📅 2026-10-09 ➕ 2026-10-06 ^bt-<task id>
The dates use the Obsidian Tasks plugin's format, so its queries and date pickers keep working. From there the two sides stay in step:
- Tick a box in Obsidian and the task closes in BlackOps once the change reaches GitHub. It drops out of the digest, the brain's note and any staged reminder. This works from any note BlackOps syncs with your vault, not just the checklist.
- Close a task anywhere else (the admin UI,
close_brain_task, a reply to a reminder, adone:line in a daily note's Work Log) and its box gets ticked, with the date it was done. - Untick a box in the checklist and the task reopens. Only the checklist can do this. An old daily note still shows tasks as open after they close, so an unticked box anywhere else changes nothing.
- Type a new unticked line in the checklist and it becomes a task on that brain, with its
📅date as the due date. If an open task already has the same wording, the line is linked to it instead of making a duplicate. - Open a task for yourself anywhere else and it is added to the bottom of the checklist. Tasks addressed to someone you shared the brain with stay out of it.
Deleting a line does not close its task. The line comes back the next time the brain's tasks change. Tick it instead.
BlackOps writes to the file as it is on GitHub at that moment, so it never overwrites an edit you pushed a second earlier. If you tick or untick a box at the same time a task changes in BlackOps, your change wins. Every checklist is also re-checked every 10 minutes, so a change that failed to sync (GitHub briefly unavailable, say) catches up on its own. Edits that are still only on your device reach BlackOps when your vault syncs.
The digest, once a day, at your delivery time
Reminders are gathered into ONE digest per day, at a delivery time you control — never at an arbitrary moment a task happens to become due. A 15-minute tick checks, per site, whether the owner's local delivery time has passed today and today hasn't already been gathered; once both hold, it gathers everything due and sends:
- Owner-addressed tasks — a reminder goes out immediately, no staging, since nothing needs previewing for a message to yourself.
- Share-addressed tasks — the reminder is staged behind a hold window (2 hours by default) rather than sent immediately. You get one digest email listing exactly what's queued and to whom, delivered before anything staged can possibly go out, with a one-click cancel link per item. Cancelling skips only that occurrence — the task stays open and comes up again next cycle. Silencing a task (from the admin UI) is the separate, explicit action for "stop asking about this" rather than "not today."
Delivery time defaults to 09:00 America/New_York and is stored per site (brain_task_settings); shared recipients inherit it rather than getting a setting of their own. This is deliberately interim — the platform doesn't yet know a user's real timezone, so every site outside US Eastern currently gets the wrong default until that lands.
Cadence: when a reminder repeats
By default, reminder cadence backs off the longer a task goes unaddressed (starting daily, doubling up to a configurable cap), and tightens back to daily once a due date is close or has passed — the message states the age in days and, once due, how many days overdue. next_reminder_at always advances to the next scheduled calendar day, never to "now plus N days" — an off-schedule or manual send can't permanently shift a task off its slot.
Pass an optional natural-language schedule to open_brain_task for a specific rhythm instead:
"daily","weekdays""remind me Friday","every Friday","once a week"— recurring weekly by default"every 3 days","every other day"— a fixed-day interval"just this Friday","once"— a one-off; after it fires, the task reverts to the automatic backoff rather than going silent
An unparseable phrase is rejected at write time with a clear error — it's never silently ignored. Whatever the cadence, a due date passing always overrides it: an overdue task is never reminded less than daily. The current cadence, in your original phrasing, is visible on the task in the admin UI and in the brain's mirrored note.
Replying closes the loop
A shared recipient answers by replying to the reminder email — no login required, the same inbound path share_brain already uses. The reply is classified before it closes anything: a strict, typed judgment (not prose-parsing) decides whether the reply clearly resolves the ask, only partially addresses it, asks a question back, or is unrelated. Only a clear resolution closes the task; anything else leaves it open, and a classification failure always fails open rather than silently marking something done. You can reopen a task from the admin UI if a reply closed something it shouldn't have.
Configuration
Most thresholds are environment variables with sane defaults — see BRAIN_TASKS_HOLD_WINDOW_MINUTES, BRAIN_TASKS_BASE_INTERVAL_DAYS, BRAIN_TASKS_MAX_INTERVAL_DAYS, BRAIN_TASKS_DUE_SOON_DAYS, and the BRAIN_TASKS_JEV_* reply-classification knobs. None require a redeploy to change.
Delivery time and timezone are the one exception: they're per-site data (brain_task_settings), not an environment variable, since every site can want a different delivery time.
Related
- Daily Feed: your open owner-addressed tasks also appear in the daily feed, so the daily note can list them alongside queued todos.