The Brain Dump Problem
We have our best ideas in the shower. Or walking. Or gardening. Or doing something where our "on" brains are off, where the pace is slower, where our bodies are occupied, where there is space for inference and connections and creativity to emerge.
So you get an idea. And the idea is good. You KNOW it is good.
But the problem is that by definition you're busy doing something else. Stuck in traffic, half-asleep at 2 AM, on a bike, whatever. Almost by definition inspiration strikes at the most inconvenient of times when it comes to preserving the idea and acting on it.
So what does that mean?
Some ideas percolate. You record or remember them. Eventually you take action on them. They become something tangible (like the great kids book What Do You Do With An Idea?).
But if you're like me, most of these ideas die. Either because you failed to capture them and they slipped away or because they sit there on a scribbled piece of paper crammed with other half-remembered thoughts that are recorded somewhere pretty far away from the operating system(s) you use to actually execute stuff.
I know, I know. I should be more organized. We all should be. But since I'm not, I've been obsessed with how to improve that idea-to-output loop for a long time. It feels like if we could just take action on our best ideas we'd be living closer to our truth, to our potential. We'd be more alive, more fulfilled, more our best selves. But how do we do it without putting in too much work?
With AI coming onto the scene I decided to hack together a system that tried to do just that.
My criteria was pretty simple. It had to:
- Exist where I already was
- Be lightweight (because I didn't want to spend a ton of time actually building it)
- Be flexible enough for me to change quickly.
What I landed on is a system that uses Slack to capture my thoughts, a webhook to push those thoughts into a github repository as a running log/markdown file, and then Claude code to help me build agents to process that log and build plans to push ideas forward from there.
Here's how it works (note: this is hacky and there's probably lots of easier ways to do it).
Why Slack for capturing your stuff?
Why Slack? Well why not?
Slack has great UI/UX and integrations. It handles text, screenshots, voice memos, file attachments, natively, on every device, with a robust API. Price is right too (free). And I'm already in it for work. It's already open on my phone or computer a lot. There is no learning curve.
What One Brain Dump Becomes
So the idea strikes, I open slack and I type it out, or record it, or dump a link or screenshot to something cool. Nothing fancy. The key is little to no friction. The act alone of making the idea or thought or whatever more tangible is itself a practice. Probably the most important one in all of this.
The rest is kind of gravy.
The gravy starts with automatically pushing the slack notes into my github repository. And then optimizing around where all my agentic work already happens — Claude Code.
Build It: The Whole Loop
The loop has four layers. The slack capture, the push to github, triggering action in Claude code via agents, and then me (the human) getting back involved to make decisions.
Ultimately, the goal is that a thought I have on a walk should arrive at my desk already sorted, with no step where I have to remember to move it along. In practice my hacked approach doesn't work that seamlessly. But it doesn't need to.
If you're thinking about building your own version, here's slightly more detail.
Layer 1 — Capture
The capture layer is deliberately boring. A Slack message arrives, a webhook fires, the message lands in my repo as a line of markdown. No intelligence. The less it thinks, the less it breaks.
The Slack side. I made a private channel, #steep-notes, and a Slack app pointed at it. Three bot scopes do everything: channels:history to read the messages, files:read to pull down screenshots and voice memos, chat:write to post a confirmation back. Then I turned on the Events API and subscribed to one event, message.channels, so Slack pings my webhook every time I post. That's the whole setup, maybe ten minutes in the Slack dashboard. (Eventually I added some stuff to deal with voice notes and automating pulling transcripts of video links).
The webhook. Right now this runs on Pipedream (free tier, 10,000 invocations a month, far more than I'll ever use), but at some point I'll migrate it to Cloudflare Workers with the rest of my stack and be more CLI native. There's 4 simple steps, the kind you'd draw on a napkin:
- Validate. Answer Slack's URL-verification handshake, drop bot messages and edits, pull out the text, timestamp, and any files.
- Download. Fetch each attachment with the bot token, tag it as a screenshot, voice memo, or generic file by its mimetype.
- Format. Wrap it in markdown with a timestamp and a type header.
- Write. Append it to the running log through the GitHub Contents API, with retries and backoff because the network isn't always polite.
The log. Everything lands in one file: stream_journal.md, that only ever grows. Git handles the versioning. Entries are separated by --- and carry a header like ## 2026-02-05 14:32:17 | text, where the type is text, screenshot, or voice. Assets go in a stream_assets/ folder, voice memos in stream_assets/voice/. It's skimmable by me and readable for an agent. If I run this for years, it's easy enough to add more organization.
Layer 2 — Processing
Raw capture is useless until it's structured. Three processors turn journal lines into things the rest of the system can act on.
Voice transcription. A nightly job runs Whisper against any voice memo that hasn't been transcribed yet, writes the transcript back into the journal entry in place, and moves the audio to a processed/ folder so it doesn't get picked up twice. Whisper costs about six-tenths of a cent per minute, so a five-minute ramble is a rounding error.
Task extraction. A nightly script (extract_tasks.py) reads every journal entry since the last run, looks for action language, and turns the hits into tasks. I had this running more often but eventually decided for my purposes once a day was enough. This is where the customization/complexity comes in as it relates to classifying the stuff (by type of note/thought, into my customized workstreams, and then determining potential next steps).
For things that the system thinks I probably want to take action on (vs. say just saving interesting content) the script dual-writes a task: it appends an event to tasks.jsonl, the git-tracked source of truth for my kanban board, and upserts the same task into Supabase so I can query it. Every one lands in the triage column, tagged source: stream_journal. So "need to build a scraper for Orioles home games," for my bmorefamilies.com side project muttered into my phone on a walk, becomes a triage card on my board for that project overnight. On the board I hit a "build a plan" button from here and we are in my Claude Code workflows. Or I forget about it and my /chief-of-staff agent catches it up and flags it for attention at some point.
The processing isn't magic. The regex catches the obvious cases, maybe 70%: clear verbs, clear intent. It misses the nuanced stuff. "We should rethink how we position the consulting tier" has no trigger verb, so it slips through. But of course, I know this. I can add 4 words to the slack message to route it. For example I use the word "aspire" to lock something into a very specific workflow.
And as I mentioned the kanban/personal operating system side of things has its own, more powerful workflow optimizations to de-dupe against existing cards, nudge priority spots, flag deadlines and so on.
Wrapping it up
Slack by itself as the messy note-catcher is a game-changer. Force that stuff into a repository and the world is your oyster to design whatever workflows and loops you want to store, capture, expand and ultimately act on your ideas.
And as mentioned, yes I'm sure there are more elegant methods out there. Love to hear about them!
