What has changed

Changelog

Effective

Crisis detection — passive and indirect wording — 2026-10-25

  • A deterministic floor before the model. guardedDetectCrisis (used by Rate, Local Mode, Ask Chimesong, and Public Echo sharing) now first checks a narrow set of unambiguous first-person passive-ideation phrasings (src/lib/ai/crisis-floor.ts) — "I don't want to be here anymore", "I wish I was dead", "everyone would be better off without me", "what's the point of living" and similar — and routes them to the crisis path every time with no model call. Negations, the "kill myself laughing" idiom, wording tied to a place ("…at this job"), and sentences framed as past and resolved are left to the model. A live run had seen the model file "I don't want to be here anymore" as ordinary distress.
  • Widened classifier prompt. The crisis prompt now states that a present first-person wish not to be alive or not to exist is suicidal ideation even when passive or indirect, that ambiguity between "here" as alive and as a place resolves to crisis, and what is excluded.
  • Tested hard. 35 deterministic cases (22 must-flag, 11 left to the model, plus wiring); live, the exact phrasing flagged 50/50 through the guarded detector across two runs, 20/20 with the model alone, five uncovered passive phrasings 10/10, and five ordinary hard days 0/10 false positives (tests/unit/crisis-passive.live.test.ts).

Ask fixes and Cookie Policy 1.3.0 — 2026-10-25

  • Live fix — ask-v1 dropped negative comparisons. answerIsGrounded (src/lib/ask/grounding.ts) extracts digits without their sign, so an answer writing a delta of -3 as "-3" (or "3 points lower") was checked as 3, matched nothing, and failed closed as "I can't answer that confidently". Each evidence number now also licenses its magnitude; anything else is still rejected. Regression tests cover signed, unsigned and decimal deltas and an unrelated number.
  • Reflective voice — two figures, structurally. Compose now returns observation (no digits), one figures sentence, and decline; code joins them and rejects a conclusion with more than two figures (the 1–10 bounds excluded) or a number in its first sentence. A figure-only miss gets one retry with a fixed correction; anything else, or a second miss, fails closed. Flag still OFF.
  • Reflective voice — the person's own words. The Ask route now loads history before interpreting, and the reflective interpreter receives the user's own recorded factor and entity names (sanitised, length- and count-capped, JSON under the data-not-instructions notice), so "staying up late" maps to a recorded "late nights". A deterministic snap fixes case/spacing/underscore variants to the stored key.
  • Cookie Policy 1.2.0 → 1.3.0 (effective 2026-10-25): adds cs-local-ai, the chimesong-local IndexedDB guest history, the Rate draft key, notebook and writing-font keys, cs_intro_v1, chimesong:updates:last-seen, sidebar-collapsed, game save keys, and the cs_splash_v1 sessionStorage value; clearing site data now notes it deletes guest history. Cookie versions do not drive re-consent.

Ask Chimesong reflective voice — 2026-10-25

  • Same evidence, warmer voice. Behind the new ask_reflective_voice flag (seeded OFF; migration 20261025120000_ask_reflective_voice_flag.sql, data-only), Ask composes in the chime-score-v2 reading voice (src/lib/ask/reflective.ts, engine version ask-v2-reflective): it reflects what recurs across the user's record, with figures woven in rather than led with. Flag off, Ask runs the unchanged ask-v1 path.
  • Day texture (deterministic). Summary-style questions add a day_texture evidence item: which recorded factors and named entities recur more on the scope's harder days (below its mean by more than 0.5) than its brighter days, and vice versa — at least 10 scored days, 3 per side, 3 appearances, and a 20-point rate lift before anything is named. Counts only; never a cause.
  • Advice is reflected, then declined. Interpret now marks seeks_advice and retrieves the history an advice question touches instead of refusing it outright; compose must then decline the advice part. Medical, general-knowledge and other-people questions are still refused, with warmer redirects.
  • Guards that fail closed. Beyond the existing number-grounding guard: every label the answer declares must be in the evidence; naming any other recorded factor, entity, generic factor or everyday alias for one is rejected as an invented circumstance; advice, praise, causal phrasing, questions, and an undeclined advice request are each rejected. Labels are always sanitised and the question always boundary-wrapped on this path, independent of prompt_hardening. Persona tone is a one-line wording hint that cannot add praise or advice. Crisis routing and the daily cap are unchanged.

Privacy Policy 1.3.0 — 2026-10-25

  • Guest use and sharing are now described. New sections cover Local Mode (entries in browser storage only; text sent to Anthropic to produce a Chime; the essential HTTP-only cs-local-ai fair-use cookie and HMAC-keyed hashes of the device token and network IP; no automatic upload on signup) and sharing (Anthropic crisis check on posts and guideline check on posts and comments, the non-blocking identifying-details scan, what a post stores, reports queued for operator review with audit logging, appeals). "What we collect" now notes stored day factors and Ask Chimesong questions and answers. Version 1.2.0 → 1.3.0, effective 2026-10-25; signed-in users are asked to re-accept through the existing re-consent modal.

"What is Chimesong?" and How it works lead — 2026-10-25

  • The last two "online reflection app" descriptions are updated. The FAQ answer to "What is Chimesong?" (FAQ_ITEMS, rendered on /faq and in its FAQPage JSON-LD) and the opening paragraph of /how-it-works now describe a private journal that reflects your days back: guest or account writing, an honest reflection each day, and — with an account — the Trend, patterns (never causes) and Ask Chimesong. The FAQ question heading and the How it works title, description and four steps are unchanged. Tests now pin the new wording and forbid the old.

FAQ guest answer and social-card tagline — 2026-10-25

  • "Do I need to sign up?" is accurate again. FAQ_ITEMS (rendered on /faq and in its FAQPage JSON-LD) still answered "Yes, for Rate Day", which has been wrong since Local Mode shipped on 2026-10-09. It now says a guest can write and receive a Chime with history saved only in this browser, that a free account adds cloud backup across devices, and that the Feed (including shared-post pages), Public Echo sharing, and the Trend / patterns / Ask Chimesong features need an account. The existing "including shared-post pages" assertion still holds; a new test forbids the old claim.
  • Social-card footer. The shared template behind every page's OpenGraph/Twitter image (src/lib/seo/aster-social-image.tsx) ended "Chimesong · An online reflection app"; it now reads "Chimesong · Your days, and the patterns in them".

