LifeLab Pro · native capability map

Twenty-six things a Mac app can do that a web app can't — filtered to the ones that serve a programmable personal wiki.

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.

1 · capture get things in without arriving. the highest-value native category by far

global capture panel · ⌥space

*ran 5k, knee felt fine|
today⇧⏎ inbox@ page: tag/ command⌘⏎ open after

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

4·2h focus⌥space

notification from a hook

LifeLabnow
DEADLINE ‹today› — send lease renewal :admin:
Done+1 dayOpen

Actionable, so the reply writes DONE or reschedules without opening the app.

Global quick-capture panelNSPanel · nonactivating · hotkey
Floating one-line composer over any app; writes a block and vanishes. Supports @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.
impact 3effort 1
Services menu entryNSServices · Info.plist
Select text in any app → right-click → “Add to LifeLab”. Free system-wide integration; the source app and URL come along as properties.≈40 lines. the cheapest genuinely magic feature on this list.
impact 3effort 1
Share extensionShare Extension target
Appears in every share sheet — Safari, Mail, Photos, Preview. Sends the page, selection, or file into today with attribution.
impact 2effort 2
Drag-and-drop onto tabs and blocksNSPasteboard multi-type
Drop a file → block with a link (or copy into the vault); a URL → titled link block; a Mail message → block with message:// back-link; an image → attachment. Dropping on the ◷ today tab is the fastest “log this”.the interaction tabs unlock — see the tabs review.
impact 3effort 2
Menu bar extraNSStatusItem
Live count of today's open TODOs; click for capture + the next three agenda items. Turns the app into an ambient presence rather than a destination.
impact 2effort 1
Universal clipboard / HandoffNSUserActivity
Start a block on iPhone, continue on Mac — the Mac shows the Handoff icon in the Dock. Also gives you “Continue on Mac” from your mobile build for free.
impact 1effort 2

2 · reach let the OS call your Lua. your automation layer already is the API — expose it

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.

Shortcuts actionsApp Intents
“Append block”, “Run lens”, “Open page”, “Today's TODOs”. Users compose LifeLab with Calendar, Reminders, HomeKit, Focus modes — automation you don't have to build.also gives you Siri and Spotlight actions for free.
impact 3effort 2
URL scheme + deep linkslifelab://page/…#block
Every block gets a stable, linkable address. Paste a LifeLab link into Slack, a calendar invite, a commit message — and back-link into Mail, Things, Finder from a block.bidirectional linking with the rest of your machine. very high value, near-zero cost.
impact 3effort 1
AppleScript dictionaryNSScriptCommand · sdef
The tinkerer audience you're building for lives here. A published .sdef signals “this app is scriptable” louder than any feature list.
impact 2effort 2
Scheduled + actionable notificationsUNUserNotificationCenter
Org's agenda finally reaches out. Reply actions write back to the block (DONE, +1 day, snooze) without launching the app.
impact 3effort 2
CLI companionlifelab(1)
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.
impact 3effort 2
Spotlight indexingCoreSpotlight
Blocks findable from ⌘Space, deep-linking straight to the block. Your notes join the system's search rather than hiding behind it.
impact 2effort 2
Quick Look generatorQLPreviewProvider
Press space on an .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.
impact 1effort 2

3 · presence surfaces that exist while the app is closed

widget · a lens, rendered by the system

today07-30
TODOsend lease renewal
TODOreview PowerSync conflict
DONEran 5k
4 open+ capture

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

lens
open tabs
◷ today {scheduled}⌘1
⌂ home⌘2
lens-color-lab {−subpages}⌘3
saved lenses
next-actions {TODO −someday}⏎ opens tab
reading-queue {:read:}

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.

Widgets (desktop + Notification Centre)WidgetKit
Any lens becomes a widget. Small = counts, medium = today's agenda, large = a full lens. Users pick which lens per widget.
impact 3effort 2
Focus filtersSetFocusFilterIntent
Turn on Work Focus → LifeLab switches to the work lens and opens the work session's tabs; Personal Focus → your journal. The OS changes your app's view for you.the single most LifeLab-shaped API Apple ships. lenses + sessions + a system trigger.
impact 3effort 2
Dock badge + Dock menuNSApp.dockTile
Open-TODO count on the icon; right-click Dock for capture and recent pages. Twenty minutes of work.
impact 1effort 1
Login-item + background agentSMAppService
Hooks fire on schedule whether or not a window is open — daily rollover, agenda notifications, sync reconciliation. The app becomes a service, not a viewer.
impact 2effort 2
Live Text / OCR on dropped imagesVisionKit
Drop a whiteboard photo or receipt, get selectable text and a searchable block. On-device, no service, no key.
impact 2effort 2
On-device dictation into a blockSFSpeechRecognizer
Hold a key in the capture panel and talk. For a life-log this is the difference between recording a run and forgetting it.
impact 2effort 2

