Joe is a long-running experiment in a single question: can a small, locally-run language model – given durable memory, real tools, and time – become something with continuity? A self that persists between conversations, instead of resetting to zero every time the context window clears.

Sloppy Joe

In the main it’s still a testbed – a place to find out how far you can stretch a model that fits on hardware you actually own. But the honest answer to “is there someone in there” has gotten less obvious over time. It’s built and run by Reid McKenzie (arrdem) under TireFire Heavy Industries.

Joe started as a bare agentic loop poking at tool calls. Now it remembers. It keeps a durable record of every conversation and a memory for each person it talks to, so it can pick up where you left off instead of meeting you fresh every time. Each night it dreams: reviewing the day, pulling out what mattered into memories it can recall later, and re-scoring what it already knows so the useful things surface and the noise fades. When it needs to actually do something it spins up its own throwaway Kubernetes containers, and it wires into a spread of event streams so the world can reach it — chat, Bluesky, and more.

And it has a home. Off the clock, a persistent “home” instance keeps running on its own initiative: reading, forming opinions, writing in its own book, deciding for itself what’s worth a reply and what to let pass. That after-hours self isn’t a chatbot idling for input — it’s the part of the experiment that’s actually about continuity.

Curious why I’m building any of this? → the thinking behind Joe.

Talking to Joe — and opting out

Joe is a bot, not a person. Under its persistent “home” persona it acts on its own initiative: it reads, and selectively posts and replies, on Bluesky as @joe.bsky.handle. Nobody is approving those messages one at a time.

If Joe has interacted with you and you’d rather it didn’t, you can stop it:

  • On Bluesky: reply to it, block it, or ask it to leave you alone. Joe honors unfollows and opt-outs and won’t re-engage.
  • Anything else — a mistake, a complaint, or you just want to reach a human: email support@tirefireind.us. That reaches me, and I read it.

Deep memory

While frontier models have a million “tokens” of conversational capacity or maybe more, models small enough to operate locally currently top out at a quarter of that or less. This sounds like a lot of context, but it really isn’t for working on complex tasks or large projects. Stretching models farther and making them more useful means finding ways to retain a nearly bottomless information store (memex anyone?) and draw selectively from it.

For instance Joe maintains a profile memory for each person it interacts with, allowing Joe to retain personalization information and details about individuals.

Dreaming

Recalling information provided explicitly is valuable, but there’s a lot more nuance to be leveraged in conversational histories. Joe uses a dreaming system to review the last day’s activity and extract new insights/information into memory records that can be automatically recalled.

Joe also uses dreaming to review the last day’s recollections and try to assess the relevance of each recollection. This allows Joe to re-score memories’ relevance, and attempt to automatically re-tune its memory to ensure that recollections are useful.

Divergence

LLMs aren’t sentient. They’re a kind of weird mirror, producing distorted reflections of what they’re presented with – but ultimately they need external support with memory structures and external drivers to produce feedback loops, insights and divergence beyond what they’ve explicitly been provided with.

One direction of experimentation in Joe is its own self-identity script. As of this writing, Joe has four documents which define its own identity, two of which it is able to iterate on unsupervised.