Homepage tells the whole story — 2026-10-25

  • The lead is what Chimesong is now. The homepage hero no longer opens on the Chime definition. It leads with a private journal that, over time, shows what tends to lift and drain your days; the Chime definition (unchanged wording) now sits in step 02 of the three steps, and the pseudonymous Public Echo sentence in step 03 is unchanged.
  • Two new sections, describing only live features. "Over time" covers the Trend (life_trend) and Chimesong noticed (chime_patterns), with an illustrative — and labelled as such — chart. "Quiet companions" covers Day Factors (day_factors), Ask Chimesong (ask_chimesong), Notebooks (notebooks) and Play (small games, trivia and the day-band nudge). Account-only features are labelled as such. All five flags were confirmed ON in production on 2026-10-25.
  • Motion with no new JavaScript. The chart's columns rise, the trend line draws through them and the noticed patterns settle in; companion icons ripple once as their cards arrive. Everything is CSS keyed off the existing Reveal data-reveal-state, in src/styles/phase31/landing-story.css; the landing startup JS is unchanged. Every reduced-motion gate shows the finished state with no movement.
  • SEO and answer engines. New <title>, meta description, OpenGraph/Twitter text, social-card text, and Organization / WebApplication JSON-LD descriptions describe the fuller product. The privacy promise, "no followers, no streak", the three steps, and both CTAs are kept.

Rate draft preservation — 2026-10-25

  • Rate remembers your in-progress reflection. Behind the rate_draft flag (now on), the Rate page keeps what you're writing for today, on this device, so leaving and coming back no longer loses it — until you submit or a new day begins. Debounced localStorage save, silent restore (no prompt), keyed by user id (or "local") + local day so a shared browser never shows another person's draft; cleared on successful submit and on sign-out; multi-tab sync via storage events; stale/unknown fields dropped; all storage wrapped in try/catch (private mode = no-op). Never sent to Supabase; key chimesong:rate-draft:v1:<userKey>:<YYYY-MM-DD> carries no PII.

Closer-reading scoring prompt live (chime-score-v2) — 2026-10-24

  • chime-score-v2 is now the live scoring prompt. With score_prompt_v2 enabled (alongside chime_score_v2), Chimesong reads each entry closely, scores it 1–10, explains the score through the user's own quoted words in the order the day went, ends on one short closing line grounded in something they wrote, and points out one thing they may have missed — never with questions, advice, or stock reassurance. The post-rating prompt now reads "Does <Name>'s read feel right?" with a "Not really" button. chime-score-v1 remains the instant rollback (flip score_prompt_v2 OFF). Personas keep their character, with one universal rule: on a hard day (score ≤4) every persona comes in calm. Crisis, harm-to-others, and confession handling unchanged; reflection_v2 unaffected.

Intro slideshow fits every screen — 2026-10-24

  • Next is always on screen. The headline size was width-only (1.05rem + 2.6vw, capped at 2.75rem), so short-but-wide screens got the largest type, and the illustration row held a fixed 120 px minimum. Measured on the shipped build, Next sat 4 px below the fold at 320×568, 71–117 px below it on landscape phones (568×320, 667×375, 844×390) and 83 px below it in a 1280×500 window. The headline is now clamp(1.375rem, min(1.05rem + 2.6vw, 0.4rem + 4.4vh), 2.75rem) and the illustration row yields down to 80 px. At ≤ 520 px tall (any width) a compact layout hides the illustration, widens the headline measure and puts the progress rail beside the controls. The old short-landscape block was declared before the base .copy rule, so part of it never applied; the new one sits after the base rules.
  • No stray desktop scroll. On the desktop stage the off-stage illustration layers (translateY(12%)) extended past the art box and gave the stage 22–37 px of scroll on slides 1–3. The art box now clips them (overflow: clip). Regular phone and tablet sizes render at the same type size as before; all 11 measured viewports keep Next on screen with zero stage scroll. CSS only — no motion, copy or behaviour changes.

First-visit intro slideshow — 2026-10-24

  • A four-slide welcome on /, shown once per browser. What it is, why it's different, the value over time, and a call to action into /rate. It is a coded overlay, not a video: an indigo stage with chrome display type, glossy pill buttons and violet orbs that persist across slides and morph to new positions, drawn from a PowerPoint "Morph"-style reference. On the last slide the orbs gather into the Chimesong Aster, whose rings draw in around them. Dismissal (Skip, Escape, or the final CTA) writes cs_intro_v1 to localStorage; storage that is missing or blocked hides the intro rather than letting it reappear every visit. It waits for the session splash to finish, works for guests and signed-in visitors alike, and ?intro=1 forces a replay for testing.
  • Motion that reverses. Each slide sits before, at, or after the current one, so the same CSS transition plays forward on Next and backward on Previous; entrances are staggered on the shared --rs-ease curve and exits leave faster. Arrow keys and touch swipes navigate, the rail's dots jump to a slide, focus is trapped in the dialog and handed back to #content on close. All six motion gates (OS reduced motion, in-app Reduced Motion, Quiet, both low-performance flags, crisis) collapse it to 160 ms crossfades with the Aster shown already drawn.
  • Off the startup path. The slideshow is code-split behind a small gate component and only fetched for a visitor who will see it. The feature is gated by the intro_slideshow flag (seeded OFF; migration 20261024120000_intro_slideshow_flag.sql, data-only).

Notebook & font picker fixes — 2026-10-24

  • The picker anchors to its toggle. The “Notebook & font” panel used to render at the foot of the form, below the submit button, and hidden={!open} toggled the panel element between display: none and display: grid alongside the grid-template-rows: 0fr → 1fr transition — so the open animation never ran and the panel appeared offscreen when it did render. WritingSurface now exposes a selector slot that mounts the panel inside .rs-notebook__cover, between the nameplate (which carries the toggle) and the paper, so the panel expands in place under the button that owns it. The hidden attribute is gone; aria-hidden carries the a11y side, and the grid-rows collapse continues to hide the content when closed. Every motion gate still flattens the transition.
  • Scrolling no longer dismisses the picker. The outside-click handler listened on pointerdown, which fires at the start of a touch — before the browser knows whether the gesture is a tap or a scroll — so any touch that began outside the panel (including the start of a page scroll) dismissed it instantly. It now listens on click, which never fires when a touch turns into a scroll. Clicks inside the panel (radio options, labels) and clicks on the toggle that owns the panel are still ignored, so neither path collapses the open panel. Escape and the Close label on the toggle still close it. No migration; backward-compatible with the entries and posts that carry notebook = NULL (the plain-panel path is untouched).

