{"slug":"nineoh-guide","total":61,"limit":100,"offset":0,"since":null,"commits":[{"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":""},{"hash":"3c61104","date":"2026-07-25 09:56:53 -0700","author":"Steve","subject":"iteration 1: Turborepo scaffold + working Next.js web MVP (SSR home, DB health, legal routes) + shared @nineoh/core zod contracts","body":""},{"hash":"ade979f","date":"2026-07-25 09:46:57 -0700","author":"Steve","subject":"add rights-first Postgres schema + original legal pages (disclaimer/DMCA/privacy)","body":""},{"hash":"ac84507","date":"2026-07-25 09:42:36 -0700","author":"Steve","subject":"initial scaffold: build brief + gitignore for Unofficial 90210 Guide","body":""}]}