A running log of every change made to the marketing portal, demo app, and infrastructure — newest first.
master. Worked around it by deploying directly from the built output via the Netlify CLI, bypassing the broken Git integration. The GitHub↔Netlify connection itself still needs reconnecting in Site configuration → Build & deploy → Repository for future git push-triggered deploys to work againrouter.push('/home') on every SIGNED_IN event, which Supabase also fires when a persisted session is simply restored on page load. Net effect: any hard refresh or direct link to /vault, /healthcare, /planning, etc. silently bounced back to Home. Login.vue already handles the actual post-login redirect on its own, so the global listener now only handles SIGNED_OUT → /login; deep links and refreshes now stay putSUPABASE_SERVICE_ROLE_KEY is now set (all contexts) so the daily reminder function can query across users. RESEND_API_KEY still needed before invites/reminder emails will actually sendvault_secrets, healthcare_providers, healthcare_medications, and the new columns on documents / circle_members / user_profiles now exist in the live database/lockbox page with a 4-digit PIN gate (session-persisted so you only enter it once per browser session; stored locally in the demo, aligned with the real backend's vault_2fa_verified / vault_2fa_session_valid_until fields). Stores passwords, government IDs (passport, driver's license, SSN-type numbers), financial account numbers, insurance policies, and miscellaneous sensitive entries. Category-specific field labels adapt by entry type. Reveal/copy per entry. 90-day stale prompt for passwords specifically. "Lock" button to re-lock the session at any time/vault now opens a hub page with two distinct vault choices: Document Vault (→ /files) and Private Lockbox (→ /lockbox). Hub shows live stats: document count, lockbox entry count, and how many passwords haven't been updated in 90+ days. Clicking "Secure Vault" in Files.vue's tab bar now navigates to the Lockbox rather than showing the old inline tabhealthcareAPI gains listConditions, createCondition, updateCondition, deleteCondition (new healthcare_conditions Supabase table needed)/vault → VaultHub, /files → Files (previously /files redirected to /vault; now it's a real route), /lockbox → Lockbox; Upload.vue's "View Vault" button now goes to /files directlyemergency_contacts Supabase table; aligns with the real backend's User.emergency_contacts[] field. First contact added is auto-marked primary; primary badge shown inline/onboarding page (Onboarding.vue) triggered on first login for users who haven't completed setup: (1) Welcome + Terms consent, (2) Name / Date of Birth / Country, (3) Emergency Contacts, (4) Invite your circle (optional), (5) All set with quick-start tiles to Healthcare, Upload, Lockbox, and Planning. Progress bar across the top. Completion sets user_profiles.onboarding_completed = true and a session flag so returning users skip it. Aligns with the real backend's 7-step onboarding schema (BasicInfoRequest, EmergencyContactRequest, InviteContact)user_profiles.onboarding_completed; new users are sent to /onboarding instead of /home#faq, linked from the nav bar and footer) — five accordion questions covering who can see your Vault, whether AI reads your documents, what happens to information flagged as sensitive, whether documents train AI models or are sold, and how passwords/account numbers are handled. Built with native <details>/<summary> — no JS framework addedplatform.html#faq████) — nothing happens automatically/healthcare, in both desktop and mobile nav) with Providers (Primary Doctor + Specialists) and Medications tabs; each item shows "last confirmed X ago" and a "Needs review" badge once 365+ days pass, with a one-click Still accurate button; Import mirrors Network's Speak + File flow (new healthcare-parse.js function, CSV column mapping); new healthcare_providers / healthcare_medications tablesvault_secrets table) with reveal/copy actions, plus CSV Import for LastPass, NordPass, Bitwarden, Chrome, and 1Password exportsrevalidation-reminders.js Netlify scheduled function (daily) emails — and can optionally text via Twilio — a digest of overdue Healthcare items per user's own cadence, via Resendsend-invite.js function sends a real email via Resend; each member shows an accurate Invited / Not yet invited status with a manual resend optionsaveFamilyToTree() loads the current tree from Supabase, merges selected people without overwriting existing entries, and upserts back to both Supabase and localStorageSSN_CARD), U.S. Passport (US_PPT), Driver's License (US_DL), Form W-4 (TAX_W4), Employment Authorization Document (US_EAD), Owner's Will (OWN_WILL) — matching the seeded master records in the real SL backenddocument_type stored in the documents table and shown as a badge in the vault file listdocument_type DB columnclamResult tracks clean | infected | error | skipped; infected files route to a "Upload Blocked — malware detected" phase and are never stored; result shown as a badge on the review and done screens; stored as scan_result in the DBcontext: 'OWNER'; COLLABORATOR and SHARED files show a coloured badge in the vault file list; OWNER is hidden (implicit default)family_tree / planning_data / network_data tables on every save; on load, reads Supabase first, falls back to localStorage and auto-migratestaskDone from saved payload; collaborator task completions live in after_im_gone_tasks; extracted buildFieldValues() / applyFieldValues() helpersdocuments table gains deleted_at timestamptz; deleting a file sets deleted_at instead of removing storage or the row; vault list filters deleted_at IS NULLdeleted_at so the file reappears in the vault; Delete Permanently removes from Supabase Storage and the documents row<input type="date">; displayYear() extracts the 4-digit year for on-canvas display; migratePerson() renames old birthYear/deathYear localStorage keys on load.ged file → select root person → preview and applyparseGedcomDate() converts GEDCOM text dates ("15 JUN 1948") to ISO YYYY-MM-DDparseGedcom() indexes individuals and families from the .ged filebuildFamilyFromRoot() defaults to 2 generations (parents + grandparents) with opt-in to include more ancestorscircle_members slots matching the logged-in email; upserts user_profiles on sign-in; exposes owner vs. collaborator context switchingafter_im_gone_tasks with optimistic UI; timeline headers show X/N count<input type="date"> modal, formats to "Month Day, Year" on savelocalStorage keyed by user ID; fields pre-filled from Supabase circle members and story datalocalStoragelocalStorage/.netlify/functions/contact-parse; graceful text-input fallback if browser lacks speech support.vcf (vCard); .csv shows field-mapping UI with auto-detected column namesclaude-haiku-4-5-20251001 via ANTHROPIC_API_KEY; extracts {name, role, org, phone, email, kind, notes} from free text/family routelocalStorage/.netlify/functions/pii-scan; results merged with regex findingsANTHROPIC_API_KEY env var (key never committed)/demo/profile — edit full name + phone (saved to Supabase user_metadata), change password, read-only email, sign-outMarketplace.vue — professional directory with search, category filter chips (All / Legal & Estate / Financial / Care & Grief), card layout (avatar, Verified badge, rating, location, bookmark), Request Intro + Share Profile actions; 5 dummy professionals seededAdmin.vue — password-gated admin portal at /demo/admin (password: Admin@SL2026); 3 tabs: Marketplace (add/toggle/remove professionals), Users (session viewer), Settings (launch status, password placeholder)sm:hidden)pb-20 sm:pb-0 so content clears the fixed bottom nav on mobile/vault) shows file list with search/filter; upload stays at /uploadnetlify.toml to single wildcard SPA redirectSerene-Legacy/SL) — read BottomNavigation, Header, TabNavigator, DashboardScreen, MyFilesScreen, MoreOptionsScreen, InviteCircleScreenLogin.vue stray closing tag that caused Vite build failure (exit code 2)netlify/functions/companion.js — switched from ES module export to CommonJS exports.handlernetlify.toml SPA redirects for all new routes; updated router with /home, /files, /circle, /morecircle_members table with RLS — stores Support Circle invitees per useralokkapoorsl/SL-website (private).gitignore excluding build artifacts and node_modulesapp/ — accessible via "Take a Test Drive" passcode gate on the marketing hubonAuthStateChange — email link auto-signs user innetlify.toml — Vue app builds to /demo/ alongside marketing pagesyjhqlonsgtqegcfbehcp.supabase.co (free tier, Nano compute)documents Postgres table with row-level security — users see only their own filesdocuments storage bucket with per-user folder policiesTestDrive2026 → redirected to /demo/Investor!xyz) with shake animation on wrong entryCLAUDE.md — multi-page architecture, correct business figures, team photos, launch instructionsCHANGELOG.mdindex.html as single-page consumer portal from CLAUDE.md specplatform.html (consumer), investors.html (dark charcoal/gold), partners.html (B2B2C gold)mailto: links — no live backend yet. Intentional for pre-launch.TestDrive2026 — investor page password: Investor!xyz