Damon Kohler

Tags

  • blog127
  • python24
  • linux21
  • ubuntu12
  • android11
  • robotics11
  • ai10
  • hardware9
  • arduino7
  • ase6
  • sl4a6
  • google6
  • review6
  • game-review6
  • claude-code5
  • workflow5
  • agents4
  • homelab4
  • home-assistant4
  • research4
  • presentations4
  • makerbot3
  • nokia3
  • automation2
  • obsidian2
  • olpc2
  • productivity1
  • todoist1
  • retrospective1
  • sdlc1
  • birdnet-go1
  • mqtt1
  • syncthing1
  • icloud1
  • postmortem1
  • self-hosted1
  • gsd1
  • cartographer1
  • cougar-project1
  • nessie1
  • django1
  • olpc-fido1
  • bash1
  • shell1
  • sysadmin1
  • dnd1

Tags

  • blog127
  • python24
  • linux21
  • ubuntu12
  • android11
  • robotics11
  • ai10
  • hardware9
  • arduino7
  • ase6
  • sl4a6
  • google6
  • review6
  • game-review6
  • claude-code5
  • workflow5
  • agents4
  • homelab4
  • home-assistant4
  • research4
  • presentations4
  • makerbot3
  • nokia3
  • automation2
  • obsidian2
  • olpc2
  • productivity1
  • todoist1
  • retrospective1
  • sdlc1
  • birdnet-go1
  • mqtt1
  • syncthing1
  • icloud1
  • postmortem1
  • self-hosted1
  • gsd1
  • cartographer1
  • cougar-project1
  • nessie1
  • django1
  • olpc-fido1
  • bash1
  • shell1
  • sysadmin1
  • dnd1
Posts/Garden/About

About Me

I’m a software engineer in Munich. By day I work on Google Cloud Dedicated. In past lives I built Cartographer (LiDAR SLAM, story), rosjava (story), and SL4A (story).

This is where I write about tech, home automation, robotics, and whatever else I’m tinkering with.


The Ambient Use of AI

Jul 19, 2026

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.

