Books Read Blog Shop Admin
edgarroche.com · Avatar Studios · QC 29 Aug 2026

App Bible + QC engine to launch

This bible is live on both clean URLs:
https://www.edgarroche.com/bible
https://www.edgarroche.com/bible.html
Local: C:\Users\Ernesto\OneDrive\Desktop\EdgarRoche-Website\bible.html

Public author site for Edgar Roché: books, series, blog, contact, checkout. Cloud Run service edgar-roche on project avatar-studios-ai. Live: https://www.edgarroche.com

0. History — why the bible looked “missing”

Fixed and staying fixed. Two old bugs (i18n FOUC hid pages without i18n.js; nginx try_files served homepage for /bible). This page has i18n-ready + inline visibility. nginx maps /biblebible.html (200 on production, re-checked 19 Aug 2026).

1. Identity

Static nginx site (HTML/CSS/vanilla JS + CineImagine design). Audience: readers and fans. Not a multi-tenant SaaS. Membership/podcast/speaking sections exist but stay hidden until real content exists.

2. Login

Live: email + password via Identity Platform (Identity Toolkit REST). No username field. Reset: /forgot-password. Pages: /login · /register · /account. Authorized domains include edgarroche.com. OAuth/2FA never existed.

3. Error census (QC engine) — re-run 19 Aug 2026

