DEV Community

Cover image for My AI was in the cloud. I brought it home.
Thomas Bonnet
Thomas Bonnet Subscriber Community Curator

Posted on AI-assisted

My AI was in the cloud. I brought it home.

Hacktoberfest Open-Source AI Challenge: Ghost in the Machine Submission 👻🌼

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:

Home hardware

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.

A soul made of files

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.

Work while I sleep

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.

A door to the outside

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)

Dark-themed demo page of agent-mailbox showing a fictional Monday task recap published by a self-hosted AI agent.

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:

image

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.
Enter fullscreen mode Exit fullscreen mode

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.
Enter fullscreen mode Exit fullscreen mode

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:

  1. Paginate everything, one write per page, never the inverse.
  2. Buffer the result to a file, not to memory only.
  3. Keep the token in the environment, never in the file, so the script can be committed without sweating.
  4. 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×30=1 440 runs/month 8 to 10 €1 440≈0.0056 to 0.0069 €/run \begin{aligned} 48 \times 30 &= 1\,440 \text{ runs/month} \ \frac{8 \text{ to } 10\ \text{€}}{1\,440} &\approx 0.0056 \text{ to } 0.0069\ \text{€/run} \end{aligned}

48 wakes per day, mostly concluding "nope". First month: 8 to 10 euros burned on a pulse that had nothing to say.

The fix

It lives in the official docs: set 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.

GitHub logo openclaw / openclaw

The AI that really does things. Any OS. Any Platform. The lobster way. 🦞

OpenClaw 🦞 — Your assistant, on your devices, in your chats

OpenClaw — EXFOLIATE! EXFOLIATE! Your AI assistant, running on your own devices.

CI status npm version Node.js version License: MIT Discord

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)…




It stays cheap on purpose

Measured this week, see the numbers below.

I choose the model

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.

RAM5808192≈7 % Disk3.3 GB Power≈3 €/month (estimate) Tokensthe real variable \begin{array}{ll} \text{RAM} & \frac{580}{8192} \approx 7\,\% \ \text{Disk} & 3.3\ \text{GB} \ \text{Power} & \approx 3\ \text{€/month (estimate)} \ \text{Tokens} & \text{the real variable} \end{array}

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)