Sendpoint

Think out loud while you read.

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

Learning

Say what you think it means. Let the model check your reasoning.

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.

Step 1 · Engage

Don't just reread it. Try explaining it.

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.

chatgpt.com · SQLite WAL mode

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.

1Spoken2:14 PM
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?

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.

2Spoken2:16 PM
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?
A note with no passage is just a thought.
3No passage2:19 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
Step 2 · Send

One prompt, with the Learn template.

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.

Pasted at the cursorTemplateLearn
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_
Step 3 · Back

A reply aimed at your reasoning.

An illustrative reply to these notes. It starts from the reasoning you shared, not from the top of the topic.

chatgpt.com · SQLite WAL mode
Below are notes I spoke out loud while reading…
Learn · 3 notes
Right

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.

Went off

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.

Missed

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…

Steering an agent

Answer the plan line by line. Then let it act.

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.

Round 1 · Read

React to the lines that matter.

Three selections and one general thought, spoken while scrolling the plan in the terminal.

Claude Code · ~/code/notes-app
❯ plan conflict handling for offline note edits. don't change anything yet
⏺ Here's the plan for src/sync/:
11. Add a version column to every synced table, bumped by a trigger.
notes, notebooks, tags, audit_log
2. Client sends base_version with each mutation in the push batch.
3. Server rejects stale mutations and returns the current row.
1Spoken4:02 PM
yes but only tables that actually sync. leave audit_log alone, it's append only
24. On rejection, last write wins by server timestamp for all fields.
title, tags, body, notebook_id
5. Add a conflicts table so the UI can show what was overwritten.
6. Backfill versions for existing rows in a migration.
2Spoken4:03 PM
not for the note body. two devices edit the same note and someone loses a paragraph. fine for title and tags
37. Drop pending_mutations and replay from the event log instead.
the event log already has every mutation since the last sync
3Spoken4:04 PM
why? the offline queue reads from pending_mutations. feels like its own pr
Touches src/sync/push.ts, src/sync/schema.sql, server/sync/apply.ts
Want me to start with step 1?
4No passage4:05 PM
also no ui in this one. the conflicts table can wait
Round 1 · Send

Paste it back with Steer.

⌃⌘V at the agent's prompt. The preamble asks the agent to push back and not act yet.

Pasted at the cursorTemplateSteer
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 1 · Back

It answers each point, and disagrees where it should.

Round 2 starts empty. Select what's left to settle, and go again.

Claude Code · ~/code/notes-app
❯ [Pasted text #1 +19 lines]
⏺ Taking these in order.
Versions: agreed. notes, notebooks and tags only. audit_log stays as is.
Note body: I'd push back on automatic merging in this change. Keep both versions of a conflicting body, and use last-write-wins for title and tags. That avoids losing text without adding a merge algorithm.
pending_mutations: you're right. Replaying from the event log would let us delete the queue, but that's a separate change. Dropping step 7.
Conflicts table: cut, along with any UI.
Revised plan:
1. version column on notes, notebooks, tags, bumped by trigger
2. base_version on each pushed mutation
3. server rejects stale mutations, returns the current row
14. body: preserve both versions when edits conflict
5. title, tags: last write wins
6. migration backfills versions
Nothing changed yet.
Round 214:11 PM
good. but put both versions inline with conflict markers so i can find them, not in a separate field
2No passage4:12 PM
ok that's it. go ahead
❯ [Pasted text #2 +9 lines]
⏺ Inline conflict markers in body, then. Starting with the migration.
⏺ Update(src/sync/schema.sql)

Four moves, from any app you read in.

Sendpoint lives in the menu bar. You can change every shortcut.

Select a passage

In a browser, a PDF, or a terminal. Or select nothing and just think out loud.

Hold ⌘E

Hold to talk, release to save. Tap mode is also available. ⎋ cancels.

Talk

A small capsule shows the live transcript. Transcription runs entirely on your Mac.

Press ⌃⌘V

Every note pastes at the cursor as one Markdown prompt. Or copy them to the clipboard.

  • ⌘GTyped note
  • ⌃⌘EEdit the latest note
  • ⌃⌘SShow the stack
  • ⌃⌘⌫Clear (Undo Clear in the menu bar)
  • ⌥H…⌥;Switch stack
  • ⌥SpaceDictate at the cursor

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.

The template shapes what the model receives.

PlainJust the notes. The default.
LearnTell me where I'm right, where I went off, and what I missed.
SteerPush back, say what you'd change, don't act yet.
  • Preamble
  • Dated heading
  • Note numbers
  • Timestamps
  • Clear after export

Edit any of them, or add your own.

Notes and speech stay on your Mac.

  • MicOpen only while you're recording.
  • SpeechTranscribed locally with Parakeet on Core ML.
  • AnalyticsNone.
  • NetworkA one-time voice-model download and signed Sparkle update checks. Nothing else.
  • Asks forAccessibility and Microphone permissions.