#ItemStatusOwner
1–15Honesty QC, nginx headers, honeypot, CSP/HSTSStill good on live
16Login email+passwordLive Identity Platform
17/health + /readyz 200. Public /healthz is 404 (Google Frontend intercepts that path — nginx never sees it). Docker HEALTHCHECK and Cloud Run startup probe hit /readyz.Documented. Do not use /healthz on the custom domain.
18Stripe test mode. Checkout is POST /api/checkout/session (not Payment Links).Code ready; 409 until a title is armed + sk_liveEdgar live key
19Resend not live (FormSubmit only)Waitlist/contact use FormSubmit; Resend env detected on /api/statusEdgar
20sk_test exposed in chat (not in Git)Rotate, do not rewrite GitEdgar
22Podcast / membership / speaking not realStay hidden + aria-hiddenLater
28sessionStorage (no httpOnly cookie)Known until a BFF session cookie existsLater
29Bible FOUC / /bible SPA fallbackFixed; /bible 200
31iPhone / iPadDone — 1024 / dvh / touch / scroll
32Leer in-appSample + chapter rail + tools. EPUB when files existEdgar files
33Printful merch UIShop + tabs by book + search + wishlist + bundles. Catalog gatedEdgar token
34Dashboard clienteTabs: Library / Orders / Wishlist / Addresses. Orders empty until StripePedidos reales
35Dashboard adminTabs: Status / Essay. KPIs from /api/status; ventas $0Stripe live
36book.html navFixed
37Nav inconsistente (login/legal/account/bible missing Read/Shop)Fixed 19 Aug — 5 destinos + auth slot desktop/móvil
38BFF HEAD /api/* returned 501Fixed — do_HEAD reuses GET without body
39Neon Postgres + RLS for signed-in wishlist/progress/addressesLive schema. App role edgarroche_app (no BYPASSRLS). Guests stay on localStorage.
40Website fundamentals (splash, WebP, CTA, fonts)Fase 2 shipped (see docs/audit)
41Vibe-coding risk audit (authz, resilience, tests)Fixed in repo 19 Aug — Fase 15. Not on live Cloud Run yet (public /api/status still returns funds)Deploy
42Repo vs live driftGit has QC+hardening+light series. Live still old image. Visitors cannot see it until deploy.ps1Edgar deploy
43Shop called admin-only Printful catalog (always 401)Fixed — public shop = merch.js; live SKUs on Admin → Printful tab
44Platform pages without footer (shop/read/account/admin/auth)Fixed — mini legal footer on every HTML page
45Light mode series titles invisible (ink on dark posters)Fixed in CSS ?v=20260819d — cream type + paper nav/shadowsDeploy
46Stripe test Payment Links leftover in books.jsRemoved. Checkout is BFF session only
47Orders / revenue dashboards emptyHonest empty. Needs Stripe live + persisted events (Fase 13)API + DB
48Reader is sample not EPUBWorking sample + HEAD for epub.js. Not a mock manuscriptEdgar files
49Checkout 200 waited on FormSubmit; Stripe.js leftover; Netlify/Vercel files; service.yaml probed /healthzFase 17: sendBeacon then redirect; no Stripe.js; leftovers ignored/deleted; probes /readyz + /healthDeploy

4. Print / POD APIs — exact links (books)

The storefront sells via Stripe Checkout sessions (POST /api/checkout/session). Gelato/Blurb/KDP buttons were stripped on purpose (fake storefront). Physical print requires a server (Secret Manager). Do not put print API keys in config.js.

Decidido: novelas 6×9 = Bookvault (direct) + KDP Amazon (ISBN locked) + IngramSpark más tarde para librerías. Printful/Printify = merch (tees, tote, mug, poster), no el paperback. API keys never in config.js.

Best fit for Edgar’s paperbacks / hardcovers

VendorWhat it isDocs (human)API base / orders
Lulu Print API Best public API for trade books (PDF in, ship out). OAuth2 / OpenID. Product page
API docs
Developer portal
Create API keys
Sandbox portal
OpenAPI spec
Live: https://api.lulu.com/
Sandbox: https://api.sandbox.lulu.com/
Print jobs: POST https://api.lulu.com/print-jobs/
Gelato Global POD; books + merch. Header X-API-KEY. MEGAPROMPT target. API docs (dashboard login)
API portal / keys
Orders: https://order.gelatoapis.com/v4/orders
Catalog/prices: https://product.gelatoapis.com
Shipping: https://shipment.gelatoapis.com
Ecommerce: https://ecommerce.gelatoapis.com
Bookvault UK/EU book POD, API-first, good for direct-to-reader paperbacks. API setup
Connect your site
Orders: POST https://api.bookvault.app/v3/Order
Auth: Authorization: basic bv_YOUR_API_KEY
Blurb / RPI Print Blurb has no standalone public API. Printing is RPI Print (self-service + custom/enterprise). Blurb Print API page
RPI Print APIs
Storefront (not API): https://www.blurb.com
Onboarding + sandbox via RPI (not a public URL you can curl without a contract). Self-service = US shipping only; Custom API = global.

Merch POD (not primary for 6×9 books — still real APIs)

VendorDocsAPI base
Printify https://developers.printify.com/ https://api.printify.com/v1/ — shops: GET /v1/shops.json — products: /v1/shops/{id}/products.json. Bearer token. No CORS (server only). Catalog is merch, not trade books.
Printful Overview
API v1 docs
API v2 beta
v1: https://api.printful.com
v2: https://api.printful.com/v2 (orders: /v2/orders)
Prodigi Print API
v4 reference
Live: https://api.prodigi.com/v4.0POST /Orders
Sandbox: https://api.sandbox.prodigi.com/v4.0
Header: X-API-Key
Mixam https://mixam.com/documentation/api Public OpenAPI v3 + Swagger UI on that page (short-run / offset-style books & print, not classic Amazon POD).

Distribution portals — no public print-order API

VendorLinkReality
Amazon KDP https://kdp.amazon.com Upload PDFs in the portal. No public KDP Print API. Amazon SP-API is for Marketplace sellers, not KDP titles.
IngramSpark https://www.ingramspark.com Bookstore/library distribution. No public REST print API for indie authors. Lightning Source / Ingram Content is B2B contract.

What to create (Edgar) — copy/paste

  1. Bookvault: already in Secret Manager edgar-roche-bookvault-api-key — add Sabrosa title in the portal (PDFs).
  2. Printful (merch, not novels): https://developers.printful.com/docs/ → private token → Secret Manager edgar-roche-printful-api-key
  3. Stripe live keys when ready to take money (still test today).
  4. Resend domain + API key for real mail (FormSubmit is temporary).
  5. EPUB / audio files per book for the in-app reader.

Until those secrets exist, checkout stays Stripe (ebook / “I’ll fulfill print later”). Do not restore Blurb/Gelato buttons that open generic homepages.

5. QC phases

Phase 1 — Frontpage + headers

Done live: https://www.edgarroche.com/

Phase 2 — Login

Done live: https://www.edgarroche.com/login

Phase 3 — Inner pages

/blog · /book.html?id=humangpt · /privacy

Phase 4 — Checkout

All five books are Coming Soon on the storefront. Stripe is still test-mode. POST /api/checkout/session returns 409 until a Bookvault title exists. Do not take print money yet.

Phase 5 — Mail

Resend domain + API key in Secret Manager. FormSubmit is temporary.

Phase 6 — Hidden products

Podcast / membership / speaking stay hidden.

Phase 7 — Sabrosa first (Bookvault)

API key is in Secret Manager edgar-roche-bookvault-api-key. Cloud Run /api/status pings Bookvault. Catalog has 0 titles. USD prepay funds are 0.

Edgar does in the Bookvault portal (I cannot: no PDFs in the repo, and creating a title bills £19.95):

  1. Add a card / prepay USD (Financial → PrePayment, RemainingFunds is 0).
  2. Add title Sabrosa — paperback, dummy ISBN, print partner US (not UK hub).
  3. Upload interior PDF + cover wrap. Order one proof to the LA/PR address on file.
  4. Tell me the dummy/real ISBN → env BOOKVAULT_SABROSA_ISBN to arm checkout for Sabrosa only.

I already did via API: account ping (Master, myBookVAULT, eroche@edgarroche.com), empty library, countries list. I will not POST a Title (charges setup, needs files).

Phase 8 — Device QC + platform (done)

iPhone/iPad: hamburger at 1024px, 100dvh, safe-area, tap 44px. Routes: /read · /shop · /admin · /account. Reader is a working sample (not a fake manuscript). Shop has search, wishlist, bundles (Coming Soon). Account has library samples, continue, wishlist, addresses.

Phase 9 — Sabrosa files (Edgar)

PDFs + prepay in Bookvault portal. Then set BOOKVAULT_SABROSA_ISBN. The storefront reads /api/status and turns Sabrosa’s button on by itself.

Phase 10 — Stripe live

Put STRIPE_SECRET_KEY (sk_live) + STRIPE_WEBHOOK_SECRET in Secret Manager. Armed titles call POST /api/checkout/session and redirect to Stripe. Webhook is mounted at /api/webhooks/stripe.

Phase 11 — Full in-app manuscript

Drop assets/books/{id}-es.epub and {id}-en.epub (and optional MP3). The reader already HEAD-checks that path and loads epub.js. No more UI work.

Phase 12 — Printful merch live

Secret Manager PRINTFUL_API_KEY. Shop already calls GET /api/printful/catalog. Mockups follow from Printful.

Phase 13 — Real dashboards

After live money: persist Stripe sessions → orders. Client orders list and admin revenue fill in. Until then they stay $0 on purpose.

Phase 8b — Covers + contact + blog

Jackets object-fit:contain. Contact FormSubmit — click Activate Form. Blog essays are long-form ES/EN.

Phase 14 — Full platform QC (19 Aug 2026)

Re-audited frontpage, inner pages, reader, shop, account, admin, auth, legal, BFF, nginx. Non-API gaps found and patched in repo: unified 5-destination nav + auth slot on mobile, account/admin/shop tabs, reader chapter rail, HEAD on the Python API, Docker probe /health, legal copy no longer says Payment Links, bible light theme. Live slot still needs a deploy for visitors to see this. API gates unchanged (see §6).

Phase 15 — Vibe-coding hardening (19 Aug 2026)

Audit fixes 1–15 shipped (docs/audit/edgarroche-com/vibe-coding-risk-audit.md): /api/status is redacted for anonymous (catalog only — the BFF verifies Identity ID tokens server-side and only ADMIN_EMAILS see funds/plan/stripe mode); /api/printful/catalog is admin-only (401); checkout origin is allowlisted; Stripe sessions carry an Idempotency-Key; webhook answers 401 on bad signature / 503 without secret with a 300s timestamp window; Bookvault responses cache 45s; nginx rate-limits /api/ (checkout stricter) and /readyz proxies to the BFF; POST bodies cap at 32 KiB; entrypoint.sh supervises the Python API; deploy.ps1 prints the rollback runbook; checkout.js never fakes “order received” on a 5xx; admin.js sends the ID token and the server decides. 18 unit tests in tests/test_print_api.py (stdlib unittest) + qc-validate checks. Fulfillment stays out of the webhook until persisted event.id idempotency exists (fix 16, by design).

Phase 16 — Full page QC + frontend close-out (19 Aug 2026 night)

Re-ran every HTML route, header/footer, tabs, buttons, and BFF contract. Census is §7 below. Shipped in this pass (repo): light-mode series type, legal footer on all platform/auth pages, shop no longer hits admin Printful, Admin Printful tab with Bearer token, dead Stripe Payment Links stripped from books.js. Live still needs a Cloud Run deploy or visitors keep seeing the old image (unredacted /api/status, invisible series titles in light, no new footers).

Phase 17 — Stack QC hygiene (20 Aug 2026)

Approved gaps from docs/audit/edgarroche-com/stack-qc.md, no new platforms. Checkout 200 uses navigator.sendBeacon (keepalive fallback) so FormSubmit cannot stall the Stripe redirect. Stripe.js removed — hosted Checkout session URL only. CSP dropped js.stripe.com / api.stripe.com / buy.stripe.com. netlify.toml / vercel.json deleted and listed in .dockerignore. service.yaml startup /readyz, liveness /health. README describes the real stack (no Three.js runtime). Kafka / Redis / Postgres / K8s still out. Deploy still pending.

6. Stack — UI wired; money/print still gated on secrets + files

Cloud Run edgar-roche · nginx + Python /api/ · Identity Platform · Neon Postgres (RLS) · FormSubmit · PWA shell. Signed-in wishlist / progress / addresses sync via /api/me. Guests stay on localStorage. Coming Soon is a live 409 from the BFF, not a fake storefront.

Honesty: “todo activo, nada Coming Soon” is not possible until Edgar pastes files and live keys. Inventing Buy buttons that charge nothing (or email a fake order) is the bug we already killed. The app is finished as a storefront gate. It is not finished as a store until Phase 9–13.
Edgar pega y listo (APIs / files):
  1. Deploy this branch: .\deploy\deploy.ps1 (repo ≠ live today).
  2. FormSubmit → Activate Form in inbox (contact + waitlist).
  3. Bookvault: PDFs Sabrosa + prepay + env BOOKVAULT_SABROSA_ISBN.
  4. Stripe sk_live + webhook secret (test key already configured on live).
  5. Printful token PRINTFUL_API_KEY.
  6. Optional: Resend RESEND_API_KEY; EPUB/audio into assets/books/.
Besides APIs — remaining to “finish” the app:
  1. Deploy (highest leverage; nothing new is visible without it — includes Fase 17 sendBeacon / no Stripe.js).
  2. Do not un-hide podcast / membership / speaking until there is real audio, a Stripe subscription product, and a talk calendar. Hidden ≠ dead code in the nav.
  3. Fase 13: persist Stripe event.id (then orders tab and admin revenue). Until then empty is correct.
  4. Optional later: httpOnly session cookie on the BFF (item 28). sessionStorage is the known static-site limit.
  5. Neon Postgres: signed-in wishlist, addresses, reading progress, waitlist. Role edgarroche_app has no BYPASSRLS. Guests remain on localStorage.

7. Page QC census — 19 Aug 2026 (re-run)

Source: repo HEAD + live HEAD/GET to www.edgarroche.com. Live /health = ok. Live /api/status still returns full ops JSON (hardening not deployed). Inner routes 200. Legend: Live = works for a visitor today · Repo = works in this checkout · Gated = wired, blocked on purpose (409 / Coming Soon / hidden) · Edgar = needs a secret or file, not more UI.

Shared chrome (every public page)

PieceStateNotes
Header desktopRepo doneBooks / Read / Blog / Shop / Contact + auth slot (Log in or Account / Admin). Theme + ES/EN. Homepage keeps extra About / Series / Dev in the hero nav — correct for a landing page.
Header mobileRepo donedata-auth-slot-mob, hamburger ≤1024px, tap 44px, closeMob().
FooterRepo done (this pass)Was missing on shop/read/account/admin/login/register/forgot/bible. Now legal mini-footer everywhere. Homepage keeps the full 4-column footer.
ThemeRepo doneDark default. Light = paper/copper. Series posters keep cinema cream type (was ink-on-ink).
i18n ES/ENLivei18n.js + boot script on every page. Bible is EN ops doc (i18n-ready so it never FOUCs).

index.html — frontpage

Block / controlStateNotes
Hero, headshot, CTAs (Books / Blog / Series)LiveReal links. No splash. WebP covers.
Stats 5 / 3 / 10+LiveCopy, not a live counter.
About + socialsLiveIMDb / IG / YT / FB / TikTok from config.js.
Books flip cards ×5Live + gatedSample → read.html?id=. View → book.html. Coming Soon → checkout modal → BFF 409. Syncs coming_soon from /api/status.catalog.
PodcastHidden (intentional)hidden + aria-hidden. Play buttons would toast “not published”. Do not show until audio exists.
Series ×3 + pitch modalLive UIopenModal(anima/segfault/isabela). Light mode titles fixed in repo. Pitch copy is real; there is no streaming player (correct — series are in development).
What I do ×4LiveStatic cards.
SpeakingHiddenUntil a real calendar.
Developer terminal + app tilesLiveTiles open Avatar Studios Cloud Run URLs from config.js.
Newsletter + contactLive FormSubmitHoneypot. Needs Edgar to click Activate Form once. Resend not configured.
MembershipHiddenWould toast “coming soon”. No Stripe subscription product yet.
Checkout modalRepo wiredPOST /api/checkout/session. 409 all titles. 5xx does not fake “order received”. Studio notice is sendBeacon after a 200, then redirect.

read.html — in-app reader

FeatureStateNotes
Sample chapters + TOC railRepo doneJacket/thesis/map/practice. Not a fake book — labeled sample.
Font / theme / progressRepo donelocalStorage per book. Continue-reading on Account.
TTS + sleep timer + quote PNGRepo doneBrowser voice until MP3 exists.
EPUB / audio filesGatedHEAD assets/books/{id}-en.epub. Drop files → loads. Edgar.

shop.html

FeatureStateNotes
Tabs by book + search + wishlistRepo doneTabs All + 5 titles. Wishlist → localStorage.
Merch cards + bundlesGated (honest)Buy disabled Coming Soon. Bundles not dual fake prices.
Printful live catalogAdmin onlyWas a dead 401 for visitors after authz. Shop now uses merch.js. Admin tab hits /api/printful/catalog with Bearer. Edgar: token.

book.html?id=*

FeatureStateNotes
Jacket, story, gallery, sample, waitlist, checkoutLive UI + gated payWaitlist → FormSubmit. Checkout → BFF. No Gelato/Blurb.

blog.html / post.html

FeatureStateNotes
Filters, 7 themes, long-form ES/ENLiveStatic JS corpus. Admin “essay” downloads JSON; does not auto-publish (correct, no CMS).

login / register / forgot-password

FeatureStateNotes
Email + password Identity PlatformLiveNo username. Honeypot. Reset via Identity Toolkit.
SessionLive (browser)ID token in sessionStorage. Not httpOnly (item 28).

account.html

TabStateNotes
LibraryLive samplesAll 5 titles + continue page. Purchased EPUB after Stripe fulfillment (Fase 13).
OrdersHonest emptyCopy says 409. Not a mock order list.
WishlistLive (Neon + device)Signed-in: /api/me. Guest: localStorage.
AddressesLive (device)Saved for later Stripe Shipping. Not sent to a server yet.

admin.html (allowlist emails only)

TabStateNotes
StatusRepo wiredBearer → redacted-vs-ops /api/status. Live still serves full JSON to anonymous (deploy). KPIs $0 honest.
PrintfulRepo this passBearer catalog. 409 until token.
EssayLive toolDownload JSON only.

Legal + bible

PageStateNotes
privacy / terms / cookiesLiveCheckout sessions (not Payment Links). Theme/lang localStorage disclosed.
bible.html · /bibleLive URL, repo content newer200 on production. This census is in the repo until deploy.

BFF contract (frontend ↔ backend)

CallWhoState
GET /api/statusbooks.js (public catalog) · admin.js (ops + token)Repo: public = catalog only. Live: still full ops blob.
POST /api/checkout/sessioncheckout.jsWired. 409 all books. Origin allowlist + idempotency in repo.
GET /api/printful/catalogadmin.js only401 without admin token. Shop no longer calls it.
POST /api/webhooks/stripeStripeRepo: 401/503. Live: old 200-ack handler until deploy.
Identity Toolkitauth.jsLive.
FormSubmitcontact, newsletter, waitlist, fire-and-forget order notice on 200 checkoutLive endpoint; Activate Form is Edgar. Checkout no longer awaits FormSubmit.
GET /api/mecommerce.js when signed inRepo wired. 401 guest. 503 if Neon not on the service.
POST /api/me/*wishlist, addresses, progress, waitlistRepo wired. Waitlist without Neon returns 200 persisted:false (FormSubmit still sends).
GET /api/admin/waitlistadmin.jsAdmin Bearer. Empty until Neon is on Cloud Run.

8. QC masivo — 29 Aug 2026 (Mouvement + Neon + login)

Re-run local 127.0.0.1:8092 + live www.edgarroche.com. Legend: Hecho = UI+contrato listos en este repo · Live = visitante lo ve hoy (imagen Cloud Run vieja) · Gated = cableado, bloqueado a propósito · Edgar = secret/archivo/deploy, no más UI.

Login: sí está setup. Identity Platform email+password. Páginas login / register / forgot / account. Nav pinta Account + Admin. Esta pasada: refreshToken + ERAuth.ensureToken() para que /api/me y Admin no mueran a la hora.
Honestidad: “todo cobrando, nada Coming Soon” no es posible hasta deploy + Bookvault Sabrosa + Stripe live. Inventar un checkout que cobre $0 es el bug que ya matamos. El frontend está conectado al BFF. El dinero sigue gated.

Por página (29 Aug)

PáginaHeader / footerFeatures activosGated / no mock
index.htmlHecho — About/Books/Podcast/Series/Dev/Blog/Shop + theme/lang/loginHero, about, 5 libros, podcast visible, series 3:4, apps, newsletter, contacto, chatbot local, checkout modalBuy → 409. Podcast play → toast. Speaking/membership no en nav (correcto)
book.htmlHechoHistoria, galería, muestra, waitlist, wishlist, checkoutPay gated. Waitlist → FormSubmit + /api/me/waitlist
read.htmlHechoMuestra + progreso. Signed-in → NeonEPUB cuando existan archivos
blog.html / post.htmlHechoFiltros, 7 temas, ES/ENSin CMS (ensayo admin = JSON download)
shop.htmlHechoTabs + search + wishlistMerch Coming Soon. Printful solo Admin
login / register / forgotHechoIdentity Toolkit liveSesión sessionStorage + refresh
account.htmlHechoTabs Library / Orders / Wishlist / AddressesOrders vacío honesto. Sync Neon si hay token+DB
admin.htmlHechoStatus / Printful / Waitlist / EssayOps solo admin. Ventas $0 honestas. Waitlist vacía sin Neon live
Legal + bible.htmlHechoPrivacy/terms/cookies realesBible noindex

9. Quince fases — de aquí al store live (no IA todavía)

Fase 18 corre en este repo. Las demás no se auto-despliegan. No commit/push/deploy desde el agente.

#FaseEstadoQué falta
18Auth refresh + waitlist sin Neon + Admin waitlist + QC 29 AugHecho en repoDeploy para que live lo vea
19Deploy Cloud Run (deploy.ps1)EdgarVisitantes siguen en imagen vieja
20Neon en el servicio (DATABASE_URL ya en cloudbuild)Schema en repo; secret creadoConfirmar migrate + ping Admin → Neon on
21FormSubmit Activate FormEndpoint liveClick en inbox de Edgar
22Bookvault Sabrosa (PDF + ISBN env)GatedArchivos + BOOKVAULT_SABROSA_ISBN
23Stripe sk_live + webhookTest key en liveEdgar live key
24Persistir event.id (orders + admin revenue)No empezadoTabla orders + webhook write
25Printful merch armadoUI + admin catalogPRINTFUL_API_KEY
26EPUB / audio en assets/books/Reader HEAD listoArchivos de Edgar
27Resend (reemplaza FormSubmit)Env detectadoKey + templates
28Cookie httpOnly de sesión en el BFFItem 28 conocidoDespués de Neon estable
29Podcast publicadoUI visible, play = toastAudio + links Spotify/Apple
30Membership StripeOculto a propósitoProducto real, no un toast
31Speaking calendarOcultoFechas reales
32Ingesta de datos + motor IA (megaprompt Fase 2)Bloqueado — solo tras aprobar §10Gemini/Anthropic, no Asana salvo que Edgar lo pida

10. Megaprompt Fase 1 — auditoría de fuentes (sin implementar)

App: edgarroche.com. Dato central: catálogo de libros + identidad de lector + pedidos print (no guiones CineImagine). Fase 2 no arranca aquí.

10.1 Fuentes que ya fluyen

FuenteFormatoDónde viveEstructura
Catálogo librosJS BOOKS + GET /api/statusRepo + BFF + Bookvault /TitlesAlta: ids, coming_soon, print_ready
Identity (login)JWT + refreshIdentity Platform · sessionStorageemail, localId
Wishlist / addresses / progressJSONlocalStorage guest · Neon si signed-inRLS por app.user_id
Waitlistemail + book_idFormSubmit + Neon waitlist_entriesMedia
Contacto / newsletterform JSONFormSubmit (inbox Edgar)Baja — no hay CRM propio
CheckoutStripe sessionStripe; webhook ack sin persistirAlta en Stripe, cero en nuestra DB
BlogJSON estáticoassets/js/blog-*.jsAlta, compile local
Chatbot frontpagekeywordsSolo browserNo se guarda
Series pitchesHTML en main.jsEstáticoNo hay CRM de pitches

10.2 Vacíos (no conectar sin aprobación)

10.3 Cómo alimentaría un motor de sugerencias (propuesta, no código)

Si Edgar aprueba Fase 2: centralizar en Neon (perfiles, waitlist, orders, contact logs) → dashboard Admin con sugerencias de qué título armar primero, a quién avisar, qué ensayo publicar. Modelo principal Gemini, Anthropic respaldo. Credenciales solo Secret Manager. No se implementa hasta aprobación explícita de este §10.

Además de APIs para “terminar” la app: deploy, Activate FormSubmit, PDFs Sabrosa, no desocultar podcast/membership/speaking sin contenido real, persistir Stripe events, opcional cookie httpOnly. Eso es producto, no un segundo panel de IA.