Five stacks. One per home-row key.
You never create, name or delete them. Press a shortcut to switch between what you're reading.
Stacks are disposable. Export clears the stack, so each round starts empty.
Stopping to type can cost you your next thought. Say it out loud instead. Select a passage, hold ⌘E, and keep thinking. When you're ready, ⌃⌘V pastes your passages and reactions into ChatGPT, Gemini, Claude Code or OpenCode as one prompt.
Free · macOS 14+ · Apple Silicon
A passage can feel clear until you try to explain it. Talking turns “I think I get it” into an idea you can actually check. You notice the connections—and the gaps—before the model says a word.
Now the next explanation has something to stick to. Send your thinking with the passages that sparked it, so the model can check your reasoning and fill your specific gaps instead of starting from scratch.
Select, hold ⌘E, and say what you think it means—even if it's half-formed. Release to save the thought with its passage. Stay in the reading, not a notes app.
In SQLite's WAL (Write-Ahead Logging) mode, changes do not overwrite the main database file directly. Instead, transactions append new committed pages to a separate .wal file.
1When a read transaction starts, SQLite remembers the last committed frame in the WAL. That end mark fixes which changes the reader can see.
That end mark freezes the reader's view to a point-in-time snapshot. Writers keep appending newer frames to the end of the log:
-- Writer appends frames 42, 43 to .wal -- Active reader's end mark remains fixed at frame 40
Later comes checkpointing, which transfers committed WAL pages back into the main database file.
2A checkpoint can copy pages back into the database only as far as active readers allow. The WAL cannot be reset while readers still need its frames.
A reader on an older snapshot can limit checkpoint progress and prevent WAL reuse.
Readers and writers can usually run at the same time. A long-running reader can prevent WAL reuse, letting the file grow.
Click into the chat box and press ⌃⌘V. The template's preamble tells the model how to read your notes. The stack clears for the next round.
Below are notes I spoke out loud while reading. Each is either a passage I quoted followed by my reaction, or a standalone thought. They're transcribed speech, so expect loose phrasing, half-finished sentences and transcription errors. I'm saying these to understand the material, not just to get answers. Read them as a record of how I'm thinking: - Where I've got it right, say so briefly and move on. - Where I'm wrong or incomplete, show exactly where my reasoning went off and what's actually true. - Answer my questions using the mental model I'm already using, then extend it. - Point out anything important I seem to have missed. Write one connected response, not a reply to each note in turn. Organize it however explains it best, even if that's not the order of my notes. Restate what you're responding to so I don't have to scroll back. # Reading notes — September 2, 2026 > When a read transaction starts, SQLite remembers the last committed frame in the WAL. That end mark fixes which changes the reader can see. wait so the reader doesn't even touch or lock the main db file, it just grabs an integer index in memory and walks the log for changes before that number? _2:14 PM_ > A checkpoint can copy pages back into the database only as far as active readers allow. The WAL cannot be reset while readers still need its frames. wait hang on, so if a background query hangs, does that mean writes start failing, or does the wal file just expand forever because checkpoint can't touch it? _2:16 PM_ right, so writes still succeed, but disk usage explodes because old frames can't be recycled until every slow reader drops its read-mark _2:19 PM_
An illustrative reply to these notes. It starts from the reasoning you shared, not from the top of the topic.
You've got the main idea: a long-running reader can prevent WAL reuse while writers keep appending. It doesn't normally block writes, though running out of disk space can make them fail.
The reader doesn't walk the whole log. For each page, it uses the WAL index to find the latest frame at or before its end mark. If there's no such frame, it reads the main database file. So it does touch that file, and it still takes read locks. Those locks usually don't block writers in WAL mode.
A reader doesn't necessarily stop the whole checkpoint. Pages can be copied back as far as active readers allow. Resetting the WAL requires a completed checkpoint and no readers still using its frames. When those conditions hold, a writer can reuse the WAL from the beginning…
The same habit works on a coding plan. Don't hold every objection in your head while you scroll. Select a line and say what's right, what's missing, or what needs to change—while the thought is still there.
Paste your reactions into Claude Code or OpenCode with the Steer template. It asks the agent to answer, push back, and revise before acting. Settle the open questions, then give it the go-ahead.
Three selections and one general thought, spoken while scrolling the plan in the terminal.
⌃⌘V at the agent's prompt. The preamble asks the agent to push back and not act yet.
These are my notes on your previous response. Each quote is something you wrote, followed by my reaction: agreement, a question, an objection, or a change I want. Notes without a quote are general thoughts. They're transcribed speech, so read for intent. Treat them as direction. Answer my questions, push back where you think I'm wrong, and say what you'd change as a result. Keep it tight. Don't act on anything yet; we'll keep going until we agree. > 1. Add a version column to every synced table, bumped by a trigger. yes but only tables that actually sync. leave audit_log alone, it's append only > 4. On rejection, last write wins by server timestamp for all fields. not for the note body. two devices edit the same note and someone loses a paragraph. fine for title and tags > 7. Drop pending_mutations and replay from the event log instead. why? the offline queue reads from pending_mutations. feels like its own pr also no ui in this one. the conflicts table can wait
Round 2 starts empty. Select what's left to settle, and go again.
Sendpoint lives in the menu bar. You can change every shortcut.
In a browser, a PDF, or a terminal. Or select nothing and just think out loud.
Hold to talk, release to save. Tap mode is also available. ⎋ cancels.
A small capsule shows the live transcript. Transcription runs entirely on your Mac.
Every note pastes at the cursor as one Markdown prompt. Or copy them to the clipboard.
You never create, name or delete them. Press a shortcut to switch between what you're reading.
Stacks are disposable. Export clears the stack, so each round starts empty.
Edit any of them, or add your own.