← all components

Capture & Digest

The two halves of the loop the founding interview ranked first. Capture is the drop-off: one inbox, many mouths, zero friction, because a thought that is not captured the moment it occurs evaporates. Digest is the return trip — the push engine made visible, because capture without a reliable path back to action is a slightly more expensive way of forgetting.

00

The capture overlay

Press c anywhere. Three lanes into one atom stream — typed text, a live recording, attached files — with facet suggestion previewing what Muninn's bouncer would stamp. Enter drops; Shift+Enter is a newline; Escape closes. Nothing navigates while it is open.

🌀
CaptureOverlay
The whole fast lane. Submitting writes one atom per payload — the note, then the recording, then each file — so a capture carrying a voice memo and two attachments becomes four traceable rows rather than one blob. The drop button counts them out loud: "Drop 3 atoms into the Well".
ui/src/components/CaptureOverlay.tsx
Writing · text only
Capture · fast lane
enter to drop · esc to close
Empty · drop button disabled
facets appear as you write…
🏷️
Facet suggestion chips
Debounced at 340ms, triggered past about eight characters, and reading filenames and extensions as well as typed text (since 2.32.16). Anything above 80% confidence auto-selects; everything else is offered. The trailing number is the confidence percentage, which is what makes a wrong suggestion arguable rather than mysterious.
ui/src/components/CaptureOverlay.tsx · suggestTags
Suggested · two auto-selected
Nothing yet
facets appear as you write…
Adding a facet by hand
🎙️
Recording lane
MediaRecorder plus an AnalyserNode. A pulsing red dot, the live waveform, an elapsed timer, and a stop control. Live audio capture landed at 2.27.15 and is unverified end to end — it has not been exercised against a real microphone in a review pass, which is logged on the issues page.
ui/src/hooks/useAudioRecorder.ts · .cap-rec
Recording
0:47
〰️
Waveform
A mirrored luminous band, one bar per animation frame, RMS-driven, capped at the panel half-height and alpha-scaled by level — "something suspended in water rather than a studio meter", in the component's own words. It reads --accent-raw from the document at paint time, so changing the accent recolours a live recording mid-take. The resting state is a single flat line.
ui/src/components/Waveform.tsx
Active
Resting
⚠️
Microphone denial
Permission refusal is a first-class state (2.29.15), not a swallowed exception: a plain-language message with role="alert", and the text lane stays fully usable — the fallback is always to keep typing.
ui/src/hooks/useAudioRecorder.ts · rec.message
Denied
Unsupported browser
📎
Attachment list
Picker plus drag-and-drop, multiple files, each showing name, size and MIME type, each individually removable. Drag depth is counted rather than toggled, so dragging over a child element does not flicker the dropzone off — a small correctness detail that most implementations get wrong.
ui/src/components/CaptureOverlay.tsx · .cap-files
Two files
  • renewal-terms-2027-draft.pdf418.2 KBapplication/pdf
  • cohort-rerun-notes.md4.1 KBunknown
💧
Sink & acknowledgement
Dropping a capture runs a three-phase sequence — writing → sinking → acked — where an atom element visibly falls into the field before the acknowledgement reads "dropped into the Well · fleeting · awaiting the bouncer". 520ms to ack, 1750ms back to a focused empty box, so a run of captures never waits on an animation.
ui/src/components/CaptureOverlay.tsx · Phase
Acked
dropped into the Wellfleeting · awaiting the bouncer
Dropzones
Two of them. Inside the overlay, releasing files attaches them. On the /capture page itself (since 2.31.15), releasing files queues them straight into the Well without opening the overlay at all — the fastest path from a file on your desktop to a row in the corpus.
ui/src/views/Capture.tsx · .page-dropzone / .cap-dropzone
Page dropzone
release — straight into the Wellqueued as awaiting Muninn ingest
01

The day's captures

A timeline of everything dropped today, showing the state machine plainly in the header: fleeting → literature → permanent. Each row carries its kind, its media metadata, its facets, its classification and its lifecycle state — so "did that actually land" is answerable at a glance.

Capture list item
A gutter dot coloured by kind and a connecting line down the timeline, then the text, then a media strip for audio and file kinds, then the facet row. State pills read as sentences — "transcription pending", "awaiting Muninn ingest" — rather than as enum values.
ui/src/views/Capture.tsx · .cap-item
Text · fleeting
  • The retention number in the deck is the pilot cohort, not the account.

    client/steadystarsinternal9:14 AM · 4.2h agofleeting
Audio · transcription pending
  • Voice note

    0:47 · queued
    project/mimirinternal10:02 AM · 3.4h agotranscription pending
File · awaiting ingest · confidential
  • renewal-terms-2027-draft.pdf

    418.2 KB · application/pdf
    ops/financeconfidential11:38 AM · 1.8h agoawaiting Muninn ingest
