Skip to content
Book a demoSign in

Changelog

What shipped, when.

Newest first.

Built with

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • Vercel
  • Supabase
  • Expo
  • Claude
v0.10.0June 13, 2026

Dashboard polish, mind map v3, and replies that never double

A pass of dashboard UX, a rebuilt patient mind map, and a fix that stops the agent from ever replying twice.

  • Added
    • Triage-sorted roster. Risk surfaces first with a pink edge, then unanswered, with pending patients sinking to the bottom, each carrying a new-activity dot.
    • Vitals strip on patient detail. Mood with its delta and a 14-point sparkline, last sleep, last contact with a presence dot, and texts in the last 7 days.
    • Sticky section nav with live counts, conversation day dividers with clock times, and skeleton loading rows.
    • Thought-pattern detection from reflections into the clinician evidence map, with neutral probes, verbatim snippets, confidence, and explicit review boundaries.
  • Improved
    • Mind map v3. Duplicate labels collapse into one node, sectors size by signal volume, the center ring tints to the latest mood, leaves fade by age, and pressing a hub jumps to the journal.
    • Keyboard support throughout. Enter adds a patient, Esc cancels a comment, focus rings on pills, rows, tabs, and inputs, and a Saved confirmation after edits.
    • Pending rows now state the concrete next step instead of sitting blank.
  • Fixed
    • The agent can no longer double-reply. Inbound messages dedupe by provider id, and a similarity guard regenerates a draft when it echoes the previous message.

A faster roster, a mind map that reflects signal volume and recency, and a fix so a redelivered text never triggers a second reply.

v0.9.0June 12, 2026

Clinician feedback loop and agent reasoning

Clinicians can steer the conversation now. A comment left on a message becomes guidance the agent follows on its next reply, and the agent reasons privately before it responds.

  • Added
    • Feedback loop. A clinician comment anchors to a specific message and is injected as guidance into the agent's next reply and check-in.
    • Chain of thought. Replies think privately first; the reasoning is logged and shown in the journal as a thought entry, kept separate from insights, risks, and wins.
    • A clinician profile block in the rail, with initials avatar, email, and sign out.
  • Improved
    • The conversation lives in a pinned scroll window that stays on the newest message, with a comment composer under each message.

Clinicians nudge tone and direction. The agent carries it into the next reply.

v0.8.0June 12, 2026

iMessage check-ins, and a clinician-only app

Patients stop opening a therapy app. They text. Nyra is now an iMessage companion that checks in every day and turns each reply into structured signal for the clinician, who works from a new care roster.

  • Added
    • Daily iMessage check-ins. A patient answers a morning text and one gentle nudge. No app to install, no account, keyed by phone number only.
    • Structured observation extraction from every reply. Mood, sleep, meds, symptoms, wins, and risk flags land in the patient record automatically.
    • Deterministic crisis handling. Crisis language short-circuits to 988 and 911 before any model is called.
    • Clinician care roster. Sign-in lands on /care, where a clinician adds a patient by phone number and reads the full conversation alongside its extracted signals.
    • Conversational memory, so each check-in remembers the last one.
  • Improved
    • Model routing now falls back across providers, so a check-in still goes out when the primary model is rate-limited.
  • Removed
    • The patient-facing app. The patient experience is the text thread now.

The Hawthorne problem, addressed directly. Care meets people in their messages and hands the clinician a clean read of the time between visits.

v0.7.0May 27, 2026

App rebrand to Nyra, portal consolidation, marketing site live