Previous Posts

  • Bootstrapping Agentic OS

    Jul 19, 2026

  • Progress Update

    Jul 19, 2026

  • SDLC Workflow

    Jul 19, 2026

  • The Research Workflow

    Jul 19, 2026

  • When Syncthing Faithfully Shipped a Disaster

    Jul 19, 2026

  • The Birds Were There the Whole Time

    Jul 18, 2026

  • Building an AI Development Team on a Single Linux Box

    May 01, 2026

  • Running D&D with Obsidian and AI

    May 01, 2026

  • My Home Assistant Architecture

    May 01, 2026

  • My AI-native Home(lab)

    May 01, 2026

  • Cartographer Launch!

    Sep 05, 2014

  • Understanding Kalman Filters

    May 01, 2014

  • Is your Roomba running slow?

    Jul 18, 2013

  • offline friendly ros development

    Mar 10, 2013

  • Cloud Robotics at Devoxx 2012

    Dec 07, 2012

  • Cloud Robotics at Berkeley Par Lab

    Oct 11, 2012

  • Introduction to rosjava at ROSCon 2012

    Jun 02, 2012

  • Unblock Us Security

    Mar 06, 2012

  • Bluetooth Keyboard Doesn't Work After Suspend

    Feb 19, 2012

  • HDMI Audio on Ubuntu

    Feb 19, 2012

  • Fixing the F3 key on a Kinesis Keyboard

    Jan 03, 2012

  • Android Fling Detection

    Jul 09, 2011

  • Cloud Robotics at Google I/O 2011

    May 13, 2011

  • Nuisance: A Short Story

    Apr 23, 2011

  • Review of Fallout: New Vegas

    Feb 06, 2011

  • Building ROS from Source

    Jan 03, 2011

  • Review of Fable III

    Jan 02, 2011

  • Flying the Parrot AR.Drone with a Wiimote and Nunchuck

    Jan 01, 2011

  • How to Flash a Lego NXT Brick on Ubuntu

    Jan 01, 2011

  • Brain Slug Hat

    Dec 14, 2010

  • LED Menorah

    Dec 05, 2010

  • Android-Powered, Automated Cat Feeder

    Nov 15, 2010

  • Making The diNovo Edge Work On Ubuntu Lucid

    Nov 06, 2010

  • From Photo to Inkscape to DXF to OpenSCAD to MakerBot to Costume Jewelry

    Nov 01, 2010

  • SketchUp 7 Keyboard Shortcuts under Wine

    Oct 30, 2010

  • MJPEG Streaming Protocol

    Oct 19, 2010

  • Secure Synergy Configuration for HTPC Control

    Oct 02, 2010

  • Meet Helo and Miranda

    Aug 07, 2010

  • MakerBot Cupcake CNC

    Aug 07, 2010

  • How far did Tom Petty free fall?

    Jun 06, 2010

  • Better Orientation Readings in Android

    Jun 03, 2010

  • Using chmod in Android

    May 27, 2010

  • Bot Commander r1 Released

    May 19, 2010

  • Review of Halo ODST

    May 14, 2010

  • Review of Mass Effect 2

    May 13, 2010

  • Android Lego NXT Rover with Stereoscopic Vision

    May 09, 2010

  • Review of BioShock 2

    May 08, 2010

  • Outlet Mounted Phone Pocket

    May 04, 2010

  • Browsing Android Source in Eclipse

    May 03, 2010

  • How to Install Mercurial on Ubuntu

    Mar 18, 2010

  • My 5 Rules for Writing Bash Scripts

    Mar 16, 2010

  • How to Activate an Android Phone Over WiFi

    Mar 13, 2010

  • Reencode Videos to Play Faster

    Mar 07, 2010

  • Ubuntu Koala Missing Volume Control: Found!

    Nov 02, 2009

  • Fixing Karmic Koala's Broken tzdata Package

    Nov 01, 2009

  • Introducing hushnote

    Oct 25, 2009

  • How to use Manual Focus (the easy way!)

    Oct 10, 2009

  • Finding Unique Files

    Sep 30, 2009

  • Pletscher ESGE on my Surly Long Haul Trucker

    Aug 29, 2009

  • Android G1 Bicycle Mount

    Aug 29, 2009

  • Is your Wii power supply broken?

    Jul 30, 2009

  • Solving Car Talk Puzzlers with Python

    Jun 11, 2009

  • SL4A / ASE (Scripting Layer for Android / Android Scripting Environment)

    Jun 09, 2009

  • Logitech Pan/Tilt Python C Extension

    May 10, 2009

  • Ubuntu Jaunty Wireless and RT61PCI

    Apr 27, 2009

  • OneSwarm is what I've been waiting for!

    Apr 24, 2009

  • Finding Duplicate MP3s Using Locality Sensitive Hashing

    Mar 02, 2009

  • Installing a New Hard Drive on Ubuntu

    Feb 28, 2009

  • Android Recipes and Snippets

    Feb 13, 2009

  • Ubuntu on the OLPC XO

    Feb 11, 2009

  • Vim Features Overview

    Feb 11, 2009

  • Rhythmbox shout2send Plugin

    Jan 25, 2009

  • Streaming Music to the Chumby with PulseAudio and GStreamer

    Jan 24, 2009

  • Getting started with the CMUCam3

    Dec 31, 2008

  • Plant Monitor

    Dec 14, 2008

  • Email Injection

    Dec 10, 2008

  • JavaScript Painting with Canvas

    Dec 09, 2008

  • Ubuntu Ibex Wireless and RT61PCI

    Dec 07, 2008

  • XBee ZNet 2.5 Wireless Accelerometer

    Nov 09, 2008

  • Scooba Stuck In Diagnostic Mode

    Nov 02, 2008

  • Arduino Accelerometer (ADXL330)

    Sep 26, 2008

  • Arduino RF Link

    Sep 23, 2008

  • How to Run Rise of Nations with Wine

    Sep 22, 2008

  • How to Repair a Computer Fan

    Sep 07, 2008

  • Backing Up and Resizing Partitions in Linux

    Sep 02, 2008

  • Git Repository Collaboration

    Jul 29, 2008

  • Ubuntu Internet Install

    Jun 09, 2008

  • SSH Tunnel to Router Settings

    May 20, 2008

  • My Train Orb (also Scraping Munich Train Schedules)

    May 20, 2008

  • Python Decorators and SimpleXMLRPCServer

    May 15, 2008

  • Save The Date (also, fun with historical weather data)

    May 07, 2008

  • Django on Google App Engine

    May 02, 2008

  • Review of O'Reilly's "Programming Collective Intelligence"

    May 02, 2008

  • How BitTorrent Private Trackers Work

    Apr 29, 2008

  • Finding your public IP address in Python

    Apr 16, 2008

  • Awesome Linux Utilities for five hundred, Alex!

    Mar 23, 2008

  • Tomato

    Mar 21, 2008

  • How to Check if a Child Process is Still Running in Python

    Mar 20, 2008

  • FriendFeed sounds cooler than it is?

    Feb 09, 2008

  • PyS60 GPS on the Nokia N95

    Feb 02, 2008

  • Symbian Signing rotateMe

    Jan 30, 2008

  • My New Nokia N95. Wow.

    Jan 28, 2008

  • Monitoring Hard Disks with SMART

    Nov 18, 2007

  • PyOpenDHT

    Oct 19, 2007

  • Whoopee! A blinking LED!

    Oct 12, 2007

  • Scraping Xbox Live

    Oct 06, 2007

  • A different sort of web framework

    Oct 03, 2007

  • Pertelian X2040 USB LCD

    Sep 13, 2007

  • Fido: OLPC Telepresence Robot

    Aug 29, 2007

  • Simple Django offline apps? Oh, yes.

    Jul 12, 2007

  • Python One-Liners

    Jul 12, 2007

  • __import__ is stupid.

    Jun 15, 2007

  • Fesity, Apache2, SSL, and Firefox

    Jun 08, 2007

  • The evolution of Python generators.

    May 21, 2007

  • Python Design Patterns

    May 21, 2007

  • Where's my open source implicit SSL FTP clients?

    May 17, 2007

  • Stupid FileVault

    May 13, 2007

  • Editing Python with Vim

    May 13, 2007

  • What's an ISO and how do I use it?

    May 10, 2007

  • Project Nessie: A P2P Platform in Twisted

    Oct 10, 2006

  • Cougar Car Audio Build

    Jun 20, 2006

Garden updates

  • The House Is a Robot: How an AI-Native Homelab WorksJul 24, 2026
  • Home Assistant, Organized: Packages, Blueprints, and a Deterministic PlaneJul 24, 2026
  • Running D&D Out of an Obsidian VaultJul 24, 2026
  • A Multi-Agent Claude Code Development WorkflowJul 24, 2026
  • BirdNET-GoJul 18, 2026
See all →

Graph View

Created with Quartz v4.5.2 © 2026

  • GitHub
  • LinkedIn