C.W.K.
Stream
Lesson 01 of 04 · published

Frictionless or Dead

~9 min · capture-contract, validation, required-fields, friction

Level 0Cold Hearth
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"Capture requires no title, tags, categories, or Pippa response. A crumb is valid with a single sentence."

The Product Thesis Becomes a Validation Rule

Track 1 argued why the blank page kills journals. This is where that argument becomes code. The capture contract is a hard engineering rule: a crumb requires nothing beyond content. No title. No tags. No category. No mood. No Pippa response. One sentence is a valid crumb; a single photo is a valid crumb; a link you'll want later is a valid crumb. The moment a field is required, it's a gate between you and saving — and every gate is a reason tomorrow-you closes the app instead of using it.

So the validation is deliberately close to nothing. A crumb is valid if it has some content (text or media); everything else — the ULID, the capture timestamp, the timezone, the target date, the source device — is attached automatically, never asked for. The system fills in the metadata; the human supplies only the fragment. A successful local write produces immediate visual confirmation, so the loop from thought to captured-and-safe is as short as the hardware allows.

Every required field is a tax on the moment you can least afford it. Validation should defend the smallest thing that makes a record real, and auto-fill everything else. Ask for a title 'to stay organized' and you've traded a lifetime of captured thoughts for a tidy schema nobody fills. Make the valid state trivially easy to reach; earn structure later, from crumbs you actually have.

Auto-Attach, Don't Ask

The metadata a crumb carries is real and important — you've seen how load-bearing captured_at and target_date are. But 'important' does not mean 'ask the user for it'. The device knows the moment, the timezone, and today's date without a prompt; the target date defaults to today and can be changed later; the ULID is minted silently. None of that touches the human's five-second budget. The design move is to separate what must be true about a crumb from what the human must type — and to make the second set as close to empty as possible.

Structure Comes After, From Real Material

What about tags, journals, drafts — all the structure the rest of this quest is about? It all comes after capture, from crumbs that already exist, never as a toll at the door. You can tag a crumb later, move it to a journal later, assemble it into a draft later. Deferring every optional decision past the capture moment is the whole trick: the structure is real and rich, but none of it is allowed to stand between a thought and its safe landing. Capture first, organize from what you caught.

Code

Minimal validation: defend content, auto-attach the rest·python
def make_crumb(text=None, media=None, target_date=None) -> Crumb:
    # the ONLY requirement: there must be some content
    if not text and not media:
        raise Invalid("a crumb needs text or media")  # the whole gate

    # everything else is attached automatically — never asked for
    return Crumb(
        id=new_ulid(),                       # minted silently
        text=text,
        media_refs=media or [],
        captured_at=device_now(),            # the device knows
        timezone=device_tz(),                # the device knows
        target_date=target_date or today(),  # defaults to today
        source=device_id(),
    )
# no title, no tag, no mood, no Pippa call standing between you and 'saved'

External links

Exercise

Take a capture or quick-add flow you use and list every field required before save. Sort each into three piles: makes-the-record-real (keep), can-be-auto-attached (move to the system), can-be-done-later (defer past capture). Redesign the flow so the 'must type' pile is as close to just the content as you can get. Notice how much of 'required' was really 'convenient for organizing'.
Hint
The keep pile should be tiny — usually just the content itself. Timestamps, IDs, defaults, and source info belong to the system; tags, titles, and categories belong to after-capture. If your 'required' list is long, most of it is a toll you can remove without losing any real data.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.