The product is Nyra now. The in-app marketing landing is gone, replaced by a unified Patient or Clinician portal. Marketing copy lives at nyra-landing as its own static Next.js site.

  • Added
    • Standalone marketing site at nyra-landing built on Next.js 16 + Tailwind v4. /docs (file-based CMS, sticky sidebar), /changelog (this file), /blog (file-based CMS), /waitlist (canvas starfield + email capture), full SEO surface (Metadata API, OG image generated at build, sitemap, robots, manifest, three JSON-LD blocks). 19 static routes, zero server runtime except the waitlist API handler.
    • In-app login portal at the root route. The marketing landing inside the Expo app is gone; / now renders the Patient or Clinician role chooser with legal acceptance gating both.
    • Role-aware Supabase email exchange. /api/auth/supabase-exchange now reads role + clinicId from the request body so the patient flow does not silently get bound to a clinician session.
    • SegmentedControl shared primitive in clinical-ui.tsx.
  • Improved
    • Workspace sign-in consolidated across patient and clinician into one entry point with shared validation, error states, and post-sign-in routing.
    • Voice agent UI state collapsed into one reducer per phase (idle / capturing / processing / sending / failed).
    • Patient sheet primitives (ClinicalScaleSheet, CrisisResourceSheet, LegalDrawer, PatientSettingsSheet) consolidated onto one ClinicalSheetScaffold so modal chrome stays consistent.
    • Clinician workspace shell tightened. DashboardShell + ClinicianSidebar render a 260px sticky nav on desktop, fold into the existing stacked layout below 1080px.
    • Route chrome (TopNav + SiteFooter) consolidated across home, blog, docs, changelog, waitlist.
    • App design tokens hardened. Inline rgba purged in favor of semantic ControlSize / DataDisplay / LayoutWidth / Motion / Opacity tokens. CI design-token-usage test added to keep it that way.
  • Removed
    • Stale /welcome and /explore routes in the app. Now redirects (/welcome preserves invite tokens to /patient).
    • In-app landing-evidence-map.png asset.
    • Stand-alone "Open the app" CTA on the marketing nav. The primary CTA is now "Join the waitlist" until the app ships publicly.
  • Fixed
    • Marketing footer was reading "988:call or text" and "911:emergency" after an over-broad em-dash sed pass. Now reads "988 · call or text" / "911 · emergency" / "Text HOME · 741741".
    • Waitlist hero was painted with bg-midnight which covered the site-wide gradient backdrop entirely. Section is now transparent so the orb composition stays visible behind the starfield, hero content centered vertically.

Nyra is live with a public marketing surface and a consolidated clinical app. Release gates (npm run release:verify:strict) and the TestFlight config validator (npm run release:check:eas) both pass. Only external Apple identity remains before a TestFlight build.

v0.6.0May 27, 2026

Clinician dashboard, one-time invites, warm welcome turn

The clinician workspace becomes desktop-first. Empty roster gets a real invite flow. The assistant's first turn now references the inviting clinician by name and the day of the 14-day arc.

  • Added
    • DashboardShell + ClinicianSidebar primitives. Desktop (≥ 1080px) renders a sticky 260px sidebar over the existing workspace; mobile keeps the stacked layout untouched.
    • One-time clinician invites. POST /api/clinician/invite mints an 18-character URL-safe access code (90 bits of entropy, ambiguous characters removed for typeability) with a 7-day expiry. signIn consumes the invite atomically; first valid use binds the patient to the inviting clinician's clinic and deletes the code.
    • ClinicianInviteCard replaces the templated setup-task list when the roster is empty. Generate → share (copy link or mailto) → live waiting indicator that flips to a success card when the first patient connects.
    • Sign-out path in the clinician dashboard shell.
    • /welcome explainer route plus a personalized assistant welcome turn that references the inviter's display name and the patient's day-of-arc.
  • Improved
    • inviterClinicianDisplayName persisted on the patient record at invite-consume time so the welcome turn can address the inviter by name without an extra lookup.
    • Patient screen reads invite tokens from URL params and pre-fills the access code field on the portal.
  • Security
    • Invite issuance + consumption now appear in the audit chain alongside every other state-changing action.

The clinician first run was a templated setup-task list on an empty roster. It is now a three-step flow that ends with a real patient connected. The patient no longer lands on credentials they have to guess at: an invite link carries the full context, and the assistant's first turn knows who sent them.

v0.5.0May 27, 2026

Per-table Supabase + postgres_changes + icon primitives