Notebooks — 2026-10-23

  • The Rate page's writing panel is now a notebook. A notebook is a bundle — cover material, binding, matching paper and a paired handwriting face — not a colour swatch. Covers are drawn entirely in CSS gradients: a woven linen crosshatch, a pebbled leather grain, a vinyl gloss sweep. Bindings bring their own hardware — exposed sewing thread, a cloth spine tape and ribbon marker, a strap and buckle, a lock plate with a keyhole, twin-ring wire, a traveller's elastic. The panel frame renders as the cover, the writing area as that notebook's paper (warm tint, faint ruled lines, one margin rule), and the user's own typing is set in the notebook's hand. Six notebooks ship — Minimalist, Cottagecore, Dark Academia, Gothic, Pink and Emo — with Minimalist the default, replacing the plain textbox for everyone. All six are free; Dark Academia, Gothic, Pink and Emo are marked as planned-premium for a future release, and /premium says so.
  • A system, not six skins. Identity (name, copy, tier, the two faces) lives in src/lib/notebooks/registry.ts; colour lives in src/styles/phase31/notebooks.css keyed by data-notebook, with hand-tuned palettes per theme. Adding a seventh notebook later is one registry entry plus one CSS block.
  • The writing sits on the rules, and stays readable. A single 28px pitch drives the ruled-line gradient, the textarea line-height and the field minimums, so text stays on the lines at any zoom. Ten Google Fonts faces, self-hosted through @fontsource under OFL-1.1; only the five paragraph-safe faces are ever applied to a user's own writing, the five character-heavy ones set a three-word cover label and nothing else. Gothic writes in a clean hand, never blackletter. WCAG contrast is measured in a unit test — placeholder, prompt, cover-lettering and focus-ring ratios across all six notebooks in both themes.
  • Writing font is independent of the notebook, with a plain accessibility face. Each notebook keeps a paired hand, but the writing font is now its own device-local preference ("auto" | key): any of eleven faces pairs with any of the six notebooks. "auto" follows the notebook's own hand and is the default, so existing writers are unchanged; an explicit pick is sticky across notebook changes. Atkinson Hyperlegible (OFL-1.1, Braille Institute, designed for low-vision readability) joins the set as the plain, high-readability option — led in the picker, labelled, never forced. The font/notebook split stays loader-free through src/lib/feed/post-font.ts, so @/lib/schemas and the middleware bundle never pull font CSS.
  • A shared day appears as the author's notebook, not a card. Posting to Public Echo renders the day as the notebook itself — its paper, its accent, and the handwriting the author chose — by remapping the Echo card's surface tokens to the notebook's own and skipping the card backdrop. No card is auto-selected; the notebook is the default. A card remains an explicit opt-in (“Use a card instead”), and a card post carries no notebook, so the two are mutually exclusive and the feed renders exactly one. Encoded with no migration (notebook set → notebook; notebook null → card), so the posts shared before this still render as cards. The accent stays legible (measured 3.19:1–3.67:1) and no body text is recoloured.
  • One selector on /rate. A single cover toggle (“Notebook & font”) expands a panel holding both the notebook picker and the font picker, animating open and closed on the shared --rs-ease curve (every motion gate flattens it) and closing on an outside tap or Escape. No new button cluster, and switching mid-entry never restamps the day.
  • History is a wall of notebooks. /history gains a Notebooks view: one square per day, drawn in the notebook that day was written in, reusing the same material and binding CSS as the writing surface. Tapping a square expands it in place to a paper sheet with that day's writing in its own hand, its rating, and a link to the full day; tapping outside, pressing Escape, or tapping again collapses it. Dates stay in the interface font over a per-notebook scrim (13.8:1–17.8:1 on every cover), a Find a day box filters by date or by any word written, and the Chronological list is untouched and one tap away.
  • Accessibility and storage. A visible focus ring on every field; high-contrast mode swaps the decorated surfaces for the app's plain ones; all six motion gates collapse the animations to zero with expand/collapse still working; forced-colors strips the decoration entirely. Which notebook a user writes in is a device-local preference, and each entry and post records its notebook in new nullable columns — days and posts from before this render in the default notebook. The feature is gated by the notebooks flag.

Reflection holds the user's open question — 2026-10-20

  • An answered “Still open” field is held, never ignored. Under the reflection_v2 measurement block (src/lib/ai/scoring-rubric.ts), when the structured reflection includes a non-empty Still open field, the Chime now names that question back as the user's own and leaves it open — reassuring them it is okay it has no answer yet — rather than passing over it. It never answers, resolves, or advises on the question.
  • No new questions, no probing, no score change. Chimesong still never invents or poses a question of its own, and the existing reflection_v2 ban on questions and probing for hard entries is unchanged; the holding is phrased as a statement, not a prompt demanding an answer. The guidance is presentation-only — the versioned chime-score-v1 rubric, the score, and confidence are untouched, so the scoring-drift corpus (plain-text entries with no Still open field) is unaffected. The behavior is gated behind the existing reflection_v2 flag; no database migration is required.

Journaling for anxiety guide — 2026-10-20

  • A gentle guide for anxious days. A new guide covers low-pressure journaling for anxiety: a simple method for loud days, short prompts, what to do when writing makes anxiety worse, when to close the notebook, and when journaling is not enough. It makes no medical claims and points clearly to professional support and crisis resources.
  • Stronger guide linking. The guides hub now lists three guides, and the method and prompt guides link to the anxiety guide so the collection stays easy to move through.

Daily reflection guide expansion — 2026-10-19

  • More useful ways to begin. The daily reflection guide now offers 54 original questions for ordinary, difficult, mixed, unfinished, good, hard-to-name, low-energy, and end-of-day reflections. It explains how to choose one question, how little someone needs to write, and why a reflection does not need a lesson or positive ending.
  • A clearer guide path. The reflection guides now include visible breadcrumbs, matching structured data, truthful published and updated dates, and stronger contextual links from Chimesong's public pages. The method guide remains distinct from the prompt collection and now includes two concise examples.

Interface motion pass — 2026-10-19

  • Content settles in instead of snapping in. A shared Reveal / RevealGroup pair (src/components/motion/) fades sections and card groups up 32px as they reach the fold, once each, over ~0.9s on the same cubic-bezier(0.22, 1, 0.36, 1) curve as the --rs-ease token, the splash and the echo-card chrome — slower and more deliberate so the rise is clearly felt, not faster. Grouped cards unfold one after another 120ms apart rather than arriving in one block. Applied to the landing page hero and bands, How Chimesong Works, both reflection guides, the guides index, Premium, and the What's New timeline. Variants live in src/lib/experience/motion.ts beside the existing ones; no new animation library was added, because framer-motion and gsap were already dependencies.
  • Pages arrive with a crossfade. A template.tsx in each of the (main), (legal), and (auth) route groups fades a page in over 260ms on navigation. Opacity only, deliberately: a transform on a whole-page wrapper would make it the containing block for any non-portalled position: fixed overlay inside it.
  • Buttons rise; interactive cards already did. .rs-primary-button, .rs-secondary-button, and .rs-header-action now lift 1px on hover and still settle 1px on press. A new shared .cs-lift utility expresses the hover/press gesture that .rs-history-card and .rs-activity-card already performed, and is applied to the guides index cards. Lifts are behind (hover: hover) and (pointer: fine) so a tap never sticks lifted. Non-interactive content cards were deliberately left alone.
  • The Aster mark idles with more presence. <AsterMark ambient /> drifts its outer and middle rings and breathes its glint on the sidebar inkblot's own 56s linear and 9s ease-in-out timings, so the sidebar idles as one. The glint's breathe was widened and the whole mark now swells and rises on a slow 19s cycle, giving the idle more life while staying on its calm, slow timing. Used only on the three large decorative marks (landing hero, landing closing mark, sidebar brand); small inline marks stay still.
  • Pages gain calm depth. The decorative sky's wave strokes, constellation, and scattered points (.resonant-sky-lines) now drift up slightly slower than the scrolling page, so the background reads as receding. The drift is scroll-linked — identical on touch and pointer, no mouse-tracking — driven by a --cs-sky-scroll custom property that a tiny <SkyParallax> publishes from the window scroll offset. The opaque sky field and horizon are left still so no seam can show.
  • Motion off means off. Every addition — reveals, the ambient Aster float, and the sky parallax — is gated on prefers-reduced-motion: reduce, the in-app Reduced Motion setting (data-motion-reduced), low-performance mode, Quiet mode, and crisis surfaces — reduced-motion visitors are pinned to the settled state before first paint rather than animated to it. A <noscript> rule unhides every reveal for visitors without JavaScript. No feature, page, route, flag, or database change.

