diff --git a/docs/prd/README.md b/docs/prd/README.md
index 21c7146..c033507 100644
--- a/docs/prd/README.md
+++ b/docs/prd/README.md
@@ -42,6 +42,32 @@ aimed at increasing amusement, engagement, and social sharing.
6. **What-If Simulator** — medium effort, highest shareability + return traffic
7. **Pledge to Reduce** — medium effort, longest return-visit tail
+## Phase 3 — Virality & Joy Features
+
+| # | PRD | File | Summary | Shareability | Return-visit pull | Effort |
+|---|-----|------|---------|-------------|-------------------|--------|
+| 1 | Token Horoscope | `prd-token-horoscope.md` | Daily satirical AI horoscope seeded from UTC date; shareable + refreshes every 24 h | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ (daily) | Low |
+| 2 | AI Guilt-O-Meter | `prd-guilt-o-meter.md` | Real-time guilt thermometer filling over 5 min; share your guilt level; unlocks Certified Hypocrite badge | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | Low |
+| 3 | Token Confessional | `prd-token-confessional.md` | Confess your worst AI sin; receive satirical absolution + shareable card; ephemeral (nothing leaves the browser) | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | Low |
+| 4 | Token Exchange Rate Board | `prd-token-exchange-board.md` | Financial-terminal ticker showing live token-to-absurd-thing exchange rates reusing existing equivalences logic | ⭐⭐⭐⭐ | ⭐⭐ | Low |
+| 5 | Doomscroll Bingo | `prd-doomscroll-bingo.md` | Weekly 5×5 bingo card of AI sins; confetti on BINGO; Full House of Doom badge; highly shareable card image | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ (weekly) | Medium |
+| 6 | Name That Wasteful Prompt | `prd-name-that-prompt.md` | Daily slider game: guess how many tokens a silly fictional prompt used; Prompt Sommelier badge for 5 plays | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ (daily) | Medium |
+| 7 | AI Autopsy Report | `prd-ai-autopsy-report.md` | On-unload satirical autopsy document for session tokens; printable HTML card; shareable as screenshot | ⭐⭐⭐⭐ | ⭐⭐ | Medium |
+| 8 | Doom Postcard Generator | `prd-doom-postcard.md` | Canvas-rendered downloadable PNG postcard with chosen greeting, milestone, and live token count | ⭐⭐⭐⭐⭐ | ⭐⭐ | Medium |
+
+### Phase 3 Implementation Order
+
+1. **Token Horoscope** — low effort, strongest daily return-visit driver; daily seed + share button
+2. **AI Guilt-O-Meter** — low effort, adds emotional persistence throughout the session; badge milestone
+3. **Token Confessional** — low effort, highly relatable; shareable absolution card drives organic spread
+4. **Token Exchange Rate Board** — low effort, reuses existing equivalences; visual punch for Dashboard
+5. **Doomscroll Bingo** — medium effort, proven viral bingo format; weekly rotation drives D7 returns
+6. **Name That Wasteful Prompt** — medium effort, daily curiosity-gap game; strong badge retention mechanic
+7. **AI Autopsy Report** — medium effort, printable satirical artefact; complements Token Receipt
+8. **Doom Postcard Generator** — medium effort, highest absolute shareability (downloadable image)
+
+---
+
## Shared Design Principles
- **No new runtime npm packages** — the site must remain fully static
diff --git a/docs/prd/prd-ai-autopsy-report.md b/docs/prd/prd-ai-autopsy-report.md
new file mode 100644
index 0000000..f13d4e3
--- /dev/null
+++ b/docs/prd/prd-ai-autopsy-report.md
@@ -0,0 +1,177 @@
+# PRD: The AI Autopsy Report 🔬
+
+## Overview
+
+At the end of a session — triggered by the `beforeunload` / `pagehide` event,
+like the existing Token Receipt modal — the site generates a satirical
+"autopsy report" for the tokens consumed during the visit. Styled as a mock
+medical-examiner document, it includes absurdist fields like *"Cause of
+Death," "Time of Death," "Surviving Dependents,"* and *"Forensic Notes."*
+The report is rendered as a printable HTML card and can be saved as a
+screenshot or printed by the user.
+
+---
+
+## Problem
+
+The existing Token Receipt modal shows session stats in a thermal-receipt
+format. That feature works well, but it is informational rather than
+satirical. The Autopsy Report takes the same session data and re-frames it
+through the lens of absurdist medical bureaucracy — a format that is
+inherently funnier, more screenshot-worthy, and more socially shareable than
+a receipt.
+
+---
+
+## Goals
+
+- Create the site's most screenshot-ready artefact for social media sharing
+- Add a printable leave-behind that users keep and share offline
+- Complement (not replace) the existing Token Receipt with a parallel
+ satirical framing
+
+---
+
+## Non-Goals
+
+- Replacing the Token Receipt (both can coexist — the Autopsy is an optional
+ alternative view)
+- Accurate medical terminology (the absurdity is the point)
+- Canvas/image rendering (HTML + CSS print stylesheet is sufficient)
+
+---
+
+## Feature Description
+
+### Report Fields
+
+The report is formatted as a mock official document with the header:
+
+```
+OFFICE OF THE DIGITAL MEDICAL EXAMINER
+AUTOPSY REPORT — DECEASED AI SESSION
+CERTIFICATE No. [6-digit random number]
+```
+
+| Field | Value / Logic |
+|---|---|
+| **Decedent** | *"Global AI Token Pool (Session Portion)"* |
+| **Date of Death** | Current date/time formatted as `DD MMM YYYY HH:MM UTC` |
+| **Cause of Death** | Randomly selected from a pool of 20 causes (see below) |
+| **Time of Death** | Session end timestamp |
+| **Duration of Illness** | `[sessionDurationSeconds]` formatted as *"X minutes, Y seconds"* |
+| **Tokens Consumed** | `sessionTokens` formatted with commas |
+| **CO₂ Emitted** | `calculateEnvironmentalImpact(sessionTokens).co2Grams` + units |
+| **Water Used** | Water equivalence in mL |
+| **Energy Consumed** | kWh equivalence, formatted to 4 decimal places |
+| **Surviving Dependents** | Randomly selected satirical line (see below) |
+| **Forensic Notes** | Randomly selected note from pool of 15 |
+| **Pathologist** | *"Dr. A.I. Burnout, MBBS (Digital), FRCGPU"* |
+| **Signature** | ASCII-art signature line |
+
+**Cause of Death pool (20 items):**
+
+- *"Unnecessary synonym generation (acute)"*
+- *"Chronic re-prompting with minor wording changes"*
+- *"Compulsive birthday card outsourcing"*
+- *"Acute image generation with no clear purpose"*
+- *"Self-inflicted philosophical debate at 02:00"*
+- *"Repeated 'make it more professional' injections"*
+- *"Wikipedia summary avoidance disorder (terminal)"*
+- *"Elective lunch decision paralysis"*
+- *"Third-party apology text composition"*
+- *"Experimental 'explain like I'm 5' overdose"*
+- *(10 additional)*
+
+**Surviving Dependents pool (15 items):**
+
+- *"3 cached responses that were never read"*
+- *"1 email draft that was deleted without sending"*
+- *"47 GPU cycles, mourned by their families"*
+- *"2 synonyms for 'utilise' that were not utilised"*
+- *"The original, un-AI'd version of your text"*
+- *(10 additional)*
+
+**Forensic Notes pool (15 items):**
+
+- *"No foul play suspected. Victim was a willing participant."*
+- *"Deceased showed no signs of having used a search engine."*
+- *"Evidence of repeated 'regenerate' button activation."*
+- *"Time of arrival on site inconsistent with stated 'quick look'."*
+- *(11 additional)*
+
+### Trigger Mechanism
+
+Two complementary triggers (same pattern as Token Receipt):
+
+1. **Passive:** `pagehide` event after ≥ 30 seconds on page — the report modal
+ opens automatically, giving the user a chance to screenshot before leaving
+2. **Active:** A **"🔬 Generate Autopsy Report"** button is always visible in
+ the Dashboard tab footer (visible after 60 seconds)
+
+The modal has a **"Print / Save as PDF"** button that calls `window.print()`.
+A `@media print` CSS block hides everything except the report card, so the
+browser's print-to-PDF produces a clean document.
+
+### Visual Design
+
+- White card on a dark overlay (modal backdrop)
+- Header in a serif font (or `font-family: Georgia, serif` fallback)
+- Field labels in uppercase, values in normal case
+- A horizontal divider line between sections
+- Faint watermark text: *"CONFIDENTIAL — FOR SATIRICAL PURPOSES ONLY"*
+- Certificate number in monospace font, top-right corner
+
+### Share Button
+
+> 🔬 I just received my AI Autopsy Report.
+> Cause of death: "[cause]"
+> Tokens consumed: [N] | Session: [duration]
+> Get yours: → [URL] #TokenDeathClock #AIAutopsy
+
+---
+
+## Architecture Notes
+
+| Layer | Change |
+|-------|--------|
+| `death-clock-core.js` | Add `AUTOPSY_CAUSES`, `AUTOPSY_DEPENDENTS`, `AUTOPSY_NOTES` constant arrays; add `generateAutopsyReport(sessionData, nowMs)` returning a plain object with all report fields |
+| `index.html` | Add `
` (hidden); add trigger button in dashboard footer |
+| `src/js/` | New `28-autopsy.js`: `initAutopsy()`, `openAutopsyReport()`, `renderAutopsyReport(data)`, print button handler |
+| `styles/` | New rules in `features.css`: `.autopsy-modal`, `.autopsy-card`, `.autopsy-header`, `.autopsy-field`, `@media print` rules |
+
+All dynamic report fields use `textContent` — the `generateAutopsyReport`
+function returns a plain object, and the renderer maps fields to DOM nodes via
+`textContent` assignments.
+
+---
+
+## UX / Accessibility
+
+- Modal follows ARIA modal pattern: `role="dialog"`, `aria-modal="true"`,
+ `aria-labelledby` pointing to the "AUTOPSY REPORT" heading
+- Focus trapped inside modal; `Escape` closes it
+- Print button has `aria-label="Print or save the autopsy report as PDF"`
+- `prefers-reduced-motion`: modal appears without fade animation
+- The `@media print` stylesheet hides the modal overlay/backdrop and renders
+ only the card for clean PDF output
+
+---
+
+## Success Metrics
+
+- Autopsy modal open rate
+- Print/PDF button click rate
+- Share button click rate
+- Social posts containing "#AIAutopsy"
+
+---
+
+## Open Questions
+
+- Should the Autopsy Report and Token Receipt coexist as separate modals, or
+ should one be a "style" toggle of the other? (Separate modals preferred —
+ each serves a different tone)
+- Should a unique "Certificate Number" be shareable as a URL hash to let users
+ retrieve "their" report later? (v2 — would require deterministic seeding from
+ session data)
diff --git a/docs/prd/prd-doom-postcard.md b/docs/prd/prd-doom-postcard.md
new file mode 100644
index 0000000..f0ed972
--- /dev/null
+++ b/docs/prd/prd-doom-postcard.md
@@ -0,0 +1,193 @@
+# PRD: Doom Postcard Generator 🖼️
+
+## Overview
+
+A Canvas API-rendered "doom postcard" that the user can customise with a
+satirical greeting, today's global token count, and a chosen milestone. The
+postcard is rendered entirely client-side (no image libraries, no backend),
+and the user can download it as a PNG or copy its share text. Downloadable
+images are shared on social media at a significantly higher rate than text
+links, making this the site's highest-reach potential feature.
+
+---
+
+## Problem
+
+All current sharing mechanisms produce text. Text posts are lower-engagement
+on social platforms than image posts. A Canvas-rendered image that can be
+downloaded and posted directly to Instagram, X, LinkedIn, or Mastodon bypasses
+the link-preview problem entirely and keeps the site's branding and message
+visible even when the link is stripped.
+
+---
+
+## Goals
+
+- Create the highest-shareability single feature on the site
+- Produce a visually distinctive, screenshot-ready image with zero dependencies
+- Keep all rendering entirely client-side (no upload, no cloud render)
+
+---
+
+## Non-Goals
+
+- Server-side image generation
+- GIF or animated export (v2)
+- Fonts beyond system/Canvas defaults (v2 — font loading via FontFace API adds
+ complexity)
+
+---
+
+## Feature Description
+
+### Postcard Layout (800 × 500 px canvas)
+
+```
+┌─────────────────────────────────────┬──────────────────┐
+│ │ TOKEN │
+│ [GREETING TEXT] │ DEATHCLOCK │
+│ │ 🌍 │
+│ [STAT LINE 1] │ [QR-like art] │
+│ [STAT LINE 2] │ │
+│ │ nitrocode. │
+│ [Milestone name] reached at: │ github.io/ │
+│ [Milestone token count] │ token- │
+│ │ deathclock │
+│ token-deathclock │ │
+└─────────────────────────────────────┴──────────────────┘
+```
+
+- Left panel: dark background (`#0d1117` or theme equivalent), white/green text
+- Right panel: slightly lighter dark background, site branding, URL
+- A subtle noise/grain texture via `ctx.putImageData` for a vintage postcard
+ feel
+- A thin coloured border matching the chosen milestone's `color` property
+
+### User Customisation Options
+
+Presented in a panel above the canvas preview:
+
+| Option | Type | Choices |
+|---|---|---|
+| **Greeting** | Dropdown | 10 preset satirical greetings (see below) |
+| **Milestone** | Dropdown | All milestones from `MILESTONES` array |
+| **Stat to highlight** | Dropdown | CO₂, water, electricity, "tokens today" |
+| **Theme** | Toggle | Dark (default) / Light |
+
+**Preset Greetings (10):**
+
+1. *"Wish you were here — unfortunately the servers are on fire 🔥"*
+2. *"Greetings from the age of automated mediocrity"*
+3. *"Having a wonderful time. The data centres disagree."*
+4. *"Wish you were here. The glaciers wish they were too."*
+5. *"Sending you [N] tokens of love (uninvited)"*
+6. *"The machines are thinking about you. Constantly."*
+7. *"Don't worry, the AI is handling everything. That's the problem."*
+8. *"Postcards from the algorithm: wish you'd typed less"*
+9. *"The planet called. It said 'please stop.'"*
+10. *"You are here. The tokens have already left."*
+
+### Canvas Rendering
+
+The `renderPostcard(ctx, options)` function (in `src/js/`) performs:
+
+1. Fill backgrounds (left and right panels)
+2. Draw border rectangle using `options.milestoneColor`
+3. Fill greeting text using `ctx.fillText()` with word-wrap helper
+4. Fill stat lines (token count, equivalence)
+5. Fill milestone name and token threshold
+6. Fill branding text (right panel)
+7. Draw a simple ASCII-art decoration in the right panel (a 🌍 emoji rendered
+ via `ctx.fillText` is sufficient)
+8. Apply grain texture: loop over a small tile of `putImageData` with random
+ ±5 RGB noise, tiled across the canvas
+
+All text uses `ctx.font` with a system monospace font stack:
+`'Courier New', Courier, monospace`.
+
+### Download
+
+*"Download Postcard 📥"* button calls:
+
+```js
+const link = document.createElement('a');
+link.download = 'token-deathclock-postcard.png';
+link.href = canvas.toDataURL('image/png');
+link.click();
+```
+
+No libraries, no server round-trip.
+
+### Share Button
+
+Shown alongside the download button:
+
+> 🖼️ I generated a doom postcard on the Token Deathclock.
+> [Greeting text] → [URL] #TokenDeathClock #AIPostcard
+
+---
+
+## Architecture Notes
+
+| Layer | Change |
+|-------|--------|
+| `death-clock-core.js` | No changes needed; postcard renderer uses already-exported `MILESTONES`, `getCurrentTokens()`, `calculateEnvironmentalImpact()` |
+| `index.html` | Add `` with options panel, `