Your reading list as a daily podcast, with NotebookLM and n8n
For anyone who wants to learn more than they can read. How a custom podcast lands in your Slack every workday.
You save articles, videos and podcasts for later. Later never comes. I flipped it: every workday around 7:15 a podcast lands in my Slack, made from what I want to learn that day. I can listen on the go or over coffee.
This guide is for marketing leads, founders and consultants who learn better through audio than through a reading list, and who aren't afraid of n8n or a terminal.
What's inside
- The two-part setup, and why n8n can't do this on its own
- The script in six commands: notebook, sources, audio, mp3, send
- The host prompt that cuts the chatter and ends with one action for today
- The n8n workflow in four nodes, with an error message in Slack when something breaks
- Five things that went wrong on my first run, and the fix for each
Where should we send the guide?
What you get every morning
One message in a Slack channel, with three things:
- An mp3 you play right in Slack. No app, no download.
- The one action for the day, in a single sentence above the audio.
- The link to the notebook in NotebookLM. There you can ask follow-up questions about the sources or have it quiz you.
If something goes wrong, you get an error message in the same channel instead of an episode. You never have to go looking for why it stayed quiet.
Why it comes in two parts
The regular NotebookLM has no API. So n8n can't talk to it directly. That's why you split the work:
| Part | Where it runs | What it does |
|---|---|---|
| Script | Your own Mac | Create the notebook, add sources, generate the audio, convert to mp3 |
| Workflow | n8n | Receive the mp3 through a webhook and deliver it in Slack, or report the error |
The script uses a command-line tool that drives NotebookLM through your own browser login. To be straight about it: that tool isn't made by Google. It can break when NotebookLM changes, and your login expires now and then. That's what the error message in Slack is for.
What you need
- A Google account with NotebookLM. The free tier is enough to start.
- The
notebooklmCLI (packagenotebooklm-py, version 0.8.2 on my machine, installed as a tool with uv). It uses a Chromium window through Playwright for the login. - ffmpeg, to convert the audio to mp3.
- An n8n instance with a publicly reachable webhook.
- A Slack bot with a token, added as a credential in n8n.
- One brief a day in markdown: a file with what you want to learn and the links to the sources.
The brief: your relevance gate
The podcast is only as good as the brief. Three rules keep it sharp:
- One focus file. It says what you want to learn right now and why. Anything that doesn't fit stays out of the brief. The goal: only what you can apply that same week. No knowledge for the shelf.
- A fixed shape. A title, one line that starts with "Apply today", then numbered insights, each with the link to its source. The script reads that shape: the title becomes the episode name, the line becomes the summary in Slack, the links become sources in the notebook.
- No filler on quiet days. When there's no relevant news, the next item from your own list of sources takes its place. Whatever gets used is checked off, so you never get the same thing twice. When the list runs out, the brief says your list needs a refresh. No generic advice fills the gap.
How you make the brief is up to you. Mine is written by a scheduled AI task every workday. Writing it by hand works just as well to start.
The script in six commands
The full script is about 200 lines of Python, but the core is six commands. $NB is the notebook id the first command returns.
1. Create one notebook per day
notebooklm create "Learning brief 2026-09-18" --json
2. Add the brief and the source links
notebooklm source add briefs/2026-09-18.md -n $NB --title "Learning brief 9/18" --json
notebooklm source add "https://link-to-a-source" -n $NB --json --timeout 90
YouTube videos, GitHub repos and podcast pages were all accepted on my run. If a source refuses, the script skips it. I cap it at eight sources per episode.
3. Wait until the sources are processed
notebooklm source wait $SOURCE_ID -n $NB --timeout 300
4. Generate the audio
notebooklm generate audio --prompt-file host-prompt.txt -n $NB \
--format deep-dive --length default --language en \
--wait --timeout 1500 --retry 2 --json
This is the slow step. Count on about fifteen minutes.
5. Download the audio
notebooklm download audio episode.m4a -n $NB --force
6. Convert to mp3 and send to n8n
ffmpeg -y -loglevel error -i episode.m4a -ac 1 -b:a 64k episode.mp3
curl -sS -m 120 -X POST "$WEBHOOK" \
-F status=ok -F date=2026-09-18 -F "title=Learning brief 9/18" \
-F "summary=The action for today" -F "notebook_url=https://notebooklm.google.com/notebook/$NB" \
-F minutes=21 -F "audio=@episode.mp3;type=audio/mpeg"
Mono at 64k is plenty for two voices and keeps the file small. You need that, see the limits further down.
The script also keeps a log file per day. That gives it three options you'll want quickly:
--dry-runshows what would happen and touches nothing.--forcemakes new audio in that day's notebook, without creating a second notebook.--repostsends the existing mp3 to n8n again, without regenerating.
If a step fails, the script sends status=failed with the error message to the same webhook. The full script is in the zip that comes with this guide, together with the workflow code. Fill in your own webhook and adjust the host prompt. I run mine in Dutch, so the script defaults to Dutch and its log messages are in Dutch: set LB_PODCAST_LANG=en for English.
The host prompt
Without instructions, NotebookLM's two voices love to wander. This prompt keeps them on the brief. Replace the first line with yourself.
One listener: [who you are and what you want to achieve this quarter].
They listen to this instead of reading their daily learning brief, so cover the brief fully and in its order.
Open with the single action to apply today. Then take each numbered insight: explain the idea, say any
script word for word, and say how it fits their situation as the brief describes it.
Use the linked sources only to add concrete examples and detail for those insights, not for new topics.
If the brief recommends a full episode, say which one, how long, and which minutes matter.
Close by repeating the one action. No filler, no generic advice, no hype.
What each line does:
- One listener. The hosts talk to you, not to an audience.
- The brief in order. You can follow along in the text and never lose your place.
- Scripts word for word. If your brief has a sentence you want to use in a conversation, you hear it exactly as written.
- Sources only for detail. Otherwise the hosts drift toward whatever they find interesting in the video.
- Open and close with the one action. That's what sticks.
I listen in Dutch, so my version has two extra lines. Use them if you run the podcast in another language:
Speak Dutch. Keep English marketing and sales jargon in English
and say English scripts and quotes in English first, then give the Dutch version.
A translated "discovery call" sounds odd, and you no longer recognize the term when you hear it.
The n8n workflow in four nodes
| # | Node | The setting that matters |
|---|---|---|
| 1 | Webhook | POST, responds after the last node. The mp3 arrives as the multipart field audio. |
| 2 | Edit Fields (Set) | Sets the Slack channel and reads status, date, title, summary, notebook link, minutes and error from the body. Also stores the name of the binary field. |
| 3 | IF | Two conditions: status is ok and there is a binary file. |
| 4a | Slack, file upload | Uploads the mp3 to the channel, with the title, the minutes, the action for the day and the notebook link as the comment. |
| 4b | Slack, message | The other branch: reports that there's no podcast today, with the error. |
The Slack channel lives in one place, in the Set node. If you switch channels, that's the only field you change.
The workflow code is in the same zip that comes with this guide, as workflow.js. It's code for the n8n Workflow SDK, not an import file, and the node names and Slack texts are in Dutch. If you don't use the SDK, you can rebuild the four nodes from the table in a few minutes.
Five things that went wrong for me
1. The login didn't stick. After notebooklm login, notebooklm doctor still reported "not authenticated". The Chromium window had closed before the login finished. The fix: start over with a clean session, and leave the window open until you see the NotebookLM home page.
notebooklm login --fresh
If Google blocks that window as an unsafe browser, take the cookies from your regular Chrome, where you're already signed in:
notebooklm login --browser-cookies chrome --account YOUR-GOOGLE-ADDRESS
macOS asks once for access to the keychain. Then check with notebooklm doctor.
2. The Set node threw away the mp3. The first episode got stuck in n8n. The node that prepares the fields only passed on its own fields, and the binary file disappeared. The fix in the Set node: include all input fields, turn on include binary data, and turn off strip binary data. In code: includeOtherFields: true, includeBinary: true, stripBinary: false.
3. "Short" gave me 4 minutes. That's thin for a brief with several insights. With length "default" the same brief became 21 minutes. NotebookLM only knows short, default and long. There's nothing in between.
4. The bot wasn't in the channel. An upload to a channel your bot isn't a member of fails with not_in_channel. Type /invite @ plus your bot's name in the channel. Then send the episode again with --repost.
5. The Mac was asleep at start time. The script runs locally, so your Mac has to be awake. macOS can wake it on workdays by itself:
sudo pmset repeat wakeorpoweron MTWRF 06:25:00
That only works with the lid open, or with the Mac on power and an external display. With the lid closed on battery it stays asleep, and everything starts only when you open it.
Settings and limits
| What | What I saw | What to do with it |
|---|---|---|
| Language | The Dutch voices sound like the Netherlands, not Flanders | If the voices in your language bother you, switch to English |
| Length | Short gave 4 minutes, default gave 21 | Pick for your morning, not for your ambition |
| File size | 21 minutes at 64k mono is 10 MB | n8n accepts up to 16 MB by default. The script stops above 15 MB and leaves the mp3 on your disk |
| Timing | The brief takes about 20 minutes, the audio about 15 | Start 45 minutes before you want to listen |
| Number of notebooks | A free account allows a maximum of 100 notebooks | One notebook a day, so clean up old ones after a few months |
One next step
Don't automate anything yet. Today, make one notebook from one brief by hand, paste in the host prompt and listen to the result. If you learn something you'll apply this week, build the script. If the answer is no, the problem is the brief, not the tech.