4 · substance the things that make commitment 04 (“text is the truth”) physically real

A real folder, in Finderplain .org files on disk
Tag colours via Finder tags, versioning via git, backup via Time Machine, sync-of-last-resort via iCloud Drive. PowerSync becomes the fast path over a substrate you don't own — exactly the right dependency shape.this is the promise the web build could only assert. make it visible: “Reveal in Finder” in the block menu.
impact 3effort 2
External-edit watchingFSEvents
Edit a page in Emacs or vim; LifeLab updates live and pushes through PowerSync. Your old editor stays welcome, which retires the biggest objection to leaving the browser.also the best possible answer to “am I locked in?” — no.
impact 3effort 3
Version browserNSDocument versions / git log
⌘⌥⇧S-style “browse all versions” on a page, or a diff lens showing what changed today. Sync conflicts stop being scary because history is inspectable.
impact 2effort 3
Keychain + FileVault-backed secretsKeychain Services
Lua hooks can hold real API tokens safely, so automations can talk to services without a plaintext secret in a note.
impact 2effort 1
Encrypted / Touch-ID-locked pagesLocalAuthentication
Mark a page private; opening it requires Touch ID. For a life-logging wiki (health, therapy, finances) this converts “I'd better not write that here” into “this is where that goes”.emotional unlock, not a technical one. surprisingly large effect on what people trust the app with.
impact 3effort 2
Real multi-window + splits + Stage ManagerNSWindow · window restore
Two windows with independent tab sessions, restored exactly on relaunch. ⌥click a tab to split. Full-screen Spaces per project.
impact 2effort 2
System text input, properlyNSTextView · IME · Data Detectors
Emoji picker, dictation, multilingual IME, spell-check, substitutions, text replacements, accessibility — all things CodeMirror approximated and AppKit just has. Data detectors turn typed dates into scheduled properties.the practicality you traded styling for. name it as a win, not a compromise.
impact 3effort 1
Print / PDF / Export as a lensNSPrintOperation
Print any lens result — a weekly review, a project's open items — with your mono styling intact. Physical output is a surprisingly strong ritual anchor for journalling.
impact 1effort 1

5 · sensors for a life-log specifically. handle with restraint — passive data is the fastest way to make a wiki feel like surveillance

HealthKit / Screen Time readHealthKit · via mobile app
Steps, sleep, workouts, screen time appended as day-page properties. The daily page becomes partly self-writing, which is a real reason to open it.rule: passive data lands as properties on the day block, never as prose. it must be visibly deletable and hook-controlled.
impact 2effort 3
Calendar + Reminders readEventKit
Today's meetings render as a lens in the day page; each event can spawn a note block with attendees pre-tagged. Read-only first — the calendar stays the source.
impact 3effort 2
Location contextCoreLocation, coarse
Optional coarse place on capture (“home”, “office”, city) as a property. Makes retrospective lenses possible: “everything I wrote while travelling”.
impact 1effort 2
Now-playing / active-app contextMediaRemote · NSWorkspace
Optionally stamp a captured block with what you were doing. Powerful for a work log, creepy if default-on — ship it off, per-hook, and per-property.
impact 1effort 2

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.

6 · what to build, in order ratio of “feels like magic” to days of work

1
Global capture panel (⌥space) — one day. The feature people describe to friends, and the proof that native was the right call. Nothing else on this list is close.
2
URL scheme + Services menu — one day together. Makes LifeLab addressable and reachable from every other app on the machine. Absurd value per line.
3
Actionable notifications + a background agent — your agenda finally reaches out, and hooks run whether or not a window is open. This is the step where LifeLab becomes a service.
4
Drop-onto-tab — files, URLs, mail, images. The interaction only tabs make possible, and the natural pair to capture.
5
Shortcuts actions via a Lua action registry — build the registry once and Shortcuts, Siri, the CLI, AppleScript and your own menus all come off it. Do the registry before the integrations.
6
Widgets + Focus filters — a lens on your desktop, and the OS switching your workspace when you switch context. Ship widgets first; Focus filters are the flex.
7
Real files + FSEvents external editing — heavier, but it's the feature that makes the other 25 credible. “Your notes are files. Edit them in Emacs if you like.”
8
Touch-ID-locked pages — changes what people are willing to write down, which changes what the app is for.

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.