Change Log — Web & App (traceability)
A single running record of changes across both surfaces — the web platform (marketing + web app + hub) and the native mobile apps — plus the backend/platform. It exists so anyone can trace what changed, where, when, and whether it crossed over between web and mobile.
Sources that feed this log: Design's CHANGELOG.md in each web pack, our integration pass (integrate.py), and the mobile app builds.
How web ↔ mobile sync works (read this first)
Design ships web-only packs (marketing index.html + web app.html + i18n/ + hub/). They contain no mobile code, so web changes do not automatically reach the native app. For every pack we check what actually applies to mobile:
| Design change type |
Crosses to mobile? |
What we do |
| Marketing footer / hero / layout, web-app chrome |
❌ No |
Nothing — web-only, separate native app |
Wording in the shared app section of i18n |
✅ Yes |
Re-sync those strings into the mobile i18n bundle |
| Brand tokens (phase colours, brand orange, fonts) |
✅ Yes |
Apply to the mobile theme.ts |
| A new product screen / feature in the app design |
✅ Yes |
Build it natively in the React Native app |
If something crosses over, we ship a fresh nutrisync-app-full.zip (OTA). If nothing does, we say so and only the web is pushed.
Who fixes what — Design vs Integration (ownership)
Design edits its own source canvas and re-exports a fresh compiled web bundle. It cannot ingest our integrated output as a new source, and it cannot produce backend/ops features. So we keep a clean split — Design owns the pixels, we own the wiring — and integrate.py bridges them on every export.
| Layer |
Owner |
Maintained by |
| Web visual / structure / navigation (incl. hub room nav) |
Design |
Fix in Design's canvas → re-export |
| Backend wiring, consent banner, admin live KPIs, error-hide |
Integration (here) |
integrate.py re-applies each export |
| Added hub pages (Translations tool, this Change Log, docs CTAs) |
Integration (here) |
integrate.py |
| Mobile app (screens, i18n, logo, theme) |
Mobile repo (here) |
nutrisync-app build → OTA |
Shared copy/wording (i18n/*.json) |
Shared |
Founders edit via the Translations page; kept EN-canonical |
Rule of thumb: ask Design only for design / structure / navigation. Do not ask Design to build the Translations page, Change Log, admin wiring, or consent — those live in the integration layer (and Design can't do the backend ones). Never upload our integrated build back to Design as a "source".
Open Design requests (for the next pack)
- ✅ Hub room navigation — delivered in the 0607v02.53 pack: room/tab changes now push History, so the browser Back button steps within the hub (tab → room → landing) instead of dropping to the landing.
- ✅ Web onboarding — Back on every step + Start over — delivered in 0607v02.53: Back on every step, a new "Start over" (resets to step 1, clears answers), and the browser Back button steps the wizard back.
- ✅ Web app — native "Back to site" exit — delivered in 0607v02.53: sidebar item + brand-rail pill + a Settings row (covers mobile). Our stopgap floating button now auto-disables when the native control is present (
integrate.py checks for it).
- ✅ Web app — bigger back controls — delivered in 0607v02.53: in-app back links are now 44px pills; onboarding back is 44px with a 24px chevron.
- ✅ Dev error overlay — root-caused — resolved in v11.1: the overlay only fires on a real asset miss; Design found the one genuine miss (a Figma-typo'd mood icon,
mischevious → mischievous), fixed it, and audited every dynamically-referenced asset — both pages now load with zero console errors. The #__bundler_err{display:none} rule is retained deliberately as a production safety net (a debug overlay should never reach users even if an asset regresses); nothing triggers it today.
All Design brief items are now closed.
Deploy channels
- Web: GitHub
nutrisync-web → Cloudflare Pages (auto-deploy on push).
- Mobile: GitHub
nutrisync-app → EAS Update (OTA, production channel) on push.
🏁 PO Review — Round 1 scoreboard (WEBFEEDBACK · updated each iteration)
Full triaged backlog: doc 15 — PO Review Round 1. W-numbers below match it.
| Wave |
Items |
Done |
Open |
| 1 · Bugs |
W1–W5 |
W1 W2 W3 ✅ · W4 ✅ (all three socials live) |
W5 verify |
| 2 · Pricing/stats |
W6–W9 |
W6 W7 W8 W9 ✅ (W6 it.2 per Pilar's decision; W7 already consistent in v11.42) |
— |
| 3 · Copy/assets |
W10–W14 |
W10 W11 W13 W14 ✅ (W14 explicit checkbox per PO; W13 mobile on official avatars) |
W12 web-side → Design (doc 12 §14) |
| 4 · Features |
W15–W19 |
W19 (pending PO re-test) |
W15 W16 W17 W18 |
| 5 · Figma polish |
W20–W24 |
W20 W22 W23 ✅ (Design v11.43 at source) · W21 ✅ · W24 ✅ (video section still awaits asset) |
— |
APPFEEDBACK (F1–F49 + Movement/NutriLog rebuilds) = Round 2, parked per Lucía; assets + Excel DBs received and inventoried.
Log (newest first)
2026-08-05 · r13 — StartUp Admin (quinta superficie) · po93→po98
- Nuevo módulo independiente
repos/adminsite → Pages nutrisync-admin → admin.nutrisynccollective.com. Contabilidad de partida doble del build: coste por proyecto y feature, presupuestos, libro diario, P&L, balance, ingresos diferidos (IFRS 15) y cierre con candado. Cero dependencias con webdeploy; lo único compartido es el acceso.
- Backend: 8 tablas
sa_* + 7 funciones, todas con is_sa_admin() — MFA sin cláusula de gracia, a diferencia del resto del hub. Ficheros 2026-08-05-startup-admin.sql y -v2.sql.
- IAS 38: investigación → gasto; desarrollo →
capitalization_review. Nada capitaliza automáticamente.
- Web: tercera puerta en el pie del marketing (
ns-admin-door), rejilla 2×2 con la ficha grande a doble ancho (ns-doors-grid) y columna de marca a 400px para que el ritmo del pie sea uniforme (ns-footer-brand).
- Hub: la página de MFA muestra ahora quién puede entrar en la contabilidad (
admin_mfa_readiness()) — antes nadie lo sabía: la RLS de admins es «lee tu propia fila».
- Calidad: pack nuevo
admin-tests.mjs (49) con gate de sintaxis del HTML servido, contrato RPC↔SQL, gating admin, sello de asset y comprobación de ORDER BY. web-tests.mjs pasa de 34 a 45.
- Mobile: sin cambios — esta iteración no cruza a la app.
1 Ago 2026 — Sprint 11 · Epic K construido: identidad completa · app v0.18.0 + web po37
(A partir de aquí, las iteraciones pasan a llamarse sprints.)
- Login nuevo (4B): Apple (id-token nativo, solo iOS) · Google (PKCE con navegador seguro) · código por email (OTP 6 cifras, crea cuenta) — y la contraseña plegada bajo "Prefiero contraseña", con manejo de email-sin-confirmar + reenvío. Cliente Supabase a
flowType: pkce.
- Biometría (3B): oferta única tras el primer login; BioGate al arranque en frío con Face ID/huella (SecureStore + LocalAuthentication); "Usar contraseña" como salida; jamás bloquea sin hardware enrolado.
- MFA admins (2A):
is_admin_mfa() — las 11 funciones admin exigen aal2 en cuanto la admin enrola su TOTP; página de alta en hub → 🔐 MFA (QR + verificación).
- Access log (K4):
log_access en cada arranque con sesión (plataforma+versión, retención 90 días) + admin_access_summary para el piloto.
- Build 3 además estrena el logo definitivo. Requiere: SQL 2026-08-01, consolas (runbook doc 30),
npx expo install de 4 dependencias y build+submit.
31 Jul 2026 — R10 (Lucía + Pilar): gráficas finales de Progress + logo definitivo · app v0.17.4-r10a + web po36
- Sección de gráficas rediseñada (spec de Lucía): tarjeta blanca con cabecera "Fase · Días X–Y", leyenda de hormonas fija arriba (no cambia entre estados) y tag interactivo: al tocar una curva aparece la píldora de la hormona (Estrógeno 🟡 · LH 🔴 · FSH 🟠 · Progesterona 🌹) y se oculta sola — el hit-test usa los polígonos reales extraídos de los SVG de Design (point-in-polygon en runtime).
- SVGs nuevos (Pilar): las 4 gráficas por fase + el frame mensual estático que nunca cambia (sustituye a la volatilidad).
- Logo final (
applogo2.svg): icono 1024×1024 regenerado — alas coral sobre crema. ⚠️ El icono es activo nativo: se verá en TestFlight con el próximo build (el de Epic K); las gráficas llegan ya por OTA.
- 1A·2A·3B·4B reconfirmadas por Pilar (ya registradas).
31 Jul 2026 — Decisiones de identidad APROBADAS (1A·2A·3B·4B) · web po35
- Founders aprueban el paquete completo de doc 28: Google+Apple Sign-In, MFA obligatorio para admins, biometría ofrecida tras el primer login, y contraseña en retirada suave para nuevas usuarias. Epic K pasa a ejecución (próxima sesión, fases A+B, un único rebuild nativo → TestFlight build 3). Decisiones de pagos (5-8) pendientes.
31 Jul 2026 — Doc 29: propuesta de pagos y suscripciones · Epic L · web po34
- Propuesta en profundidad: dos raíles obligados por mercado (IAP de Apple/Google dentro de la app — 15-30%; web libre a ~3-5% con Stripe o Paddle-MoR) unificados en RevenueCat → webhook → tabla
subscriptions en Supabase + is_premium() para las puertas RLS. Flujos completos de alta (app y web), renovación con gracia, cancelación vía stores/portal (nunca ticket) y baja elegante sin borrar datos. Cobertura inicial EUR/UK/USA/CA/AUS; LATAM por fases (métodos locales solo con cohorte real). Integración de diseño inventariada (doc 12 §22: paywall, patrón candado, Suscripción en Ajustes, success, pricing web). Prerequisito duro: el raíl web necesita la sociedad (doc 19); el móvil puede arrancar con la cuenta individual. Epic L en backlog; 4 decisiones a founders. Aclaración: AWS no juega aquí (no tiene motor de suscripciones de consumo).
31 Jul 2026 — Doc 28: propuesta de identidad y autenticación · web po33
- Propuesta formal para founders: Google + Apple Sign-In (en pareja — regla del App Store), OTP por email como método sin contraseña y vía de recuperación, biometría como app-lock (patrón SecureStore + local-auth; la sesión y su caducidad no cambian), passkeys en watchlist en lugar de construir push-approval a medida, MFA TOTP obligatorio para admins y access log mínimo (90 días, solo admins) para saber quién accede durante el piloto. Fases A/B con un único rebuild nativo; matriz de prueba OTP/Apple/Google por cohortes (recomendación del partner para Indonesia). 4 decisiones pedidas a founders.
31 Jul 2026 — Content-i18n fase 2: el motor diario en los 14 idiomas · SQL l12
2026-07-31-content-i18n-l12.sql (⚠️ aplicar tras la fase 1): primera pasada de los 4.896 textos restantes — consejos, señales del cuerpo, citas y valores típicos en fr, it, ca, de, nl, el, val (AVL), gl (RAG), eu (batua), oc-aranés (gascón, prioridad de revisión nativa), zh y ja.
- Sin cambios de app ni web: la app ya pide su idioma; las revisoras corrigen en hub → Translations → Contenido.
- Con esto, todas las superficies y todo el contenido dinámico hablan los 14 idiomas — cierre completo del frente de traducciones (queda solo revisión humana).
31 Jul 2026 — Content-i18n fase 1: el motor diario habla español · SQL + OTA + web po31
- SQL
2026-07-31-content-i18n.sql (⚠️ aplicar): tabla content_text, ns_daily_recs(p_date, p_lang) con fallback EN (clientes antiguos siguen en inglés sin romperse), RPCs de edición admin y primera pasada ES completa: 408 textos — los 60 consejos del día, las 40 Señales del cuerpo con sus citas, y los valores típicos (ánimo/energía/flujo/recuperación).
- App (solo JS → OTA, misma versión 0.17.4): NutriLog y Movement piden las recomendaciones en el idioma de la app.
- Hub → Translations → sección "Contenido del motor diario": las revisoras ven EN + ES editable (y los 12 idiomas restantes vacíos para la fase 2); guardar es soltar el foco. Vacío = inglés.
- Con esto, la queja de Pilar queda cerrada al 100%: interfaz (v0.17.4) + contenido (esta fase) en español.
30 Jul 2026 — R9 (feedback de Pilar): español completo en cliente · app v0.17.4 + web po30
- Catálogo ES explícito al 100%: los 208 nombres de alimentos/movimientos con traducción española revisada (adiós al fallback de paréntesis, que fallaba en "unsweetened", "general session", etc.) + alérgenos, intensidades y valores de recuperación.
- Preferencias nutricionales: nota introductoria, tipos de dieta (reutilizan las claves ob.* del onboarding, ya en 14 idiomas) y alérgenos, todo mostrado en el idioma de la app.
- NutriLog/Movement: badge "MENSTRUAL · DÍA 4" compuesto con claves, valores de Ánimo/Energía/Flujo (Regular/Baja/Ligero…), chips de síntomas (Cólicos, Hinchazón, Fatiga, Dolor de cabeza) e intensidades (Moderada…) traducidos.
- Pendiente conocido (server): los textos del Consejo del día / Señal del cuerpo / citas vienen del CONTENIDO en base de datos (solo inglés hoy) — content-i18n es fase propia del backlog; no se arregla en cliente.
30 Jul 2026 — Guía Builders para founders + feedback→email
- GUIA-Builders-Founders.html (raíz del proyecto, para compartir): cómo entrar (PIN Cloudflare + cuenta de la app; sin contraseñas compartidas), dónde está el feedback (Consola Admin → App Feedback / Pilot → sección 3) y mapa de las 7 secciones con URLs directas.
- Feedback → email sin vendors: Edge Function
feedback-email que envía por SMTP del propio buzón IONOS (feedback@ se lo escribe a sí mismo) + trigger pg_net con token en Vault (2026-07-30-feedback-email.sql). Cero proveedores nuevos, cero DNS — descartada la variante Resend. El guardado en el hub nunca depende del email.
- Buzones nuevos: review@/contacto@/feedback@ — ⚠️ crear también alias contact@ (es el publicado en app, web y legales).
30 Jul 2026 — Gestión del Piloto: cohortes + invitaciones por lotes + feedback segmentado · web po28
- SQL
2026-07-30-pilot.sql (⚠️ aplicar en Supabase): tabla pilot_invites (email→cohorte→estado proposed/approved/invited/joined) + RPCs admin admin_pilot_propose/set_status/overview/feedback — mismo modelo de puertas que la waitlist; "dentro" se detecta solo al crearse la cuenta.
- Hub → página Pilot (card 🚀 en Builders + pestaña): segmentar la waitlist (origen/antigüedad/conversión), proponer lotes por cohorte (advisory, wave-1…), validación de founders, export CSV TestFlight y copia de emails para Play; feedback in-app etiquetado por cohorte.
- Doc 27 — Estrategia del Piloto: cohortes, mecánica ASC (Internal founders / External por cohorte, CSV import), métricas GTM semanales y ritual de decisión entre olas.
- Incidencia de build: un escape unicode corrupto en integrate.py vació index.html y el hub gateado durante el empaquetado — restaurados de po27 y bloque reescrito con snippets planos (sin secuencias de escape). Verificado: 0 ficheros vacíos, nav completo.
29 Jul 2026 (noche) — 🚀 Primera build en TestFlight · cuenta Apple PROPIA aprobada
- La cuenta Apple Developer individual fue aprobada a mitad del proceso — el puente Warnigo se descarta sin usar.
com.nutrisync.app no estaba disponible (registrado en otro team) → bundle definitivo com.nutrisynccollective.app (iOS y Android), alineado con el dominio.
- v0.17.3 (build 1) subida a App Store Connect — ficha "NutriSync" (App ID 6796082357), team G9W35DBZW9, certificados y provisioning gestionados por EAS.
- API Key de App Store Connect (rol APP_MANAGER) creada y guardada en EAS → próximos submits sin login de Apple ni 2FA.
- Siguiente: grupo "Founders" en TestFlight Internal + invitaciones.
29 Jul 2026 — Panel de Feedback en la consola admin · web po26
- Descubierto al responder "¿a dónde va el feedback?": la app escribe en la tabla
feedback y el RPC admin_feedback() existía desde R3-49, pero ningún panel del hub lo llamaba — los mensajes se guardaban sin que nadie pudiera leerlos. Añadido panel "App Feedback" a la consola admin (misma sesión/patrón que admin_kpis; solo allowlist de admins). No hay ningún correo implicado; el único buzón público sigue siendo contact@nutrisynccollective.com.
29 Jul 2026 — Paridad PWA ↔ app auditada · app v0.17.3
- Auditoría estática + revisión en vivo de m.nutrisynccollective.com (v0.17.2 confirmado desplegado: peach bg ✓, calendar fix ✓, catálogo ✓, ES ✓, manifest standalone ✓, service worker ✓).
- Fix crítico:
Alert.alert NO existe en react-native-web — los 16 avisos de la app (errores de guardado, "Period logged", confirmaciones de borrado de datos…) eran no-ops silenciosos en la PWA. Nuevo notify() multiplataforma (Alert nativo / alert-confirm web) aplicado en las 8 pantallas.
- BackHandler del onboarding con guard (el stub web podía romper el cleanup).
- Subtítulos de Login/Signup y aviso del Notification Center pasados por t() (quedaban en inglés con la app en ES) — claves en/es.
- pwa-kit:
viewport-fit=cover en el postprocess (safe-area correcta en iPhones con notch en modo standalone).
- Divergencias menores aceptadas y documentadas:
adjustsFontSizeToFit es no-op en web (posible desbordamiento leve en textos de metas/moods) y el gráfico CAS History usa width % (correcto en web, estable en nativo).
29 Jul 2026 — TestFlight vía Warnigo listo para build · app v0.17.2-tf1
app.json apunta al bundle interino com.warnigo.nutrisync.beta (nunca com.nutrisync.app bajo Warnigo), icono 1024×1024 de marca generado (faltaba — bloqueaba el submit), export compliance pre-respondido.
- Doc 26: runbook completo ES — eas build/submit con Apple ID de Warnigo, ficha ASC, Internal vs External testing, OTA, y plan de migración a la cuenta NutriSync definitiva.
29 Jul 2026 — Calendario en una pantalla + fix raíz PWA + mobile-first · app v0.17.2 + web po23
- Bug raíz de la PWA encontrado: un
<Svg> con absoluteFill pero SIN width/height cae al tamaño por defecto del navegador (300×150) en react-native-web — en nativo se mide bien, por eso solo se veía en la PWA. El hero naranja del Calendario "encogía" y los chips Avg cycle/Avg period quedaban fuera de la tarjeta. Fix: tamaño medido por onLayout (válido en ambas plataformas) + color de respaldo. Mismo fix en PeachBg (fondo de Welcome/Login/Onboarding). Auditoría del resto de la app: ningún otro Svg sin tamaño.
- Calendario compactado a una pantalla: 16 espaciados reducidos (hero, toggle, leyenda, tarjeta del mes, celdas, márgenes) — el mes completo cabe en un móvil estándar.
- Leyenda de fases en una fila: los 4 chips (Menstrual/Follicular/Ovulatory/Luteal) reparten el ancho con flex, sin salto de línea.
- Mobile-first (decisión founders): la web-app deja de estar enlazada desde marketing — todos los CTAs "Open the app" llevan ahora al registro de la waitlist (scroll + focus al email). app.html sigue accesible para builders vía hub. Bloque idempotente ns-mobile-first en integrate.py para futuros packs de Design.
29 Jul 2026 — Catálogo ×12: primera pasada de traducción · app v0.17.1 + web po22
- Los 208 nombres de catálogo pendientes (alimentos, movimientos, categorías) ahora tienen primera pasada de traducción en los 12 idiomas restantes (fr, de, it, nl, el, ca, val, gl, eu, oc-aranés, zh, ja) — generada por ingeniería como borrador, con variantes valencianas reales (creïlla, bresquilla, clòtxines, titot, bajoqueta) y léxico gascón para el aranés (milhòc, arraga, higa, vairat).
- Estado: BORRADOR para revisión de las revisoras en el hub → Translations (sección catalog). Nada está marcado como final; cualquier corrección en el hub prevalece en el siguiente pack.
- Merge triple: packs web (hub), mob3_keys.json (pipeline) y catálogos móviles ×12 → la app muestra los nombres traducidos desde ya (v0.17.1).
29 Jul 2026 — Round 8 (r8b part 2) · app v0.17.0 — the i18n sweep
- Content catalog ×14: the app now bundles the hub catalog (foods, movements, categories, conditions, symptoms — 341 entries/language) and shows food/movement names in the app language. Canonical values stored in Supabase stay English (CAS/analytics parity). Fallback trick: the founders' Excel names embed Spanish in parens ("Apple (Manzana)") — ES shows the parenthetical, other languages the clean English, until the hub fills real translations.
- Hardcoded strings routed through t(): Settings menu + section titles, Notifications & Reminders (all rows + subs), Edit Period symptom sections (Pain/Digestion/Cravings/Skin) with translated chips, sleep/birth-control options, the 12 mood labels, sex-log rows, meal types (f34: Breakfast/Lunch/Dinner/Snacks). EN + ES shipped; 12 languages pending via hub.
- f18: Sign In & Security shows the REAL device name (expo-constants) and drops the placeholder "MacBook Pro" row — only real sessions listed until server-side session listing ships.
- Hub: new
mob3_keys.json merged by integrate.py (ns-mob3-i18n) — the Translations tool now lists the 201 catalog names + new mob.* keys; empty values mark pending and never overwrite.
- f23 (calendar hero on device) queda pendiente de verificación de los founders en dispositivo real.
29 Jul 2026 — Round 8 (r8b part 1) · app v0.16.1
- f40: hormone charts regenerated from Design's NEW Frame SVGs (no weekday labels; monthly
monthly-cycle-hormones at the same width as weekly).
- f36: "Most Recommended" is now PHASE-aware (matches the phase-fit intensity — yoga tags on menstrual days), not list position.
- Locale dates (f9/f10/f26/f27 part): new
localeTag() — weekday strip, "Día N", "Volver a hoy", month names and both mini-calendars now format in the APP language; edit-calendar weekday row alignment fixed (exact 1/7 widths).
- Home strings translated: "ciclo sincronizado ✓", "añade tu regla para sincronizar" (EN/ES; rest via hub).
- r8b part 2 (next session): bundle the ×14 CATALOG (foods/movements/conditions/diets) from the web packs into the app + route the remaining hardcoded Settings/symptoms strings through t() — the bulk of f5/f14–f22/f31/f33–f35; plus f18-Settings real device names and f23 hero device re-check.
29 Jul 2026 — Round 8 (r8a): period-edit correctness · app v0.16.0-r8a
- Editing the period start to an earlier date is a CORRECTION (updates the current cycle row — the inserted-row approach was invisible to the server: root cause of "nothing updates"). Client/server share the same current-cycle rule; Settings · Cycle & Health no longer blanket-updates all history rows; every tab refetches the cycle on focus; Calendar maps dates to their own cycle, future keeps counting, pre-history back-projects.
- Also: onboarding research consent persists to the Data & Privacy toggle; keyboard insets on the logs; confirmation orb without outer rings; assorted layout/label fixes. Full detail: doc 25. The 20-item i18n sweep is scheduled as r8b (next session).
26 Jul 2026 — Hotfix v0.15.1: stray text node in Movement Log (same class as v0.14.2)
- Inline JSX comment after left literal spaces as a text node (R7-f10 edit). Comment moved to its own line. Repo sweep clean; this stray-node grep is now part of the standard pre-package verification.
26 Jul 2026 — Round 7: auto-restart fully dead + CSS v2 · app v0.15.0-r7 + 1 SQL migration
- Server no-wrap migration (
2026-07-26-r7-cycle-no-wrap.sql): the recommendations RPC wrapped the cycle day at the length (NutriLog/Movement showed day-1 content) AND picked the cycle row without ORDER BY. Calendar today/past now uses the actual day too; pencil opens "Edit period start date".
- CSS v2 per the founders' formula (baseline = first full cycle, PMS-symptom severe days, locked until reliable — never a default 100); stat block shows CAS · CSS; nutrition needs ≥3 checks for full marks; real session counts.
- Design assets: per-phase hormone SVGs (+ volatility on monthly), btn-history, edit-3, nav icons fill-fixed and bigger.
- Full detail: doc 24.
25 Jul 2026 — Hotfix v0.14.2: stray text node in GoalOrb
- "Text strings must be rendered within a component" on the goal-orb screens: an inline JSX comment left two literal spaces as a text node inside the orb View (R6-f19 edit). Comment moved to its own line; repo-wide sweep found no other occurrences.
25 Jul 2026 — Design v11.48/49 integrated (web po17): baseline ladder designed on the prototype
- Design delivered the §21 wireframes AS working prototype UI, on both the phone and desktop-dashboard Progress renderings: ring-motif stat states (Building n/7 amber ring → Provisional dotted-ring + pill → solid green), coral→amber "Baseline set" celebration card with Nutri, and the dual comparison line ("vs your first week" → "vs last cycle") with a 7-dot pre-baseline tracker. Includes a clearly-marked demo scrubber (Preview · days logged) so reviewers can walk the ladder without an account — prototype-only chrome.
- Full integration re-run on the fresh pack; all ns-* blocks verified.
- Offer noted from Design: port the same ladder into the web app (
app.html) Progress — ACCEPTED, requested for the next pack (keeps desktop web app in parity with the mobile app's v0.14.1 ladder).
24 Jul 2026 — Baseline ladder: first-week empty states become the product's first goal · app v0.14.1
- Post-R6 UX proposal implemented (f15/f16 follow-up). The dead first-week states are now a progressive ladder: days 1–2 show baseline progress ("n/7"), days 3–6 show provisional values in amber (real data, honestly labelled), day 7 freezes the personal baseline (first-7-days averages, derived — no schema change) with a "✨ Baseline set" card, and the CAS comparison reads "↑x vs your first week" (green/red) until the first full cycle unlocks "vs last cycle".
- Copy is provisional (EN+ES shipped) — founders refine it in-app; Design owes the 3-state stat-row wireframe (doc 12).
24 Jul 2026 — Round 6: 20/20 in one batch · app v0.14.0-r6a
- Blocker fixed: Cycle Stability now computes its OWN score (Energy 45% + Mood 45% + PMS 10%, per the developer scope) instead of mirroring the CAS; gauge reshaped (open bottom, volatile-red→aligned-yellow angular gradient, knob + centre number).
- Bugs: "Back to Home" crash after logging (wrong navigator route), keyboard lingering over the confirmation.
- Design-asset sweep: crisp vector nav icons, "Logged & Syncing" confirmation per reference, exact calendar-hero radial (uncut), year view legible (dark numbers — they were white-on-cream — + phase dots + 2-column grid), vector streak markers, brighter Progress palette to spec, saturated hormone hills with the mid-week "V" fixed.
- Full scoreboard: doc 23. Two expected empty states flagged for re-test with data (f15/f16).
23 Jul 2026 — Design pack v11.47 integrated (web po15) + LH recolour in app
- v11.46/47 from Design: prototype synced to the shipped-app tokens (ring progress arc + 6-stop palette, white score card under flat header, View History, Movement rename, neutral calendar with per-phase radial badges) — this kills the false-mismatch diffs; hormone legend chips fixed (FSH/Progesterone were swapped).
- Design decisions returned: LH → #D93030 (applied to the app chart, ships with v0.13.2); year view = tint-only at 12px (matches our call); waves = parametric spec (4 ellipses rx≈1.15R/ry≈0.28R, waterline at score%) — pending founders' choice vs the exact Ellipse-SVG shapes they requested in R5-f2; app keeps the exact SVGs meanwhile.
- Full integration re-run on the fresh pack (all ns-* blocks reapplied: Access-first, QR→PWA, growth panel, pricing polish, ob/mob i18n sections, docs overlay).
23 Jul 2026 — Translation debt cleared: 155 mobile strings into the i18n pipeline · app v0.13.2 · web po14
- Audit found 155 mob./ui. strings accumulated since Round 3 that lived only as EN fallbacks in code. All now in the catalogs: EN as source of truth, ES fully hand-translated, and the other 12 languages auto-filled where an existing translation matched the same English string (~17/lang); the rest awaits native review.
- Hub Translations tool gains sections "App mobile strings (R3–R5)" and "App shared UI" — reviewers translate there next to onboarding/marketing, Export → merged → OTA.
feedback/r45-strings-skeleton.json is the offline alternative.
- New integrate.py block
ns-mob2-i18n keeps these keys flowing into future Design packs.
23 Jul 2026 — v0.13.1: visible app version in Settings
- Settings now shows "NutriSync vX.Y.Z" at the bottom — testers can confirm they're on the current build before filing feedback (root fix for the stale-build churn that produced 16 duplicate items in Round 5).
23 Jul 2026 — Round 5 (r5a): ring re-spec + exact wireframe assets · app v0.13.0-r5a
- 16 of 25 items were Round-4 duplicates (testers on a pre-v0.12.x build) — marked re-test. The 9 real items shipped in one batch; full detail in doc 22.
- Highlights: ring is a true progress arc again (grows daily, badge rides the tip, closes at day ≥ length and stays closed until a period is logged) with the new bright palette; waves are the exact Ellipse 259–262 vectors; nav labels root-caused — they were painted INSIDE the icon PNGs; icons re-cropped caption-free (originals in archive/misc/navbar-labeled-icons). Recovery→Movement, hormone palette, per-phase radial calendar badges, neutral year view, btn-notes pill, single notes entry point, exact streak-off vector.
23 Jul 2026 — Round 4 batch r4e: Progress wireframe parity · app v0.12.5-r4e — ROUND 4 COMPLETE (30/30)
- f28+f23: header is now FLAT solid coral
#E4572E (title + greet + PHASE·DAY badge only); the Cycle Alignment Score moved to its own white/cream card below — coral arc on a light track, score in dark text, comparison ("↑x vs last cycle") in green.
- F18: the 5 component circles are tappable → modal with the founders' exact copy per component (what it measures + the concrete action to raise it), current/max shown in coral.
- F19: hormone chart rebuilt — Estrogen yellow, LH red/coral, FSH orange, Progesterone light mauve; each hill has a gradient fill fading to transparent; solid 2px stroke on top; legend moved ABOVE the chart; current day still highlighted on the x-axis.
- f22+f25: Cycle Stability gauge is a continuous red→orange→yellow gradient arc (also in low-data states — no more flat gray), white knob at the score position, zone words volatile · aligned · stable (no coloured dots, no purple/green).
- f24: component rings thinner (4.5px) with lighter labels. f20: Current/Last cycle/Best values in bold coral. f21: populated Energy/Mood/PMS percentages in green. f27: active period tab = bold coral text, no white pill.
- f26 (decision): View History stays; wireframe update requested from Design.
- New
mob.*/explainer strings ship with EN fallbacks; translations follow via the hub Translations tool.
- Round 4 closed: 30/30 items. Post-round: rebuild the PWA (parity) and re-test 059 on current builds.
23 Jul 2026 — Round 4 batch r4d: logs + settings polish · app v0.12.4-r4d
- f16: weekly-streak "missed day" now uses the wireframe's own Nutri asset (
Group 1171289069 → assets/nutrilog/streak-off.png) in Meal + Movement history.
- f17: saving a meal or workout now opens a proper confirmation screen — green ✓, "Logged!", "recorded and counts toward today", with Log more and Back to Home buttons (replaces the 1.8s toast that auto-vanished).
- f29 (root cause found): the Security screen's 2FA rows rendered the icon KEY as literal text — that was the stray "sms" and the doubled "Face ID" ("faceid" text + "Face ID / Touch ID" label). The map param also shadowed the i18n
t. Real SettingsIcons now, all rows aligned on a 30px icon column (sessions rows included).
- f30: Choose-your-Nutri selection ring is a fixed 126px circle hugging the avatar, always centred (it used to trace the outer grid cell).
23 Jul 2026 — Round 4 batch r4c: onboarding goal bubbles + Calendar parity · app v0.12.3-r4c
- F1: the onboarding NutriGoal step is now a big swipeable gradient bubble (GoalCarousel: swipe or arrows, dots, the shown orb IS the selection, first goal auto-selected) using the exact wireframe radial gradients — same component as Edit Health. Canonical EN values untouched → i18n and DB parity intact.
- Bonus bug found & fixed: onboarding's NutriGoal was silently NEVER saved — the old code referenced an undefined
userId inside a swallowed try/catch. Now persisted with the real auth user id after saveOnboarding (errors surface).
- F13: Calendar hero card now uses the wireframe radial — FF7000 core (to 23%) → FF5509 edge (SVG radial, rounded 30).
- F14: date circles are neutral
#FFFAF9 with ink numbers (subtle border; today keeps the orange highlight); phase colour no longer floods the dates.
- f15: NEW cycle-day badge at the top-left of every date — small phase-coloured circle with the cycle-day number (menstrual uses the wireframe gradient DE2A2A→CA4848→CE4A49→FF664F); sex-day stars unchanged.
23 Jul 2026 — Round 4 batch r4b: Home wireframe parity · app v0.12.2-r4b
- Ring rework (f4/f5/f6/F3/f7/f8): fixed small gap at the upper-left (never a closed loop, never a variable pie); gradient along the arc with the darkest maroon at the TOP-RIGHT lightening to pale orange toward the gap; day badge FIXED at the start of the gap (left, over the white section) — only its number changes; centre phase text up to 34pt; waves with stronger pink/orange/maroon layering; soft faux-radial white→warm glow behind the ring (concentric circles — avoids the react-native-svg RadialGradient web banding). Drag-to-preview kept (updates text + badge number).
- f2: shared
screenGrad background — full-coral #FE5936 at the very top fading to white, transition concentrated near the top — applied to Home, NutriLog, Movement Log, Progress and Log Symptoms.
- F11: new
GoalOrb component with the EXACT wireframe radial gradients per goal (PMS FD410C→FF820B→FFA51E · balance FE7FD4→FF5509 · energy FF5813→FF0086); Edit Health now uses it (onboarding picks it up in r4c/F1).
- F9: tab-bar icons enlarged 34×30 → 40×35.
- F12: mood/energy slider drag made much more responsive (threshold 8→3px, 22px per step) — sliding, not just tapping.
23 Jul 2026 — Round 4 batch r4a: logging persistence + manual cycle restart · app v0.12.1-r4a
- F10 (bug) Symptoms DID save but never reloaded:
getTodayLog didn't select the rich fields (mood_state, pain/digestion/skin symptoms, cravings, libido, sex_logged, notes). Now selected → Edit Period prefills today's log, fully editable and re-saveable.
- f31 (feature) "Log period" button on the Log Symptoms screen → mini calendar (Sunday-first) → picking a date starts a NEW cycle at Day 1 from that date. Each period start now inserts a new
cycles row (real cycle history); cycle_length becomes the rolling average of the last ≤6 actual cycle gaps (15–60d sanity window), feeding Progress + the algorithm with real data.
- f31 (engine) New
cycleDayActual — the day counter NEVER auto-wraps at day 28; it keeps counting (29, 30…) until a period is logged. All "today" contexts switched (Home, logs, notifications, Progress, CAS ctx); calendar forecasting keeps the modulo for future-date predictions. phaseForDay treats past-length days as luteal, cycleProgress clamps the ring at full.
- 059 Verified not a regression: nav labels are off in shipped code since v0.10 — testers were on a stale build; asked to re-test current.
- No DB migration needed (
cycles already supports multiple rows per user).
19 Jul 2026 — Doc 20: Community Moderation Policy draft template (web po11)
- New doc 20 (ES working draft + EN public mirror): purpose, allowed/forbidden, eating-disorder & crisis protocols, moderator action ladder, reporting mechanics (auto-hide on 2 reports, 24/72h SLA), identity/privacy, publish checklist. Contains 8 ⚠️ DECISION markers for founders — resolving them + lawyer varnish gates Wave 5 (Community WF-7). DRAFT — not published, not legal advice.
19 Jul 2026 — po10: PWA in architecture docs + pricing section polish
- Pricing (marketing): fixed CTA alignment (a second
margin-top:26px was overriding margin-top:auto — buttons now pin to the card bottom at equal height), enterprise card lifted (warm #FFFDF8 bg + shadow), coral ✓ glyphs on feature lines. Interim patch ns-pricing-polish in integrate.py; source fix requested from Design (doc 12 §19).
- Architecture as-built now states the dual role of
m.nutrisynccollective.com: 4th product surface and the current dev/testing channel (TestFlight substitute while Apple enrollment is pending; parity by construction; rebuild after every OTA).
19 Jul 2026 — Hub Translations tool: App onboarding section (web po9)
- New App onboarding (mobile + PWA) section in the hub Translations tool: the 76
ob.* onboarding keys are reviewable per language next to Marketing/Web-app/Catalog, with the same edit-on-device + Export flow. Source of truth: _integration/ob_keys.json, merged into all 14 web i18n packs by integrate.py (marker ns-ob-i18n).
- Fixed a pre-existing tool bug: it fetched
va.json / oc-aran.json while the published packs are val.json / oc.json — Valencià and Aranés were silently starting blank instead of showing the machine first pass.
- Reviewer flow: pick language → section "App onboarding" → correct → Export → hand the JSON to Engineering → merged into the mobile catalogs and shipped OTA. The
feedback/ob-translation-skeleton.json file remains as an offline alternative.
19 Jul 2026 — Wave 1 of the Q3 dev plan (F5 + G3-phase-1 + onboarding i18n) · app v0.12.0-w1 · web po8
Backend (2 SQL migrations — snapshot first):
- 2026-07-19-waitlist-convert.sql — F5 handoff: waitlist.converted_at column, an auth.users INSERT trigger that stamps it whenever a waitlisted email registers (works across all four surfaces, no client code), backfill for existing users, and admin_waitlist() now returns converted_at.
- 2026-07-19-admin-growth.sql — admin_growth() RPC: last-12-months signups + waitlist per month, plus totals (users / waitlist / converted). Aggregate-only, no PII, gated on public.admins.
Web (po8):
- Waitlist dashboard: new App user column (✓ when the signup registered), sortable, in CSV export, plus a "Now app users" stat card.
- Admin console: new Growth — real actuals panel (12-month users vs waitlist bars + totals + waitlist→user conversion %) and Model assumptions panel — monthly growth %, premium share %, ARPU editable, saved per device (localStorage), 12-month projection table vs the Conservative plan. Both wired via integrate.py (marker ns-growth, idempotent across Design packs).
Mobile app (v0.12.0-w1, OTA + PWA rebuild):
- Onboarding i18n engine: every onboarding string (sections, questions, helpers, option labels/sublabels, beta welcome, consent, all-set) now renders through ob.* keys with English fallback. Canonical option values stay English — display-only, so onboardingMap/Supabase parity is untouched.
- 76 ob.* keys translated into all 13 non-EN catalogs (ES hand-written; FR·DE·IT·NL·EL·CA·VAL·GL·EU·Aranés·ZH·JA machine-first-pass, pending native review). ob-translation-skeleton.json produced for founders/Design review.
- EN copy fixes in the wizard: "You're data"→"Your data", "reaserch"→"research", "Prefrences"→"Preferences", "Im"→"I'm".
- Release gate: the language selector already only offers bundled catalogs; the MT first pass ships silently behind English defaults until founders sign off the EN copy (then per-language review).
Post-mortem note: none — no incidents this wave.
2026-07-19 · Backlog sweep + target architecture (doc 19 B3)
- Old-backlog sweep folded the orphans into the corporate plan's Missing list: consent service (D1–D3/D6), wearable connectors (Epic E), push delivery, waitlist→onboarding handoff (F5), admin business tracker (G3), community (WF-7), remaining 7 language packs + CJK font. Doc 03 stale statuses corrected (F7 domain ✅, D8 cookies ✅, B1 partially ✅).
- Appendix B3: post-migration target architecture diagram (Cloudflare edge unchanged → ALB → ECS Fargate API/auth/workers → Aurora Multi-AZ in private VPC with KMS, S3, Secrets Manager, CloudWatch/OTel; region eu-central-2 Zurich) with the what-changes/what-doesn't contract.
2026-07-19 · Launch readiness + AWS scale-up plan (doc 19 Appendix B, Epic K)
- Bilingual production-readiness task list added to the corporate plan: payments, observability, hardening (incl. backup restore drill + PITR), staging+CI, store pipeline, compliance/support ops — and the AWS migration reframed as TRIGGER-based (with the Supabase-dedicated intermediate step first), with a concrete cutover plan when it fires. Backlog Epic K.
2026-07-19 · Corporatisation plan (doc 19, EN+ES)
- New backlog Epic J + doc 19 · Corporate Migration Plan: phased task list (P0–P8) to move everything to NutriSync-owned accounts — Workspace, GitHub org with repo transfers (incl. the Pages re-connection gotcha), Cloudflare/Supabase/Expo, Organization Apple + company Play, IONOS, team password vault — with the 3+1 access matrix, plain-language "what each platform is for" (GitHub/Cloudflare/Supabase/Expo/stores/IONOS/working folder/backups), and Built·Missing·Production-changes summary. Bilingual; standalone HTML in the working folder.
2026-07-19 · Ops hygiene: working folder, auto-archiving, rollback runbook (doc 18)
- Dedicated Cowork-connected working folder
~/SKG_AI_Tribe_Projects/NutriSync (inbox/releases/design-packs/feedback/backend-sql/tools/archive/repos); Downloads decommissioned and cleaned (1.6GB of project history sorted in: 94 archived builds, 37 design packs, all feedback rounds, 14 SQL migrations; two stale duplicate git clones verified clean and removed).
- Deploy scripts rewritten: consume from
inbox/, auto-archive every deployed zip to releases/ (web, app AND pwa-dist). Rollback = old zip → inbox → re-run; Cloudflare Pages additionally offers one-click rollback to ANY previous production deployment (no numeric limit, verified in current docs).
- Backup policy: working folder → Google Drive excluding
repos/ (GitHub is the code backup). New doc 18 · Ops Runbook is the canonical reference for all of it.
2026-07-19 · Dedicated working folder (platform hygiene)
- New shared workspace
~/SKG_AI_Tribe_Projects/NutriSync (Cowork-connected): inbox/ (builds to deploy) · releases/ (every version, rollback points) · design-packs/ · feedback/ · tools/ (the 3 .command scripts + PWA kit) · backend-sql/ (migration history) · repos/ (git clones). Deploy scripts rewritten to consume from inbox and auto-archive to releases. Backup to Google Drive: everything except repos/ (GitHub is the code's backup). Downloads is out of the workflow.
2026-07-19 · Builders "Access" page (web)
- Build:
nutrisync-web-1807_v11.45-po5.zip — new hub/access.html (behind Access itself): the 7 allow-listed emails with owner labels, how the email+PIN login works, where to manage the list (Zero Trust policy — live source of truth), and the note that public.admins (Supabase) is a separate list for KPIs/feedback. Pill added to the gated hub nav.
2026-07-19 · PWA synced to v0.11.0 (m.nutrisynccollective.com)
- "Build NutriSync PWA" re-run from the r3f source: the full Round-3 app (all 56 fixes) is live on the 4th surface. Exactly 3 files changed on deploy (re-hashed bundle + index + versioned SW) — parity by construction, cache-safe by design.
2026-07-19 · R3 batch I — v0.11.0-r3f (OTA): Onboarding + two-step activation. ROUND 3 COMPLETE
- R3-51 ✅ (D1) two-step activation: signup accepts any email, but the account only activates via the verification link. App ships the "Check your inbox" panel with resend + friendly handling of unconfirmed logins. Requires the dashboard toggle: Supabase → Authentication → Providers → Email → "Confirm email" ON.
- R3-52 ✅ "None of the above" mutually exclusive with conditions · R3-53 ✅ PMOS in onboarding steps · R3-54 ✅ diet "Other" opens a free-text field (stored in new
users.diet_other — run diet-other.sql); DIET map completed (gluten-free/dairy-free/other no longer collapse to 'none') · R3-55 ✅ three NutriGoals in onboarding too · R3-56 ✅ consent pillars use red outline line icons (cycle/salad/lock), beta-welcome hearts stay (approved copy).
- Round 3: 56/56 items closed across v0.10.0→v0.11.0 (6 OTAs, 2 SQL migrations, 1 dashboard toggle). All releases archived in
releases/ for rollback.
2026-07-19 · R3 batch H — v0.10.4-r3e (OTA) + feedback table (SQL)
- R3-45 ✅ Nutri save button full-opacity coral · R3-46 ✅ chosen Nutri propagates: Home refreshes the profile on every tab focus (gate already fetched per open).
- R3-47 ✅ emoji sweep: Sign-in & Security (key/SMS/FaceID/phone/laptop line icons), Data Privacy (lock banner + download icon), Community Privacy banner → green
#E8F7F0 box with #2D6A4F text + icon · R3-48 ✅ stray roadmap note under Active Sessions removed.
- R3-49 ✅ Send Feedback = in-app screen → new
public.feedback table (RLS insert/read own; founders read via admin_feedback() RPC gated on the existing public.admins allowlist). Requires feedback-table.sql in the SQL editor. mailto: hand-off gone.
- R3-50 ✅ + R3-55 (partial) Health Profile/NutriGoals: gradient bg, date header, grey subheading, per-goal gradients, swipe left/right, lock icon (no emoji), allergies/conditions moved out (live in Cycle Health), save errors no longer silent — and the goal list is now the founders' three (4th removed; onboarding side lands with Batch I).
2026-07-19 · R3 batch G — v0.10.3-r3d (OTA): NutriLog + Movement CTAs
- Root cause found: the "+ Log a meal / + Log movement" buttons EXISTED but sat at bottom:18 — underneath the floating tab bar. Lifted above it (R3-38/42). "Missing button" reports were the nav bar covering them.
- R3-39/43 ✅ "History ›" links on both tabs (Meal History / Movement History screens were built but unreachable); post-log "synced" confirmation already in place; missed days now show the blue Nutri in both histories.
- R3-40/41 ✅ line-icon SVGs above FUEL/VITALITY and SESSION/STEPS (no emojis), "Movement basics" header + "Each one boosts your cycle sync score" subheading.
2026-07-19 · R3 batch F — v0.10.2-r3c (OTA): Progress rebuilt
- R3-29 ✅ orange hero card with name greeting + PHASE·DAY badge, CAS ring inside (white on orange).
- R3-30 ✅ "↑x / ↓x vs last cycle" once a completed cycle exists · R3-31 ✅ 4th ring relabelled Recovery · R3-32 ✅ zero-value rings show full track, no floating dot.
- R3-33 ✅ Cycle Stability = simple band-coloured ring (volatile/stable/aligned) with score centre + Current/Last/Best beside — speedometer gauge dropped.
- R3-34 ✅ Energy Stability / Mood / PMS Symptoms row with REAL values (per-metric stability from logged series, PMS rate from symptom logs; honest "—" under 7/3 logged days). New lib fns
seriesStability, fetchPmsRate.
- R3-35/36/37 ✅ 4 hormones (Estrogen, LH, FSH, Progesterone) as filled mountain curves, Mon–Sun labels with today highlighted, W/M/Y as segmented pill.
2026-07-19 · R3 batch E — v0.10.1-r3b (OTA): Calendar rebuilt
- R3-18 ✅ page header: back · Calendar · pencil → Cycle Health (edit period dates).
- R3-22 ✅ week starts SUNDAY app-wide in calendar (founder decision D2) · R3-23 ✅ date numbers in solid phase-coloured circles, future days outlined · R3-19/20/21 ✅ knob on the bar track, "→ phase begins in Xd", period as range.
- R3-25…28 ✅ Year tab = "Cycle History": big year + Nutri, orange stats bar with REAL values (cycles tracked / avg length / ±variance from logged history, honest "—" before enough data), real-time text search over phase episodes with pagination ("Show more", bounded client derivation; SQL RPC path noted for scale), numbered coloured mini-months, current month highlighted, own layout.
- R3-17 ✅ complete sex days on calendar: ★ protected / ☆ unprotected (new
fetchSexDayTypes).
2026-07-19 · R3 batch 1 — v0.10.0-r3a (OTA) + versioning policy
- Versioning starts: app now semver'd (
0.10.0); every release zip is kept in releases/ as a rollback point (baseline app-v0.9.0-baseline-r2k-source.zip archived first). Rollback = deploy the previous release zip via "Deploy NutriSync App".
- 048/R3-01 ✅ nav bar icon-only (labels removed — they duplicated the captions baked into the icons).
- 041/042/043/R3-06 ✅ Home ring rebuilt to the reference: always-visible gap (≤94%), gradient mapped along the arc (maroon start-cap → bright tip), day badge riding the arc tip.
- R3-07 ✅ smooth continuous scrub · R3-08 ✅ battery green once logged (resets daily) · R3-09 ✅ score card styled · R3-10 ✅ multicolour waves.
- R3-05 ✅ eternal-loading fixed: onboarding check now has an 8s timeout + cached last-known state — boot always resolves.
- R3-12 ✅ gate: gradient bg, chosen Nutri (placeholder photo removed), slide hardened, save errors surfaced.
- R3-14/15/16/17 ✅ (app side) log symptoms: real date, gradient, notes editor from header pencil, reloads today's log, save failures alert instead of silently discarding. Calendar sex-stars follow in Batch E.
- Decisions: D1 two-step activation · D2 week starts Sunday · D3 professional text search (paginated, lazy) — multimodal added to backlog.
2026-07-19 · PO Review Round 2 ingested (app)
- Founders' full-app pass (56 findings + 26 screenshots + 3 corrected reference images) triaged into doc 17 as R3-01…R3-56 in 9 build batches, plus 3 founder decisions (email verification, week-start day, year-search scope). Verified against the current OTA — all findings current. Execution starts with Batch A (global chrome) + the two data-loss majors (symptoms persistence R3-17, boot hang R3-05).
2026-07-18 · Footer QR now points to the mobile PWA (web)
- Build:
nutrisync-web-1807_v11.45-po3.zip — QR asset regenerated to encode https://m.nutrisynccollective.com; tile click opens the PWA. Doc 12 §18 asks Design to adopt at source.
2026-07-18 · 4th surface live — mobile PWA at m.nutrisynccollective.com
- Surfaces now: responsive web app · mobile PWA (new) · RN iOS · RN Android — all on the same Supabase.
- The PWA is the RN app itself rendered via react-native-web (Expo web export): parity by construction, rebuilt with "Build NutriSync PWA.command" (kit: date-picker web shim, CSS PeachBg override, PWA manifest + versioned service worker, installable full-screen). Deployed with wrangler to Pages project
nutrisync-m.
- Build-pipeline lessons baked into the kit: wrangler skips
node_modules paths → font assets moved to assets/vendor with bundle rewrite; rewritten bundles re-hashed so immutable caching can never pin a stale build; SW only caches valid responses and falls back to index on navigations only.
2026-07-18 · Access-first entry for Investors/Builders (web)
- Build:
nutrisync-web-1807_v11.45-po2.zip (supersedes po1)
- Footer Investors/Builders buttons now link straight to the hub pages, so Cloudflare Access (email + one-time PIN) is the login — the in-page 6-digit screens are no longer reachable from the public site.
- The hub's inner 123456 gate auto-unlocks on the custom domain (Access already authenticated); on any other host it still asks the code.
- All 28 hub pages now carry a canonical-host script: visits via the
pages.dev alias bounce to nutrisynccollective.com, so the unprotected alias no longer bypasses Access.
2026-07-18 · Design pack 1807_v11.45 — footer QR at source + disclaimer fix
- Build:
nutrisync-web-1807_v11.45-po1.zip (supersedes all v11.43-po* builds)
- Design delivered doc-12 §15 at source (v11.44+v11.45): footer QR in the top block, 94px white tile, caption ×14 (
ftScan), custom-domain URL, evenly distributed columns. Our provisional QR now auto-disables (integrate.py skips injection when the pack carries ftScan).
- EN/ES disclaimer regression fixed at source ("Made with care in Madrid." — Singapore/Thessaloniki gone in all 14 languages).
- Still open at source: §16 support email (pack ships
hello@; our layer patches to contact@ each build).
2026-07-18 · Platform — branch protection on main ✅
- GitHub rulesets
protect-main (Active) on nutrisync-web and nutrisync-app: block force pushes + restrict deletions on the default branch. PRs deliberately NOT required — the one-command deploy scripts push directly to main.
2026-07-18 · Platform — Zero Trust on /hub/* ✅
- Cloudflare Access now gates
nutrisynccollective.com/hub/* server-side: Founders email allowlist + One-time PIN by email, 24h sessions (free plan). Verified end-to-end (allowed email in, foreign email denied). Doc 14 updated with the live config + admin instructions. 123456 stays as inner soft layer; www→root redirect closes the side door; pages.dev alias keeps only the soft gate.
2026-07-18 · Custom domain live + live waitlist counter (po8 → po9 hotfix → po10 QR)
- Build:
nutrisync-web-1807_v11.43-po10.zip (supersedes po7/po8/po9 — delete them from Downloads)
- Footer QR (new) — scan-to-open tile next to the store buttons; encodes
https://nutrisynccollective.com/app.html (provisional in the integration layer; doc 12 §15 asks Design to adopt it at source).
- Domain 🎉
https://nutrisynccollective.com is live on Cloudflare (nameservers moved from IONOS; pages.dev stays as alias). Docs/hub links updated to the new domain. Pending user checks: Supabase Auth Site URL + reset.html redirect, and MX/email delivery test.
- W8-live —
waitlist_count() RPC (baseline 140 + signups since 14 Jul) drives the public "140+" stat on marketing + investor pages; static text remains the no-JS fallback.
- 🐛 po9 hotfix — po8's counter script used a document-wide MutationObserver; when the RPC returned exactly 140 it rewrote "140+" with the same value, each write re-fired the observer → infinite loop → "Page Unresponsive" and sections/footer missing (race-dependent, both domains). po9 only writes when the number actually changed (>140) and re-sweeps on a bounded 10×1s timer instead of an observer.
2026-07-17 · R2-K — final APPFEEDBACK cleanup (mobile)
- Build:
nutrisync-app-r2k-cleanup.zip (OTA — contains all batches)
- F49 ✅ Onboarding diet options now include Gluten-free, Dairy-free and Other.
- F20 ✅ New onboarding step after nutrition preference: "What's your primary goal?" with the four NutriGoals; the choice persists to
users.nutrigoal and immediately drives the recommendation engine's +2 goal ranking. (Swipe-carousel styling = Design polish pass.)
- F18 ✅ The Nutri now floats (gentle 3.2s loop) on the onboarding screens.
- F25 ✅ Check-in gate: mood/energy respond to slide gestures (drag up = higher, down = lower); taps still work.
- F1 ⚠ confirmed open — onboarding questions/options are hardcoded EN in
steps.ts (chrome is translated, content isn't). Needs a steps↔ob i18n mapping pass — queued with the next translation round alongside the new NutriLog/Movement labels.
2026-07-17 · Round-1 final answers wired (web)
- Build:
nutrisync-web-1707_v11.43-po7.zip
- W4 ✅ complete — footer socials all live, new-tab: Instagram (@nutrisync.collective), LinkedIn (company page), TikTok (@nutrisyncc).
- W14 final copy — the consent checkbox now carries the founders' exact wording: "Yes, I want NutriSync updates — launch news, cycle-nutrition tips, and first access to the app." (+ "Unsubscribe anytime." retained for GDPR hygiene).
- Privacy policy confirmed in progress on the founders' side (unblocks F17 T&C links when it lands); barcode feasibility answered — closed on their side; video still pending, section stays out.
2026-07-17 · R2-I + R2-J — Calendar & Progress rebuilds (mobile)
- Build:
nutrisync-app-r2ij-calendar-progress.zip (OTA — contains all prior batches)
- R2-I Calendar: F3 ✅ every day computed from the shared lib/cas phase math · F22 ✅ grid always renders full 7-column weeks (Saturday restored) · F20b ✅ header stats show the user's real avg cycle/period values · F21 ✅ soft-wellness restyle: coral/sage/golden/lavender palette, floating white card, segmented cycle progress bar with day knob + "phase begins in N days" note, translucent stat cards, small muted dots, dashed predicted days, orange-gradient today · F4 ✅ Month/Year toggle (12 mini-months, tap-to-open), phase filter chips (highlights matching days) and ★ marks on intimacy-logged days.
- R2-J Progress: F21b ✅ CAS ring fill = exact score/100 · five live component mini-rings from daily_scores · F20c ✅ "Movement" not "Fitness" · F19b ✅ "+X vs last cycle" appears only once a completed cycle exists · F22b ✅ Cycle Stability gauge (Volatile/Stable/Aligned needle from mood/energy consistency — a different metric to CAS, honest "keep syncing" state under 7 days) · F24b ✅ View History → dedicated screen with Weekly/Monthly/Yearly + the dev-spec progressive unlock (1 cycle / 2 cycles / 90 days), coral line chart with gradient fill, Current/Average/Best rings, Avg/High/Low/Improvement stats, dashed-border avg-by-phase bars + auto-generated phase insight · F26b ✅ weekly predicted hormone curves (estrogen/progesterone), Monthly/Yearly honest empty states · F25b ✅ Energy/Mood/PMS frame removed · F27b ✅ bullet tips removed.
- All values computed from real daily_scores/daily_logs — nothing fabricated; empty states everywhere data is insufficient (dev-spec rule).
2026-07-17 · R2-H — Home rebuild: interactive cycle ring (mobile)
- Build:
nutrisync-app-r2h-homering.zip (OTA)
- F26 ✅ (core) New
CycleRingInteractive: progress runs clockwise from 12 o'clock with rounded caps; the arc uses the exact spec gradient (#570B18 5% → #BD1833 18% → #D34D64 30% → #FF3519 40% → #FE4E28 59% → #FCAD5E 71%, drawn as 72 smoothly interpolated segments — SVG has no angular gradient), remainder white; white knob carries the day number.
- F7 ✅ The ring is a scrubbable timeline — drag anywhere on the band to preview any day; day number, phase name and knob position update live; "Back to today" chip restores. Preview only — no data is written.
- F6 ✅ Fill fraction = day/cycle-length (e.g. day 18 of 28 ≈ 64%).
- F26 text-fit ✅ Phase name auto-scales and never touches the ring; wave illustration fixed in the lower half, clipped inside the ring.
- F24 ✅ The energy/mood check-in never auto-opens; a battery button (segments = today's energy) sits at the ring's top-right and opens the Gate.
- Remaining F26 nuance for the founders' next pass: exact typography weights/spacings vs the reference screenshot — flagged for their visual check. F25 (slide-to-log inside the Gate) queued with the Gate polish.
2026-07-17 · R2-G + Round-1 answers wired (web + mobile)
- Builds:
nutrisync-web-1707_v11.43-po6.zip · nutrisync-app-r2g-navbar-avatars.zip (OTA)
- PO answers: ① LinkedIn URL → W4 ◑ footer icon live, new tab (IG/TikTok pending) · ② official Nutri avatars delivered · ③ W14 ✅ waitlist consent = explicit checkbox, injected next to the email input, submission gated, GDPR wording · ④ video "not yet" — section stays out · ⑤ PMOS confirmed (already shipped).
- W12/W13 + F41 artwork ✅ (mobile) —
NutriAvatar now renders the official PNGs (red/pink/yellow/blue; legacy 'coral'/index values mapped); picker grid, Settings header, Personal Info and Home all on official art. NutriLog/Movement daily-tip characters now match the user's chosen Nutri (per-variant art). Streak dots → official day_complete/day_incomplete. Web-side swap → Design (doc 12 §14).
- F12 ✅ (R2-G) — nav bar rebuilt: Design's line-icon set, floating pill bar, taupe → accent-red #E4572E active, order Calendar · NutriLog · Home (centre) · Movement · Progress, label "Home".
2026-07-17 · R2-F — Settings batch F39–F48 (mobile)
- Builds:
nutrisync-app-r2f-settings.zip (OTA) · backend/2026-07-18-r2f-users-fields.sql (additive: users.username, users.gender)
- F44 ✅ BLOCKER — text fields typed one letter at a time. Root cause: the
Field component was declared inside the screen component, so every keystroke re-created it and React remounted the input, dropping focus. Hoisted to module scope — typing is continuous.
- F40 ✅ Tapping the Nutri profile (Settings header + Personal Info photo) opens Choose Your Nutri.
- F41 ◑ Picker now loads the saved selection and saving reflects everywhere (Home avatar included). The final Nutri artwork swap still waits on the approved asset files (W12/W13).
- F42 ✅ Selection = thin coral circular outline (was a filled rounded square).
- F43 ✅ "Cycle & Health Information" now opens its own page (new screen: cycle anchors + contraception + conditions) instead of Edit Period.
- F45 ✅ Age shown directly under the name (computed from DOB).
- F46 ✅ Personal Information now: edit-photo→Nutri, first/full name, username, email (read-only), DOB, gender, height, weight + link card to Cycle & Health. Saves tolerate the columns migration not being applied yet.
- F47 ✅ "Send Feedback" row (Preferences) → opens a pre-addressed email to contact@nutrisynccollective.com.
- F39 ✅ All Settings emoji icons → clean SVG line-icon set (
ui/SettingsIcons); Design can swap paths in place for their final set.
- F48 (general fidelity) stays open — it is the umbrella item, closed by the remaining rebuild batches.
2026-07-17 · R2-E — APPFEEDBACK quick wins (mobile)
- Build:
nutrisync-app-r2e-quickwins.zip (OTA, supersedes r2d zip — contains everything)
- F5 ✅ Home avatar was a hardcoded
pravatar.cc stock photo → now the user's chosen Nutri (new shared ui/NutriAvatar used by Home + Settings picker).
- F8 ✅ Home buttons renamed → "Log symptoms" / "NutriGoals".
- F13 ✅ Onboarding back control: double chevron « → single ‹.
- F14 ✅ Next button no longer shows two arrows (locale labels ship "Next →"; trailing arrows stripped since we render the SVG arrow).
- F15 ✅ "Start over" removed from all onboarding steps per PO feedback.
- F19 ✅ Finishing onboarding lands on Home — root cause: the tab navigator had no
initialRouteName, defaulting to the first tab (Calendar).
- F23 ✅ Bell icon removed from Home header (Notification Center stays reachable via Settings).
- Parked with reasons: F17 T&C links need the privacy-policy page to exist first (queued with the "Make privacy policy" item); F12/F18/F20/F24–F26 are part of the bigger Home/onboarding/nav rebuilds, next batches.
2026-07-17 · R2-D — Movement Log 4-screen rebuild (mobile)
- Builds:
nutrisync-app-r2d-movement.zip (OTA) · backend/2026-07-18-r2d-movement-logs.sql (new movement_logs table, RLS-owned)
- Screens 1+2 — Daily Tip / Body Insight (movement context: recovery need, quote), SESSION 0/1 + STEPS stat cards (steps honest "—" until wearables), grouped checklist (Strength / Cardio / Flexibility & Recovery / Daily Movement, top 6 each) with individual selection + "+ Other" custom activity → closes the remaining half of W2 on mobile. Highest checked intensity still feeds workout_logged/CAS (Scoring Rule 1: more checks ≠ more points).
- Screen 3 — free-text Log Movement, keyboard-safe, history icon → screen 4.
- Screen 4 — Days Logged + Weekly Streak cards; days merge color-coded checked activities and session notes, phase pill per day.
- Content from
ns_daily_recs.movement_basics + movement tips/insights; wireframe character assets.
2026-07-17 · Design pack 1707_v11.43 — all 7 source requests delivered
- Builds:
nutrisync-web-1707_v11.43.zip (integrated) · nutrisync-app-r2c-nutrilog.zip includes the ×14 PMOS/mobile crossover
- Design fixed at source: marketing copy ×14 (native translations) · PMOS ×14 · W20 battery energy UI · W22 progress card (Current/Weekly/Best, honest empty rings) · W23 auto-cycling hero wireframe · team photos on local assets · Edit Period/movement integrity fixes. Doc-12 items 1–13 all closed.
- Integration layer verified: patches now no-op where Design fixed at source (W3/W9/W10/W11/W24f silent); still applying our downstream-only layer (W6 pricing, W1 forgot-password, W21 day strip, prototypes→Builders move, founder tools, consent, KPIs).
- Mobile crossover: all 13 locale app sections re-bundled (native PMOS labels); caught + fixed
es.json still shipping "SOP" at source (flagged back to Design).
- Round 1 scoreboard: 20 of 24 closed. Remaining: W4 (URLs), W12/W13 (Nutri assets), W14 (consent decision), W15–W18 (sequenced with Round 2), W24 video half, W5 PO re-test.
2026-07-17 · R2-C — NutriLog 4-screen rebuild (mobile)
- Builds:
nutrisync-app-r2c-nutrilog.zip (OTA) · backend/2026-07-18-r2c-meal-type.sql (additive: meal_logs.meal_type)
- Screen 1 · Daily Tip — "Today" header, Daily Tip/Body Insight tabs, tip card with live phase-day badge + wireframe character asset, Nutri Basics stat cards (Meals Logged x/3 FUEL · Hydration 1.8L VITALITY), "Check off what you eat today" checklist grouped by category (wireframe's 4 first, content team's 5 extra after; top 6/category), wireframe checkbox assets.
- Screen 2 · Body Insight — insight card, tappable Mood/Energy/Flow quick-log pills (persist to daily_logs), Today's Symptoms multi-select tags, rotating quote card, same checklist.
- Screen 3 · Log Meal — Breakfast/Lunch/Dinner/Snacks tabs, live food search over
content_food, free-text notes, keyboard-safe input (fixes F31), history icon → screen 4. Barcode = future (PO feasibility check pending).
- Screen 4 · Meal History — Days Streak + Weekly Streak dot cards, reverse-chron days with phase pill and per-slot sections incl. "No entry" states, + Log New Meal.
- All content flows from
ns_daily_recs — diet/condition/goal filtering is server-side and shared with web. New lib/recs.ts client. New i18n keys fall back to EN pending the next translation round.
2026-07-17 · R2-B — recommendation engine (Supabase RPC)
- Deliverable:
backend/2026-07-18-r2-reco-engine.sql — the POs' 7-step algorithm as SQL functions, one endpoint for web + mobile.
ns_segment_for_day (pure, testable) · ns_current_segment (user's cycle row, RLS-invoker) · ns_food_candidates / ns_movement_candidates (segment→diet→condition filter, +2 goal/+1 condition/+HormonalBC-boost ranking) · ns_daily_recs(date) → one JSON: segment, rotated daily tips + body insights (both contexts), food-of-the-day (rotates over top-7 ≈ no repeat within a week, zero history storage), full Nutri/Movement Basics grouped by category.
- Tested on real Postgres before delivery (pglite): 28-day sweep → clean 10-segment partition; vegan+PCOS profile → 85 candidates, 0 diet violations; full RPC returns all 12 keys. R2-A content verified live via REST (153/48/100).
- To apply: doc-11 runbook — snapshot, run the file in the SQL editor; smoke-test queries are at the bottom of the file.
2026-07-17 · Round 2 kickoff — R2-A content schema (Excel → Supabase)
- Deliverable:
backend/2026-07-17-r2-content-schema.sql (372 statements, transaction-wrapped, re-runnable)
- Tables (all RLS: public read, service-role-only writes):
content_segment (10 cycle segments), content_goal (3), content_diet (8), content_condition (10 incl. Hormonal-BC layer), content_food (153 items · 9 categories · segment/goal/diet/condition tags · Spain notes), content_movement (48 items · 4 categories · intensity-matched), content_tip (100: 60 daily tips + 40 body insights incl. rotating quotes — 10 segments × 3/2 variants × nutrition+movement; v2 fixed a duplicate-key from the sheets' section rows).
- Encodes the POs' recommendation algorithm inputs verbatim (segment→diet→condition filter, goal +2 / condition +1 ranking, 5–7-day no-repeat) — the engine itself lands with the NutriLog/Movement rebuilds.
- To apply: doc-11 runbook — Supabase snapshot first, then run the file in the SQL editor; verify query is embedded at the bottom.
2026-07-17 · PO Round 1 — Iteration 5 · F16 PCOS → PMOS (web + mobile)
- Builds:
nutrisync-web-0607_v11.42-po5.zip · nutrisync-app-pmos-fix.zip (OTA)
- Context (verified): PCOS was officially renamed PMOS — polyendocrine metabolic ovarian syndrome on 12 May 2026 by a 56-organization coalition (Endocrine Society, AE-PCOS et al.). PO instruction: display PMOS wherever PCOS appeared.
- Data contract preserved: stored canonical keys stay
PCOS/pcos so no existing user rows break; only display labels change. Mobile norm() aliases the legacy token so old logs still match.
- Web: condition chips show PMOS in every language (translated label when present, PMOS fallback otherwise); ES label SOP → PMOS; demo onboarding options updated.
- Mobile: Edit Health chip now PMOS + legacy alias; ES label updated.
- → doc 12: translators to provide the localized PMOS terminology for the other 12 languages.
2026-07-17 · PO Round 1 — Iteration 4 (web) · W21 circular day strip
- Build:
nutrisync-web-0607_v11.42-po4.zip
- W21 ✅ The day-of-week strip (Home, Edit Period, Check-in — one shared component) now renders circular day buttons (aspect-ratio circles, evenly spaced) instead of full-width rectangles; today's highlight keeps the orange gradient. Stopgap note: final component styling still belongs to Design's Figma pass (doc 12).
2026-07-17 · PO Round 1 — Iteration 3 (web) · W2+W3 data integrity
- Build:
nutrisync-web-0607_v11.42-po3.zip
- W3 ✅ Edit Period pre-fills — Flow no longer defaults to "Medium" nor Mood to "Content"; nothing is selected until the user taps, and mood saves
null (not [null]) when untouched. Mobile app checked — already clean.
- W2 ◑ Movement integrity — "Mark as done" now writes one honest session row (session title) instead of fabricating a checked row per session part; the "This week" list no longer shows hardcoded demo workouts as ✓Done for live accounts (they render as planned). Remaining half — per-activity selection + "Other" free-text input — intentionally deferred: it ships with the Round-2 Movement Log 4-screen rebuild (wireframes + assets already delivered), rather than hacking selectable rows into a screen about to be replaced.
- CAS unaffected (it reads
workout_logged, not the checklist), so scores stay consistent through the change.
2026-07-17 · PO Round 1 — Iteration 2 (web) · W6+W7 pricing
- Build:
nutrisync-web-0607_v11.42-po2.zip
- Decision (Pilar, 17/7): "solo el standard tier que es 4.99 y employer the same."
- W6 ✅ Marketing pricing: Free/€0 card removed (grid collapses to Premium + Employer), Premium €5.99 → €4.99/mo. Employer €35–50 unchanged.
- W7 ✅ Investor tab verified already consistent in v11.42 (B2C Basic €4.99/mo · Premium €12.99 from M13 · B2B ≈€48/employee/yr) — the Free/Plus/Care contradiction in the feedback was from an older build. No change needed.
- Also carries the W11 headshot fix (stale UUID asset →
assets/team/co3_sq.png).
2026-07-17 · PO Round 1 — Iteration 1 (web)
- Build:
nutrisync-web-0607_v11.42-po1.zip
- W1 ✅ Forgot password — link now sends a real Supabase reset email; new branded
reset.html completes the flow (set new password). ⚠ One-time step: Supabase → Auth → URL Configuration → add https://nutrisync-collective.pages.dev/reset.html to Redirect URLs.
- W8 ✅ Waitlist stat 130 → 140+ (marketing stats bar + investor page). Live-count RPC logged as follow-up tech debt.
- W9 ✅ Diagnosis-delay card: "~4 yrs / Later diagnoses than men" + metabolic 4.5y · cancer 2.5y · ADHD 5–6y (EN + ES; embedded dicts + locale files).
- W10 ✅ CAS section now says the score tracks improvement over time (EN + ES) — Pilar to confirm final wording.
- W11 ✅ Lucía's headshot centered (applied Design's own crop: 50% 32%, scale 2.15).
- W24 ✅ (removal half) Footer "Prototype" button stripped — zero public prototype entry points remain.
- Translators note (→ doc 12): the other 12 locale files still carry the old W9/W10 marketing copy — needs Design's translation round.
- All patches live in
integrate.py (idempotent) → survive future Design re-exports.
2026-07-07 · Prototypes moved off the public site → Builders "Prototypes" tab
- Build:
nutrisync-web-0607_v11.42.zip (integrated)
- What: the marketing "HEALTH FLOWS · See NutriSync in action" showcase (
<section id="screens">) is prototype material, so it's been removed from the public marketing site (section + its nav/hero/footer #screens links stripped at runtime).
- Where it went: a new gated Prototypes entry in the Builders area — a card in the Founder Tools row and a pill on the standalone gated hub nav. Opens
hub/prototypes.html, which deep-links all 16 prototype screens (app.html#demo-<route>: login, signup, onboarding, allset, gate, home, nutrilog, movement, editperiod, edithealth, progress, calendar, settings, connections, privacy, security) plus an "Open the web app prototype" entry.
- How (durable): all via
integrate.py (runtime DOM strip + generated hub page), so it survives future Design re-exports. Note: a lone footer "Prototype" text button that launches the app demo directly was left in place — say the word to strip that too.
2026-07-07 · Web pack v11.42 — Basque + Aranese native review DONE
- Build:
nutrisync-web-0607_v11.42.zip (integrated) · Design raw nutrisync-web-design-0707_v11.42.zip · nutrisync-app-eu-oc-review.zip (mobile OTA)
- ✅ Native review complete: Design's team did the Basque (eu, 11 corrections) and Aranese (oc, 9 corrections) native-speaker passes — the two production blockers I'd been tracking are now cleared. Corrected
eu/oc app strings re-bundled into mobile.
- Web: the web-app onboarding wizard now carries the language selector (all 14 switchable mid-wizard). Re-integrated our layer.
- Mobile: crossover = corrected
eu (5) + oc (4) app strings only; re-bundled.
- Status: all 14 languages complete AND reviewed → ready to move into testing.
2026-07-07 · Mobile — Welcome fidelity + radial-peach app-wide
- Build:
nutrisync-app-welcome-design-match.zip (mobile OTA)
- Wings mark: swapped in Design's real ink wings asset (
nutri_wings_ink.png) — the previous one was a lookalike ("rays + orb"); removed the overlaid orange orb; centered per Design's Welcome frame.
- Background: replaced the darker linear peach gradient with Design's exact soft radial-peach (
radial-gradient(circle at 28% 16%, #FDE2D6 → #FBEFE6 → #FFF8F1 → #F9D7BD)), rendered as a real SVG radial via a shared PeachBg. It now sits behind every screen (one background behind the navigator; all screens transparent) — Welcome, Login/Create, onboarding, daily gate, main tabs and settings all share it, matching Design's "no screen on the old linear gradient".
- Carries the earlier Welcome/Login language selector + back nav and the
supabaseKey boot fix.
2026-07-07 · Web pack v11.41 + mobile Welcome selector & back-nav
- Build:
nutrisync-web-0607_v11.41.zip (integrated) · Design raw nutrisync-web-design-0707_v11.41.zip · nutrisync-app-welcome-i18n.zip (mobile OTA)
- Web (Design): brand watermarks on every section + footer (mobile-width QA at 390px; Platform-section mark repositioned), footer disclaimer → "Made with care in Madrid" localized in all 12 packs, language-popover polish (scrollable, click/Escape-to-close, full names). Also added the
welTo/welP welcome strings to all 12 packs. Re-integrated our layer.
- Mobile (our side — Design handed us the Welcome spec):
- Language selector on the landing — added to the Welcome and Login/Create screens (shared
LanguagePicker: two ISO pills + dropdown of all available languages). The landing previously had no way to switch language.
- Back navigation — added a ‹ Back on the Auth screen (Login/Create → Welcome), which previously had no way back.
- Welcome title/paragraph now use the shared
welTo/welP keys (translated in every pack); bundled those keys into the 12 add-on mobile catalogs.
- Also fixed earlier this session: mobile boot crash
supabaseKey is required — the public anon key is now baked into config.ts so the app boots from a fresh clone without .env.
2026-07-06 · v11.30 — Japanese live · all 14 languages complete
- Build:
nutrisync-web-0607_v11.30.zip (integrated) · Design raw nutrisync-web-design-0607_v11.30.zip · nutrisync-app-i18n-ja.zip (mobile OTA)
- Web: Japanese (
ja, 日本語) now live end-to-end. All 14 languages complete (EN, ES, FR, DE, IT, NL, EL, CA, EU, GL, VAL, OC, ZH, JA) — app + marketing + prototype. Unicode/CJK verified (Postgres round-trip + UTF-8 frontends, no ASCII-only validation).
- Mobile (crossover): bundled Japanese
app, registered ja — mobile now carries all 14 language bundles; CJK renders via the OS font.
- Docs: added Hub Access — Zero Trust guide (
14-Hub-Access-Zero-Trust) to Builders → Documentation — how to protect /hub/* with Cloudflare Access (email allowlist, audit log) instead of the client-side code.
- ⚠ Native review still required for Basque + Aranese before production. CJK web-font still recommended for Design (ZH/JA polish).
2026-07-06 · v11.29 — Back buttons on Founder Tools pages
- Build:
nutrisync-web-0607_v11.29.zip (supersedes v11.28)
- Builders hub: the Waitlist, Translations and Review tool pages now have a ‹ Back control that uses browser history — returns to the Builders room you came from. The Waitlist page's old "← Builders hub" link pointed to
full-hub-gated-site.html, which bounced to the marketing start; replaced with history-back (same pattern the Change Log doc already used, which the founders confirmed lands correctly). Docs pages already had ‹ Back.
- Mobile/Platform: none.
2026-07-06 · v11.28 — Founder Tools cards open in-place · Unicode verified
- Build:
nutrisync-web-0607_v11.28.zip (supersedes v11.27 — includes Chinese)
- Builders hub: the Founder Tools cards (Waitlist / Review / Translations / Change Log) now open in the same tab instead of a new one (
target="_blank" removed). They were working, but a new tab is easy to miss / can be popup-blocked — so they felt dead. Confirmed via live test that same-tab clicks aren't intercepted by the room's SPA; browser Back returns to the room.
- Public site: removed the "Demo access — use code 123456" hint from the hub gates (site is public).
integrate.py strips it from the compiled bundle; the 123456 code still works, it's just no longer shown on-screen. Share it out-of-band.
- Platform — Unicode/CJK verified end-to-end: live round-trip proved Postgres stores CJK (3 bytes/char) + emoji (4 bytes) natively; both frontends are UTF-8 with no ASCII-only input validation on user text. Added
backend/unicode-check.sql.
- Mobile: none.
2026-07-06 · Web pack v11.27 — Chinese live (web app + mobile)
- Build:
nutrisync-web-0607_v11.27.zip (integrated) · Design raw nutrisync-web-design-0607_v11.27.zip · nutrisync-app-i18n-zh.zip (mobile OTA)
- Web: Chinese (
zh, 简体中文) now live end-to-end (app + marketing + prototype). 13 of 14 languages complete.
- Mobile (crossover): bundled Chinese
app, registered zh (mobile CJK renders via the OS font automatically). Existing app sections unchanged.
- ⚠ CJK web-font (Design): no explicit CJK web-font (e.g. Noto Sans SC) or system fallback found in the export — Chinese renders via browser system-font fallback (functional, but not a designed CJK face). Re-flagged for Design (Brief §6) as a polish item before ZH/JA go to production.
- Remaining: Japanese (app + marketing), then the final all-14 verifier pass.
2026-07-06 · Web pack v11.26 — Aranese marketing (12 European langs complete)
- Build:
nutrisync-web-0607_v11.26.zip (integrated) · Design raw nutrisync-web-design-0607_v11.26.zip
- Web: Aranese marketing added — Aranese now complete end-to-end. All 12 European languages done (EN, ES, FR, DE, IT, NL, EL, CA, EU, GL, VAL, OC).
- Mobile: no change — app-section i18n unchanged; Aranese marketing is web-only.
- ⚠ Native review still pending for Aranese + Basque before production.
- Remaining: Chinese + Japanese (app + marketing), then Design's final all-14 verifier pass.
2026-07-06 · Web pack v11.25 — Valencian complete + Aranese live
- Build:
nutrisync-web-0607_v11.25.zip (integrated) · Design raw nutrisync-web-design-0607_v11.25.zip · nutrisync-app-i18n-oc.zip (mobile OTA)
- Web: Valencian marketing added (Valencian now complete end-to-end) + Aranese (
oc) live in the web app (12th language; Gascon-Occitan of Val d'Aran). Aranese marketing pending.
- Mobile (crossover): bundled Aranese
app, registered code oc — aligned mobile registry oc-aran → oc to match Design's file code (shared ns_locale). Simplified the selector ISO label to code.toUpperCase() (OC, VAL, etc.).
- ⚠ Native review REQUIRED before production: Aranese (low-resource, MT-derived) — tagged
native-review-REQUIRED in the file. Basque review also still pending.
- Remaining packs: Aranese marketing, then Chinese, Japanese, then a final all-14 verifier pass.
2026-07-06 · Web pack v11.24 — Valencian live (web app + mobile)
- Build:
nutrisync-web-0607_v11.24.zip (integrated) · Design raw nutrisync-web-design-0607_v11.24.zip · nutrisync-app-i18n-val.zip (mobile OTA)
- Web: Valencian (
val) now live in the web app (11th language) — AVL forms (hui, teua, este…). Valencian marketing pending.
- Mobile (crossover): bundled Valencian
app and registered code val. Note: Design's file code is val — aligned the mobile registry from va → val so the shared ns_locale matches across web ↔ mobile. Existing app sections unchanged.
- Remaining packs: Valencian marketing, then Aranese, Chinese, Japanese.
2026-07-06 · v11.23 — Docs: back navigation on every page
- Build:
nutrisync-web-0607_v11.23.zip (supersedes v11.22 — includes Galician + cache _headers)
- Builders hub: every documentation page now has a "‹ Back" control (returns to the previous page via browser history — the card grid or the doc you came from) alongside an "All documents" home link. Fixes not being able to navigate back after opening a doc card.
- Mobile/Platform: none.
2026-07-06 · v11.22 — Galician live + cache-busting headers
- Build:
nutrisync-web-0607_v11.22.zip (integrated) · Design raw nutrisync-web-design-0607_v11.22.zip · nutrisync-app-i18n-gl.zip (mobile OTA)
- Web: Galician (
gl) now live in the web app (10th language). Galician marketing pending.
- Cache fix:
integrate.py now writes a Cloudflare Pages _headers file forcing browsers to revalidate HTML + /i18n/* on every load (max-age=0, must-revalidate). This stops the stale-app.html issue where new deploys / new language packs didn't appear until a hard-refresh — verified the live app already had all switches and translated correctly; this makes it show without manual cache-clearing.
- Mobile (crossover): bundled Galician
app and registered gl; existing app sections unchanged.
- Remaining packs: Galician marketing, then Valencian, Aranese, Chinese, Japanese.
2026-07-06 · Web pack v11.21 — Basque marketing (Basque complete)
- Build:
nutrisync-web-0607_v11.21.zip (integrated) · Design raw nutrisync-web-design-0607_v11.21.zip
- Web: Basque marketing added — Basque now complete end-to-end. 9 languages fully live: EN, ES, FR, DE, IT, NL, EL, CA, EU.
- Mobile: no change — app-section i18n unchanged; Basque marketing is web-only. (Basque native review still pending before production.)
- Remaining packs: Galician, Valencian, Aranese, Chinese, Japanese.
2026-07-06 · Web pack v11.20 — Basque live (web app + mobile)
- Build:
nutrisync-web-0607_v11.20.zip (integrated) · Design raw nutrisync-web-design-0607_v11.20.zip · nutrisync-app-i18n-eu.zip (mobile OTA)
- Web: Basque (
eu) now live in the web app (9th language). Basque marketing pending.
- Mobile (crossover): bundled the Basque
app translation and registered eu; existing app sections unchanged.
- ⚠ Native review: Basque is low-resource — flag for a native-speaker review pass before production (same as Aranese). Tagged
review: native-review-pending in the file.
- Remaining packs: Basque marketing, then Galician, Valencian, Aranese, Chinese, Japanese.
2026-07-06 · Web pack v11.19 — Catalan marketing (Catalan complete)
- Build:
nutrisync-web-0607_v11.19.zip (integrated) · Design raw nutrisync-web-design-0607_v11.19.zip
- Web: Catalan marketing added — Catalan now complete end-to-end (marketing + prototype + web app). 8 languages fully live: EN, ES, FR, DE, IT, NL, EL, CA.
- Mobile: no change — app-section i18n unchanged; Catalan marketing is web-only.
- Remaining packs: Basque, Aranese, Valencian, Galician, Chinese, Japanese.
2026-07-06 · Web pack v11.18 — Catalan live (web app + mobile)
- Build:
nutrisync-web-0607_v11.18.zip (integrated) · Design raw nutrisync-web-design-0607_v11.18.zip · nutrisync-app-i18n-ca.zip (mobile OTA)
- Web: Catalan (
ca) now live in the web app (8th language: EN/ES/FR/DE/IT/NL/EL/CA). Catalan marketing still pending.
- Mobile (crossover): bundled the Catalan
app translation into the app and registered ca; the selector now offers 8 languages. mob.* falls back to English until translated. Existing 7 app sections unchanged.
- Next packs: Catalan marketing, then Basque, Aranese, Valencian, Galician, Chinese, Japanese.
2026-07-06 · Web pack v11.17 — Greek & Dutch marketing (7 core langs complete)
- Build:
nutrisync-web-0607_v11.17.zip (integrated) · Design raw nutrisync-web-design-0607_v11.17.zip
- Web: Greek + Dutch marketing translations added. All 7 core languages (EN, ES, FR, DE, IT, NL, EL) are now complete end-to-end — marketing + phone prototype + web app. Pending packs: CA, EU, GL, VA, Aranés, ZH, JA.
- Mobile: no change —
app-section i18n byte-identical for all 7 languages; the new marketing is web-only.
- Note (i18n visibility): verified the integration does not drop web-app translations — our integrated
app.html is Design's app.html plus only a <head> consent banner + error-CSS; the i18n fetch/apply code and all language files are intact. If the deployed web app shows only marketing translated, it's a stale/cached app.html or an un-deployed build, not the integration — a clean redeploy + hard-refresh resolves it.
2026-07-06 · Mobile selector aligned to ISO codes
- Build:
nutrisync-app-i18n-iso.zip (mobile OTA) · nutrisync-web-0607_v11.16.zip (docs)
- Mobile: the language selector now shows ISO codes on the pills (EN · ES · FR …) to match the web selector; the dropdown shows
CODE · Endonym (e.g. FR · Français) so it stays scannable. Aranese shows as OC. Resolves the web↔mobile selector consistency item.
- Web/Platform: none (Change Log doc only).
2026-07-06 · Web pack v11.15 — Italian marketing live
- Build:
nutrisync-web-0607_v11.15.zip (integrated) · Design raw nutrisync-web-design-0607_v11.15.zip
- Web: Italian marketing translation now live (
it.json gained marketing + catalog). Marketing translated: EN, ES, FR, DE, IT. Web-app languages unchanged (7 live). Re-integrated our layer.
- Mobile: no change —
app-section i18n is byte-identical to v11.14 for all 7 languages; IT marketing is web-only.
2026-07-06 · Web pack v11.14 — 7 languages live (web + mobile crossover)
- Build:
nutrisync-web-0607_v11.14.zip (integrated) · Design raw nutrisync-web-design-0607_v11.14.zip · nutrisync-app-i18n-live.zip (mobile OTA)
- Web: Design shipped 7 live web-app languages — EN, ES, FR, DE, IT, NL, EL (
i18n/<code>.json) — plus FR + DE marketing translations; the selector now uses ISO-code pills [EN] + [OS/ES] + a ▾ dropdown, Español as the standing second pill; and a boot error from the 12-language registry was hotfixed. Pending packs: CA, EU, GL, VA, Aranés, ZH, JA (selector reveals each as its pack ships; marketing gates to EN/ES until translated).
- Mobile (real crossover): bundled the 5 new
app translations (FR/DE/IT/NL/EL) into the app and refreshed EN/ES to Design's latest (mobile-only mob.* keys preserved). The app selector now offers only languages that have a bundle (7 today) and grows automatically as packs land; mob.* strings fall back to English until translated. OS-default only auto-selects a language we can render.
- Open decision: web selector shows ISO codes, mobile shows endonyms — pick one for cross-surface consistency.
2026-07-06 · v11.7 — Founders' Review Checklist
- Build:
nutrisync-web-0607_v11.7.zip
- Builders hub: new Founders' Review Checklist (
hub/review.html) — a structured, interactive review organised by customer journey → section (Marketing, Onboarding, Home, Logging, Health & profile, Settings, Cross-cutting). Each section is rated across five dimensions — Design · Copy/Language · Business logic · Assets · UX/Flow — with a status (👍 OK / ✏️ Change / 🚫 Blocker / N/A) and a comment. Progress tracking, filter to blockers/changes/unreviewed, and export to CSV, JSON, and a Markdown action-summary (machine-readable). Reachable from the Founder Tools row (new ✅ Review card). Saves per device.
- Also: Founder Tools "Translations" card relabelled to "14-language review".
- Mobile/Platform: none.
2026-07-06 · v11.6 — Multilingual to 14 (+ 中文/日本語); mobile + tool built
- Build:
nutrisync-web-0607_v11.6.zip (web) · nutrisync-app-i18n-14.zip (mobile OTA)
- Scope: added Chinese (
zh) and Japanese (ja) → 14 languages. Flagged the CJK web-font requirement for Design (Noto Sans SC/JP or system fallback).
- Mobile (done):
LanguageProvider now carries the 14-language registry with OS-language default (via expo-localization, required defensively so OTA never crashes) and English fallback per locale; App Preferences shows the two-pill (English + OS/current) + dropdown selector. expo-localization added to package.json.
- Builders tool (done): the Translations page is now a 14-language reviewer — pick a language, see the MT beside the English source (yellow = still equal to English, pink = blank), filter/only-untranslated, and export that one
xx.json.
- Handoff: 12 skeletons now (
…/zh.json, ja.json) + mt_translate.py routes ZH/JA through the from-English engine.
- Platform: i18n stays English-canonical; each locale falls back to English until its catalog is published.
2026-07-06 · v11.5 — Multilingual expanded to 12 (Spain co-official) + MT decided
- Build:
nutrisync-web-0607_v11.5.zip
- Docs: added the Spain co-official languages — Catalan, Basque, Galician, Valencian, Aranese — bringing the plan to 12 languages. Locked the machine-translation-first-pass → native-review decision, with a per-family engine strategy: European set MT from English (Google/DeepL); Iberian set MT from Spanish via Apertium (Valencian = Catalan valencia variety; Aranese = Occitan; Basque = heaviest review). Updated Design Brief §6 + backlog.
- Handoff: 10 skeleton locale files now (
fr/it/de/nl/el/ca/eu/gl/va/oc-aran.json) plus mt_translate.py — a runnable MT script with per-language engine routing, placeholder + brand-noun protection, and a mismatch-fallback report.
- Web/Mobile: no functional change yet — spec + scaffolding only.
2026-07-06 · v11.4 — Multilingual (7 languages) spec + skeletons
- Build:
nutrisync-web-0607_v11.4.zip
- Docs: confirmed the 7-language plan (EN/ES/FR/IT/DE/NL/EL) — selector = two pills (English + OS language, OS default) + dropdown for the rest, alphabetical; fallback to
[English][Español] when OS lang is English/unsupported. Written into Design Brief §6 (with the Design/Integration/Founders ownership split) and added to the Platform Backlog product tracks.
- Handoff: generated 5 skeleton locale files (
fr/it/de/nl/el.json, 613 keys each incl. mobile keys, English placeholders) for Design/the translator to fill.
- Web/Mobile: no functional change yet — spec + scaffolding only. Translation-source decision (professional vs MT + native review) to lock before content work starts.
2026-07-06 · v11.3 — Release Note + backlog refresh
- Build:
nutrisync-web-0607_v11.3.zip (integrated) · Design raw: nutrisync-web-design-0607_v11.3.zip
- Docs: new Current Release & Backlog note (
13-Release-Notes) — what's built and testable now vs what's pending, versioned to the app (release = deployed web build, currently v11.3 · mobile 0.1.0). Surfaced as a prominent banner at the top of Builders → Documentation and downloadable as a standalone note. Also folded the waitlist system + CRUD dashboard + DB runbook into the Platform Backlog (F5, Epic G, product tracks).
- Web: Design v11.3 is a minor
index.html tweak (+49 bytes) over v11.2; app.html and i18n unchanged. Re-integrated our layer.
- Mobile: no change — shared app-section i18n diff = 0.
2026-07-06 · Web pack v11.2 — auth/onboarding back-to-site pill
- Build:
nutrisync-web-0607_v11.2.zip (integrated) · Design raw pack: nutrisync-web-design-0607_v11.2.zip
- Web: small polish over v11.1 — Design added a floating "← Back to site" pill (bottom-right) on the auth/onboarding screens (also on mobile). Only
app.html changed (+150 bytes); index.html and all i18n are byte-identical to v11.1. Re-integrated our layer; stopgap exit still stands down (native present).
- Naming: Design now prefixes raw packs
nutrisync-web-design-0607_vX.Y.zip; our integrated deployable drops the design- (nutrisync-web-0607_vX.Y.zip). Deploy the one without design-.
- Mobile: no change — shared app-section i18n diff = 0.
2026-07-06 · Web pack v11.1 — error overlay root-caused (brief closed)
- Build:
nutrisync-web-0607_v11.1.zip (Design pack now uses our version naming)
- Web: Design closed the last brief item — the bundler error overlay was root-caused, not masked: the trigger was a single typo'd mood-icon asset (
mischevious→mischievous), now fixed; a full asset audit confirms zero console errors on both index.html and app.html. The #__bundler_err{display:none} rule is kept as an intentional safety net. Re-integrated our layer; our own error-hide is now redundant-but-harmless.
- All 5 Design brief items are now closed.
- Mobile: no change — shared app-section i18n diff = 0 (added/removed/changed all empty).
2026-07-06 · Web pack (0607v02.53) — Design brief fixes landed
- Build:
nutrisync-web-0607_v10.55.zip (from Design pack Nutrisync marketing website revamp_0607v02.53.zip)
- Web: Design fixed 4 of the 5 brief items at source — native Back to site (sidebar + brand rail + Settings), 44px back controls everywhere, web onboarding Back on every step + Start over + browser-Back, and hub deeper back paths (History-based browser Back within the hub). Re-integrated our layer; the stopgap floating exit button now auto-disables because the native control is present.
- Still open: the
__bundler_err dev error overlay is still in the export (we keep hiding it) — re-flagged as Open Design request #5.
- Mobile: no change — verified: 2 new shared strings (
backToSite, obStartOver) are web-app-only; mobile already has its own mob.startOver. Shared app-section diff otherwise 0.
2026-07-06 · Design Brief doc added
- Build:
nutrisync-web-0607_v10.54.zip
- Docs: added Design Brief — Open Requests (
12-Design-Brief-Open-Requests) to Builders → Documentation — a copy-paste brief of the compiled-bundle fixes for Design (web-app exit, small back buttons, onboarding back/restart, hub nav, error overlay). Mirrors Open Design requests in this log.
2026-07-06 · App polish — bigger back arrow + prominent web-app exit
- Build:
nutrisync-app-onboarding-fix2.zip (mobile OTA) · nutrisync-web-0607_v10.53.zip (web)
- Mobile: the onboarding progress-bar back control is now a bold « double-chevron (larger icon + larger tap target) — the old thin chevron was too small to see.
- Web: added a prominent "← Back to site" button to the web app (
app.html, top-right, solid coral) so users can always leave the app journeys and return to the marketing site — there was no route back before, and the first (subtle) version was hard to spot. Injected via integrate.py; logged Open Design request #3 for a proper in-header placement.
- Platform: none.
2026-07-06 · Change Log — build filenames added
- Build:
nutrisync-web-0607_v10.51.zip
- Docs: every log entry now carries a Build line naming the package (zip) — and any SQL / Edge Function — it shipped in, for release traceability. Older pre-
v10.4x builds are referenced by their actual filenames where tracked.
2026-07-06 · Waitlist dashboard — undo/rollback + DB runbook
- Build:
nutrisync-web-0607_v10.50.zip
- Builders hub: every Add / Edit / Delete now runs confirm → execute → Undo. A rollback bar appears for ~9s and reverses the action — re-inserts a deleted row (exact copy), restores previous values on an edit, or removes a just-added row. Edits and deletes ask Yes/No first.
- Docs: added Database Changes Runbook (
11-DB-Changes-Runbook) to Builders → Documentation — the backup-first rule (snapshot → change → verify → restore) plus the dashboard's in-app undo. Backing convention also lives in backend/DB-CHANGES-RUNBOOK.md.
- Convention: going forward, every data-/schema-changing SQL we hand over leads with a backup step and ends with a verify step.
- Mobile: n/a.
2026-07-06 · Waitlist dashboard — full CRUD
- Build:
nutrisync-web-0607_v10.49.zip + SQL backend/admin_waitlist_crud.sql
- Builders hub: the Founders' Waitlist dashboard is now editable — Add signup (email, name, source, joined date), Edit any row, and Delete with confirm, alongside the existing search / filter / CSV export. Admin-gated end to end.
- Platform: new
admin_waitlist_crud.sql adds admin-only SELECT/INSERT/UPDATE/DELETE RLS policies on public.waitlist (checks public.admins). Public marketing-form inserts still work; the list stays private to non-admins. The dashboard now reads the table directly (needs row id for edit/delete) and falls back to the read-only admin_waitlist() RPC (with a "read-only" banner) if the CRUD SQL hasn't been run yet.
- Mobile: n/a.
2026-07-06 · Onboarding navigation — mobile fixed, web spec'd
- Build:
nutrisync-app-onboarding-fix.zip (mobile OTA) · nutrisync-web-0607_v10.48.zip (web)
- Mobile: onboarding now has full back/restart. Back works on every step (including the consent step, which previously blocked it); the Android hardware back button steps within the wizard instead of leaving the app; and a "Start over" control (with a confirm) resets to step 1 and clears answers. New strings
mob.startOver / mob.startOverBody added EN + ES. Ships OTA.
- Web: reviewed
app.html — the wizard has step-back logic but Back is inconsistent across steps and there is no "Start over"; and the hub's deeper card/section back-navigation still drops to the landing. Both are in Design's compiled bundle, so logged as Open Design requests #1 and #2 with precise specs (mirroring the mobile behaviour).
- Platform: none.
2026-07-06 · Waitlist — legacy migration + live capture
- Build: live capture
nutrisync-web-0607_v10.45.zip · dashboard _v10.46.zip · Founder Tools row _v10.47.zip · SQL backend/admin_waitlist.sql (migration itself run in Supabase, no build)
- Platform: created
public.waitlist (email · joined_at · source, unique on lower(email), RLS on: anon insert allowed, no public read). Migrated ~140 signups from a legacy Supabase project via a staging table + deduped insert … on conflict do nothing; imported rows tagged source='legacy_import'.
- Web: the marketing site's waitlist and newsletter fields now persist to
public.waitlist (tagged marketing_site / newsletter). Wired in integrate.py as a delegated capture-phase listener (the compiled bundle's own {{ }} handlers aren't rewireable), POSTing via PostgREST with the public anon key; shows a lightweight "You're on the list ✓" toast and treats duplicates as already-subscribed.
- Builders hub: new Founders' Waitlist dashboard (
hub/waitlist.html) — total + per-source counts, searchable/sortable list of signups, and CSV export. Admin-gated: reads via the new admin_waitlist() SECURITY DEFINER function (checks public.admins), so the list stays RLS-private to everyone else.
- Builders room header — "Founder Tools" row: Waitlist, Translations and Change Log now surface as a distinct card row at the room-header level (injected under the Builders tab bar via
integrate.py, kept in place across the compiled bundle's re-renders), not inside the Documentation tab — they're tools, not documents. Removed the old banner cards from the Documentation page; the Change Log still appears there as a normal document too.
- Mobile: n/a.
2026-07-06 · Web pack (05072026) — hub room navigation fixed
- Build:
nutrisync-web-0607_v10.44.zip (from Design pack Nutrisync marketing website revamp_05072026.zip)
- Web: Design delivered the hub navigation fix requested on 07-04. Inside the Investor and Builder rooms the room tabs are now sticky (Overview / Business case / MIS · and Overview / Documentation / Admin·MIS / Backlog stay visible while scrolling); a room switcher in the header lets you jump Investor↔Builder or "← Back to site" directly; the in-room "← Overview" control returns to that room's Overview instead of the landing page; and the
123456 gate only appears at hub entry, never re-locking on tab/room switches. Re-integrated our layer over the fresh export (consent, admin live KPIs, mobile i18n keys, error-overlay hide, Translations page + docs CTAs, current Change Log).
- Mobile / Platform: no change — verified: nav fix is web-hub-only; shared
i18n app diff = 0 strings; no brand-token or new-screen changes. Native app untouched.
- Still open with Design: strip the
__bundler_err dev error overlay at source (we continue to hide it via integrate.py).
2026-07-04 · Known issue logged — hub room navigation (resolved 07-06)
- Build:
nutrisync-web-0407_v10.43.zip
- Web: inside the Investor/Builder rooms there's no direct Investor↔Builder switch and the tab bar isn't sticky, so leaving/switching sections forces a return to the landing page. Handled in Design's compiled bundle — spec handed to Design (see Open Design requests).
- Mobile / Platform: n/a.
- Also added: the Who fixes what ownership boundary + Open Design requests sections above, and Change Log / Translations cards at the top of the Builder → Documentation tab.
2026-07-04 · Web pack v10.40 — footer redesign
- Build:
nutrisync-web-0407_v10.40.zip (from Design pack Nutrisync marketing website revamp_0407_v10.40.zip)
- Web: slim 3-row footer (brand + Team Access chips + Product/Company/Legal columns + single "Stay in sync" bar with store badges & socials); bigger header logo. Re-integrated our layer (consent, admin KPIs, i18n keys, Translations page + docs button).
- Mobile: no change — verified: footer is web-only; mobile header logo already enlarged; shared i18n diff = 0 strings.
- Platform: none.
2026-07-04 · Documentation & backlog refresh
- Build: part of the 07-04 web builds (
nutrisync-web-0407_* series)
- Web: backlog doc gained Product feature tracks (bilingual, monetization, community, custom domain); Project Status changelog updated; Translations button made prominent at the top of the docs index.
- Mobile: n/a.
- Platform:
integrate.py established as the one-command re-integration for every Design pack.
2026-07-04 · Bilingual EN/ES + Design bilingual pack
- Build: Design bilingual pack (integrated web build, 07-04) · mobile via OTA
- Web: Design's bilingual pack integrated — EN/ES across marketing + web app, decoupled
i18n/ catalogs, language selector, wearables screen, mobile-fit fixes, 2× logos. Founder Translations review page added to the hub.
- Mobile: full EN/ES i18n wired —
LanguageProvider + t(), language selector in App Preferences, 121 strings translated across every screen (incl. 83 mobile-specific keys added to the shared catalog under app.mob). Shipped OTA.
- Platform: i18n kept in sync web ↔ mobile via the shared catalog.
2026-07-03 · Wave 1 + Epic E foundation
- Build:
nutrisync-web-stitched.zip (web) · mobile via OTA · SQL backend/admin_kpis.sql, admin_auto_promote.sql, health_connectors.sql, Edge Function delete-account
- Mobile: Edit Health, Notification Center, App/Nutritional Preferences; bigger brand lockup (home + gate); full-account deletion wired; Connected Devices (wearables) foundation behind a feature flag (OFF).
- Platform: full account deletion Edge Function deployed (data + auth erasure); cookie/consent layer on web; admin console wired to live KPIs (aggregate-only, admin-gated);
health_signal + connected_providers schema.
- Web: consent banner, admin live wiring, error-overlay hidden.
2026-07-02 · Web app live + CI/CD
- Build:
nutrisync-web-latest.zip (initial stitched web) · mobile via OTA
- Web: Claude Design web app stitched to Supabase; marketing + gated hub live on
nutrisync-collective; auto-deploy pipeline (GitHub → Cloudflare Pages).
- Mobile: OTA pipeline (GitHub → EAS Update) live; Android test build produced.
- Platform: Supabase (EU) backend serving both surfaces; CAS engine writing
daily_scores.
How to add an entry
When a new web pack lands or a mobile build ships, add a dated block at the top with three lines — Web, Mobile, Platform — noting what changed and, crucially, whether it crossed between surfaces. Include a Build line naming the package(s) it shipped in. Keep canonical values English (see the i18n contract).
Build naming (avoid deploying the wrong file):
- Design raw pack (input, not deployable on its own): nutrisync-web-design-0607_vX.Y.zip.
- Integrated deployable (what we actually push — Design's pack + our layer via integrate.py): nutrisync-web-0607_vX.Y.zip (no design-).
- Always deploy the one without design-.