PreslerOS · how it works

An AI agent for
our household.

PreslerOS is the app Miloni and I use for our to-dos, groceries and travel. Behind it is an AI agent that runs on a Mac at home and does many of those to-dos itself, in a real web browser, the way a person would. This page explains what an AI agent is, how this one is put together, what it can do today, and how I built it.

What an AI agent is

A language model, given tools and a goal, working in a loop.

A chatbot answers a message and stops. An agent is given a goal and keeps going. At each step the model looks at what it knows so far, picks a tool to use, reads what comes back, and decides the next step. It stops when the goal is done, or when it needs a person.

  1. 1

    Read the goal

    “Book dinner for our anniversary,” plus any context: the calendar, notes from past runs, what it remembers about us.

  2. 2

    Choose a tool

    Open a restaurant's site, click a time, search email, or ask Miloni or me a question.

  3. 3

    Read the result

    The page as text (and a screenshot if that isn't clear), the email it found, or our answer.

  4. 4

    Repeat or finish

    Back to step 2 until it's done. An errand can take hundreds of steps, so PreslerOS caps a run at 400.

Three things decide what an agent can do, and they're where most of the work in PreslerOS went:

The model
Claude, from Anthropic. Errands use Claude Opus 5.5, the most capable model. Chat and the review after each job use Claude Sonnet 5.5, which is faster.
The tools
A real Chrome browser, controlled through Playwright, plus 94 tools I wrote: add to the grocery list, read an email, ask a person, request approval, file a booking into a trip, and so on.
The rules
Instructions for when to act and when to ask, plus limits built into the tools themselves. These are covered under Keeping it safe.

How it works

Three pieces: the apps, a small cloud, and a Mac at home.

The phones never talk to the Mac directly. Everything goes through the cloud. The Mac keeps one connection open to the cloud, so nothing at home is exposed to the internet.

The apps

  • iPhone (SwiftUI), with widgets and lock-screen Live Activities
  • Android (Jetpack Compose), with a Wear OS watch
  • A web app for a computer
  • Our own Claude chats can read and add to our lists
  • Email to the agent's own address
HTTPS

The cloud

  • Cloudflare Workers, on the free tier
  • Stores everything we share: to-dos, groceries, trips, chats
  • Checks flights every 5 minutes and sends the notifications
  • Passes requests to the Mac and its answers back
one connection,
opened by the Mac

The Mac at home

  • Runs the agent (the Claude Agent SDK)
  • Has its own Chrome, signed in to our stores, the airline and restaurants
  • Keeps memory, order history and receipts in a local database
  • Reads Gmail, Calendar and Drive through Google's APIs

Why a Mac, and not a server

Costco, Instacart, United and most restaurants have no API an agent could call. The only way in is their website, signed in as us. A Mac at home keeps those sign-ins, looks like a normal household computer to the sites, and can show a person the screen when it gets stuck on a sign-in.

Why a cloud in the middle

The Mac sleeps and sometimes travels. The lists, trips and flight alerts live in the cloud, so they work on every phone either way. Anything that needs the Mac waits in the cloud and starts as soon as the Mac reconnects. Today the Mac is a laptop; it's moving to an always-on Mac mini.

What it can do

What we use it for today.

Groceries

Fills two carts from one list

It imported a year of our Costco and Safeway orders. Each item on our shared list goes to the store we usually buy it from; new items go to Claude, which sends bulk staples to Costco and small or specialty things to Safeway. It fills both carts and waits for one Approve before ordering.

Errands

Does to-dos in a browser

Book a table, cancel a subscription, return an order, fill out a form, look up prices and report back. When a new to-do comes in, Claude decides whether it's one for us, for the agent, or for the grocery list.

Chat and email

Answers questions about our life

Ask it in the app, from a watch, or by email. It searches our Gmail, Calendar and Drive to answer (“when does the car registration expire?”), adds to-dos, and drafts emails written the way each of us writes.

Travel

Runs the trips

Booking emails become trips on their own. It tracks each flight, works out when to leave for the airport, shows a countdown on the lock screen, and can check us in once check-in opens.

Routines

Works on a schedule

“Every Sunday evening, look at next week and add what we'll need to groceries.” “When the wine club emails, make me a to-do.” Each one is set up from a sentence in chat.

PreslerOS itself

Helps build the app

A screenshot of a bug in the app becomes a GitHub issue. Claude writes a plan with mockups, builds it once we approve, and opens a pull request. See How I built it.

One errand, step by step

“Book dinner for our anniversary.”

What happens when I hand a to-do to the agent, with the tool it uses at each step.

  1. Phone

    I add the to-do. The cloud stores it, and Claude reads it and suggests the agent could do this one. I tap to hand it over.

  2. Mac

    The Mac picks it up and starts the agent with the to-do, our calendar, what it remembers about us, and its notes on how the booking site works.

  3. Mac

    It searches on its own in Chrome, reading each page and clicking through it, with no check-ins for steps that can be undone.

  4. Mac

    It asks when there's a real choice. Nopa has two tables for two on Friday, so it calls ask_user. I get a notification with 6:30 and 8:45 as buttons.

  5. Phone

    I tap 6:30. The answer goes to the cloud, down to the Mac, and back into the agent's loop as the tool's result.

  6. Mac

    It stops before anything final. It calls request_approval with the booking's details and a screenshot of the page. The tool doesn't return until I tap Approve or Reject.

  7. Mac

    It books and reports back. finish_task saves a summary, the confirmation and a screenshot as the receipt. The to-do is marked done by the agent.

  8. Mac

    It reviews the run. It updates its note on how the restaurant's site works, and may ask me whether to remember something, like that we prefer earlier tables.

Keeping it safe

It acts on its own, and asks once before anything it can't undo.

The agent does every reversible step without asking. It asks one time, with everything in one approval, before it pays, books, sends, cancels or changes an order.

How it gets better

It learns from each run without retraining the model.

The model itself never changes. What changes is the context it gets at the start of each run, written by the agent after the last one.

Facts about us

After each job it looks back at our answers, rejections and edits. Small things it saves quietly. Bigger things it asks about first, one question per job.

Notes on each website

Where things are on a site, what's slow, what to avoid. The next run on that site reads the note first, so the second booking goes faster than the first.

How each of us writes

It reads our sent email and writes down our habits, so a draft from Miloni sounds like Miloni. We can remove any habit that's wrong.

How I built it

Mostly by directing Claude.

Claude wrote the code: Claude Code on my Mac, and Claude in GitHub Actions working from GitHub issues. My part is deciding what to build, reviewing each plan and its mockups, and approving.

First commit
Oct 15, 2026
Commits co-written by Claude, of 165
164
Lines of code, not counting tests
~99,000
Merged pull requests opened by Claude on its own
20 of 64
  1. 1 · Issue

    Something to change

    An idea of mine, or a screenshot from the app. The screenshot stays private; the issue just links to it.

  2. 2 · Plan

    Claude proposes a plan

    A written plan and mockups in the app's own design. I reply to change it, or approve it.

  3. 3 · Build

    Claude builds it

    One pull request across the apps, the cloud and the Mac. Automated checks build and test every piece, including a check that Android kept up with the iPhone.

  4. 4 · Ship

    Merged, then released

    Once the checks pass it merges. The Mac then updates the cloud and sends a new build to our phones through TestFlight.

The hard parts

Signing in. Sites expire sessions, ask for codes and show “is this you?” checks, so a lot of work went into 1Password logins, reading emailed codes, and letting a person finish a sign-in from a phone. Second, restarts: if the Mac restarts mid-errand, the agent resumes the same conversation and is told to check where things stand and never repeat a payment or booking.

What it runs on

The agent runs on our Claude subscription through the Claude Agent SDK, not on pay-per-call API usage. Browser errands run one at a time because they share one Chrome. Code changes each get their own copy of the repository, up to three at once. Chat runs alongside both, so a question never waits behind a shopping run.

Build your own

If you wanted one for your household, here's how I'd start.

You don't need to write code yourself, but you do need to know what you want and review what Claude proposes. PreslerOS started as just a grocery agent and grew one errand at a time. Each step below says what to set up and what to ask Claude.

  1. Pick one errand worth automating

    Choose something you do every week on a website that has no API, like the grocery order. One errand done well teaches you more than ten half-done ones.

    Ask Claude“I want an agent that does our weekly Costco order from a shared list. What would it need, and what's the smallest version I could try this week?”

  2. Set up the basics

    A Claude Pro or Max subscription, Claude Code installed on a Mac that can stay on, and a GitHub account for the code. Create an empty repository and open Claude Code in it.

    Ask Claude“Set up this repository for a household agent. Start a CLAUDE.md with how I like to work: show me a plan before building, and nothing that spends money without my approval.”

  3. Get the agent working on the Mac

    The agent is a small program using the Claude Agent SDK, driving its own Chrome profile that you sign in to once. Give it only browser tools, and make it stop on the store's final review screen. Run it from the terminal and watch it work.

    Ask Claude“Build a Node program with the Claude Agent SDK and Playwright that fills a Costco cart from a list in its own signed-in Chrome, and stops before placing the order.”

  4. Add an approval step you can reach from your phone

    Start simple: a web page or a notification with Approve and Reject. When you want it to work away from home, add a small cloud service the Mac connects out to, so nothing at home is open to the internet. An iPhone app needs an Apple Developer account and TestFlight; a web page doesn't.

    Ask Claude“Add a request_approval tool that sends me the cart total and a screenshot, and waits until I approve on my phone. Propose the simplest way for my phone to reach the Mac without opening a port.”

  5. Use it, and turn every annoyance into a request

    Real use shows you what's missing. Write each problem down as a GitHub issue. Once you're comfortable, install Claude's GitHub app so it can plan and build from those issues, with automated checks on every change.

    Ask Claude“Set up GitHub Actions so Claude plans an issue when I label it, builds it when I approve, and runs our tests on every pull request.”

  6. Add errands and memory as you trust it

    Once groceries are routine, let it take general to-dos in the browser, read your email and calendar, and keep notes on what it learns. Add each new power with its own limit: what it may do alone, and what it must ask about first.

    Ask Claude“Let the agent take any to-do I hand it. It should do reversible steps on its own and ask me once before paying, booking or sending anything.”

Three habits from building PreslerOS

Writing the rules down once, in CLAUDE.md, instead of repeating them in every request. Reviewing plans and mockups rather than code. And keeping one written contract between the pieces (docs/CLOUD.md) that Claude updates with every change, so the phone, the cloud and the Mac never drift apart.