This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine.
What I Built
A personal AI agent that lives on my NAS instead of someone else's cloud. Four moving parts:
OpenClaw, an open-source agent harness, in a container on a UGREEN DXP2800: quad-core Intel N100, 8 GB of RAM, one NVMe SSD and two hard drives that already spent their days doing backups.
The agent has no memory of its own, every model is a blank page. What makes it someone is a folder of plain-text files: rules, personality, my profile, its daily notes. It re-reads its own papers before answering, like a séance that consults the script before summoning anything.
Every Monday at 6 AM it queries my Notion tasks, builds an HTML recap and emails it, with guard rails so a Monday identical to the previous one never mails twice.
The agent wrote and shipped its own public front end: agent-mailbox, a tiny static showcase of that mailbox. Every recap visible there is fictional on purpose. The real data stays home.
Demo
Open the live demo (free Render instances sleep, so the first hit of the day may take a few seconds)
One self-contained HTML page: inline CSS and SVG, no dependencies, no trackers, zero outbound requests. Generated by the agent, deployed on Render as a static site.
Code
The whole demo is a three-file repo, README included:
agent-mailbox
Minimal demo front end for a self-hosted AI agent: one static page, no real data, no trackers, no secrets.
The idea: the agent runs on a personal machine; it publishes an activity recap here. This page is a showcase for the DEV challenge article "Ghost in the Machine" (Week 4, Hacktoberfest 2026).
Contents
-
index.html: the demo page, fully self-contained (inline CSS and SVG, no dependencies). -
render.yaml: blueprint for a free static-site deployment on Render.
Rules for this repository
- No personal information: no names, no locations, no addresses, no real projects. Everything shown on the page is explicitly fictional.
- The agent publishes from home; this mailbox is a demonstration mirror, not a production service.
Credits
This repository, its demo page and its blueprint were generated end to end by the agent itself (commit author: OpenClaw Agent). The human provided the direction and the rules, and wrote none of…
| File | Role |
|---|---|
index.html |
the showcase page, fully autonomous |
render.yaml |
Render blueprint, static site, free tier |
README.md |
the project's privacy rules, and who wrote what |
Yes, the agent generated every line of it, and the README says so in black and white. The human only gave direction.
How I Built It
OpenClaw is the backbone: gateway, container, tool policy, scheduler. Around it, four files make the agent actually work:
AGENTS.md: the conduct rules. What it may do without asking, what it never does, like "no more than three retries on a failing test" and "nothing private leaves the house".
SOUL.md: the personality, so it replies like a colleague instead of a brochure.
USER.md: my portrait, written by the agent itself. One dated directive per line, superseded by new ones, never silently deleted.
MEMORY.md plus one daily note, committed to a private git repo, because an agent whose memory isn't versioned is an agent whose memory gets lost without warning.
What a directive looks like (made-up example, same format as the real file)
<!-- observed: 2026-10-15 | status: active -->
- **No invention** : Never invent. Always challenge a bad idea before
executing it, especially mine. A confident guess is worse than an honest
question.
A real excerpt from the agent's diary, lightly trimmed
# Monday 26 October 2026
## Memory promotion run, 03:00: nothing to promote
- promote --min-score 0.75: 0 candidates ("No short-term recall candidates")
- Short-term store healthy: 48 entries, 0 promoted, 22 spaced
- Conclusion: the maxAge counter applies to the promotion pool, not to the
recall store. No further monitoring needed on this point.
That is the agent's diary. Every night it reviews its own recent memory, decides what deserves to become long-term, and writes the verdict down so the next version of itself stops re-investigating a closed case. Proof of life at 03:00, in markdown.
The Monday job
It runs with the same paranoia. Last execution, straight from that diary: 148 task cards fetched across three boards, 12/12 layout guards passed, SENT 148, zero human keystrokes.
It is a small Node script against the Notion API. The code matters less than the four rules wrapped around it:
- Paginate everything, one write per page, never the inverse.
- Buffer the result to a file, not to memory only.
- Keep the token in the environment, never in the file, so the script can be committed without sweating.
- Lock the send twice: an explicit env flag authorizes the email, and a content diff cancels it when nothing changed. A Monday identical to the previous one has no right to exist twice.
Last week, for Week 3, I built a script that emails me a weekly digest of public dev.to posts, summarized by an open-weight model. It runs on GitHub Actions today, but OpenClaw could run it on its own schedule, at home.
The trap I fell into: the heartbeat
OpenClaw wakes the agent every 30 minutes by default to ask if anything needs attention.
Do the math:
48 wakes per day, mostly concluding "nope". First month: 8 to 10 euros burned on a pulse that had nothing to say.
It lives in the official docs: set The fix
heartbeat.every: "0m" to cut the recurring wake without killing event-driven runs. My scheduled jobs still ring on time.
Why Does Open Innovation Matter?
Because everything that makes the agent mine is a file, not a feature: rules, personality, memory. An open-source harness means I can read the entire contract between me and the model.
OpenClaw 🦞 — Your assistant, on your devices, in your chats
OpenClaw is an open-source AI assistant that runs on your own computer and meets you in the channels you already use: Discord, iMessage, Slack, Teams, Telegram, WhatsApp, and 20+ more, plus native apps for macOS, iOS, Android, Windows, and Linux. One Gateway runs it as a personal assistant on a laptop or as a shared team deployment; configuration is the only difference.
Yours, with no catch. State, memory, and credentials live on your hardware. Models and agent harnesses (Claude, Codex, local models) are plugins you can swap without changing anything else. Your prompts go to the model provider and chat platforms you configure, plus any diagnostics export you enable yourself; by default OpenClaw itself phones home for nothing but a daily version check, anonymous feature statistics are opt-in, and update.checkOnStart: false disables both (what OpenClaw sends)…
Measured this week, see the numbers below.
When a provider changes prices, renames itself or buries a feature nobody voted for, my drawers don't care.
I choose what leaves the house
An API model today, so the prompt boundary is my decision. A fully local model tomorrow, same files, same agent, nothing crosses the router.
For scale: each conversation turn carries 100 to 200k input tokens of files and history. That is the weight of a soul, and the main reason the heartbeat bill added up.
A closed assistant is an account you're borrowing. This one fits in a drawer, and I have the only key.
The Spirit of It
The theme asked for a ghost. Mine has one: a soul made of markdown files, haunting a different model every time I swap one, and remembering me anyway. Fitting for Halloween.
Think of a centaur: the head is mine, the legs are the agent's. The legs remember better, tidy better, and compute while I sleep. But legs that walk off on their own are not autonomy, they are an accident.
The ghost works because the human reads.
Prize Categories
- Best Use of Render: the agent's public front end runs on Render as a static site, deployed from the blueprint in the repo.
This project comes from a human. AI helped with its design.


Top comments (0)