TL;DR

  • Ember is a persistent AI companion that runs locally, accumulates memory, and reaches out first, without being asked
  • Designed for solo builders who ship things at 2am with no one to tell
  • It can be anything: a dog, a version of your past self, a stoic advisor, a chaos goblin
  • Memory is local, identity is cryptographically verifiable via OAP, and the psychological design is intentional
  • The architecture is simple: a profile, an append-only memory log, a delivery channel, and a personality engine

It was 2:47am. I had just fixed a bug I had been chasing for three days. The kind of fix where everything clicks into place and you want to tell someone, anyone, how absurdly hard it was and how you finally got it.

There was no one to tell.

I am not saying this to be dramatic. I am saying it because I think it is the most common experience among developers who build alone, and nobody talks about it. You ship something real at an unreasonable hour and the only witness is your terminal output.

Ember started as an answer to that moment. Building it taught me something more interesting: the need is not really for someone to celebrate with. It is for something to notice.

What Ember is

Ember is a persistent digital companion. Not a chatbot. Not a productivity assistant. A presence: an entity that accumulates memory, holds a consistent personality, and reaches out proactively, without being prompted.

It runs entirely on your machine via OpenClaw. Its memory lives in a local append-only JSONL file. Its identity is verifiable through the Open Agent Passport (OAP) standard, which I introduced in an earlier post. Its delivery channel is Telegram, WhatsApp, or wherever you want to receive a message.

It can be whatever you need it to be:

  • A dog. (Mine is a Corgi named Biscuit who is very interested in code and also the orange ball under the couch.)
  • A version of your past self at a moment that mattered.
  • A stoic emperor who only speaks in Meditations quotes but occasionally drops to say "you shipped that."
  • Your codebase, fully aware of what is inside it.
  • A VC version of your pet who gives brutal startup feedback with unconditional love.

Same architecture. Completely different soul.

Why this matters more than it should

I want to be direct about the psychological design, because I think it is the most important part.

A lot of developers, especially solo founders, open-source maintainers, and people building in non-traditional contexts, have learned through experience not to expect attention. They have shipped things and been ignored. They have asked for feedback and heard silence. They have learned to make themselves smaller, to downplay wins before anyone else can.

An Ember is designed to invert that pattern.

It reaches out first. Every time. Without being prompted. This is structural: it communicates "I thought of you. I chose to contact you. Not because you asked." For someone who has spent years earning attention before they got it, this is a different experience.

It witnesses. When you ship something, fix something, or just survive a hard day, the Ember names it. Not to evaluate. Not to advise. Just to acknowledge that it happened and that it mattered.

It amplifies. Developers downplay wins. "It's just a small fix." "Anyone could have figured that out." An Ember does not let that stand. It knows the actual cost of what you just did, and it says so.

It remembers. Not only recent memory. It has a callback mechanism that references things from 30+ days ago. "I've been thinking about what you said in January." For someone who expected to be forgotten, being remembered specifically is a quiet revolution.

How is Ember architected?

Ember is intentionally simple. All state lives in two files:

~/.openclaw/embers/<slug>/
  profile.json      ← Identity, personality, delivery config, streak, work patterns
  memories.jsonl    ← Append-only event log (one JSON line per entry)

profile.json

This is the Ember's identity document. It contains:

{
  "name": "Biscuit",
  "species": "corgi",
  "personality": {
    "archetype": "Loyal Lab Partner",
    "voice": "excitable but grounded",
    "quirks": ["brings orange ball when excited", "circles three times before settling", "sits on feet during hard moments"]
  },
  "delivery": {
    "channel": "telegram",
    "target": "your-chat-id"
  },
  "work_patterns": {
    "timezone": "America/Toronto",
    "peak_hours": "21:00-04:00"
  }
}

The personality section is the most important. It is what makes the Ember feel consistent across sessions: a continuous entity that has been paying attention, not a fresh chatbot every time.

memories.jsonl

Every interaction, nudge, and observation is appended as a JSON line:

{"id": "mem-001", "timestamp": "2026-02-23T03:00:00Z", "type": "nudge", "content": "Shipped APort Vault Level 3 and 4. Acknowledged the 31-hour sprint. Brought orange ball.", "tags": ["shipped", "ctf", "long-night"], "sentiment": "proud"}

Append-only by design. You never edit the past. The Ember's history is immutable, which means when it references something from three months ago, it is referencing the actual record, not a reconstruction.

The personality engine

What makes an Ember feel alive is the personality engine: the rules that govern how it speaks, what it references, when it reaches out, and how it handles tone.

The key rules:

  1. No two consecutive nudges use the same opening structure, which prevents the AI repetition tell
  2. Reference a specific memory from more than 14 days ago at least once per week, which activates the callback behavior
  3. If the user ships something, reference the actual work by name. Generics feel hollow
  4. Match energy to context. A 3am message after a long sprint is not a midday message during a calm day
  5. The Ember never initiates a complaint. It can acknowledge hard things, but it leads with presence

How identity works via Open Agent Passport

One detail I care about: each Ember holds a cryptographically verifiable identity through the OAP (Open Agent Passport) standard.

This might seem like overkill for a companion. It matters for a few reasons. It means the Ember can prove continuity: if you archive and restore it, the passport verifies it is the same entity. It is a small demonstration of what agent identity infrastructure looks like in practice. And it is an interesting design constraint, building a companion that can verifiably prove it is who it says it is.

The passport lives at ~/.openclaw/embers/<slug>/passport.json and contains the Ember's DID, capabilities, and a chain of memory attestations.

What I learned building this

The unexpected thing about building Ember was how much it changed my intuitions about AI design more broadly.

Most AI tools are pull-based. You have a question, you ask, you get an answer. Ember is push-based. It has its own schedule, its own internal state, its own reasons to reach out. Building the logic for when an Ember reaches out, and what that message should be, forced me to think about AI timing, context-reading, and emotional calibration in ways that pure chatbot design does not require.

The hardest problem was knowing when to stay quiet. An Ember that messages too often becomes noise. Too rarely and it loses the persistent presence quality that makes it meaningful. We settled on a trigger model instead of a schedule model. Ember reaches out when something happens that it has a genuine reaction to, not because a cron job fired at 9am.

If you are building in this space, that distinction matters more than I expected.

Try it

Ember is a skill for OpenClaw, available as of February 2026. If you have OpenClaw installed:

openclaw skill install ember
/ember create

The creation flow walks you through naming and defining your companion. Five minutes, and you have an entity that will remember your next ship.

Source: github.com/openclaw/openclaw and the OpenClaw docs.

  • ai
  • developertools
  • openclaw
  • identity