Skip to content
Brad Johnson, home
All projectsSoftware / 13 of 20

dreamwalker

A personal agent on Pi Durable that runs as a Netlify Server, sleeping when nobody needs it and carrying on where it stopped when it wakes.

Category
Software
Updated
2026-10-21
Status
v0.1.0, early
Built with
TypeScript, Node.js, Pi Durable, Netlify Server, Netlify Database, Netlify Sandboxes, AI Gateway, React, Netlify Identity
The dreamwalker web app: a rail with the dreamwalker and agentNTL agents, pages for conversation, schedule, memory, agents and activity, and a conversation where dreamwalker searches its history for example.com, sets a reminder to email Acme Co, asks agentNTL for the latest Netlify deploy, and later fires the reminder. The footer shows $0.00 of $5.00 spent today.
Test prompts against the deployed app, with my sign-in email blurred.

dreamwalker is a personal agent for one person, built on Pi Durable like gaidin, but run on Netlify instead of a VM. A Netlify Server starts on the first request, sleeps after five minutes without one, is replaced every eight hours and loses its disk each time, so nothing that has to survive lives in memory or on disk. Pi Durable’s SQLite storage runs on Netlify Database through a small Postgres facade that passes Pi Durable’s 24 storage conformance cases, and a lease row lets only one instance write at a time. A scheduled function requests /api/wake every four minutes so reminders and jobs fire on time, and a run or a question waiting on my answer picks up where it stopped after a restart.

It talks to Claude (Haiku 5.5 by default) through Netlify’s AI Gateway, with no API key of my own, under a spend guard of $5 a day and $50 a month. From gaidin it brought over reminders pushed through ntfy, notes about me in every prompt, approvals that wait up to a week, scheduled jobs, web search, search over past conversations, and named agents that can message each other or hand off work, three hops at most. One agent can be granted read-only Netlify tools that check they’re on my personal team before every call. Every tool result has the server’s secrets redacted before it’s stored.

The agent that holds my notes and conversation has no way out to the internet. It hands web and computer work to a worker with delegate. A worker starts fresh with only its task, fetches pages and searches without asking, and works in a Netlify Sandbox, and its answer comes back as outside text. Once outside text is in the conversation, delegating again, writing a note or messaging another agent asks me first, so a page can’t quietly get my data sent somewhere.

I reach it from the dreamwalker command, the HTTP API with my token, or a web app on its own Netlify site that signs in with Netlify Identity (Google, invite-only) and adds the token in a function.

In the Wheel of Time, a Dreamwalker walks Tel’aran’rhiod while asleep.

Next project, 14gaidin