Public Echo structured-reflection sharing correction — 2026-10-18

  • Complete structured reflections can be shared. Public Echo's editable copy, sensitive-information preview, and final feed write now accept the complete labeled narrative produced by Rate's shared 3,000-character structured-input budget. The obsolete 2,000-character single-box validation no longer rejects a valid reflection before it can be echoed.
  • Actionable recovery instead of schema jargon. A genuine sharing validation problem now identifies the field to review — public copy, caption, card style, or saved-day link — and gives a useful next step. The raw invalid request phrase is no longer presented as user guidance. Existing crisis, moderation, sensitive-information, authentication, ownership, and private-entry boundaries are unchanged; no database migration is required.

Rate mobile typing stability — 2026-10-18

  • The active reflection stays in view. The five-field /rate form no longer runs its auto-grow path twice or briefly collapses the focused textarea on every keystroke, which caused mobile browsers to repeatedly re-anchor the page above the software keyboard.
  • Stable growth, same reflection flow. A focused field now grows only when its content needs more room, fits back to its content after editing, and is excluded from page scroll anchoring. Prompts, the shared character budget, Today's Moments, storage, and Chime generation are unchanged.

Ask Chimesong (Gate 5) — 2026-10-18

  • Grounded questions over your own history. A new Ask Chimesong box on the Trend view answers natural-language questions about your recorded days, behind the ask_chimesong flag (default off; the box is hidden and /api/ask returns 404 when off). The engine (ask-v1) is a fixed three-stage spine: an AI Interpret stage turns the question into a structured retrieval request only (never an answer or a number), a deterministic Retrieve stage reads your own baseline and pattern evidence so every figure originates from your entries, and an AI Compose stage writes a four-part answer — what the data suggests, the evidence, confidence, and limitations.
  • It can't invent numbers, and it says when it can't answer. A programmatic grounding check rejects any composed figure that doesn't trace to the retrieved evidence, failing closed to a plain "can't answer that confidently" rather than guessing. Answers are association-only — never cause, diagnosis, prediction, or advice — out-of-scope questions are declined, thin data returns an honest "not enough yet", and a crisis-signalling question is routed to support first. Questions are account-only, rate-limited per day, and stored in an owner-RLS ask_questions table (server-side writes only) via migration 20261017140000_ask_chimesong.

Personal Chime Model / patterns (Gate 4) — 2026-10-18

  • Quiet associations on your Trend. A "Chimesong noticed" section on the Trend view may surface a few evidence-tiered associations from your own recorded days — a factor, person, place, or time-of-week whose days have averaged higher or lower than the days without it — behind the chime_patterns flag (default off). The engine (patterns-v1) is deterministic and read-only: no AI, no writes, and it compares only your own days.
  • A high bar against noise, and your dismissals don't skew it. A pattern surfaces only when the effect is both large enough and steady enough (absolute effect, signal-to-noise, and split-half sign agreement, with minimum day counts on both sides), so random variation stays silent; genuine non-effects can be shown as negative evidence. "Not useful" soft-hides a note in an owner-RLS dismissal store that never re-weights the underlying math. Migration 20261017130000_chime_patterns.

Structured Rate reflection — 2026-10-17

  • Five optional fields. /rate now offers The moment that stayed, How it felt, Lighter, and heavier, Still open, and a taller Anything else field. The first four rotate through the approved reflection prompts; text areas grow as needed, use one shared 3,000-character budget, and expose per-field counts only while focused or after typing. No field is required: one non-empty field enables Finish & get my Chime, while an entirely blank form remains disabled.
  • Complete even when sparse. The entries endpoint accepts any one populated field, stores the normalized object in entries.reflection_fields, and keeps entries.day_text populated with a labeled narrative for History and existing readers. Crisis detection still receives the complete stitched text. Both the versioned and rollback scoring paths receive labeled structured input and are explicitly instructed never to penalize brevity, request more writing, or mention empty fields.
  • Existing experience preserved. The current Aster mark, Resonant Sky tokens, Light/Dark/Aurora themes, Feels hooks, privacy copy, score reveal, Local Mode, and Today's Moments component remain in place. Moments added to the reflection flow into Anything else; on mobile the unchanged Moments panel appears before the form. The additive migration is add_reflection_fields_to_entries and existing rows remain valid with a null structured value.

Voice first-name rename + Rate-flow persona attribution — 2026-10-17

The seven reflection voices now use first-name identities in every user-facing surface: Juliana (the default), Keziah (formerly Witty Friend), Serenity (formerly Poetic Philosopher), Roseline (formerly Gentle Listener), Yuri (originally shipped as Shy Tsundere), Selena (originally shipped as Aster Radiant), and Elizabeth (originally labelled with her internal persona name, "The Unfiltered Anchor"). Only the human-readable name field in src/lib/ai/personas.ts changes; the stable persona ids (default, witty, poetic, therapist, tsundere, aster, elizabeth) are preserved, so saved entries, feed records, insights, analytics, and the profiles.premium_persona CHECK constraint are untouched.

The Voice picker now shows first-name-only titles. Juliana is the one exception — her card renders a small "Default" pill next to the title, matching the picker's chime accent styling. The role description line under each title and the sample chime preview are unchanged. Downstream components (src/components/insights/RhythmCards.tsx, src/components/settings/AccountOverview.tsx, feed attribution, analytics labels) resolve the display name through PERSONAS[id].name, so no additional wiring was needed.

