Call Summary - qmd
When Tuple transcription completes, headlessly runs Claude Code to summarize the call (read via the `tuple` CLI), write a title and summary back onto the call, and index it into qmd so past calls are searchable from the terminal.
A Tuple trigger that summarizes a finished call with Claude Code and indexes it into qmd — a local search engine over markdown — so past calls are searchable from the terminal alongside everything else qmd indexes.
This is the same headless shape as slack-call-summary-claude, with the Slack delivery replaced by
local indexing. Nothing opens and nothing waits for input.
What it does
When call-transcription-complete fires, the trigger writes a prompt and launches Claude headless.
Claude then:
- Finds the call —
tuple call currentif you're still on it, otherwise the most recent call fromtuple transcription list. - Stops without changing anything if that call already has a summary, so one you wrote by hand is never overwritten.
- Reads the transcript —
tuple transcription show <id> --with-events. - Writes a title and a structured summary (outcome, decisions, action items, open questions, notable
context) back onto the call with
tuple transcription set-title/set-summary, so they show up in Tuple's Call History.
The trigger then exports every call's title and summary to markdown and hands them to qmd:
qmd query "what did we decide about rate limiting" -c tuple
qmd search "postgres migration" -c tuple
Summaries, not transcripts
Only titles and summaries are indexed. A raw transcript is mostly filler and cross-talk, and it captures whatever personal conversation happened around the work — the summary is the part worth searching. Full transcripts stay one command away:
tuple transcription show <call-id>
Tuple transcribes on-device, and the exported summaries and qmd index stay on your machine as plain files you can read or delete. The full transcript and lifecycle metadata are sent through Claude Code to your configured model provider to produce the summary.
The export is additive: it writes new summaries and updates changed ones, and never deletes
anything — TUPLE_QMD_OUT may well point at a directory holding other notes. One consequence is
that deleting a call in Tuple leaves its summary here. Remove the file yourself if that matters.
Each run exports the ten most recent calls, which covers the call that just ended plus any that started and stopped while a slow summary was still being written. Only calls that have a title or a summary are exported — a transcript on its own has nothing to search here.
Older calls are not revisited, and nothing summarises them retroactively. That only matters if an older call already carries a summary you wrote yourself, in which case widen the window once:
CALL_SUMMARY_QMD_LIMIT=-1 ~/.tuple/triggers/call-summary-qmd/export-summaries
qmd update && qmd embed
Requirements
- macOS
- The
tupleCLI available on your login shell'sPATH(withtranscriptionsupport) - Claude Code (
claude), authenticated - qmd — optional. Without it the summary is still written to the call and only the indexing step is skipped.
Setup
Install the trigger. There is no other setup: on its first run it registers the qmd collection and
sets that collection's update command, so qmd update keeps it current from then on.
Claude Code is given a deliberately narrow allow-list — only the tuple transcription subcommands
needed to read the call and write the summary back.
Configuration
| Variable | Default | Purpose |
|---|---|---|
TUPLE_QMD_OUT |
$XDG_DATA_HOME/tuple-summaries (~/.local/share/tuple-summaries) |
Where the exported markdown lives |
CALL_SUMMARY_QMD_COLLECTION |
tuple |
Name of the qmd collection |
CALL_SUMMARY_QMD_LIMIT |
10 |
How many of the most recent calls to export. -1 exports all of them |
CALL_SUMMARY_QMD_DRY_RUN |
unset | Set to 1 to write the prompt and exit without running Claude |
Troubleshooting
The trigger logs to /tmp/tuple-trigger-debug.log; each run also keeps its prompt and Claude's
output under $TMPDIR/tuple-call-summary-qmd/.
- Nothing happens when a call ends. Triggers must be enabled in Tuple, which registers a
Background Item. Check with
launchctl print gui/$(id -u)/app.tuple.app.triggers >/dev/null 2>&1 && echo ON || echo OFF. claude not found on login-shell PATH. Triggers run from a Background Item with a minimal environment, so the work is re-launched through a login shell. Make sureclaude,tupleandqmdall work in a fresh terminal.- The call is indexed as "Untitled call". The summary was not readable yet when the export ran.
The next
qmd updaterepairs it.