How the AI works

Read gently. Reflect. Tag. Ask. Then, over weeks, notice.

Daystrata is AI-native: reading free-form personal writing kindly, and finding patterns across weeks of it, is not possible without modern language models. Here is exactly how we use them, and where we do not.

The pipeline

Six steps, every entry.

  1. 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. 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. 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. 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. 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. 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.

How entry tags map to visual parameters
From the entryIn the stratum
Entry idThe seed. Same entry, same artwork, always.
Mood and energyThe mineral mix, by distance to six anchors in mood-energy space.
EnergyLine density: more, closer hatch lines on high-energy moments.
TensionTurbulence: rougher, higher-frequency band edges, and a pull toward oxide red.
MomentsRuns of bands, bottom to top, in the order they were written.
ThemesOne thin accent vein per dominant theme, in that theme's mineral.
Hour writtenDirection: morning bands rise, evening bands settle.
LengthHow 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.