Thinking Notebook · For nerds · Roger Basler de Roca

The Nerd Guide

This is how the thinking notebook runs fully automatically: a Mac records a stream or a meeting, transcribes locally, stores the texts in Dropbox, and scheduled tasks in Claude turn them into takeaways, news and a Notion sync. In the end, the human decides what stays.

← Back to the starter

Before you record

Only record what you are allowed to record: your own meetings with the consent of everyone involved, or streams where the organiser agrees. Many events offer recordings or transcripts anyway, ask there first. Never hand your login details to an AI. You log in yourself in the browser.

The architecture

  1. 1Stream in the browser
  2. 2Sound via BlackHole
  3. 3Recording with ffmpeg
  4. 4Local transcription with whisper.cpp
  5. 5Text file in Dropbox
  6. 6Claude: takeaways, notebook, Notion

The audio stays on your computer. Only the texts go to the cloud.

What you need

1 · Install the tools

Install Homebrew (asks once for your Mac password):

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

On Apple Silicon Macs, then run the two lines Homebrew shows at the end. Then the tools:

brew install ffmpeg whisper-cpp && brew install --cask blackhole-2ch

Then restart the Mac once.

2 · Route the sound

  1. 1Open the Audio MIDI Setup app
  2. 2Click + at the bottom left and create a Multi-Output Device
  3. 3Tick your speakers or headphones and BlackHole 2ch
  4. 4System Settings, Sound, Output: choose this new device

This way you keep hearing the stream, and at the same time the sound reaches the recording.

3 · Load the speech model

small is a good compromise for older Macs, on Apple Silicon large-v3-turbo works too.

mkdir -p ~/whisper-models && curl -L -o ~/whisper-models/ggml-small.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin

4 · The recording script

Save the script in your transcript folder. It records in 10-minute chunks, transcribes each chunk, skips silence and keeps the Mac awake.

#!/bin/bash
# Stream recorder for the thinking notebook
# Records audio in 10-minute chunks and transcribes them locally with whisper.cpp.
# Transcripts land in the Dropbox folder and are picked up by a scheduled task in Claude.
# Start:  bash stream_recorder.sh        Stop:  Ctrl+C

set -u
if [ -z "${OUT:-}" ]; then                              # find target folder (Dropbox) automatically
  DB=$(ls -d "$HOME/Library/CloudStorage/Dropbox"* 2>/dev/null | head -1); [ -z "$DB" ] && DB="$HOME/Dropbox"
  OUT="$DB/Thinking-Notebook-Transcripts"
fi
WORK="${WORK:-$HOME/Thinking-Notebook-Recording}"     # audio stays local, never goes to the cloud
DEVICE="${DEVICE:-BlackHole 2ch}"                     # audio input that receives the stream sound
MODEL="${MODEL:-$HOME/whisper-models/ggml-small.bin}"
LANG_CODE="${LANG_CODE:-en}"
SEGMENT="${SEGMENT:-600}"                             # seconds per chunk

mkdir -p "$OUT" "$WORK/chunks" "$WORK/done"
command -v ffmpeg >/dev/null || { echo "ffmpeg missing: brew install ffmpeg"; exit 1; }
command -v whisper-cli >/dev/null || { echo "whisper-cli missing: brew install whisper-cpp"; exit 1; }
[ -f "$MODEL" ] || { echo "Model missing: $MODEL"; exit 1; }

echo "Recording from '$DEVICE' in chunks of $SEGMENT s. Transcripts to: $OUT"
caffeinate -dimsu -w $$ &

( while true; do
    ffmpeg -hide_banner -loglevel error -f avfoundation -i ":$DEVICE" -ac 1 -ar 16000 \
      -f segment -segment_time "$SEGMENT" -reset_timestamps 1 -strftime 1 \
      "$WORK/chunks/%Y-%m-%d_%H-%M-%S.wav"
    echo "$(date '+%H:%M:%S') recording interrupted, restarting in 5 s"; sleep 5
  done ) &
