Most AI products are built to talk. Sala is a digital spirit house that mostly doesn't, and the entire design problem was figuring out exactly how little it should say, and on what terms.
DISCOVERY
The problem
The hard part wasn't the build, a single API call and some local storage is a weekend of engineering.
The hard part was restraint: LLMs default to helping, elaborating, and reassuring. Left alone, the model wanted to say "you seem to be thinking about your mother a lot": sympathetic, plausible, and exactly the wrong thing.
An AI that interprets your life back to you isn't a mirror, it's a horoscope with better manners.
The idea
Each day, you leave a small fragment: a word, a line, a photo. Four days a month, on วันพระ (the Thai lunar observance days), the system checks whether anything you've left has genuinely repeated. If something has, it names it once, in four words or fewer. If nothing has, it says nothing. There's no chat interface, no way to prompt it, no way to ask it to speak sooner. You can't summon it.
DESIGN
The decision that resolved it
Rather than fighting the model's drift with a longer list of "don'ts," I looked for an existing system that already solves the problem of an entity that notices without commenting, and found it in the object the piece is already named after. A spirit house doesn't negotiate. You leave something, it doesn't reply, and its rare acknowledgments (incense catching, birds at the offering) happen on a schedule you don't control. That's not a metaphor laid over the interaction design; it is the interaction design. Once I stopped inventing restraint rules and started borrowing them from how a spirit house already behaves, three separate open problems resolved at once:
Timing:
Instead of tuning an arbitrary "speak after N entries" threshold, reflection is gated to the four real Wan Phra dates a month. The mirror is structurally incapable of speaking outside them; not a UX choice, but a calendar constraint.
Voice:
Instead of prompting the model not to give advice, I gave it a narrower job entirely: name a verified repetition in the format[word] – [count], nothing else. Borrowed from Thai noting-practice meditation: naming what's present, without elaborating. Less room for the model to drift into therapist-voice because there's no sentence-shaped slot for advice to fill.
Trust:
The fabrication risk (the model inventing a pattern to seem insightful) is closed at the architecture level: repetition is counted client-side before any API call happens, so the model is formatting a fact I've already verified, never discovering one on its own. Reflections are also never stored. Merit, in the tradition this borrows from, accrues silently and untraceably; keeping a permanent log of what the mirror said would contradict the logic the whole piece runs on.
IMPACT
What this demonstrates
The rarest skill in AI product design right now isn't getting a model to do more — it's knowing where it should do less, and being able to defend that boundary with something sturdier than taste. Sala's restraint isn't a style choice I made and then rationalized; it's inherited from a real cultural system, which means every "no" in the product has a source outside my own preference. That's a harder position to argue from, and a much stronger one.