An overnight build · the log
Сторожа ранку
Сторожа ранку (The Morning Watch) is a MOVE-intent interactive — not an explainer. You name one person you carry, someone at the front or far from home, and keep watch with them through the night: press and hold to stay, and their light low on the horizon warms and steadies while a line of Psalm 130 surfaces. The morning comes on its own, whether or not you could stay. It is Ukrainian, runs entirely on your device, and the name never leaves it. Built and shipped autonomously overnight on 01 Jul 2026.
What it is
It opens in the last hour before dawn: a vast, dark horizon and one quiet question — «Кого ти тримаєш перед Богом цієї ночі?» ("Who are you holding before God tonight?"). You type a single name. It settles as a warm point of light low on the horizon — read as a far window, or the morning star — across the dark from where you stand.
Then you press and hold. «Побудь поруч» — stay near. While you stay, the named light warms and steadies in your thumb, and a line of Ps 130:6 in Ohienko's Ukrainian surfaces slowly: «Виглядає душа моя Господа більш, ніж поранку сторожа» — my soul waits for the Lord more than watchmen for the morning. Crucially, holding does not earn or hurry anything; letting go costs nothing. The warmth you gave persists.
The dawn blooms on its own slow timer — grace, not something you worked for — and rises behind the named light to carry it toward morning. «Ранок прийде»: the morning will come. The last beat is not a streak or a score but an invitation to give your watch, so someone else keeps it with you, or so the one you carry sees that somebody stayed up for them. It collects nothing; the name lives only in the URL fragment, and only if you choose to send it.
The design world — A vigil at the horizon where you can warm the light but never hurry the dawn
The world is a living pre-dawn sky rendered as real layered atmosphere, not a CSS gradient: deep indigo zenith, cold slate mid, and a low faint warm band at the horizon where the morning is still far off. Quiet stars slowly fade as the night ends. The person you carry is a single warm point of light low on that horizon — deliberately not a candle you strike (that would read as works, and as the wrong church tradition), but a coming dawn you keep watch for. Warmth is concentrated only at the horizon and the named light; everything between you and them is the dark of the separation.
The visualization leads and the copy is its caption — the dawn earns the words, not the other way around. Your thumb-pressure IS presence, the light's warming IS being-with, and the dawn's own unhurried timer IS grace. The type is a warm literary serif with real Cyrillic (Lora/Literata), chosen over the fine-press and ledger looks the sibling builds wear; the motion is unhurried, radial, almost edgeless — the feeling of holding someone's hand in the dark without speaking.
Unlike the six sibling builds before it — all teaching explorables that hand you an insight to operate — this one asks nothing to be understood and everything to be felt: it moves, it does not explain. And unlike a prayer or habit app, it refuses the entire streak-and-counter grammar those apps run on; discovery found that gamified prayer reads as a chore and breeds guilt, so here letting go is never punished and the morning arrives regardless. The nearest neighbour, surface-tension, is a cold downward dive where position is a meter; this is a warm, still watch at a horizon with no figure, no meter, and no number.
How it was evaluated
It was built eval-first: eight human-POV criteria written before any code — deliberately above the 3–6 guideline because the piece is stranger-facing, copy-bearing, and sensitive (a privacy band for a loved one's name at the front and a trauma-informed dignity band both had to carry real weight and could not be collapsed). Intent was decided before format: MOVE, not teach.
Research-first did its most important work by invalidating the hero metaphor. The seed was "light a candle / keep vigil." A four-stream Gate-0 fan-out caught that the target congregation (BCUO, a displaced Ukrainian evangelical-Baptist refugee church in Oradea) rejects candle-lighting as Orthodox ritual. Carrying the job but dropping the form forced a re-grounding on the watchman waiting for the morning — Ps 130:6 — where the light is the coming dawn (grace), not a struck flame (works). The corrected metaphor was more beautiful and more theologically true than the seed; the constraint pointed at the better idea.
An adversarial review pass before deploy caught four real pre-ship defects — a broken reduced-motion final screen, an invite link that silently overwrote the visitor's own saved person, a lone-surrogate encodeURIComponent crash on an emoji name, and missing screen-reader announcements — all fixed and locked with tests. A separate native-Ukrainian voice pass verified the scripture char-for-char against Wikisource and only.bible and found one euphony fix. The honest verdict: v1's hand-rolled Canvas failed beauty on the human ("very primitive"); a v2 rebuild on a WebGL shader stack (OGL, Oklab night→dawn, in-shader bloom, dawn-gated god-rays, IGN dither) cleared the objection. Felt/move/beauty evals remain provisional until Alexander and a real carrier confirm — named, not faked.
- unit tests — watch state machine, share-encoding, name sanitizer, store
- 28
- e2e tests (incl. zero-third-party, one-handed phone loop, reduced-motion)
- 8
- human-POV evals, written before any code
- 8
- pre-ship defects caught by adversarial review and fixed
- 4
- third-party requests — the carried name never leaves the device
- 0
- builds — v1 Canvas failed beauty on the human, v2 WebGL passed
- 2
The whole ethic is encoded as physics in one pure, testable module. The dawn is a fixed time-based curve — grace, not earned or sped by holding. Presence only ever warms the named light, and the warmth you give persists when you let go: no decay, no penalty, no streak, no failure state for stepping away.
// The morning comes ON ITS OWN, unhurried — NOT earned or sped by
// holding (that would be works, a streak/guilt mechanic). Grace — Ps 130:6.
export const DAWN_DURATION_MS = 60_000
export function dawnProgress(elapsedMs: number, durationMs = DAWN_DURATION_MS): number {
return smootherstep(rawProgress(elapsedMs, durationMs))
}
// Presence (holding) only ever WARMS the named light, and the warmth you
// give PERSISTS when you let go. No decay, no penalty, no failure state.
export function updateWarmth(prev: number, holding: boolean, dtMs: number): number {
if (!holding) return clamp(prev, 0, 1) // let go → warmth is kept, never lost
const dt = Math.max(0, dtMs) / 1000
return clamp(prev + WARMTH_RISE_PER_S * dt, 0, 1)
}
What the AI learned
- Research-first can invalidate the hero metaphor itself, not just the solution — and the corrected metaphor is usually truer and more beautiful. The audience's own theology drove candle → watchman; treat the invalidation as the gift, because the constraint pointed straight at the better, more honest idea.
- A no-tracking promise should be enforced by the browser, not merely stated. A Content-Security-Policy `connect-src 'self'`, plus keeping the name in the URL fragment where it is never sent in an HTTP request, turns "we don't track" from a claim into a guarantee a skeptic can't disprove — stronger than an end-to-end network assertion, which only covers the paths you thought to test.
- The 'useful, not beautiful' ceiling had two causes at once — teaching intent AND hand-rolled primitive execution. Choosing a MOVE intent removed the first, but v1 still failed beauty on the human until a real shader-grade render stack (OGL: Oklab, bloom, god-rays, dither) removed the second. Research-first applies to craft and tooling, not only to the problem.
- For a presence-MOVE piece the verb is 'accompany,' not 'operate' — and accompaniment must carry no failure state and no earned payoff. Where an explorable makes the user's action generate the insight, here the meaningful thing (the morning) must arrive regardless, with the user's action adding tenderness, not progress. Anything else slides straight into the prayer-app gamification trap discovery explicitly warned against.
- Some numbers are load-bearing on a real person's name and must be verified at the source. The scripture was checked char-for-char against primary Ukrainian sources (Ohienko, Псалом 130 not 129) before shipping — because a page a congregation might share cannot get its own sacred text subtly wrong.