amount and regret appear twice. Plumbing (block_id, _tag_property_types, collapsed) is mixed in with real data. And the whole :METADATA: block is only reachable by right-click → Show Metadata — collapse it and it's gone.LifeLab · block model
Two ways to attach data to a block have drifted apart. Metadata (right-click → show) is a free-form JSON bag — powerful, but hidden, ugly, and it evaporates when you collapse it. Drawer properties (defined on a tag's page) render as a tidy :PROPERTIES: drawer and stay consistent — but you author them somewhere else, and a block ends up carrying both drawers with the same values duplicated.
The fix is one store and one surface. Every block already holds a key/value bag; the question is only how you see and edit it. These frames collapse the two systems into a single properties drawer, add a fast inline :key=value: path, and demote the plumbing (id, timestamps, ui flags) out of sight.
:k=v:Type :amount=400: on any headline — on ↵ it commits into properties and leaves the title clean.
Schema fields and adhoc fields share one :PROPERTIES: drawer. Collapse summarizes — never deletes.
The tag's schema is the one show-list: declare a field there and every tagged block gets it.
id / timestamps / plugin blobs never touch the drawer — the inspector shows the whole bag on demand.
The same amount:400 lives in both the pretty :PROPERTIES: drawer and the raw :METADATA: bag — alongside plumbing you never wanted to see (block_id, _tag_property_types, collapsed). Two mental models fighting over one block.
amount and regret appear twice. Plumbing (block_id, _tag_property_types, collapsed) is mixed in with real data. And the whole :METADATA: block is only reachable by right-click → Show Metadata — collapse it and it's gone.:key=value:The fastest path for one-off tracking. Type :key=value: anywhere in the title; on ↵ it commits into the block's property store and dissolves from the title text. One home for data (properties), one quick way in (typing). The = separates it from a plain :tag: only while you type.
: fires completion:PROPERTIES: drawerEvery property — whether it came from a tag schema or was typed inline — renders in a single drawer. Schema fields carry a faint origin tag and a type; adhoc fields carry a plum dot. System plumbing never appears here at all — it lives only in the inspector (frame I).
amount 400 · regret 3 strip — glanceable in a list, one click to expand. The data is always attached; only the chrome folds.:PROPERTIES: = the tag's schema_tag_property_types had the right idea — a declared list of what to show — its only sin was living as a copy on every block. Keep the gate, move it to the tag page. logbook's blob shows nowhere because no schema declares it — no registry, no naming convention, no smarts. And when the plugin wants a visible scalar, it publishes one into the :logbook: schema.
total deliberately, as a typed schema field every :logbook: block shares.What you liked about :METADATA: was honesty, not the drawer. Keep the honesty, drop the drawer: Mod+I on any block opens the inspector — the entire bag, grouped by owner, raw values, editable. It replaces right-click → Show Metadata and never costs vertical space in the document.
:k=v: gets its type from the valueYou worried inline props can't declare number vs text without code. They don't have to — the literal decides. A bare number is a number, true/false is a boolean, a recognizable date is a date, anything else is text. Quote to force text: :zip="00501":. The schema is where you pin a type when inference guesses wrong — declared once on the tag page.
Per-block _tag_property_types did two jobs — declare types and decide what renders — and was copied onto every block. Keep both jobs, in one place: the tag's schema (frame H). Anything the bag holds that no schema declares and no human typed inline stays unlisted. System plumbing never competes for the drawer — it lives only in the inspector.
You're right that a drawer on every block eats vertical space. So the drawer isn't the default — it's the third tier you open on demand. When a block has few props, chips render on the title line itself at zero extra height — display from the store, not text; the collapsed strip is one line; the full drawer only appears when you're editing.
: → = switchYour lag worry is real, but it's not the grammar — it's that typing : hydrates pages for tag completion. Fix the eager load. Completion queries a tiny in-memory index of tag names and property keys. Typing = just filters the same list to property mode. Nothing heavy ever started, so nothing is thrown away.
No per-block display setting to manage. Title-line chips are display-only and always on when props fit. Blocks at rest show the one-line summary. Moving the cursor into a block expands its drawer in place; leaving folds it back to the strip. Tab pins a drawer open if you want it to stay — that pin is the only persisted state (a system flag, hidden like collapsed today).