Storage normalizes across nine tables instead of one jsonb blob. Chat moves to postgres_changes. Every chrome surface picks up IconButton.

  • Added
    • SupabasePerTableStore writes to nine normalized tables (patients, sessions, audit_logs, direct_chat_messages, risk_events, push_tokens, plus three singletons) defined in docs/supabase-schema.sql. Hydrates in parallel; writes diff against the prior snapshot so each mutation touches only what changed. Append-only writers for audit_logs and direct_chat_messages.
    • postgres_changes subscriptions on direct_chat_messages, filtered server-side by patient_id. Replaces the manual broadcast helper for the chat path.
    • IconButton primitive in clinical-ui.tsx. Required label, 44pt minimum touch target (WCAG 2.5.5), default accessibilityLabel falls back to label text (WCAG 4.1.2). Wired across patient (Send / Send to care team / Open PHQ-9 / Open GAD-7 / Get crisis resources / Settings), clinician (Send / Save formulation), and shared sheets (Settings legal links + Sign out + Close, Crisis Call / Message / Close, Scale Submit, Legal accept / close).
    • TestFlight runbook in docs/testflight-runbook.md plus expo-notifications plugin in app.config.ts so EAS production iOS builds carry the APS entitlement automatically.
  • Improved
    • SupabaseStore retains the single-blob default. Per-table mode is opt-in via OPENMIND_STORAGE_MODE=per-table and auto-imports the legacy blob on first read so the flip does not lose data.
    • Probe scripts (`npm run release:check:supabase`) cover blob + per-table + Realtime in one command.
    • Patient view detox. PHQ-9 / GAD-7 severity labels still text, no emoji replacements; 988 and 911 still readable text in the crisis sheet; compliance pills still text.
  • Removed
    • Per-section atmosphere gradients on the marketing site, replaced by a single fixed-position site-wide composition.
  • Security
    • Service-role key stays server-only. Per-table writers never instantiate Supabase clients in the client bundle; CI guards this with the data-boundary verifier.

Storage stops rewriting one jsonb blob per chat message. Chat moves from the manual broadcast helper to postgres_changes, so updates land within ~200ms of insert. Chrome gains consistent icon and label affordances while keeping the clinical tenets: no medical-grade iconography, no icon-only safety affordances, compliance and severity labels stay as text.

v0.4.0May 26, 2026

Voice transcription, realtime chat, magic-link sign-in, push notifications

Three free-tier integrations land in one day. Groq Whisper for voice, Supabase Realtime for chat, Expo Push for notifications. Magic-link becomes an alternative sign-in path.

  • Added
    • /api/voice/transcribe wired to Groq Whisper (whisper-large-v3-turbo) on the free tier, with OpenAI Whisper as a paid fallback. Voice notes from the patient screen route through here with the patient session header.
    • Supabase Realtime broadcast helper. Direct-chat updates push to subscribed clients without polling.
    • Supabase magic-link sign-in via @supabase/supabase-js. Optional path alongside the clinic-identity credentials flow; exchanges to the server session over /api/auth/supabase-exchange.
    • Expo Push (free, via exp.host) for clinician chat notifications. Tokens register via /api/notifications/register; the server pushes when a clinician sends a message to the patient.
    • Single-row Supabase storage adapter (SupabaseStore) using direct fetch against the PostgREST endpoint. No SDK in the client bundle. Probe script (`npm run release:check:supabase`) round-trips a synthetic state through READ / WRITE / READ-back / DELETE.
    • FHIR R4 mapping plus HAPI public test server integration. Patient + Observation + Bundle export from the audit log.
    • EAS Build free-tier config validator (`npm run release:check:eas`) covers dev/preview/production profiles. Free-tier reminders printed inline (30 builds/month, simulator builds need no Apple account, etc.).
  • Improved
    • The 14-day assessment scheduler now auto-advances assessmentDay based on enrolledAt + current clock, so the patient sees the right prompt without server roundtrips.
    • Clinician scale trajectory chart + audit log browser (Waves 4.1 and 4.2 from the original roadmap) render against the live store.
  • Security
    • Service-role key gated to server; client bundle imports only the anon key, which respects RLS.

The infrastructure batch, all free tier by design: OpenRouter for the LLM, Groq for Whisper, Expo for push, Supabase for storage and realtime. Monthly cost stays zero until launch.

v0.3.0May 26, 2026

Real LLM replies, PHQ-9 / GAD-7, crisis sheet, legal gate

