Session 11 — 8 bugs, 2 discussion items, 1 one-pager
March 2, 2026 — All Items ResolvedContext: Sheri conducted beta testing of the live site and reported 8 bugs and 2 discussion items. The core issue was architectural: one database row per prompt answer caused tribute counts, PDF pages, and the preview to treat each individual answer as a separate "tribute." All items were resolved in a single session.
| # | Type | Feedback | Root Cause | Status |
|---|---|---|---|---|
| 1 | Bug | Anyone logged in can see all books | Overly permissive RLS (Row Level Security) policy — a database rule that was set to "allow everyone" with no conditions | Done |
| 2 | Bug | Prompts not included — "one word to describe" shows just the word | The question text wasn't being passed along to the PDF or preview — only the contributor's answer was stored | Done |
| 3 | Bug | Upload 5 photos but only one shows | Photos attached only to first submission per contributor | Done |
| 4 | Bug | Photos oriented incorrectly | The PDF generator ignores EXIF rotation metadata — the hidden "right-side up" flag that phone cameras embed in photos | Done |
| 5 | Bug | Each question on a separate page instead of grouped per person | One DB row per prompt answer; PDF treated each as separate tribute | Done |
| 6 | Bug | Wrong tribute count (counts answers, not people) | Dashboard counted submissions.length not unique contributors |
Done |
| 7 | Bug | Same person can submit multiple times via same link | No duplicate detection; every visit creates new rows | Done |
| 8 | Bug | PDF back cover says "sayitnow.com" (wrong domain) | Hardcoded old domain string | Done |
| 9 | Discussion | Need ability to finalize book and download for print | No "complete" workflow existed | Done |
| 10 | Discussion | Pricing shows "/book" — implies physical book included | Price labels said $29/book |
Done |
| 11 | Extra | One-pager for Sheri to share with potential customers | N/A — new deliverable | Done |
Feedback: "Anyone logged in can see all books, including test books with visible titles."
Files: src/pages/dashboard/index.astro
Feedback: "Prompts aren't included — for example, 'one word to describe [Name]' just shows the single word without any context of what the question was."
[Name] automatically replaced by the honoree's actual name.
Files: TributeBookPDF.tsx, preview/[code].astro
Feedback: "The form lets you upload 5 photos but only one shows up in the preview and PDF."
i === 0 logic). Since each prompt answer was a separate database row, photos on subsequent answers were lost.
photo_urls are consolidated into a single array per contributor. The preview shows a full photo gallery for each person.
Files: TributeBookPDF.tsx, preview/[code].astro
Feedback: "Photos taken on my phone show up rotated or sideways."
Files: src/pages/b/[code].astro
Feedback: "Each question shows as a separate page in the PDF instead of being compiled together per contributor."
This was the core architectural issue. The submission model stored one database row per prompt answer, not per contributor. Everything downstream — tribute counts, PDF pages, and the preview — treated each row as a separate "tribute."
Files: TributeBookPDF.tsx, PDFDownloadButton.tsx, PDFGenerator.tsx, preview/[code].astro
Feedback: "The tribute count shows each question as an individual tribute instead of counting everything from one contributor as one tribute."
new Set(submissions.map(s => name + email)).size instead of submissions.length. The PDF generator also reports contributor count, not row count.
Files: dashboard/[bookId].astro, PDFGenerator.tsx
Feedback: "The invitation link can be used more than once by the same person, creating duplicate tributes."
Files: b/[code].astro, migration SQL
Feedback: "The back cover of the PDF says sayitnow.com, which is the wrong domain."
sayitnowbook.com in both the PDF back cover and the preview page (which had sayitnow.io).
Files: TributeBookPDF.tsx, preview/[code].astro
Feedback: "Need a way to finalize the book and send it to print (as PDF)."
published
Files: dashboard/[bookId].astro
Feedback: "The pricing shows '/book' which is confusing — it implies a physical book is included."
/book suffix from all price displays. Added subtitle: "All plans include a digital book with downloadable PDF. Physical printing available separately through our print partner." Updated Premium tier features to consolidate into "High-resolution print-ready PDF."
Files: pricing.astro, stripe.ts
A standalone, print-ready one-pager Sheri can share with potential customers — or print to PDF. Covers the pitch, how it works, occasions, and pricing in a single scrollable page.
File: landing-site/one-pager.html
| Decision | Rationale |
|---|---|
| Group by contributor in PDF | One section per person, not per question answer |
| Re-process all photos through the browser before upload | Permanently bakes in the correct orientation before it reaches the PDF generator |
| Edit mode for signed-in only | Anonymous contributors can't be reliably identified for updates |
Finalize = published status | Reuses existing status value in the schema |
| Keep the permissive book lookup rule in place | Anonymous contributors (who aren't logged in) need it to find a book by share link; the dashboard filters at the query level instead |
| Physical book pricing deferred | Text changes done now; pricing structure for fancier books discussed later |
| File | Changes |
|---|---|
TributeBookPDF.tsx | Major rewrite: group by contributor, show question labels, fix domain URL |
PDFDownloadButton.tsx | Updated to match new contributor-grouped data structure |
PDFGenerator.tsx | Updated data structure, counts unique contributors instead of answer rows |
preview/[code].astro | Contributor grouping, prompt text, all photos, fixed URL |
dashboard/index.astro | Added owner_id filter |
dashboard/[bookId].astro | Unique contributor count, finalize/reopen workflow |
b/[code].astro | EXIF orientation fix, edit mode for returning contributors |
pricing.astro | Removed /book, added digital clarification |
stripe.ts | Updated feature list wording |
migration SQL | Database permission rules: contributors can view and update their own submissions |
one-pager.html | New: shareable one-pager |
| Item | Status |
|---|---|
| Database permission rules applied to production | Done |
| Code deployed to sayitnowbook.com (commit aea57d4) | Done |
| E2E screenshots captured via Playwright | Done |