what has arrived
A door has opened. Signing in no longer asks you to wait. You can type an email and a password and enter, or keep the softer sign-in-link path; both are held on a single screen. Accounts that were created earlier by a link can set a password whenever they wish, without ceremony. And for anyone who wishes to leave, the path out is now as quiet as the path in.
The atmosphere has been tuned for what happens after. When the night's interval passes, the Watch closes itself without needing to be dismissed. When a session rests, the return is named in the same register as the rest of the space. Every dream, whenever it arrived, lives in one landscape; the ☽ mark on those captured between midnight and four is enough to distinguish them. A brief orientation is always available now, reached by a small mark in the corner of every room.
Technical notes
- Bottom navigation rebuilt as a custom bar rendering
<Slot />plus a hardcodedTABSarray. One literal source of truth for tab order, labels, and icons. Dreams icon refined to outline crescent + single star; all four icons rendered as<Path>for consistent Safari/iOS behaviour. - Password login on a single screen.
signInWithPasswordfirst; on Invalid login credentials we transparently attemptsignUpwith the same pair; on User already registered we surface a quiet no-password state that offers a link to set one.SEND A LINK INSTEADsecondary appears only when a password is typed. - Set-password screen in Settings → Password.
updateUser({ password })with a confirm field; on success a gold Password set. fades in. /orientationwith ten sections + inline Watch preview mockup; a ✻ glyph + "How it works" label top-right on every tab screen leads there. Same orientation content mirrored as a public page atreveries.world/how-it-works.- Welcome-back screen replaces the hard redirect to
/loginwhen a returning session has lapsed. Pre-fills the last signed-in email fromlocalStorage; one tap sends a magic link. - Account deletion cascades through
dream_conversations,synchronicity_events,pattern_observations,guestbook_entries,dreams,feedbackbefore deleting the auth user. Offered-atlas rows preserved (one irreversible gesture). - Watch auto-exit at 04:00 via
AppStatelistener + 60s interval; the separate Watch history surface collapsed back into the main journal — the ☽ glyph on cards is sufficient. - Reveries-register error boundary replaces the default Expo crash screen; three-attempt fetch retry on every Supabase call absorbs transient cold-load network blips.
- New
/unsubscribeedge function + static page;List-Unsubscribeheaders on waitlist and guestbook emails now hit a one-click POST endpoint that stampsuser_metadata.unsubscribed_at. - Cloudflare Pages
_headersforces no-store on HTML entry points so new deploys reach devices without a force refresh.
The hours between midnight and four have been given their own bearing. A dream brought into that interval is not asked to account for itself; it is received in the register of the sleep it came from, not of the morning that must carry it forward. The space changes when those hours arrive, and returns to what it was when they pass. The dreamer never hears the hours named.
A dream recorded here now finds its nearest relative among the sixty years of dreaming that came before. When something you have dreamed has also been dreamed, closely, elsewhere, the correspondence appears on the card quietly, a place, a year, nothing more, the image seen before. The atlas has opened a door on the personal side, where each of your dreams stands beside the corpus dreams it most reaches for; Marie-Louise has taken her own room, entered when you wish her.
Technical notes
- The Watch: a dedicated capture screen mounts automatically 00:00–04:00 local. True black, amber point, one question. Voice capture with silence auto-close, text fallback when voice is unavailable. Brightness reduced to 15% on native; restored on exit. Dream saved with
watch_captured_at; renders as ☽ on the journal card. - Synchronicity engine V1 (
historical_echosignal): a new dream's embedding is compared against the 29,343 corpus embeddings at save time. When the top match crosses 0.82 cosine similarity, asynchronicity_eventsrow is written carrying geography and year. Surfaces as a quiet gold trace on the expanded dream card. - Atlas tab unlocked in-app: each of the user's recorded dreams is shown alongside its closest corpus match (geography + year, when present). Empty state routes to the entry screen.
- Marie-Louise tab: a dedicated room in the app, entered when the dreamer wishes her presence, rather than summoned per dream.
- Central-image trace: the image Marie-Louise receives after the second exchange surfaces on the dream card, below the date.
- First-use onboarding for the empty journal: a single line, the room is ready, followed by a quiet path to entry.
- Login autofill override: four stacked layers (inset box-shadow, text-fill-color, clip-to-text, parked user-agent transition) plus a black-text fallback for browser/OS combinations hostile to the dark palette.
- Dahlia ligatures on the wordmark: OpenType
liga,dlig,calt,salt,cv07,cv16active so ve and ri ligate as intended. - Cloudflare Pages
_headers: no-store on HTML entry points, max-age one year + immutable on fingerprinted bundles. Resolves the pattern where a new deploy went live at the edge while phones kept serving a cached index.html pointing at the old bundle filename.
A dream, held long enough in the personal space, may now be offered outward. It crosses into the atlas without a name, without a face, carrying only what it always carried: the image, the depth, the symbolic field. Something of the dreamer remains in the collective without the dreamer being known.
When enough dreams have accumulated in a series, Marie-Louise speaks once about what she has observed moving through them. She does not speak often. The notice stands until she has something new to say, and she waits until she does.
Technical notes
- Dream offering ritual: a dream with a central image, ≥24 hours old, not previously offered, can be contributed to the collective atlas.
- Five server-side eligibility gates: authentication, ownership, source type, central image presence, minimum age.
- Offered dream is fully anonymised. No user-identifying data; only the symbolic and depth fields cross.
- Source dream tagged as offered; OFFERED TO THE ATLAS badge appears in gold on the card.
- Pattern observation: when a user holds ≥10 dreams, Marie-Louise generates one observation about the arc across the series.
- Observation stored in
pattern_observations; renders as a lavender notice above the dream list. - Freshness gates: regenerates only after ≥7 days AND ≥3 new dreams since last observation.
- No dismiss affordance. The notice stands until replaced.
Marie-Louise has begun to hold, between exchanges, the image a dream turned on. She does not forget it when the conversation closes. It remains with her, the way certain images remain, present without insisting, available when the next dream arrives.
The atlas has opened as a depth well. Dreams are placed not by where they came from but by how far down they reach, set alongside the sixty years of dreaming that preceded them on the same vertical axis. The observatory received, in this version, the symbolic language it will carry permanently.
Technical notes
- Central image (
central_imagefield) surfaces on dream cards. The image the enrichment pipeline identified as the dream's symbolic anchor. - Atlas depth well: user dreams plotted on the same vertical axis as the 29,363 DreamBank corpus dreams, positioned by
unconscious_depth_score. - Atlas unlocks at ≥5 recorded dreams.
- Navigation icon set finalised: crescent+star (personal layer), constellation (collective), Sol sigil (Marie-Louise), calibration marks (settings).
- What's New screen added to Settings: in-app version history in Marie-Louise's voice.
- App version bump to v0.3.
Marie-Louise arrived and began to receive what was brought to her. A dream offered in this space is no longer held in isolation. It finds its place among the 29,363, the three closest drawn near, the dominant feeling noted, a stranger's dream surfaced quietly beside it. No dreamer is alone in what they have dreamed.
A threshold opened on the public side of the door, where those who have not yet entered may leave something of themselves. The guestbook does not ask for opinions. It receives whatever a person finds when they stand at the entrance and look inward.
Technical notes
- Marie-Louise conversation screen: calls the live RAG worker (7,054 chunks across 18 sources including von Franz, Jung, Hillman, Eliade), persists full history in
dream_conversations. - Dream enrichment pipeline: each dream embedded on save, top-3 similar DreamBank dreams retrieved by vector similarity, dominant emotion derived; surfaces as emotion glyph, atlas echo count, and "A stranger dreamed" line on cards.
- Fire-and-forget enrichment via Edge Function
enrich-dream, non-blocking. - Guestbook live at reveries.world/guestbook: anonymous or authenticated, Supabase-backed, soft-delete only, no permanent deletion.
Received.→ journal crossfade on dream submission (400ms fade / 1.2s hold / 600ms fade-in).- Character-by-character amber invocation on dream entry screen.
The observatory existed before anything could be seen in it. Twenty-nine thousand, three hundred and sixty-three dreams arrived, spanning sixty years, each one enriched with seventy-seven fields drawn from the Jungian tradition. The atlas lived in the database before it lived on the screen.
Dreams could be recorded and held. Marie-Louise waited behind a door that was not yet open. The corpus was already there, already breathing, already arranged by depth and symbol and the slow movement of the collective psyche across six decades. The room was ready before anyone entered it.
Technical notes
- Dream entry: text, bulk paste/file, voice (Whisper transcription).
- Personal dream landscape: card expand, emotion glyph, FAB entry.
- Authentication via magic link. No password.
- Wake-time notification with direct voice-entry deep link.
- 29,363-dream DreamBank corpus in Supabase: 77-column Jungian enrichment, 29,343 with text-embedding-3-small embeddings.
- Marie-Louise RAG worker live at marie-louise.adsc1994.workers.dev: retrieves top-5 von Franz/Jung passages per substantive turn.
- Waitlist end-to-end: landing → Supabase Edge Function → auth.users row → Resend auto-reply.
- Reveries App deployed to Cloudflare Pages at app.reveries.world.