The patient screen gets a real assistant. PHQ-9 / GAD-7 administered with validated wording. Crisis escalation on item 9. Terms / Privacy / Medical Disclaimer required before workspace entry.

  • Added
    • Real LLM assistant replies via OpenAI / OpenRouter, with a deterministic local fallback when OPENMIND_MODEL_PROVIDER_READY is false or the upstream returns an empty completion.
    • PHQ-9 + GAD-7 questionnaire UI with the validated wording verbatim. Item-9 escalation on PHQ-9 immediately surfaces 988 and 911 as plain text.
    • Crisis resource sheet listing 988, 988 text, 911, Crisis Text Line (HOME to 741741), The Trevor Project, Veterans Crisis Line. Numbers always visible as text; never behind an icon.
    • Patient settings sheet with sign-out + legal placeholders + clinic identity row.
    • Tappable clinician roster rows that swap the active patient on the evidence map.
    • LegalDrawer plus Terms of Use, Privacy Notice, Medical Disclaimer documents. Acceptance gated before either patient or clinician workspace opens.
  • Improved
    • Patient sign-in flow surfaces the AI assistant's first turn automatically, so the workspace is never empty after consent.
    • Audit chain hash verification re-walks on hydrate.
  • Security
    • PHI claim regressions guarded by the verify-clinical-release-claims script. Any added file mentioning HIPAA / FDA / medical approval / diagnosis / medication-recommendation without an explicit negation fails the build.

The clinical batch: real assistant, real scales, real crisis paths, real legal acceptance. No new instrument invented, no clearance claimed that Nyra lacks.

v0.2.0May 26, 2026

Semantic token layer, async feedback, native agent learning architecture

Inline rgba purged. Skeleton / LoadingState / ErrorState / Toast primitives ship. Atmosphere collapsed from four ad-hoc gradients into one component.

  • Added
    • Semantic token layer + responsive type scale across the app design system. Components reference Spacing / Radius / Surface / Border / TextRole / Typography.scale.X.{mobile|tablet|desktop} instead of magic numbers.
    • Feedback primitives. Skeleton (text / tile / card variants with reanimated pulse), LoadingState wrapper, ErrorState with retry, and a Toast system (ToastProvider + useToast() + ToastRegion).
    • Async-aware patient screen. Skeleton + toasts + field errors + error states wired through the assessment turn submission path.
    • A11y roles, labels, and live regions on every clinical primitive (Pill / Surface / Stack / Pressable / ChoiceTile / etc.). Tab nav role correction for the web chrome.
    • Native agent learning architecture (NodeKind / EdgeKind / VersionMeta) plus the Codex parallel implementation.
    • Persona cards on the landing render two-column at tablet width with a11y labels on every CTA.
  • Improved
    • Atmosphere reduced from four ad-hoc per-screen gradient setups into one AtmosphereBackdrop component with a variant prop.
    • Clinician evidence citations grouped by source tier (clinical / research / public / patient) with the full set visible per group.
    • Clinician MiroFish completed-step IDs captured via a ChipInput instead of a free-text field.
  • Fixed
    • Clinician workspace lint cleanups across Codex parallel batches.
    • Deduplicated parallel ClinicianDiagnosisCapture type definitions that arrived twice.
    • Kept MiroFish free-loop helper single-sourced after the adapter regression bailout.

The "stop looking like a prototype" batch. Async surfaces stopped flashing empty, tokens replaced literals, and the agent-learning architecture landed natively so the clinician research panel could render against a real type system.

v0.1.0May 25, 2026

Initial scaffold + atmospheric monopo interface

First commits. App skeleton, domain modules, compliance gates, and the original monopo-inspired interface treatment.

  • Added
    • Expo Router scaffold for the patient + clinician app under apps/miro/.
    • Domain modules covering HIPAA posture, clinical compliance policy, evidence boundaries, instrument severity bands.
    • Patient + clinician + login screens with the initial design system (shared clinical-ui primitives, themed text and view, atmospheric backdrop).
    • API routes + server adapters. /api/auth/sign-in, /api/clinician/overview, /api/patients/[id]/evidence-map, /api/assessment/session and /api/assessment/turn, /api/scales/result, /api/compliance/*, /api/research/dossier, /api/mirofish/*. Server-side ClinicalStore abstraction with JsonFileStore + InMemoryStore implementations.
    • Evidence retrieval scaffolding plus the cleanup contract that pins what the prototype must not regress.
  • Improved
    • Atmospheric "monopo" interface treatment as the first cohesive look (later replaced by the editorial-orb direction).

The starting point. The look changed within days, but the contracts (audit chain, PHI boundary, store abstraction, compliance posture) date from these first commits and stuck.