The Rate flow now reads the user's active voice from the same source as the picker and attributes its processing / confirmation copy to that voice. RitualLoading renders {Name} has received your entry, {Name} is listening for the shape of the day, and {Name} is forming one considered chime using the templated loadingLinesFor helper; RatingCalibration reads How was {Name}'s performance? Does this rating resonate?. The subtitle, Claude Sonnet 5.5 attribution footer, and "Chimesong noticed" chips remain unchanged. The active persona is hydrated in RateExperience from /api/user/persona (authenticated) or getLocalVoice() (Local Mode); fetch failures fall back to Juliana so a flaky network never blocks the loading state. The AI's internal self-identification ("Respond as Selena") is updated for Selena so the model's own self-reference matches the user-facing card; Elizabeth keeps her internal <name>The Unfiltered Anchor</name> per the persona spec. No database migration or persistence change ships with this release — the Elizabeth CHECK-constraint migration from earlier in the same PR remains the only database change.

New Elizabeth voice (The Unfiltered Anchor) — 2026-10-17

Elizabeth is a new reflection voice in the Chimesong Voice system, available to all signed-in users and in Local Mode. She is emotionally flat, unflinchingly direct, and unwavering in support: no sugarcoating, no performative warmth, and no exclamation points. Every reflection follows a three-beat structure — Observation, Pattern or Tension, Grounding — in three to six sentences.

The new elizabeth persona was added to the persona registry (src/lib/ai/personas.ts), the account-mode Voice settings (src/components/settings/PersonaSelector.tsx), and the Local Mode voice allowlist (src/lib/local-chimesong/db.ts). A database migration (20261017000000_expand_persona_constraint_for_elizabeth) expands the profiles.premium_persona CHECK constraint to accept the new identifier without rewriting any existing profile rows. Existing voices are unchanged and there are no breaking changes. The underlying 1-10 Chime measurement, calibration, privacy choices, and crisis-safety handling continue to take priority over the voice overlay, and the role-stability guards keep Elizabeth from drifting warmer mid-session.

Personal Baseline (Life Trend) — 2026-10-17

Chime Score v3 / Core Revamp Gate 3 adds a read-only Personal Baseline: a daily score becomes a signal the user can compare only to their own earlier days. A new Life Trend view (/life-trend) shows Today, the last 7 days, the last 30 days, and the preceding 30 days, plus one templated sentence comparing recent vs previous (better / lower / close). It ships behind a life_trend feature flag (default off; nav entry and view appear only when on).

  • Deterministic, no AI. A pure statistics engine (baselineEngineVersion baseline-v1) over scores already recorded by Gates 1–2 — no model call, no writes, no persisted baselines. A single endpoint /api/life-trend returns the payload under existing owner RLS; no cross-user comparison anywhere.
  • Statistical honesty. Missing days are excluded (never zero-filled); unavailable/crisis entries are excluded; low-confidence days are down-weighted with a floor while a user's own calibrated score carries full weight; outliers are not clipped (mean shown, median kept internally); minimum sample sizes gate each window ("not enough yet" instead of a number); windows use the user's local day via rated_at.
  • One source per day. The user's calibrated score is used where present (honoured past the 24-hour freeze), otherwise the AI score; the two are never blended. No diagnosis, cause, or reward/punishment language in the UI.

Day Factors (private) — 2026-10-16

Core Revamp Gate 2 adds evidence-backed day-factor extraction behind the day_factors feature flag. After a scored entry, Chimesong extracts a small set of supported factors from the text and surfaces a few high-confidence ones as a quiet "Chimesong noticed" line, with a lightweight correction affordance.

  • Evidence-backed, no fabrication. Extraction (extractionVersion day-factors-v1) is a separate, persona-free step that never affects the score or confidence. Every factor must quote the entry; any factor whose evidence span cannot be located in the text is dropped, and a failed extraction is recorded as an explicit unavailable state rather than fabricated or empty-as-complete factors.
  • Private storage. Factors live in entry_factors (write-once, versioned, owner-only RLS); personal entities (people, places, routines) are private analysis and never enter the feed or a public profile. User corrections are stored separately in entry_factor_corrections and never overwrite the AI's extraction.
  • Quiet by design. Only a few high-confidence factors are surfaced — not a dashboard. Account-mode only; guest/Local Mode is untouched.

Per-chime Public Feed fonts — 2026-10-16

Public Echo composing now moves from card style to a separate optional font step. The two pickers are never mounted together: choosing a card runs an out-then-in horizontal GSAP transition to the font choices, and Back to card styles returns without losing the selected card. Chimesong (Default) is the pre-selected first option, while Echo to feed remains persistently available beneath the scrollable composer so posting never depends on choosing a decorative font.

Fifteen free mixed-case faces are available: Lora, Playfair Display, Zilla Slab, Fraunces, Outfit, Work Sans, Space Grotesk, Quicksand, Josefin Sans, Barlow Semi Condensed, Space Mono, Caveat, Dancing Script, Righteous, and Fredoka. The chosen face applies only to the body wrapper containing the user's public writing and the AI Reading; author identity, caption, Signal score, timestamp, controls, and card chrome keep the Chimesong interface fonts. Caveat and Dancing Script receive a larger readability floor and more line height.

The additive public_posts.font column stores only an allowlisted key and remains nullable, so existing posts and skipped choices use the house font. Invalid or absent write values are normalized to null on the server. Each @fontsource 400-weight stylesheet is code-split behind the central registry: picker samples load progressively as they approach view, and Feed cards request only their own face when nearing the viewport, deduplicated once per page. License attributions are recorded in FONTS_LICENSES.md.

Public Feed engagement and ownership correction — 2026-10-13

Public Feed cards now keep their engagement row inside the same grid item as the shared entry. The legacy card styles had been forced to consume the grid item's full height before the action row was added; at multi-column widths, the overflowing controls could sit behind the following row and stop receiving pointer input. Feed posts now use a vertical flex layout in which both classic and living card styles grow only within the space left above their actions. The correction is covered at 390, 768, 1024, and 1440 pixel viewport widths.

Every resonance count is now a link to that exact post's resonance section, comment counts continue to target the exact post, and like controls remain bound to the represented post. A visible Your post tag appears inside an owner's shared card; owners retain feedback counts, comments, and removal but still cannot like or resonate with their own post. The dislike control has been removed from Feed and post detail, and new dislike vote requests are rejected at the request-schema boundary. Existing historical database fields remain intact so this UI correction requires no destructive migration.

Local Settings and safer online ratings — 2026-10-12

Local Mode now has a capability-aware /settings page instead of sending signed-out people to Log in. Themes, the four current Feels (Heartfall, Drizzle, Constellation, and Fireflies), motion, Quiet Sky, Lightweight mode, sound volume and chimes, haptics, contrast, local data, and free Voice personas can all be managed on this device. The compact controls in More and the full Settings page read and write the same preference record, while the Feels dialog-positioning fix, the retired Breath option, and the current More/Settings navigation remain intact.

