Comms — Voice Capture

A Comm is a named intake channel — journal, ideas — that you talk to over and over through the day. Each capture is a drop. The channel accumulates drops and fires a linked Sortie on a policy you choose, handing the day’s captures off to whatever routine the Sortie points at (your daily note, a feature logger, anything).

The model

COMMS (the channel) collects drops all day → a Sortie fires on the channel’s policy → the routine downstream does the rest.

The Comm owns the channel and the when; the Sortie is the dumb fire target (an encrypted webhook + token). Firing reuses the existing Sortie path unchanged — a Comm just decides when to pull the trigger and rides the day’s drops along in the payload.

Two doors into the same channel

Talk to your assistant

Over MCP, just say “add this to my journal comms: …”. The drop_comms tool appends a timestamped drop. No app, no endpoint — you’re already in a session.

iOS Shortcut

For quick mobile capture, a Shortcut dictates and POSTs to /api/v2/comms/{comm}/drop with a Bearer token — same channel, hands-free.

Fire modes

on_push

Fire immediately after every drop. Good for an ideas channel where each idea should become a logged item the moment you say it. The drop returns instantly; the fire runs in the background.

scheduled

Accumulate all day, fire once at a set local time (e.g. 21:00). Good for a journal channel that sweeps the day’s drops into your daily note each evening. A cron sweeps due channels every 5 minutes and fires each once per local day after its time.

manual

Fire only when you say so, via fire_comm. Also flushes a scheduled/on_push channel early.

The unifying fire rule

A fire dispatches every undispatched drop in the channel, then stamps them as sent. One rule covers all three modes: on_push sends just the new drop, scheduled sends the whole day’s accumulation, manual sends whatever’s queued — with no double-sends and nothing lost.

Getting the drops into your routine

When a Comm fires, the day’s drops are injected into the linked Sortie’s payload. Put {{comms}} wherever your routine expects the text:

{
  "transcript": "{{comms}}",
  "channel": "{{comm_name}}",
  "date": "{{comm_date}}"
}

If you never place {{comms}}, the fire falls back to adding a comms key automatically — so a channel works with zero payload configuration. Everything past the fire is your routine’s job.

MCP tools

drop_comms — append a capture to a channel.

list_comms — list channels, their fire mode, and pending drop counts.

create_comm — create a channel and bind it to a Sortie with a fire policy.

fire_comm — dispatch every undispatched drop now.

Security & isolation

  • Both tables are site_id-isolated with deny-by-default RLS.
  • The Sortie’s bearer token stays encrypted server-side and never enters a drop, a payload hash, or the conversation.
  • Existing Sorties are untouched — Comms only call the fire path and add optional payload injection.