Empty day
The empty state is itself the primary action — the whole block is a button that opens the overlay — with the two ways in spelled out underneath. A day with nothing captured should invite a capture, not report a void.
ui/src/views/Capture.tsx · .cap-empty
Nothing today
02

Digest cards

Three tracks feed this list — scheduled decay, stochastic resurfacing of the unprocessed, and relevance triggers. Every card states which track surfaced it and gives a one-line reason. The design bet, borrowed from spaced-repetition prior art, is that consistency of delivery beats algorithmic precision.

🔀
Track key
Three coloured keys with a one-line mechanism note each: the priority scalar re-sorted daily with auto-postpone; cheap random resurfacing of the unprocessed; relevance matching against what you are doing right now. The note is what turns a legend into an explanation.
ui/src/views/Digest.tsx · TRACK_META
All three
scheduled · decaypriority scalar, re-sorted daily, auto-postponestochasticcheap resurfacing of the unprocessedrelevance triggersurfaced because it matches what you are doing now
Open counter
Open over total, as a big numeral with a two-line label. It counts down live as verdicts are filed, which makes the daily pass feel finishable — the one property the operating cadence depends on.
ui/src/views/Digest.tsx · .digest-count
Six of eight
6openof 8
Cleared
0openof 8
🃏
Digest card
Track badge and reason, title, body, tied open question, facets, age, priority. The track colour is passed down as a CSS custom property (--track) and painted as the card's left edge, so a list of eight cards is scannable by track without reading a word.
ui/src/views/Digest.tsx · .digest-card
Relevance trigger · with an open question
  • relevance triggeryou asked about the retention figure twice this week

    The 71% caveat was written down once and never carried forward

    The pilot-cohort caveat lives in a single Drive readout. Every downstream mention drops it.

    open questionIs the account-wide retention rate ever going to be computed?

    client/steadystars20mo oldpriority 88
Stochastic · no question
  • stochasticrandom draw from the unprocessed pile

    Boomerang went on hold and nobody wrote down why

    On hold since 2023-06-30. The tasks are still relevant, the sections are not. Nothing in the Well records the reasoning behind the pause, only its date.

    project/boomerang3.1y oldpriority 41
⛏️
Dig-in control
Collapsed, it advertises exactly what expanding will show: "full atom · 4 in thread · provenance". A focused card also expands on enter — but only when the event target is the card itself, so pressing enter inside the note input does not collapse the thing you are writing about.
ui/src/views/Digest.tsx · .digest-dig
Collapsed
Expanded
🧵
Dig-in context
Five blocks: a plain-language "why this surfaced", the atom in full, the surrounding thread with the atom itself marked, the provenance chain, and the linked entities with jumps into both the Constellation and the Registries. Added at 2.33.16 on the argument that a verdict filed without reading the context is noise in the priority scalar.
ui/src/views/Digest.tsx · .digest-context
Thread context
Thread context
  • Reggie · Nov 21, 2024, 4:02 PM

    Deck's ready for tomorrow — retention slide is the strongest one in it.

  • Malkio · Nov 21, 2024, 4:14 PM this atom

    Caveat that number. It's the pilot cohort, not the account. If it goes out without the cohort attached we'll be quoting it back to ourselves for two years.

  • Reggie · Nov 21, 2024, 4:20 PM

    Added a footnote.

Provenance + linked entities
Provenance
driveNov 21, 2024Retention playbook v2 — pilot readoutwell://source/S-028
Linked entities
SteadyStarsretention rate
⚖️
Verdict actions
Three verdicts and a note escape hatch. Fruitful raises priority so it comes back sooner; Unfruitful sinks it and lets the scalar decay; Done closes it out of the queue. Filing one animates the card out of the list in the matching direction — rise, sink, or close.
ui/src/views/Digest.tsx · VERDICTS
Unfiled
Filing a note
✔️
Filed verdict
Once filed, the actions are replaced by a single statement of what the Well did with it — "rising — back sooner", "sinking — priority decayed", "done — closed out". The wording describes the effect on the queue, not the click that caused it.
ui/src/views/Digest.tsx · .digest-verdict
Fruitful
rising — back sooner
Unfruitful
sinking — priority decayed
Done
done — closed out
🧾
Feedback trail
A verdict filed with a note becomes its own linked atom in the Well (2.35.16), and the trail shows it: verdict, the quoted note, and the atom id plus what it is linked to. This is the part that makes feedback a memory rather than a mutation — the Well can later be asked why something was sunk.
ui/src/views/Digest.tsx · .digest-trail
With a note
  • unfruitfulparked deliberately, not forgotten — stop bringing it back monthlyFB-0142 · linked to A-311
Without a note
  • doneno noteFB-0143 · linked to D-003