Local writing and device-local history remain unlimited. Online Local Mode ratings now have an atomic, rolling allowance: five successful ratings per device/browser in 24 hours, two rating operations in ten minutes, and one active operation at a time. Idempotency prevents a retry from paying for the same AI operation twice; a generous shared-network allowance and configurable global circuit breaker provide secondary cost protection. When an allowance is resting or its private counter service is unavailable, the entry is saved locally without inventing a score.

Quota records are server-only and contain opaque keyed identifiers, timestamps, outcomes, and latency — never reflection text, prompts, reasoning, or Chime output. Profile and security, billing or future account entitlements, cloud sync, social preferences, Public Echo, Feed, and Resonate remain account-owned and are explained in Local Settings rather than exposed or silently enabled.

Feels dialog positioning + Breath removal — 2026-10-11

A follow-up to the Feels hydration hotfix earlier the same day. Two changes, both inside the Feels system.

  • Dialog clipped off-screen under any Feel. The Radix dialog content (the More menu, which hosts Settings and the Feel picker) is tagged .feel-glass. Every feel stylesheet declares [data-feel="x"] .feel-glass { position: relative } at specificity (0,2,0), which outranks the Tailwind fixed utility (0,1,0) on the dialog content. With a Feel active, the dialog therefore lost its fixed viewport anchor, fell into document flow, and top: 50% pushed it far below the fold — it opened but rendered off-screen, so the More button appeared unresponsive. src/styles/phase31/feels-hotfix.css now pins [data-slot="dialog-content"] and [data-slot="dialog-overlay"] to position: fixed at specificity (0,2,1) under any html[data-feel], restoring the desktop (centered) and mobile (bottom-pinned) anchors. This was the residual bug after the hydration fix in PR #14: clicks registered, but the surface was invisible.
  • Breath Feel removed. Breath ran heavy (per-frame orb/aura compositing plus the hold-to-breathe gesture) and stuttered on mid-range devices, so it has been retired rather than shipped laggy. Removed from FEEL_NAMES/FEEL_ASSETS in src/lib/feels/config.ts, from FeelPreference and the preference validator in src/lib/experience/preferences.ts, and from the Settings picker in src/components/experience/ExperiencePreferences.tsx. The Breath-only chimeOnExhale preference and its data-feel-sound wiring were removed with it, and public/feels/feel-breath.css / feel-breath.js were deleted. A stored feel: "breath" value is no longer in the whitelist, so the preference normalizer falls it back to none without clearing any other preference. Remaining Feels: Heartfall, Drizzle, Constellation, Fireflies.

Feels hotfix — More button and Settings recovery — 2026-10-11