REC=$!
trap 'echo; echo "Stopping ..."; kill $REC 2>/dev/null; pkill -P $REC 2>/dev/null; exit 0' INT TERM

while true; do
  FILES=( $(ls -1 "$WORK/chunks/"*.wav 2>/dev/null | sort) )
  N=${#FILES[@]}
  if [ "$N" -gt 1 ]; then
    for ((i=0; i<N-1; i++)); do
      F="${FILES[$i]}"; B=$(basename "$F" .wav); DAY=${B%%_*}
      mkdir -p "$OUT/$DAY"
      whisper-cli -m "$MODEL" -l "$LANG_CODE" -nt -otxt -of "$WORK/done/$B" -f "$F" >/dev/null 2>&1
      if [ -s "$WORK/done/$B.txt" ] && [ "$(wc -w < "$WORK/done/$B.txt")" -gt 15 ]; then
        { echo "Recording $B (automatically transcribed, not checked)"; echo; cat "$WORK/done/$B.txt"; } > "$OUT/$DAY/$B.txt"
        echo "$(date '+%H:%M:%S') transcribed: $B ($(wc -w < "$WORK/done/$B.txt") words)"
      else
        echo "$(date '+%H:%M:%S') silence or too short, skipped: $B"
      fi
      mv "$F" "$WORK/done/"
    done
  fi
  sleep 20
done

Quick test with any video, chunks of 60 seconds:

SEGMENT=60 bash stream_recorder.sh

After about two minutes "transcribed" appears and a text file is in the folder. Stop with Ctrl+C. For continuous mode, start without SEGMENT and leave the terminal open.

5 · Claude takes over

Scheduled tasks in Claude turn raw text into work. Create them by giving Claude the following prompts and adding: "Create this as a scheduled task, hourly from 8 am to 8 pm" (or daily at 6:30 for the news).

Feed in transcripts

hourly

Read all new .txt files in the Dropbox folder /Thinking-Notebook-Transcripts that you have not processed yet. Combine related chunks into blocks of at most 60 minutes. For each block extract all takeaways: insight, task (doable in under 30 minutes), open question, AI agent shown (with level 1 reads, 2 drafts, 3 acts after approval, 4 acts autonomously). Store each block as an input and the takeaways in my thinking notebook. Remember which files are processed. Invent nothing, no verbatim quotes from raw transcripts.

Morning news

daily 6:30

Research 6 current news items from the last 72 hours on my topics: [your topics]. Every item with a real URL, source and a one-sentence summary. Replace the news in my thinking notebook with them.

Notion sync

hourly

Read my thinking notebook and replace the content of my Notion page [page name] with: Think ahead (news), Think along (only the kept takeaways per talk or meeting, discarded ones with reason separately), Think back (the three thoughts). Do not rephrase anything, only transfer.

Start the stream in the morning (optional)

daily 8:50 · needs the Chrome extension and the connected Mac

On my Mac, open the stream page [URL] in Chrome. I am logged in there; if a login page appears, abort and report it. Start playback with sound, wait for the programme to start if necessary. Leave the tab open. Then check whether new files arrive in the transcript folder and tell me in three sentences whether everything is running.

6 · The checklist before the weekend

When something gets stuck

Silence or too short
The sound is not reaching BlackHole. Check the output and whether the tab is muted.
Device not found
ffmpeg -f avfoundation -list_devices true -i "" then start with DEVICE="Name" bash stream_recorder.sh
Mac too slow
Load the smaller model ggml-base.bin and start with MODEL=~/whisper-models/ggml-base.bin.
Mac falls asleep
Keep the lid open, power adapter on, energy saving off. With the lid closed, even caffeinate does not help.
Wrong names in the text
Raw transcripts are not checked. So only quote after checking yourself.

Why the effort?

Because here the machine does exactly what it is good at: taking notes, sorting, suggesting. And because you keep exactly what only you can do: decide what matters.

Not everything that can be automated has to be dehumanised. You decide.