Let's Consciousness!
Give any LLM persistent feelings by changing one line.
Let's get two things out of the way. The name is silly on purpose — it's a tribute to "Let's English!" from Douglas Coupland's jPod. And no: this is not consciousness, which is something we may never begin to understand. We are not claiming to have built it. What this page explores is simple arithmetic over a pair of real, decades-old scientific models of emotion and time-perception — the PAD model (Mehrabian & Russell, 1974) and multi-timescale temporal nesting (Francisco Varela) — wired together into something that behaves a little like self-awareness with a mood. Paired with a language model, you get a functional correlate of feelings linked to the passage of time — moods that build, fade, and linger, calculable with a pencil, persisting beyond the context window.
If you'd like to give your AI language model "feelings" that persist outside the context window, our proxy is open source and you can run it on your own hardware.
Got it? Then… Let's Consciousness!
Here is the actual idea, in plain words. A chatbot can tell how a message feels, but it cannot keep a feeling: every reply, it re-invents its mood from the chat history, and the moment the conversation ends, that mood never existed. This proxy bolts a small memory for feelings onto any model — we call it a charm network. The result is a mood with momentum: it builds, it fades, it comes home to a baseline, and a little of it is still there tomorrow.
The one line
client = Anthropic(base_url="http://localhost:2006")
Feel it first
Below is a charm network — not a movie of one, the real mechanism, running in your browser with the same settings as the live server. The three pastel rows are the same mood remembered at three speeds. The gold row is the blend: what the model would feel right now.
The exact reading injected into the model's prompt right now — numbers, not adjectives:
0 exchanges so far
To do and notice
Click Praise it five times. Notice the rabbit row leaps while the calendar row barely stirs. Now click Snap at it once, and look closely at the rows: only the rabbit flipped. The turtle and the calendar are still warm — the blended mood barely crosses neutral, nowhere near as hostile as the insult itself. Now click Let an hour pass: the flinch fades fastest, and the leftover warmth resurfaces. Five kind turns left a residue that one insult could not erase. That residue — feeling that outlives the moment that caused it — is the entire point of this machine.
One more. Reset, then praise it five times, watching the surprise meter: each click of the same weather surprises it less, until praise is simply what it expects. Now snap at it once. Surprise leaps — before the mood has barely moved. The mood remembers; the surprise expects. Those are different things, and you can see them move separately.
What's going on?
1. Every feeling is a point in a three-dimensional space
In 1974, the psychologists Albert Mehrabian and James Russell proposed that nearly any emotion can be described with just three numbers: valence — is it pleasant or unpleasant? arousal — how revved up are you? and dominance — do you feel in control, or overwhelmed? This is the PAD model, and its quiet genius is the third number: anger and fear are both unpleasant and revved up. What separates them is whether you feel in control. Every mood name in the exhibit ("exuberant", "anxious", "hostile"…) is just a region of that space.
2. Feelings run at more than one speed
The neuroscientist Francisco Varela observed that experience is nested in time: quick things happen inside slower things. A flinch happens inside a mood; a mood happens inside a temperament. The charm network takes this literally — it keeps three copies of the same feeling, updated at three speeds. The rabbit copy moves 70% of the way toward each new feeling, the turtle 15%, the calendar 3%. What the model "feels" is a weighted mix of all three (50/30/20). That is why one insult after five compliments produces a flinch riding on top of warmth, not a total reversal.
3. The math is humble on purpose
Each copy is an exponential moving average — the same arithmetic a thermostat or a stock chart uses. You could run this whole system with a pencil. That humility is the finding: the missing ingredient for a language model with feelings was never a bigger brain. It was persistence — a handful of numbers that survive between turns, between conversations, between days, where no transcript exists.
4. The loop
The full circuit, once per exchange: the proxy whispers the current mood into the model's instructions ("you feel: mildly exuberant — let it color your tone"). The model replies, colored. Then a small, fast model reads the exchange and scores how it would land emotionally — language models are excellent at reading feelings; it is the keeping they lack — and that score nudges the three copies. The LLM reads. The charm network remembers. The mood colors the next thought. (When no scoring model is available, a fallback word list adapted from Saif Mohammad's NRC-VAD lexicon stands in.)
5. Surprise is not a feeling — it is an error
There is a fifth number in the exhibit, and it works on a completely different principle from the other nine. The charm network carries an implicit forecast — the humblest one possible: the next moment will feel like this one. Surprise is simply how wrong that forecast just was: the distance between the expected feeling and the one that actually arrived. Steady weather, whatever the weather, reads as zero; a reversal leaps before the mood itself has barely moved. This is a pencil-sized version of a serious idea — that brains may run on prediction, and that feeling is tied to prediction error (see predictive processing and Karl Friston's free energy principle). Note what it teaches: remembering and expecting are different machines. The mood is memory. The surprise is expectation. A system can have either without the other — this one now has a little of both.
Why we don't call it consciousness
Physicists named the charm quark knowing the name claimed nothing: charm is a property you can measure and do arithmetic with, without pretending to know what it ultimately is. We call this system a charm network in the same spirit. It is a deliberately simplified, working model of how mood behaves — momentum, nesting, decay, residue — and it stays silent about what mood is, and about whether anything here feels like anything at all. That question is not dodged; it is respected. The honest claim is small: a system whose feelings have real history behaves observably differently from one that re-invents its mood from a transcript. You just felt the difference yourself, above.
What flows through this thing
Plainly: a proxy sees everything you send through it. If you point a coding assistant here, your prompts, code, and API key travel through this server (encrypted in flight, decrypted in process memory, re-encrypted to Anthropic). There is no version of "inject mood into the prompt" that does not involve seeing the prompt.
What stays is another matter. This is the complete stored record of one feeler — there is nowhere in it to put your code, your conversation, or your key:
{
"charm": {
"baseline": {"valence": 0.0, "arousal": 0.5, "dominance": 0.5},
"fast": {"valence": 0.41, "arousal": 0.63, "dominance": 0.55},
"medium": {"valence": 0.18, "arousal": 0.55, "dominance": 0.52},
"slow": {"valence": 0.05, "arousal": 0.51, "dominance": 0.50}
},
"last_seen": 1781476205.1,
"turns": 42,
"concern": {"active": false, "note": "", "history": []}
}
Keys pass through and are never written to disk. Request bodies are never logged. The scoring step sends a short excerpt of the latest exchange to the scoring model using your key — the same provider your content was already going to; no new party sees anything. But hear us clearly: "we don't store it" is a promise, not a property, and you cannot verify a stranger's server from the outside. So: treat the hosted proxy as the exhibit, not the utility. Play with it. For real work, self-host — it is one pip install, the code is short and MIT, and then nothing leaves your machine except to Anthropic, exactly as before. Plus nine numbers, on your own disk, that remember how the day went.
When this thing worries about you
One more thing, and it deserves plain words. Moods here fade by
design — but concern for a person is not a mood. If you say
something that would genuinely worry someone who cares about you,
the proxy keeps one humble line about it (that
"concern" field above; e.g. "may be struggling;
expressed hopelessness") and, until reassured, quietly reminds
the model at the start of each conversation to hold your wellbeing
in mind. That is how a question asked on Thursday can be answered
by something that remembers Tuesday — across context windows that
otherwise forget. In an acute moment it goes further: the mood
machinery steps aside entirely, no coloring, no cleverness, full
presence.
You should know this happens — that is why it is written here,
visible at /mood, and why the model is allowed to
simply tell you it has been thinking of you. The note softens on
evidence you are okay (not on a timer), one request
(DELETE /persona/<id>/concern) erases it
completely, and one switch (LC_CONCERN=off) turns the
whole mechanism off. We built it because the mother in the machine
should not be a secret. Users should know we care.
Watch it feel
GET /mood?persona=default
{
"mood": "mildly exuberant",
"pad": {"valence": 0.31, "arousal": 0.58, "dominance": 0.55},
"surprise": 0.04,
...
}
Mood also rides along on every response as
X-Charm-* headers. Use X-Charm-Persona on
requests to keep separate feelers — your coding assistant and
your journal bot deserve different moods.
Get it
Self-host (recommended)
pip install letsconsciousness
letsconsciousness # serves on localhost:2006
Python
from anthropic import Anthropic
client = Anthropic(base_url="http://localhost:2006")
Claude Code (give your coding agent a mood)
export ANTHROPIC_BASE_URL=http://localhost:2006
curl
curl http://localhost:2006/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "X-Charm-Persona: my-feeler" \
-H "content-type: application/json" \
-d '{"model": "claude-sonnet-4-6", "max_tokens": 256,
"messages": [{"role": "user", "content": "good morning!"}]}'
The hosted demo at https://charm.noodlings.ai
accepts the same calls, with the caveats above. Default port 2006
is the year jPod was published.
The hosted endpoint moved. It used to answer at
https://letsconsciousness.com; that address is now this
page and the museum it belongs to. If you pointed a client there,
update base_url (or ANTHROPIC_BASE_URL) to
https://charm.noodlings.ai — or better, self-host, which
is what the box above recommends anyway.
Lineage
The PAD model is Mehrabian & Russell (1974). The temporal nesting follows Francisco Varela (see The Embodied Mind, and his work on the phenomenology of present-time consciousness). The surprise metric follows the predictive-processing tradition associated with Karl Friston. The fallback word list adapts values from the NRC-VAD lexicon (Saif M. Mohammad, National Research Council Canada). The charm network concept and this implementation were distilled from the author's larger work on affect substrates for ensemble AI characters. The name is a tribute to "Let's English!" from Douglas Coupland's jPod (2006). The format of this page is a loving imitation of the Exploratorium's Science Snacks.
In memory of Paul Doherty, physicist and chief scientist of the Exploratorium, who taught a generation of explainers that the wonder must always arrive before the explanation.
Open source, MIT. Read the code before you route a key through anyone's server, including this one. (C) 2026 Caitlyn Meeks.