views beyond river and grid

thinking doc · 2026-08-16 · follow-on to Table View: Metadata Projection · touches Month Lenses, Doodles, Lens Spec Draft 3 §11.1

The useful pivot isn't "which other views" — it's noticing that every view you have or want is one function: position = f(block). That reframing prices the whole roadmap, because it says you are not building N views; you are building axis bindings for one renderer.

viewxyneeds from the block
riverorder keynothing — works on any set
gridmanualmanualnothing, but stores position outside the data
tablekey namesorder keyshared keys
boardone key's valuesorder within columnone key, few distinct values
timelinea date keylane / stacka date — every block has one
charta date keya numeric key, reduceddate + number + your aggregation

Grid is the odd one out: it's the only view whose position isn't derived from the block. Every alternative below is more attractive precisely because its layout means something.

1 · Board — the one I'd build first pick

Group by a single key; each distinct value is a column; the card's column is the value. Attractive for one reason that nothing else on this list can claim: it writes. Dragging a card from next to doing sets status=doing. It's the grid's drag gesture, except the position is data instead of decoration — which is exactly the objection you raised against a free canvas.

projects/lifelab
![[:projects/lifelab:]]{todo board:status}
next4
implement minJEPA
:ml:
install bazzite to desktop
fri
cmd shortcuts for bold
doing2
lens is still slow and wonky
↖ dropping → status=doing
grid view broke
2d
blocked1
drag image INTO lens
needs upload path
no status7
shift-enter new block
unset
drop = write one key · the no status column is not a bug, it's the backlog of unlabelled work

Why it fits your model better than a table: it needs exactly one key to exist, not a whole shared key space, so it works on day one with the metadata you already have. It also degrades gracefully — a key with 30 distinct values just gives you 30 columns and you learn not to board on that key. And board:tag is free: columns are tags, dragging re-tags. That's a genuinely new capability, not a redraw.

2 · Timeline — the one that needs nothing pick

The table's weakness is that it dies on sparse metadata. Time has no such problem: every block already has a date (created, plus when/due/logbook entries when present). A timeline is therefore the only alternative view that works on any set, including Home — the same universality that makes river safe.

Home · last week
![[Home]]{timeline:when when:-1w..+1w}
mon 103 blocks
drag+drop between pagesMandarin study:diary:
tue 111
Alan Wake 2 · 2h52m ────
wed 12
nothing recorded
thu 136
lens is slow3 meals:diary:sync mode offline
fri 14ahead
install bazzite due
past = what happened · future = what's due · the same lane, one rule

Two things make this worth more than a sorted river: gaps are visible (wed 12 is empty, and that's information — the river silently closes up), and past and future share one axis, so retrospection and agenda stop being two features. It's also where your :LOGBOOK: durations finally render as what they are: spans, not a drawer count. Month Lenses is this view zoomed out — same binding, coarser grain.

3 · Chart — nearly free once aggregation exists cheap

Not a rival view so much as the natural drawing of the thing you just built. If a lens can already reduce kcal by day, the only missing part is rendering the series as bars instead of rows. Same query, same reducers, ~zero new model.

journal/2026-08 · monthly
![[:meal:]]{chart:kcal:sum grain:day when:this-month}
260013000
aug 1aug 7aug 13
hatched = no data, not zero · on a bar → that day's leaf table

Keep it deliberately poor: one series, bars or a line, no legends, no dual axes, no colours beyond the accent. A charting library here would be the first thing in LifeLab that doesn't look like a terminal buffer. The sparkline is the inline degenerate case — same series, 11px tall, in a river row or a table cell (and probably explains the sparkline that keeps appearing uninvited in your TODO list).

4 · Gallery — small, cheap, only if doodles land later

![[:draw:]]{gallery when:-1m..}
doodle
mon 10
screenshot
tue 11
doodle
thu 13
whiteboard
thu 13

Blocks whose payload is visual are the one case where the river's text-first row actively hides the content. A gallery is ~40 lines: thumbnail + date caption, click opens the block.

But it's strictly downstream of #+begin_draw and image blocks — until those exist there's nothing to show, and it earns nothing on a text corpus.

5 · The trap: graph view no

It's the most requested and the least used. Concretely, for LifeLab: a force graph of blocks-and-links has no stable position (so no muscle memory), no readable labels past ~50 nodes, and it answers a question you can already answer better — "what touches this?" — which is the LINKED section. If you want the honest 90%, build the neighbourhood: one block, one hop, as a small list of incoming and outgoing with the relation named. That's a panel, not a view, and it's useful every day rather than twice.

Same verdict on map and tag-hierarchy tree: map waits until a location key actually exists (mobile capture), and the tag tree is the pages browser you already have.

6 · How I'd sequence it

#viewwhy nowcost
0fix gridshares the projection plumbing everything below reuses
1board:keyonly view that writes; needs one key, not a schema; re-tagging by drag is new capabilitymedium
2timelineworks on every set with zero metadata; unifies retrospection and agenda; renders logbook spansmedium
3tablethe entry surface for macros-style data; wants grain + coverage from §8 of the other docmedium
4chart / sparklineaggregation already computes it; drawing onlysmall
5galleryafter draw/image blockssmall

All five are {view} words in a lens line with an axis argument — board:status, timeline:when, chart:kcal:sum, table cols:…. One grammar, one renderer, one place where "which blocks" is decided. If a view can't be expressed as an axis binding over a lens result, that's the signal it's a different feature wearing a view's clothes.

7 · Open