Ship the capture
Every capture tool I’ve used eventually failed for the same reason: it made me decide something before I was ready to decide anything. A folder. A tag. A project. The thought dies waiting on the decision.
The friction model
I think of capture as a pipe with three stages: notice, record, file. Most tools collapse record and file into one step — and that’s the bug. The moment a note asks where does this go? before it asks what is this?, you’ve already lost some fraction of your users to the pause.
A capture tool’s only job is to survive the fifteen seconds between having a thought and doing something else. Everything past that is someone else’s problem — including future-you’s.
What actually breaks capture
- Any required field beyond the text itself
- A save button that isn’t “just typing”
- Sync that blocks on a spinner before the keystroke lands
qcap solves this by writing straight to a local queue — no schema, no
project_id, no network round-trip before the cursor returns. Filing
happens later, asynchronously, in Obsidian, where
I actually have the context to do it well.
- Global hotkey opens a single-line input, nothing else on screen.
- Enter appends the line — timestamped — to a local queue file.
- A background job in Obsidian pulls the queue, drafts a note per line, and clears it.
The rule
If a feature adds a decision to the hot path, it doesn’t belong in the hot path. It belongs after — in review, in filing, in the part of the day already set aside for deciding things.
on hotkey:
show(input)
on enter:
queue.append(timestamp(), input.text)
hide(input)
| Step | Before | After |
|---|---|---|
| Notice | — | — |
| Record | Open app, pick notebook | Hotkey, type, enter |
| File | Immediately, by hand | Later, in batch |
None of this is original — every GTD-adjacent tool rediscovers the same pipe eventually.1 The only trick is refusing to let filing borrow time from recording.
Footnotes
-
Ambitions vary; the pipe doesn’t. ↩