Automate / Action items
Turn meeting recordings into action items, automatically.
One script: the transcript goes to Claude Code with a strict prompt, and every line that comes back becomes an Apple Reminder with an owner and a due date.
To get action items from a meeting automatically on a Mac, record the call with RecordCue, let macOS transcribe it on the device, and have a hook pipe the transcript into claude -p with a prompt that asks for one line per item: owner | task | due. A loop then creates one reminder per line in a Reminders list called Meetings — task as the title, owner and the call in the note, due date set when one was agreed. It runs a few minutes after you hang up, without a bot in the call, and it works the same for Zoom, Google Meet, Teams, Slack huddles and every other call RecordCue notices. The model decides what counts as an action item, so the list is a draft to skim, not a record to trust blindly.
What you get
The model's whole answer is a few lines, which is what makes it safe to loop over:
$ claude -p "List the action items…" < "2026-09-08 18.07-19.01 Google Meet.txt" Priya | Send the revised pricing deck to Marco | 2026-09-10 me | Book the follow-up with the Berlin team | - Marco | Confirm the launch date with legal | 2026-09-15
And in Reminders, a minute later:
Reminders › Meetings
[ ] Send the revised pricing deck to Marco Wed 10 Sep, 09:00
Owner: Priya · from Google Meet 2026-09-08 18:07
[ ] Book the follow-up with the Berlin team
Owner: me · from Google Meet 2026-09-08 18:07
[ ] Confirm the launch date with legal Mon 15 Sep, 09:00
Owner: Marco · from Google Meet 2026-09-08 18:07me is whoever was on the microphone side of the transcript. Items with a date get 09:00 on that day as their due time; the rest have none. The note on each reminder names the owner and the call, so a task still makes sense a week later, and so you can find every task from one meeting with a search.
Prerequisites
- RecordCue with automatic transcription on in Settings, so a
.txtexists for the script to read. - The hook runner from /automate/hooks/. This page is one action in its folder.
- Claude Code installed and signed in, so
claudeworks in a terminal. The runner already puts~/.local/binand Homebrew on the path. - Apple Reminders, which every Mac has. The script creates the Meetings list if it is missing.
The action
Save it as ~/.config/recordcue/actions/30-tasks.sh. It exits 0 straight away when there is no transcript, and again when the model returns no lines, so a recording with nothing to do is marked done and never retried. If claude itself fails — not signed in, no network — it exits 1 and the runner tries again next minute. A single reminder that cannot be created is written to hooks.log and skipped, so a retry never duplicates the ones that worked.
#!/bin/zsh
# ~/.config/recordcue/actions/30-tasks.sh
# Action items from the transcript, one Apple Reminder each, in a list "Meetings".
[[ -n "$RC_TRANSCRIPT" ]] || exit 0
items=$(claude -p "List the action items from this call transcript, one per line, exactly as:
owner | task | due
Owner is a first name, or 'me' for the person marked Mic. Due is YYYY-MM-DD when a
date was agreed, otherwise -. No header, no numbering, no other text. Output
nothing if there are no action items." < "$RC_TRANSCRIPT") || exit 1
print -r -- "$items" | grep -F '|' | sed 's/\*//g; s/ *| */|/g; s/^[- ]*//; s/ *$//' |
while IFS='|' read -r owner task due; do
[[ -n "$task" ]] || continue
[[ "$due" == [0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] ]] || due=-
body="Owner: ${owner:-?} · from $RC_SERVICE $RC_WHEN"
osascript - "$task" "$body" "$due" <<'EOF' || print -u2 "30-tasks: could not add: $task"
on run argv
set {taskName, taskBody, dueText} to argv
tell application "Reminders"
if not (exists list "Meetings") then make new list with properties {name:"Meetings"}
set r to make new reminder in list "Meetings" with properties {name:taskName, body:taskBody}
if dueText is not "-" then
set d to current date
set day of d to 1
set year of d to (text 1 thru 4 of dueText) as integer
set month of d to (text 6 thru 7 of dueText) as integer
set day of d to (text 9 thru 10 of dueText) as integer
set time of d to 9 * hours
set due date of r to d
end if
end tell
end run
EOF
done
exit 0Two lines deserve a look. The claude -p line is the moment the transcript leaves the Mac: it goes to Anthropic, under your account, because you sent it. RecordCue itself makes no network requests. And the osascript - line passes the task and note as arguments rather than splicing them into the AppleScript, so a task containing a quote, an apostrophe or a dollar sign cannot break the script or run as code.
Test it
chmod +x ~/.config/recordcue/actions/30-tasks.sh
# Try it on your last transcribed recording, without waiting for the hook:
rc='/Applications/RecordCue.app/Contents/MacOS/RecordCue'
export RC_TRANSCRIPT=$("$rc" --agent-cli latest --json | jq -r '.transcript.path // empty')
export RC_SERVICE=Test RC_WHEN=$(date '+%F %H:%M')
~/.config/recordcue/actions/30-tasks.sh && open -a RemindersRunning it from Terminal once is also where macOS asks whether the script may control Reminders; allow it. If a later run from launchd logs “Not authorized to send Apple events”, macOS wants the same permission for that route: System Settings → Privacy & Security → Automation lists what asked, and one switch there allows it. Recordings that finished before the hook was installed are never replayed, so this test does not cause duplicates later.
Variations
GitHub issues instead of reminders
For work that lives in a repository, gh can open one issue per item. Filtering the lines with grep before the loop keeps it to your own commitments; without the filter, everyone's items become issues, which is what a team repo usually wants.
# In place of the osascript block. Keep only the items whose owner is you:
print -r -- "$items" | grep -i '^ *me *|' | sed 's/ *| */|/g; s/ *$//' |
while IFS='|' read -r owner task due; do
[[ -n "$task" ]] || continue
gh issue create -R org/repo -t "$task" \
-b "From $RC_SERVICE $RC_WHEN. Due: $due"
done
# Drop the grep for everyone's items; add -l meeting or -a "$owner" as you like.Things 3
Things is scriptable too, but its URL scheme is the shorter route. jq -sRr @uri percent-encodes the title and note; when takes the ISO date the model already produces.
# In place of the osascript block. Things 3 and jq (brew install jq).
enc() { printf '%s' "$1" | jq -sRr @uri }
when=; [[ "$due" == "-" ]] || when="&when=$due"
open "things:///add?title=$(enc "$task")¬es=$(enc "$body")$when"Todoist
Todoist's quick-add endpoint parses a task the way the app's own quick-add box does, so one curl per line is enough: keep your API token in ~/.config/recordcue/todoist, read it with $(cat …) into an Authorization: Bearer header, and post {"text": "…"} to https://api.todoist.com/api/v1/tasks/quick with the task, the date and a #Meetings project in the text. Todoist works out the due date and the project from the words. Check the endpoint against Todoist's current API reference; it has moved before.
A model that never leaves the Mac
Replace the claude -p line with a local model and nothing about this recipe touches the network:
items=$(ollama run llama3.2 "List the action items… (the same prompt)" < "$RC_TRANSCRIPT") || exit 1
Smaller models follow the owner | task | due format less strictly; the grep -F '|' in the pipeline is what keeps a stray sentence from becoming a reminder. Codex works too: codex exec -o out.txt "…" < "$RC_TRANSCRIPT" and read out.txt.
Have your agent set it up
Paste into Claude Code, Codex or any local agent that can fetch a page and run a shell on this Mac.
Read https://www.recordcue.app/automate/action-items/ and set it up on this Mac exactly as that page describes. Show me every file before writing it, then run the test and show me the result.
Questions
- How do I extract action items from a meeting transcript automatically on a Mac?
- Record the call with RecordCue and turn on automatic transcription. A launchd hook then runs a script for every finished recording; the script pipes the transcript into Claude Code with a fixed prompt that asks for one line per action item, owner | task | due, and creates an Apple Reminder for each line. No bot joins the call and nothing runs until a recording you started has ended.
- How reliable are the action items?
- As reliable as the transcript and the model. The on-device transcript is rough on names and jargon, and the model decides what counts as a commitment, so it will sometimes miss one or invent an owner. Treat the Meetings list as a draft to skim right after the call, not as a record. Deleting a wrong reminder takes a second; remembering a forgotten one does not.
- Does the transcript leave my Mac?
- Yes, at one line of the script: the claude -p call sends the transcript to Anthropic under your own account, because you chose to. RecordCue itself makes no network requests. Swap that line for ollama run and the whole recipe stays on the Mac; the prompt is the same.
- Can the action items go to Todoist, Things or GitHub instead of Reminders?
- Yes. The script produces plain lines of owner | task | due; only the last step decides where each line goes. The variations below show the replacement for GitHub issues with gh, Things 3 through its URL scheme, and Todoist through its quick-add endpoint with curl.