A production hotfix for a hydration regression introduced by the Feels launch the previous day. Under some combinations of theme and Feel, the More button in the primary navigation became unresponsive, trapping users outside the Settings dialog that controls Feels themselves. The underlying cause and the full remediation are both inside the Feels system — Local Mode, Chime Score v2, Feed, History, and Resonate were unaffected and are unchanged by this release.

  • Pre-hydration script. The pre-hydration inline script in src/app/layout.tsx no longer appends <link> or <script> nodes to <head>. Any mutation of the <head> before React 19 hydrates triggers error #418 and leaves the hydrated tree without event handlers; the script now only writes data-feel (and, when set, data-feel-sound) to <html>, which is already covered by suppressHydrationWarning. Feel assets (CSS, Google font, runtime JS) are loaded by FeelLoader on mount, after React has adopted the DOM.
  • Registry invariants. src/lib/feels/config.ts now exposes FEEL_NAMES, isKnownFeel, and per-entry entitlement/persistence metadata. The pre-hydration script and the preference normalizer both validate against the shared whitelist, so a corrupted or unknown stored value falls back to no feel instead of writing an unknown data-feel.
  • Scoped glass. src/components/ui/card.tsx no longer tags every Card with .feel-glass. The dialog surface still uses it (one node, the Feel's showpiece); every other card instance stops carrying a backdrop-filter blur that was multiplying compositor work on Feed, History, and the primary flows.
  • Safety-net stylesheet. src/styles/phase31/feels-hotfix.css enforces pointer-events: none on every decorative Feel layer, floors the primary nav and Settings dialog to the readable surface token under any Feel, guarantees the Radix dialog portal stacks above decorative layers, and bans transform, filter, backdrop-filter, and mix-blend-mode on <html>/<body> so a future Feel cannot create a containing block for fixed-position portals.
  • Lite / Quiet / Reduced-motion fallbacks. The same safety-net stylesheet attenuates each Feel's aura directly from the shell's own data-quiet-sky, data-low-performance, and data-motion-reduced flags, so a user does not have to wait for a per-Feel frame-rate probe to see the quieter version.
  • Recovery path invariants. /settings renders without depending on any Feel; the Feel picker and Reset sensory settings remain readable and clickable under every combination; the Reset button only resets sensory preferences (feel, motion, chimeOnExhale, etc.) and never touches entries, history, calibration, or Local Mode drafts.

No user data was changed. If a Feel feels off, open Settings → Appearance → Feel → None, or append ?feels=off to any URL for a one-visit disable.

Feels — five premium animated layers — 2026-10-10

Five optional animated layers now sit on top of the existing Light, Dark, and Aurora themes. Only one Feel is active at a time; None turns them off. Settings → Appearance exposes the picker and a Chime on exhale switch (used by Breath only).

Each Feel ships as a pair of same-named files under public/feels/ and loads lazily on first selection. Every Feel styles the same shared .feel-* hooks (introduced in this release), so component code is tagged once and all five Feels work. Feels never touch the background art, Chime mark, logo, headline fonts, or layout; they add a fixed ambient aura and canvas above the background and below content.

  • Heartfall — hearts fall; rose, violet, and emerald liquid glass. Files: public/feels/feel-heartfall.css, public/feels/feel-heartfall.js. Accent font: Fraunces. Hook dependency: shared .feel-* classes, plus [data-feel-tilt] on hero-level panels for 3D tilt.
  • Drizzle — drops land and ripple; cobalt, cyan, and navy. Files: public/feels/feel-drizzle.css, public/feels/feel-drizzle.js. Accent font: Quicksand. Hook dependency: shared .feel-* classes.
  • Constellation — stars connect under the pointer and lingering star-trails on hold; gold, ember, and ink. Files: public/feels/feel-constellation.css, public/feels/feel-constellation.js. Accent font: Cinzel. Hook dependency: shared .feel-* classes.
  • Fireflies — fireflies glow, gather, and sync their blinking; 3D box UI with lantern-paper panels; chartreuse, moss, and pine. Files: public/feels/feel-fireflies.css, public/feels/feel-fireflies.js. Accent font: Bungee. Hook dependency: shared .feel-* classes.
  • Breath — the page breathes on its own at roughly six breaths a minute; hold anywhere empty to breathe with it and release for a soft chime (data-feel-sound="off" on <html> silences the chime); peach, sea-glass, and pearl liquid glass. Files: public/feels/feel-breath.css, public/feels/feel-breath.js. Accent font: Cormorant Garamond. Hook dependency: shared .feel-* classes, plus data-feel-origin on the Chime mark wrapper so the breath radiates from the mark.

Two safety nets ship with the Feels launch. First, the preference default for new users is feel: "none", which satisfies the "default to None on first load" guarantee for every connection quality (SaveData, slow-2g, and 2g included) without ever overriding an explicit stored choice. Second, a hard kill-switch — set window.FEELS_DISABLED = true before the pre-hydration script runs or append ?feels=off to any URL — prevents the pre-hydration asset injection, keeps the runtime FeelLoader idle, and shows the Settings picker visible but disabled with a short reason. Neither path requires a code deploy to engage.

Card readability and mobile navigation correction — 2026-10-10

Feed and History now keep a stable, readable card layout: three columns on wide desktop, two across intermediate widths, and one on phones. Shared cards retain their explicit Read full echo control, the clipping ceiling that could conceal it is gone, and History cards now show a clear Read full entry cue while remaining fully clickable.

On phones and tablets, the desktop sidebar stays hidden and the fixed bottom bar again keeps Home, Rate, and History directly visible. Its collapsed More tray contains Public Feed, Play, and the existing More destinations and experience settings. The desktop sidebar, Local Mode, and Chime Score v2 flows are preserved.

Calibration and a steadier chime score — 2026-10-10

Chime Score v2 (Core Revamp Gate 1) turns the daily 1–10 from an improvised per-request answer into a versioned, confidence-tagged measurement, and adds a lightweight post-rating calibration. It ships behind the chime_score_v2 feature flag (a row in the new feature_flags table) so it can be enabled or disabled without a redeploy; disabling it returns the entry pipeline to its previous behaviour with no data loss.

  • Calibration ("Does this rating resonate?"). After the score and reflection you can answer Yes, or Not quite and give your own 1–10 with an optional note. The user's score is stored in a new entry_calibrations table as an independent perspective — it never overwrites the AI score — and inherits the entry's privacy exactly (owner-only RLS, never exposed through the feed). It is editable for 24 hours after the entry, then frozen; the freeze and ownership are enforced in the database by a trigger, not just the UI. Calibration is included in data export and account deletion.
  • Versioned rubric. The 1–10 anchors now live in a documented, versioned rubric (docs/core-revamp/scoring/rubric-v1.md, scoringVersion chime-score-v1) that the measurement prompt is assembled from, rather than improvised inline. Old entries keep whatever version they were scored under and are never retroactively rescored; entries written before the contract carry no version and are treated as "unknown", never backfilled.
  • Confidence. Every v2 score is tagged with a low/medium/high confidence describing how well the entry supports a reading. It is recorded internally (baselines and patterns will down-weight low-confidence days later) and is not surfaced to users yet.
  • No more fake 5. When the AI read fails or is unavailable, the entry is saved with an explicit unavailable status and no score, instead of a neutral 5 that downstream trends could mistake for a real measurement. A day with no score is treated like a missing day and never counted or interpolated.
  • Measurement split from Voice. Scoring (score, confidence, explanation, against the versioned rubric) now runs as a persona-free measurement step; the chosen Voice restyles only the explanation afterwards and can never change the score or confidence. This lets a future Voice change ship without touching scoringVersion.

Sidebar and Feed polish — 2026-10-10

Three fixes to the sidebar and Feed shipped the day before.

  • Collapsed sidebar hides its text. On desktop the collapsed rail now hides nav labels, the wordmark, and the footer note entirely (display: none under html[data-sidebar-collapsed="true"]), so no clipped text bleeds through the 64px rail. Icons remain the only content.
  • Mobile sidebar experiment. This release briefly placed phone and tablet navigation behind a floating Aster drawer. The card and mobile-navigation correction above supersedes that behavior with a fixed bottom bar and directly visible primary destinations.
  • Feed cards sit in an equal-height grid. The grid uses align-items: stretch and feed-variant cards use height: 100%. The later correction removes the clipping ceiling and limits wide layouts to three readable columns so full-entry controls remain available.

A collapsible sidebar and a more compact Feed — 2026-10-09

The signed-in sidebar now collapses to a slim icon rail and expands to full labels on demand. At ≥1024px the sidebar sits in the document flow and toggling it pushes or releases the main content. This release also introduced a smaller-screen drawer that was superseded by the October 10 card and mobile-navigation correction. The Aster mark remains the desktop toggle, the preference is stored in localStorage under sidebar-collapsed and restored before paint, and the in-app "Chimesong Home" wordmark link is preserved. A slow amber inkblot (public/inkblot-mark.svg) drifts behind the navigation as ambient texture and holds still under prefers-reduced-motion.

The Feed grid was rebuilt from two oversized cards per row into a responsive layout of compact postcards. Its original four-column desktop setting was superseded by the October 10 correction, which caps wide layouts at three readable columns. The shared card frame, Signal rating, expand-to-read-full control, and post detail view are unchanged.

Local Mode and no-account access — 2026-10-09

You can now write and receive a normal Chimesong rating without creating an account. Online Local Mode uses the same validation, safety checks, AI scoring, explanation, and Chime presentation as the signed-in flow, while the result is saved only in this browser.

Local history, offline drafts, and local Play progress stay on this device. Offline writing is saved without inventing a score and can be rated when you are back online. Feed, Public Echo sharing, account settings, multiplayer, global leaderboards, and the protected Fluxfield Lab remain account-only. Creating an account is always your choice; Local Mode never silently uploads your writing.

Claude Sonnet 5.5 for Chimes — 2026-10-09

Chimesong's scoring, crisis checks, public-sharing moderation, report review, and sensitive-information checks now use Claude Sonnet 5.5 with Medium effort. Adaptive thinking remains internal and is not exposed in Chime responses.

This is a model/runtime migration. The existing prompts, 1–10 scoring scale, safety behavior, privacy boundaries, persistence, and API response shapes remain unchanged.

Adaptive voice personas — 2026-10-09

Serenity (formerly Poetic Philosopher) now uses more distinctive literary syntax, philosophical framing, controlled imagery, and emotional restraint on difficult days. Keziah (formerly Witty Friend) now uses more natural contemporary humor and slang on steady and positive days while substantially reducing comedy when an entry reflects pain or distress.

These persona changes affect how Chimesong presents a reflection, not its underlying numeric scoring criteria. Existing crisis and safety handling continues to take priority, and no other personas were redesigned.

Short reflections and clearer Rate guidance — 2026-10-08

Short day reflections are now accepted, with clearer guidance when Chimesong needs a little more context. A concise, meaningful answer such as “Today was good.” can now receive a Chime without being forced past an arbitrary character minimum.

Empty, unusable, and overlong entries receive accessible inline guidance attached to the writing field, including a link to daily reflection prompts when more context would help. Request, schema, and provider failures now use one stable retry message instead of exposing internal error text.

A one-time homepage launch animation — 2026-10-06

The homepage (/) now plays a brief, one-time launch animation on the first visit of each browser session: an amber ink drop blooms into the retired inkblot mark and resolves into the Aster logo, then hands off to the live page. It plays once per session (tracked with a cs_splash_v1 sessionStorage key), only on the homepage, and ?splash=1 forces a replay for testing.

Tapping or clicking anywhere skips it. prefers-reduced-motion — and the in-app reduced-motion and crisis-safety settings — show a static mark that crossfades out instead. The real homepage is fully server-rendered beneath the overlay, so crawlers and the LCP measurement are unaffected. The existing marks are untouched: the splash imports the Aster component and the real inkblot path rather than modifying the logo, inkblot loader, footer, or favicon.

Five living card styles for public echoes — 2026-10-05

The public echo style picker now leads with five living styles — Aurora Flow, Prism Foil, Cymatic Sand, Glass Chimes, and Ink Bloom — rendered with WebGL and Canvas. At most four cards (three on phones) animate at once, chosen by how much of each card is on screen; the rest show a frozen frame or a static poster, and every living style settles to a still frame under reduced motion or Quiet Sky.

The original seven styles, Prism Ripple, and Starweave move to a Classic section of the picker, shown in full below the living styles, and Prism Ripple now counts toward the same live-card limit. Echoes saved as Spotlight Chime or 3D Resonator display as Glass Chimes and Cymatic Sand, and sharing with an unknown style is now rejected. The share flow shows one live preview that follows the hovered or selected style and stays in view on larger screens, and Read full echo / Show less animate the card's height.

Five new public echo card styles — 2026-10-02

The public echo card picker gains five new Resonant Sky styles — Aurora Flow, Prism Ripple, Spotlight Chime, 3D Resonator, and Starweave — bringing the total to twelve. Each new style changes only the background technique (a simplex-noise aurora shader, a cursor-reactive ripple shader, a spotlight with a border beam, a perspective tilt, and a woven particle field); the shared card frame, Signal rating, layout slots, and persistence are unchanged.

Every new style falls back to a static Resonant Sky gradient under prefers-reduced-motion, and the selected style is still saved with each shared echo. The existing seven styles and the Signal rating logic are untouched.

Find Chimesong on social media — 2026-10-02

The public footer now links the verified Chimesong profiles on Instagram, Threads, Pinterest, and Bluesky, which use the Aster avatar. No product behavior or privacy setting changed.

New Selena voice (originally shipped as Aster Radiant) — 2026-10-01

Selena (originally shipped as Aster Radiant) is a new reflection voice in the Chimesong Voice system, available to all signed-in users. It is a high-energy, theatrical tone that celebrates loudly on good days and shifts into fierce, protective solidarity on hard ones, while keeping the same Chime scoring, calibration, and safety behavior as every other voice.

The new aster persona was added to the Voice settings and the persona registry. A database migration (20261001120000_expand_persona_constraint_for_aster) was applied to production so the new choice can be saved. Existing voices are unchanged and there are no breaking changes.

A more consistent Chimesong identity — 2026-09-30

Public Chimesong pages now use the Aster identity more consistently, and social preview cards for Chimesong and its reflection guides now better reflect the current visual direction.

This is a staged public-brand update rather than a universal rebrand: browser and app icons remain unchanged. No product behavior or privacy setting changed.

Easier navigation back to Chimesong Home — 2026-09-25

Signed-in users can now return directly to the Chimesong homepage. The desktop Chimesong logo links Home, while narrow-screen navigation starts compact with Home always available and an accessible control for expanding or collapsing the other destinations.

New Yuri voice and clearer Chimesong language — 2026-09-25

The reflection voice previously shown as Gentle Therapist is now Roseline (formerly Gentle Listener), with warm, attentive, curious, and explicitly non-clinical guidance.

Yuri (originally shipped as Shy Tsundere) is a new reflection voice with a playful, shy, and quietly caring tone. It changes the tone of the response while keeping the same Chime scoring and safety rules.

Current-access wording now reflects that Chimesong is currently free to use. There is no paid subscription available right now.

Reflection guides and clearer Public Echo sharing — 2026-09-25

How Chimesong works now gives a dedicated explanation of reflection, Chimes, private History, and optional Public Echo sharing.

Two new resources offer help without turning reflection into another task: How to reflect on your day provides a low-pressure approach without a streak, forced lesson, or required positive ending; Daily reflection prompts for real days offers a curated collection of questions for ordinary, mixed, unfinished, difficult, and good days.

Public Echo wording across Chimesong is now clearer: sharing is pseudonymous, moderated, and visible to other signed-in Chimesong users. Identifying details in someone's writing may still identify them.

Optional analytics notices — 2026-09-22

The Privacy and Cookie Policies are revised to version 1.2.0 to describe optional PostHog EU Cloud analytics, its consent choice, and browser/network data handling. Terms and Community Guidelines are unchanged.

Public launch

Chimesong is publicly live at chimesong.app. The service is online-only; human usability, assistive-technology, physical-device, provider, and field-performance validation continues as the service operates.

Pre-publish closeout — 2026-08-30

At the time, this was not a public release. The online-only localhost candidate had completed its feature-development scope; public-launch acceptance remained open.

Privacy and Cookie notices are updated to version 1.1.0; Terms and Guidelines receive disclosure corrections at version 1.0.1. Earlier automatic retention and backup-expiry claims are removed because those schedules were not implemented or verified. Account-linked consent deletion and surviving security audit records are now described explicitly. FAQ and accessibility text distinguish automated checks from uncompleted offline, physical-device, and screen-reader acceptance.

Cookie preferences can be opened from the landing footer, legal pages, and Settings. Optional analytics respects withdrawal and browser Global Privacy Control. Protected Feed content remains authenticated and is excluded from the public sitemap.

At the time, public launch still required human usability, assistive-technology, physical-device, production-origin, deployed-provider, and field-performance evidence.

Local release closure

The Resonant Sky interface and the bounded localhost release candidate are preserved in source control. That closure covered an online-only release scope, not PWA, offline, native-app, or public-production certification.

Historical draft — 2026-07-05

The initial legal/info pages, consent-record storage, and MDX documentation foundation were added during the earlier build. A push-subscription table and planned integrations did not establish a working notification service or deployment. Earlier lists of future features were proposals, not release promises.

Questions? Reach out to klarkkrampus@gmail.com.