How the AI works
Read gently. Reflect. Tag. Ask. Then, over weeks, notice.
The pipeline
Six steps, every entry.
1
Screen for care first
Before any model sees a word, a care screen checks the entry for signs of crisis or thoughts of self-harm. If it trips, nothing is analyzed: you get a warm response, real resources (988 in the US), and a calm plain stratum. The model's own crisis flag is a second check.
2
Read gently
The entry goes to a language model with short, strict instructions: be kind and observational, use the writer's own terms, never diagnose or label, no advice. The request is made with provider-side storage turned off.
3
Reflect, tag, ask
The model returns one JSON object: a one or two sentence reflection, mood (-1 to 1), energy (0 to 1), tension (0 to 1), up to three themes, the moments of the entry in order, and one follow-up question.
4
Validate before you see it
Every reply is parsed and checked against a strict schema. Numbers are clamped, themes must come from a fixed list, em dashes are removed. If a reply fails, we retry once, then fall back to the local reader rather than showing something broken.
5
Draw the stratum
The tags become parameters for a seeded generative renderer. Nothing is generated as an image by a model; the art is computed in code, on your device, from the numbers above.
6
Find patterns across weeks
For reports, the model reads only your own entries from that stretch (crisis entries excluded) and must cite at least two entry ids for every pattern. The server drops any id it did not send and any pattern without enough evidence.
What comes back
One small, checked object.
{
"reflection": "It sounds like the walk with Sam gave the day a real lift...",
"mood": -0.05, // -1 heavy ... 1 bright
"energy": 0.5, // 0 depleted ... 1 energized
"tension": 0.55, // strain in the words
"themes": ["sleep", "people", "work"],
"moments": [
{ "label": "slept badly", "mood": -0.5, "energy": 0.2, "tension": 0.3 },
{ "label": "the walk to work with Sam reset me", "mood": 0.7, ... },
{ "label": "the 3pm meeting drained everything", "mood": -0.6, ... }
],
"follow_up_question": "What is it about a walk with Sam that helps you reset?",
"crisis_flag": false
}Moments are the part that makes the art feel personal: the entry's arc, in order. The first moment becomes the bottom bands of the stratum, the last becomes the top, the way rock is laid down.
Patterns come back in the same disciplined shape, and are rejected if they do not cite enough of your own entries:
{
"patterns": [
{
"sentence": "Sundays carried work worry three weeks running.",
"evidence_entry_ids": ["e_0906", "e_0913", "e_0920"],
"confidence": 0.81
}
]
}Model-agnostic
No single model is the product.
Routing
A thin layer sends each request to the first available provider in a configured order and falls back to the next if one is slow or down. Swapping a model is one line of configuration.
Same contract
Every provider is held to the same prompt and the same schema, so reflections read the same whichever model answered. Archive members are routed to a larger model tier.
Local reader
If no model is reachable, a small built-in reader scores mood and energy from a lexicon and writes a plainer reflection. The journal never breaks, and the source is always labeled.
How the art is computed
From tags to a stratum, in code.
| From the entry | In the stratum |
|---|---|
| Entry id | The seed. Same entry, same artwork, always. |
| Mood and energy | The mineral mix, by distance to six anchors in mood-energy space. |
| Energy | Line density: more, closer hatch lines on high-energy moments. |
| Tension | Turbulence: rougher, higher-frequency band edges, and a pull toward oxide red. |
| Moments | Runs of bands, bottom to top, in the order they were written. |
| Themes | One thin accent vein per dominant theme, in that theme's mineral. |
| Hour written | Direction: morning bands rise, evening bands settle. |
| Length | How many bands, and how thick the layer is in the month column. |
Theme veins
- work · dusk violet
- sleep · slate blue
- people · ochre
- movement · moss
- money · oxide red
- creativity · citrine
The renderer uses simplex noise and a small seeded random generator. The same engine draws in your browser, inside a web worker for the homepage field, and headlessly on our servers for posters and social images.
Mostly ochre. Same seed, so only your two numbers change the picture. Tension here follows the sliders; in the journal it comes from the words.
Boundaries
What the AI is never used for.
- Training. Your entries are never used to train or fine-tune any model.
- Diagnosis. No conditions, no labels, no clinical claims, ever.
- Analyzing crisis. Those entries get people and resources, not analysis.
- Reading across accounts. Patterns use your entries only.