LifeLab Pro · native capability map
Grouped by what they change about the app's relationship to your day, not by framework. Each row: what it is, why it's LifeLab-shaped, impact and effort. The rule for including anything here — it must land as a block, a lens, or a Lua-callable command. Native features that don't reduce to those three are someone else's app.
global capture panel · ⌥space
Same parser as the buffer, so TODO, :tags:, <2026-08-02> and property syntax all work while typing. No UI to learn — it's one line of LifeLab, floating.
menu bar extra
notification from a hook
Actionable, so the reply writes DONE or reschedules without opening the app.
@page targeting, /command, and a growing draft (⌥⏎ for a second line).ship this first. it is the whole purpose half of your thesis in one day of work.message:// back-link; an image → attachment. Dropping on the ◷ today tab is the fastest “log this”.the interaction tabs unlock — see the tabs review.shortcuts / applescript surface
-- every Shortcuts action is one Lua entry point function actions.append(page, text, props) local b = block.new(text, props) page.append(b); return b.id end -- so a Shortcut, a Stream Deck, a cron job and -- the right-click menu all hit the same code path lifelab.register_action("Append Block", actions.append)
One registry, four front doors. This is commitment 03 made operational — the app's own menu items should be registered the same way.
hooks reaching outward
-- morning: rebuild the workspace as tabs hooks.on("day_start", function() tabs.open("today"); tabs.open("inbox") tabs.open(active_project(), { lens = "next-actions" }) end) -- deadline → real system notification hooks.on("deadline_due", function(b) notify(b.text, { actions = { "Done", "+1 day" } }) end)
The web build could schedule nothing and notify no one. Native hooks are the first time your automation layer can act on the world.
.sdef signals “this app is scriptable” louder than any feature list.DONE, +1 day, snooze) without launching the app.lifelab add "…", lifelab lens next-actions --json, lifelab open today. Makes the vault pipeable — | jq, git hooks, cron, tmux. Your audience will build things you'd never ship..org file in Finder and see it rendered in LifeLab's own styling. Small, but it's the moment the vault stops feeling like a database dump.widget · a lens, rendered by the system
Crucially not a bespoke screen — it's a saved lens with a widget renderer. Commitment 02: the widget's query is editable in the app, and you can point it at any lens you own.
tab list in the palette · ⌘⇧T
One palette searches open tabs and saved lenses in the same list, because after §4 of the tabs review they're the same kind of object. Tab overflow solved without ever scrolling the bar.
The governing principle for this whole section: passive capture must be a hook the user can read and delete, not a black-box integration. Ship each sensor as a Lua example in the docs — hooks.on("day_start", … health.steps …) — so the feature is simultaneously a tutorial for the automation layer. That's how you add sensors without becoming a tracking app.
Everything in the top five is a week, total. And note what they have in common: none of them are screens. The native superpower isn't a better window — it's that a personal wiki can stop being a place you go and become the thing your Mac writes into all day. Build the ways in and out before you build anything else inside.