{"slug":"nineoh-guide","total":103,"limit":100,"offset":0,"since":null,"commits":[{"hash":"1b7b296","date":"2026-09-13 14:58:12 -0700","author":"Steve Abrams","subject":"docs: pre-stage both 90210 resubmission branches (execute on the ASC citation)","body":"Blocked only on the guideline number from ASC Resolution Center. Staged so\nexecution is instant either way: Branch 1 (5.1.2-only) = build+submit + a\nwritten RC reply; Branch 2 (4.1/5.2) = exact 3-place display-name change\n(app.json expo.name, core APP.displayName, ASC Name field) with ≤30-char name\noptions for Steve to pick + a written RC reply; Branch 3 = map-on-the-spot.\nBuild+submit stay gated (Steve-fired). No name shipped, no guess applied.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"34c4033","date":"2026-09-13 01:26:38 -0700","author":"Steve Abrams","subject":"eas: fix stale ascApiKeyPath to the real key location","body":"Old relative path ../../.credentials/asc-api-key.p8 no longer resolves\n(the file moved). Real, single copy of the account-level ASC API key\nlives at ~/private_keys/AuthKey_72Y2TZT54R.p8 per the\nasc-api-key-account-level reference.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>"},{"hash":"4310f6e","date":"2026-09-13 00:38:07 -0700","author":"Steve Abrams","subject":"mobile: align deps to Expo SDK 57 (pre-build hygiene before the mandatory rebuild)","body":"expo-doctor flagged 8 out-of-date packages before the required rebuild — most\nnotably a MAJOR mismatch on expo-build-properties (1.0.10 vs SDK-expected\n57.0.17), the config plugin that sets iOS build settings; a wrong-major there\ncan bite a production build. Ran 'expo install --fix' to align expo-build-\nproperties, expo-apple-authentication, expo-blur, expo-constants,\nexpo-linear-gradient, expo-tracking-transparency, and react-native (0.86.2->\n0.86.3) to their SDK 57 versions.\n\nValidated (validation-loop rule): tsc --noEmit clean, expo-doctor now 21/21.\nThe staged 5.1.2 ATT-gating fix (analytics OFF at import; enableCollectionAfter\nATT() called only after requestTrackingPermissionsAsync resolves) was re-read\nand confirmed correct — it will ship in this rebuild. No source/behavior change,\nlockfile + package.json only.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"6693593","date":"2026-09-12 20:35:45 -0700","author":"Steve Abrams","subject":"5x: verification report — 3 sweeps, /api/cast 500 fixed, clean twice","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"dc8c199","date":"2026-09-12 20:34:04 -0700","author":"Steve Abrams","subject":"5x sweep 1: fix /api/cast 500 — credits has no show_id; scope by characters.show_id","body":"The /api/cast route referenced cr.show_id (credits.show_id), which does not\nexist in the schema — only characters.show_id carries show scoping. Postgres\nthrew 'column cr.show_id does not exist', the route caught it and returned\n{cast:[]} with HTTP 500, so the Expo app got an empty cast list. Replaced the\ncoalesce(cr.show_id, ch.show_id) with ch.show_id in the select, distinct-on,\nand order-by. /api/cast now returns 200 with populated showId.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8d5fd18","date":"2026-09-11 14:10:37 -0700","author":"Steve Abrams","subject":"eas: pin production ios.image=latest (ITMS-90725 guard) before the rebuild","body":"This app needs a rebuild — its uploaded binary predates its shipped fix by 28\ndays — and it was about to build without the guard that Charge & Explore needed.\n\nITMS-90725 is not hypothetical on this Apple account. C&E sat at *0 builds in\nASC* because the upload bounced on it, and the documented fix was exactly this\none eas.json line (Xcode 26 / iOS 26 SDK image). The chargeandexplore-release\ncanary treats `build.production.ios.image === 'latest'` as a HARD gate for that\nreason. Neither this app nor 90210/BHV had it.\n\nWithout the pin, the rebuild could bounce on upload *after* paying for the EAS\nbuild. One line removes the variable.\n\nVerified by semantic diff that this adds build.production.ios.image and changes\nor removes nothing else; JSON re-validated.\n\nRefs TK-11155.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"3b8d021","date":"2026-09-03 13:28:02 -0700","author":"Steve","subject":"90210: gate Firebase Analytics/Crashlytics behind ATT (fix 5.1.2 pre-consent screen_view)","body":"Was enabling collection at module-import time, so a GA4 screen_view fired before the\nATT prompt resolved (App Store 5.1.2 flag). Now: analytics.ts stays at Firebase's\ndefault (OFF) at import and exposes enableCollectionAfterATT(); App.tsx calls it in the\nATT effect after requestTrackingPermissionsAsync() resolves, before mobileAds().initialize().\nAdMob ordering was already correct. Restored from Henry nineoh-guide.bundle (source-only).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01YNivxV68DdxP1rvhViBfcN"},{"hash":"ca26827","date":"2026-08-10 10:53:07 -0700","author":"Steve Abrams","subject":"Refresh ASC blocker board to live truth (5 in review, 2 submit-ready, Costa Rica prep) — TK-10363","body":""},{"hash":"6120fe7","date":"2026-08-08 06:57:27 -0700","author":"Steve Abrams","subject":"Add live ASC blocker board for iOS submission batch (TK-10355, read-only ground-truth)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"51de6ce","date":"2026-08-06 09:13:46 -0700","author":"Steve Abrams","subject":"chore: lint (tsc clean), light refactor (import order, label padding, script formatting), v0.3.0 (session close — Fan Club podcasts + real AdMob)","body":""},{"hash":"5d90004","date":"2026-08-06 07:54:07 -0700","author":"Steve Abrams","subject":"Add read-only App Store approval-check script (for AdMob-link-after-approval task)","body":""},{"hash":"182ad70","date":"2026-08-06 06:23:00 -0700","author":"Steve Abrams","subject":"Wire real AdMob banner: iosAppId ca-app-pub-5278231299883833~3798456380 + banner unit .../1889257150 (prod), TestIds in dev","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"5b12116","date":"2026-08-06 04:17:18 -0700","author":"steve@designerwallcoverings.com","subject":"App.tsx: add ShowInfo type + show info banner (chips, expandable desc, disclaimer) below show selector","body":""},{"hash":"f7cb8f0","date":"2026-08-06 04:17:14 -0700","author":"steve@designerwallcoverings.com","subject":"api/shows: add showInfo field (description, seasonCount, episodeCount, premiereDate, finaleDate, disclaimerText)","body":""},{"hash":"620829a","date":"2026-08-05 18:14:43 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-05T18:14:36 (1 files) — db/neon-backup-20260805-1814/","body":""},{"hash":"ec52898","date":"2026-08-05 16:46:47 -0700","author":"Steve","subject":"fix(eas): allowBuilds with real boolean false values — pnpm@11 needs an explicit build-script decision; missing/placeholder crashed EAS frozen install (exit 1). Verified cold: frozen install exit 0, no ERR_PNPM_IGNORED_BUILDS","body":""},{"hash":"67efe4b","date":"2026-08-05 16:44:38 -0700","author":"Steve Abrams","subject":"Fix EAS install (build 12/13 failure): approve firebase/protobufjs/sharp build scripts via allowBuilds:true — ignored build scripts are a FATAL error in EAS CI (exit 1), only a warning locally","body":""},{"hash":"19fb4f5","date":"2026-08-05 16:44:09 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-05T16:43:55 (2 files) — eas.json pnpm-workspace.yaml","body":""},{"hash":"5613efd","date":"2026-08-05 16:37:28 -0700","author":"Steve Abrams","subject":"Fix EAS install: remove malformed allowBuilds block from pnpm-workspace.yaml (non-boolean placeholder values crashed frozen pnpm install); revert to build-11-proven plain config","body":""},{"hash":"5230058","date":"2026-08-05 16:16:54 -0700","author":"Steve","subject":"analytics: add GoogleService-Info.plist (Firebase project guide-d4c91, GA account '90210 Guide') + force-enable analytics/crashlytics collection (plist ships IS_ANALYTICS_ENABLED=false)","body":""},{"hash":"6803c9d","date":"2026-08-05 16:13:51 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-05T16:13:44 (2 files) — pnpm-lock.yaml pnpm-workspace.yaml","body":""},{"hash":"7a969e0","date":"2026-08-05 16:06:07 -0700","author":"Steve Abrams","subject":"Add Fan Club — cast-hosted podcasts (90210MG, misSPELLING, I Choose Me, Oldish, Let's Be Clear) to Watch tab","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"702110a","date":"2026-08-05 15:57:06 -0700","author":"Steve","subject":"analytics: wire Firebase Analytics (→GA4) + Crashlytics into the 90210 iOS app — screen-view tracking on tab change, safe no-op wrapper, expo-build-properties static frameworks + googleServicesFile","body":""},{"hash":"f1299ed","date":"2026-08-05 15:43:39 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-05T15:43:31 (1 files) — db/ingest-original.mjs","body":""},{"hash":"70d794a","date":"2026-08-05 15:11:27 -0700","author":"Steve Abrams","subject":"TK-12: remove committed ios/ from git — was making EAS treat it as bare project + ignore app.json (plugins/icon/AdMob/AppleSignin); managed workflow regenerates it per build","body":""},{"hash":"e879c59","date":"2026-08-05 15:10:39 -0700","author":"Steve Abrams","subject":"TK-12: both-shows feature — show-aware API (episodes/cast return showId, per-show regulars, new /api/shows) + App.tsx show selector (default original, AsyncStorage persist); news stays shared","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"d49d05b","date":"2026-08-05 15:02:42 -0700","author":"Steve","subject":"Fix AdMob crash-on-launch: move iosAppId/androidAppId into the react-native-google-mobile-ads plugin config array so GADApplicationIdentifier lands in Info.plist (bare-string plugin + root key was ignored → SDK crashed on init)","body":""},{"hash":"c386140","date":"2026-08-05 15:02:27 -0700","author":"Steve Abrams","subject":"TK-12: ingest-original.mjs — load original Beverly Hills 90210 (1990) as show #2 (facts-only episodes + names-only cast; images stay commercial-free via existing wikimedia ingest)","body":""},{"hash":"ce0f6a4","date":"2026-08-05 14:45:04 -0700","author":"Steve Abrams","subject":"TK-12: add AdMob banner + ATT prompt (Google Mobile Ads SDK) — banner above tab bar, tracking-permission request, test ad IDs (real AdMob IDs pending); gitignore generated ios/android","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"da76e9e","date":"2026-08-05 14:43:05 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-05T14:42:56 (9 files) — apps/mobile/App.tsx apps/mobile/app.json apps/mobile/ios/Unofficial90210Guide.xcodeproj/project.pbxproj apps/mobile/ios/Unofficial90210Guide/Info.plist apps/mobile/package.json","body":""},{"hash":"80d93d3","date":"2026-08-05 14:12:50 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-05T14:12:38 (1 files) — apps/mobile/ios/","body":""},{"hash":"d752218","date":"2026-08-05 13:12:22 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-05T13:12:15 (1 files) — apps/mobile/package.json","body":""},{"hash":"e2d78ae","date":"2026-08-05 13:05:51 -0700","author":"Steve Abrams","subject":"TK-12: add Sign in with Apple — expo-apple-authentication button in Saved tab (sync watchlist), usesAppleSignIn entitlement + plugin, local credential persistence","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"a03d63b","date":"2026-08-05 12:56:10 -0700","author":"Steve Abrams","subject":"TK-12: upgrade Expo SDK 52->57 (RN 0.76->0.86, React 19) for Xcode 26 — fixes ITMS-90725 (iOS 26 SDK required); fix babel-preset-expo->57.0.5, drop deprecated splash/newArchEnabled keys","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"e7d168b","date":"2026-08-05 11:40:29 -0700","author":"Steve Abrams","subject":"TK-12: wire ascAppId 6798381949 (nineoh app record created via interactive submit) — future submits non-interactive","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"e12d07e","date":"2026-08-05 11:17:19 -0700","author":"Steve Abrams","subject":"TK-12: fix fmt/consteval Xcode error — remove ios.image:latest (DTD verdict B), use SDK-52 default (Xcode-16-era) toolchain that compiles RN 0.76.9 fmt","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"1f2a021","date":"2026-08-05 09:35:44 -0700","author":"Steve Abrams","subject":"TK-12: turnkey App Store screenshot script (iPhone 6.9\" + iPad 13\") — one command post-build, defers premature native build (yoloforever C2)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"4a00039","date":"2026-08-05 09:01:05 -0700","author":"Steve Abrams","subject":"TK-12: add App Store icon (1024px, no-alpha) + splash, wire in app.json — closes missing-marketing-icon submit blocker (Cody gate C1)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"d48afc4","date":"2026-08-05 08:40:43 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-05T08:40:35 (1 files) — apps/mobile/eas.json","body":""},{"hash":"682db77","date":"2026-08-05 08:37:19 -0700","author":"Steve Abrams","subject":"TK-12: fix EAS build — align react-native 0.76.5->0.76.9 (SDK52 native version match), append monorepo watchFolders (expo-doctor 18/18)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"0016d60","date":"2026-08-05 08:24:53 -0700","author":"Steve Abrams","subject":"TK-12: paste-ready ASC listing draft (metadata, keywords, description, Data Safety=Not Collected, age 12+, review note)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"a9e5f69","date":"2026-08-05 08:07:07 -0700","author":"Steve Abrams","subject":"TK-12: app-store prep — version 1.0.0, pin eas ios.image latest, dev-gate localhost fallback, real SITE_URL canonical","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"3b23bfc","date":"2026-07-28 07:00:05 -0700","author":"Steve Abrams","subject":"TK-12: turnkey finish-tk12.sh — one command post-ASC-key drives build, holds at TestFlight submit","body":"Driver takes 3 args (.p8, Key ID, Issuer ID) and: routes key via secrets-manager\n(last-4 only, never echoed), wires eas.json submit.production.ios with\nascApiKeyPath/ascApiKeyId/ascApiKeyIssuerId + clears SET-AT-SUBMIT sentinel +\nasserts build.production.distribution=store, runs eas build -p ios --profile\nproduction --non-interactive, then PRINTS (not runs) the eas submit command and\nSTOPS for Steve's final TestFlight go. Idempotent, bash -n clean, .p8 gitignored.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"c0e6ddb","date":"2026-07-27 16:19:28 -0700","author":"Steve","subject":"chore(mobile): TK-12 App Store/TestFlight prep — prefill eas.json submit (appleId+teamId), add production runbook","body":"Config-only + docs. Production build/submit gated → approval memo in yolo-queue.\nRN 0.76.5 kept (known-good); 0.76.9 alignment recommended as a validated pre-build step.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"97a30ae","date":"2026-07-27 12:51:03 -0700","author":"Steve Abrams","subject":"chore: lint pass, cast-route null-coalesce fix, seed DB guard, minor version bump (session close)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"7786419","date":"2026-07-27 12:50:49 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T12:50:40 (1 files) — apps/web/app/api/cast/route.ts","body":""},{"hash":"e26dca5","date":"2026-07-27 12:25:15 -0700","author":"Steve Abrams","subject":"feat: per-episode cast on every episode + recurring/guest stars in Cast tab","body":"- seed episode_guest_cast from TVmaze (1160 rows, all 114 eps) + 78 recurring cast_people\n- /api/episodes returns each episode's cast (regulars + that episode's guests)\n- /api/cast includes recurring members with a kind flag; EpisodeSchema gains cast[]\n- mobile: star line on each episode card + Main/Recurring grouping in Cast tab\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"2aba195","date":"2026-07-27 12:20:36 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T12:20:30 (1 files) — scripts/","body":""},{"hash":"70d1038","date":"2026-07-27 12:07:46 -0700","author":"Steve Abrams","subject":"feat(mobile): add Watch tab — scrollable YouTube / podcasts / streaming / reference links (Linking.openURL, curated landing URLs)","body":""},{"hash":"746a4e4","date":"2026-07-27 12:06:11 -0700","author":"Steve Abrams","subject":"feat(mobile): fix scroll (flex ScrollView reveals full cast + all 114 episodes) + direct per-episode TVmaze link on each card","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"96bb1e7","date":"2026-07-27 11:47:52 -0700","author":"Steve Abrams","subject":"docs(mobile): EAS ad-hoc build recipe — press 'a' to select all devices, avoid nameless-iPhone skip + integrity error","body":""},{"hash":"ebc361f","date":"2026-07-27 11:19:10 -0700","author":"Steve Abrams","subject":"chore: quality gate — log+500 on api/cast+news error paths, mobile v0.2.0 + web v0.3.0 (session close)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"fd94bbd","date":"2026-07-27 11:03:06 -0700","author":"Steve Abrams","subject":"fix(monorepo): keep isolated nodeLinker (web React 19 intact), add @babel/runtime as explicit mobile dep for Metro resolution","body":""},{"hash":"e8b0cf6","date":"2026-07-27 10:54:28 -0700","author":"Steve Abrams","subject":"feat: mobile bottom-tab nav (Episodes/Cast/News/Saved) + /api/cast + /api/news endpoints","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"877569a","date":"2026-07-27 10:42:43 -0700","author":"Steve Abrams","subject":"chore(mobile): add preview-sim profile (iOS simulator build, no signing) for local Simulator run","body":""},{"hash":"904b355","date":"2026-07-27 10:24:13 -0700","author":"Steve Abrams","subject":"fix(mobile): pnpm 11 honors nodeLinker in pnpm-workspace.yaml, not .npmrc — move hoisted there so EAS cloud Bundle JavaScript resolves @babel/runtime","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"8a2cd67","date":"2026-07-27 10:19:47 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T10:19:40 (2 files) — .npmrc apps/mobile/metro.config.js","body":""},{"hash":"33f7f03","date":"2026-07-27 09:40:26 -0700","author":"Steve Abrams","subject":"chore(mobile): eas init (project d1c16075) + wire EXPO_PUBLIC_API_BASE to live Vercel API; drop invalid // key from eas.json","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"00e7162","date":"2026-07-27 08:49:19 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T08:49:12 (4 files) — apps/web/.agents/ apps/web/.claude/ apps/web/.gitignore apps/web/skills-lock.json","body":""},{"hash":"50992ce","date":"2026-07-27 08:46:48 -0700","author":"Steve Abrams","subject":"fix(db): news_items schema drift — add source_query + unique(canonical_url), drop NOT NULL on summary_original (index-first, summarize-on-review)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"b3f641d","date":"2026-07-26 20:18:47 -0700","author":"Steve","subject":"chore: version-up to v0.2.0 (session close) — code tsc/CTA/5x-verified, no eslint toolchain to autofix","body":""},{"hash":"c766b0c","date":"2026-07-26 20:03:01 -0700","author":"Steve","subject":"loop refine 4/n: character detail pages (/characters + /characters/[slug]) — profile, actor link, guest-cast appearances + series-regular fallback; nav + sitemap; ISR","body":""},{"hash":"78a8f84","date":"2026-07-26 16:37:04 -0700","author":"Steve","subject":"loop refine 3/n: ISR (hourly revalidate) on stable pages (home/show/cast/cast-detail/episode-detail) — cached HTML ~77ms, less DB load; dynamic pages (news/episodes/search) unchanged","body":""},{"hash":"4c1a88b","date":"2026-07-26 16:27:20 -0700","author":"Steve","subject":"loop refine 2/n: sort (season asc/desc) + comfortable/compact density on /episodes (recap show/hide, localStorage)","body":""},{"hash":"3c1fd3a","date":"2026-07-26 16:22:14 -0700","author":"Steve","subject":"loop refine 1/n: sort (newest/oldest/source) + persisted density control on /news grid (Steve standing rule)","body":""},{"hash":"59829db","date":"2026-07-26 16:14:10 -0700","author":"Steve","subject":"richer episodes: per-episode guest/recurring cast (1160 credits from TVmaze) on detail pages + per-season JustWatch watch links; episode_guest_cast table (app-user owned, no gated DDL)","body":""},{"hash":"e200329","date":"2026-07-26 08:36:42 -0700","author":"Steve","subject":"comprehensive pass: /show season overviews + 14 character profiles + hamburger mobile nav + bigger hero + full search (news/pages/games) + per-episode Reddit discuss links","body":""},{"hash":"0158b8e","date":"2026-07-26 08:25:08 -0700","author":"Steve","subject":"go-all: approve S2-S5 recaps (all 114 reviewed) + More-from-Season links on detail + /show series hub (JSON-LD, season breakdown, cast, where-to-watch) + real legal email info@agentabrams.com","body":""},{"hash":"c2dadda","date":"2026-07-26 08:19:52 -0700","author":"Steve","subject":"where to watch: JustWatch live-availability links on home + episode detail (verified 200, honest — tracks current streaming vs stale platform claims)","body":""},{"hash":"259dc22","date":"2026-07-26 08:17:17 -0700","author":"Steve","subject":"recaps: approve S1 (reviewed) + punch up 9 vaguest S2-S5 recaps (incl. S3E17 factual fix: Dixon/Navid+Snoop, not Naomi); applied to live Kamatera DB","body":""},{"hash":"71ac749","date":"2026-07-26 08:11:48 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-26T08:11:40 (4 files) — apps/web/app/layout.tsx apps/web/app/sitemap.ts db/recaps/s1.json apps/web/app/community/","body":""},{"hash":"7988044","date":"2026-07-26 07:58:13 -0700","author":"Steve","subject":"cast: show info only (name/character/bio), drop headshot photos (unflattering non-star candids) from list + detail; rights-ledger data kept for re-enable","body":""},{"hash":"396861c","date":"2026-07-25 13:43:17 -0700","author":"Steve","subject":"gitignore CTA test artifacts (cross-browser test passed: liquid-glass + ombre clean in Chrome + WebKit)","body":""},{"hash":"3b392c3","date":"2026-07-25 13:35:50 -0700","author":"Steve","subject":"2026 graphics: Photoshop-baked grainy ombre hero (413KB jpg) + liquid-glass (backdrop-filter) header & frosted stat chips on web; mobile ombre LinearGradient header/bg + BlurView glass cards","body":""},{"hash":"7a343d7","date":"2026-07-25 13:15:28 -0700","author":"Steve","subject":"episode detail: prev/next adjacent-episode nav (row-comparison, crosses season boundaries) — deeper internal linking + crawl depth for SEO","body":""},{"hash":"99ec1b5","date":"2026-07-25 12:55:04 -0700","author":"Steve","subject":"design-consistency pass: interior pages (episodes/cast/search + episode & cast detail) refactored onto the design system (CSS vars, cards, .se, display font) — whole app now cohesively luxe","body":""},{"hash":"592af52","date":"2026-07-25 12:28:25 -0700","author":"Steve","subject":"games: integrate Steve's 6 original self-contained 90210 games (trivia, backgammon, rodeo-runner, slots, blackjack, roulette) — hosted in public/games, styled /games catalog, header+home nav, sitemap","body":""},{"hash":"7fd16eb","date":"2026-07-25 12:23:20 -0700","author":"Steve","subject":"deploy prep: db/setup-prod.sh one-shot prod populator, db/review.mjs content-review CLI, DEPLOY.md runbook (Vercel+Neon / EAS TestFlight / human review)","body":""},{"hash":"c7a0053","date":"2026-07-25 11:41:56 -0700","author":"Steve","subject":"mobile forward: easter eggs — tap UNOFFICIAL badge 5x for hidden 90210 card, long-press title for ZIP-code fun fact","body":""},{"hash":"8fd5a56","date":"2026-07-25 11:40:26 -0700","author":"Steve","subject":"beverly hills photos: 8 free-licensed CC/PD city photos (Rodeo Drive, the sign) into rights-ledger; home 'Beverly Hills backdrop' strip w/ attribution","body":""},{"hash":"73371b3","date":"2026-07-25 11:38:37 -0700","author":"Steve","subject":"cast photos: 12/14 headshots from Wikimedia (per-file license-verified PD/CC-BY/CC-BY-SA only) into rights-ledger w/ attribution; wired into /cast + detail; throttled+idempotent ingester","body":""},{"hash":"8af5353","date":"2026-07-25 11:36:04 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-25T11:35:57 (1 files) — db/ingest-wikimedia-images.mjs","body":""},{"hash":"8dc29d7","date":"2026-07-25 11:33:37 -0700","author":"Steve","subject":"news: index 760 90210 articles (Google News RSS, original+reboot) as headline+source+date+link-out only (no bodies); paginated /news, noopener outbound","body":""},{"hash":"e86cb34","date":"2026-07-25 11:32:01 -0700","author":"Steve","subject":"professional redesign: original luxe design system (globals.css), Playfair+Inter fonts, animated SVG dusk hero + art-deco brand mark, sticky header/nav, stat+nav cards, dynamic OG image, favicon","body":""},{"hash":"2a1d19a","date":"2026-07-25 11:24:01 -0700","author":"Steve","subject":"internal search: /search (SSR) across episode titles+recaps and cast names+characters+bios, links to detail pages; header nav","body":""},{"hash":"d2ccd5a","date":"2026-07-25 11:21:37 -0700","author":"Steve","subject":"spoiler guard: progress-based recap hiding on web (SpoilerGuard, localStorage+event, no Context to dodge @types/react skew) + mobile (watched-through + reveal, AsyncStorage)","body":""},{"hash":"5d109ee","date":"2026-07-25 11:09:18 -0700","author":"Steve","subject":"contrarian fixes: add recap_status/bio_status to canonical schema.sql (was ALTER-only drift), correct Jessica Stroup bio, add NEXT_PUBLIC_SITE_URL to deploy gate","body":""},{"hash":"e3f69d6","date":"2026-07-25 11:04:34 -0700","author":"Steve","subject":"SEO layer: crawlable per-episode + per-cast detail pages w/ JSON-LD (TVEpisode/Person/TVSeries), sitemap.xml (135 urls), robots.txt, per-page metadata; list pages link into details","body":""},{"hash":"9cde287","date":"2026-07-25 10:55:38 -0700","author":"Steve","subject":"cast bios: 14 original ai-draft bios + person->character main-cast links; /cast shows role + bio","body":""},{"hash":"2a7ccb0","date":"2026-07-25 10:46:04 -0700","author":"Steve","subject":"recaps: complete Season 5 (22 original spoiler-safe drafts) — all 114 episodes now drafted","body":""},{"hash":"896da57","date":"2026-07-25 10:45:22 -0700","author":"Steve","subject":"recaps: complete Season 4 (24 original spoiler-safe drafts)","body":""},{"hash":"d9e5137","date":"2026-07-25 10:38:56 -0700","author":"Steve","subject":"recaps: complete Season 3 (22 original spoiler-safe drafts; sensitive storyline handled with care)","body":""},{"hash":"2cc6c11","date":"2026-07-25 10:37:54 -0700","author":"Steve","subject":"recaps: complete Season 2 (22 original spoiler-safe drafts)","body":""},{"hash":"c7d73bc","date":"2026-07-25 10:37:09 -0700","author":"Steve","subject":"recaps: complete Season 1 (24 original spoiler-safe drafts) via scalable db/recaps/sN.json + apply-recaps.mjs; add recap_status ai-draft review gate","body":""},{"hash":"c260ce8","date":"2026-07-25 10:29:54 -0700","author":"Steve","subject":"write 6 original spoiler-safe S1 recaps (our wording, grounded in factual events; AI-drafted, review before publish)","body":""},{"hash":"fc01815","date":"2026-07-25 10:28:56 -0700","author":"Steve","subject":"ingest factual cast + character names (TVmaze, names-only, no photos/bios) — populates /cast","body":""},{"hash":"1b02ed5","date":"2026-07-25 10:12:13 -0700","author":"Steve","subject":"contrarian fixes: correct Expo API-base wiring (expo-constants + EXPO_PUBLIC), add AsyncStorage watchlist + spoiler tag (native value for Apple 4.2), parameterize legal emails","body":""},{"hash":"a3ffaa4","date":"2026-07-25 10:06:07 -0700","author":"Steve","subject":"gitignore + untrack tsconfig.tsbuildinfo (build artifact)","body":""},{"hash":"c230818","date":"2026-07-25 10:05:36 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-25T10:05:29 (8 files) — apps/web/tsconfig.tsbuildinfo package.json pnpm-lock.yaml apps/web/app/cast/ apps/web/app/episodes/","body":""},{"hash":"648b098","date":"2026-07-25 10:03:03 -0700","author":"Steve","subject":"iteration 2: Expo/EAS scaffold (TestFlight config) + shared /api/episodes contract + pending-image placeholder pipeline; web+mobile tsc clean","body":""}]}