The interactive AI conversation — the one where you sit at a chat window and ask things — is the part everyone talks about. It’s also the part I use least. Most of the AI in my life never asks for my attention. It runs on a clock, triages my inbox, watches my house, files things where they belong, and drops me a note when something needs me.
This is the ambient half. It’s quieter than the chat window, and over the past few months it’s done more for me than any single conversation has.
What ambient AI is for
Executive function decides what to do next, holds the context of what you were doing, and remembers to circle back. It’s the first thing to run out when work, kids, a household, and a side project all pull at once.
Ambient AI targets the front half of that — deciding to start, remembering something exists, noticing it’s overdue. It doesn’t replace the thinking, only the remembering to go looking.
Most “AI productivity” tooling aims at the deliberate task in front of you: write this draft, summarize this paper, refactor this function. That’s the easy half. The hard half is the work that should have been started, sequenced, or chased down, and fails because nobody picked it up.
Ambient AI owns that picking-up. Most of it runs on one pattern: a clock fires, a script gathers, a model judges, and the result lands where I’ll see it. A smaller set runs the same way on demand — invoked directly instead of waiting for a schedule — and still leaves me one job: remembering it exists.
The dispatch layer
The central piece is my Todoist dispatch system. A Python cron job runs every 15 minutes, pulls open tasks out of my Todoist #Claude project, and routes each one to a Claude agent. Anything I drop into that project gets picked up within the quarter hour — unless it’s labeled waiting, in which case dispatch leaves it alone until whatever it’s blocked on clears.
The pivotal decision was making Todoist the universal inbox. AI tasks and human tasks share one lane: same triage engine, same retry semantics, same comment thread. A “fix this automation” task can start as a human investigation, become an AI diagnosis, then an AI fix, then a human review — all on one task, with the full history visible. Two-inbox systems fail because the dividing line drifts.
So I almost never start a long task by sitting down to do it. I write a Todoist task at the kitchen counter, shout one into the house by voice, or let another system file it for me — and the next dispatch tick picks it up.
The Python wrapper handles everything deterministic — scheduling, locking, rate-limit backoff, priority sorting, retry comments, dead-letter labeling after three failures, and snapshotting comment IDs to verify the agent actually posted results. Claude handles everything that needs judgment. The wrapper is fully testable; its audit trail verifies the agent’s work.
The crontabs around it
Dispatch is one cron job, not the only one. A handful of others feed the same inbox or write directly to the same vault — some on their own schedules, some when I reach for them.
Morning briefing — 05:00 daily. Async collectors pull from RSS feeds, Hacker News, and per-subreddit JSON endpoints. A Haiku-tier model does binary relevance filtering against an interest profile I keep as a Markdown note; a Sonnet-tier model scores the survivors, writes one-liners, and clusters the top stories into two or three themes. The result lands in my daily Obsidian note, and a separate automation reads the house and weather status aloud through Sonos at wake-up. I haven’t opened Hacker News on purpose in months.
Weekly review — Sunday 18:00. A pipeline reads the week’s daily notes, dispatch logs, git history across every repo, and Todoist activity, then synthesizes them into one document at Weekly Reviews/YYYY-WNN.md — what shipped, what’s still active, what’s been hanging, what to look at next — and pushes a Todoist task pointing at it. I read it on the couch and @-reply to anything I want to act on; the dispatch loop takes it from there.
HA health check — on demand. The skill queries Home Assistant Core logs, the logbook, automation traces, and entity states, hunting for startup races where an automation fired on homeassistant.start while its source entities were still unavailable. When it finds one, it auto-dispatches a root-cause agent that writes a postmortem and links it from an audit report. I find out by reading the audit; the fix gets queued as its own task.
Idea miner — on demand. A skill scans recent vault notes — research, postmortems, plans, retros — and ranks the ones that could become blog posts. The top five get posted as Todoist tasks. Most weeks I skim them, kill three, and two become drafts. (This post is one of them.)
Link-keeper — on demand. It walks every external URL in Blog/Posts/ and Blog/Drafts/, checks for 404s, redirects, and timeouts, and reports anything broken as a Todoist task. It’s the one pipeline with no LLM step — a pure mechanical check — but it earns its place because it’s still triggered ambiently, without a conversation. Link rot used to be something I noticed when a reader emailed. Now I find out on Sunday morning.
Why this is the part that actually changes things
The interactive conversation asks me to know what I want, frame the question, and process the answer — high-leverage, but high-friction. The ambient layer asks none of that. Setting it a task costs a typed Todoist line — the cost of capturing the thought at all. Receiving its work costs reading a note I was already going to open.
That changes what gets done in three concrete ways.
Things that used to fall through the cracks now have an owner. The morning catch-up on the open-source projects I follow. The Sunday review. None of it is hard; all of it is the kind of thing that quietly stops happening when life gets busy. Because these run on a clock, they don’t stop.
The cost of “I should look into that” approaches zero. A passing thought — what’s the actual difference between two MQTT QoS levels? — used to either derail whatever I was doing or get forgotten. Now it becomes a Todoist task, and the research agent has a note in the vault by the time I come back to it.
Recurring decisions become recurring outputs. “What should I read this morning?” used to be a decision I made by opening tabs. Now it’s a 05:00 cron job. The decision moved from real-time and attention-consuming to design-time and set-once.
The shape underneath all of it
Most of these pipelines share the same skeleton.
flowchart LR T["Trigger<br/>cron, webhook, or a command I run"] --> G["Gather<br/>feeds, git logs, tasks, HA state"] G --> J["LLM judgment<br/>filter, score, cluster, summarize"] J --> L["Landing place<br/>daily note, Todoist task, Sonos"]
The trigger is never a conversation — a cron schedule, a webhook, or a command that costs no more than typing it. The gathering step pulls the specific inputs in code, so the model never has to go find them. The judgment step is the part that genuinely benefits from a model, and the landing place is always somewhere I already look — never a new app or a dashboard to remember to check. Link-keeper is the one exception: it skips the judgment step, and still counts because it’s triggered the same way as everything else.
The skeleton matters more than any single pipeline: once it’s clear, building the next one is mostly choosing the trigger and the landing place — the middle two are increasingly templated.
This is what “AI in my daily life” actually looks like, and it’s nothing like the chat window. The chat window is a power tool I reach for when I need it. The ambient layer is plumbing — out of sight, mostly on a clock — taking the deciding-to-start and the remembering-to-check off my plate, so the attention goes to the things that genuinely need it.