Files
spsays-training/PROJECT_CONTEXT.md
T
2026-05-03 21:02:41 +05:30

27 KiB

Prabhupāda Says — Project Context

What this project is

A Next.js app that converts legacy RTF files containing Vedic scriptures and teachings by His Divine Grace A.C. Bhaktivedanta Swami Prabhupāda into structured, browsable content with proper Unicode Sanskrit.

The original RTF files use custom font encodings (Indevr, ScaGoudy, Inbenr/Inbeni, RM Devanagari, Balaram, etc.) where ASCII characters map to Devanagari/Bengali glyphs and IAST diacritical marks. The extraction pipeline decodes these into proper Unicode, generates Devanagari from IAST, and stores everything in MongoDB for serving via a Next.js frontend.


Tech Stack

  • Next.js 16 with Turbopack, React 19, TypeScript
  • Tailwind CSS v4 with @tailwindcss/postcss
  • shadcn/ui (base-nova style, lucide icons) — components: Button, Card, Badge, Tooltip, Input, Drawer
  • next-themes for dark/light/system mode
  • vaul for mobile drawer navigation
  • Prisma v6 with MongoDB (provider prisma-client-js)
  • MongoDB native driver (mongodb package) for seeding (Prisma requires replica set for writes)
  • Python 3 with BeautifulSoup4 + indic-transliteration for HTML extraction scripts
  • Database: MongoDB at DATABASE_URL env variable with ?authSource=admin

Project Structure

spsays-training/
├── app/
│   ├── page.tsx                → Landing page with Logo, links to Books/Essays/Glossary/RTFs
│   ├── layout.tsx              → ThemeProvider + TooltipProvider + PasswordGate wrapper
│   ├── globals.css             → Vintage color palette + reading settings CSS
│   ├── books/
│   │   ├── page.tsx            → Books index (searchable grid, diacritic-aware search)
│   │   ├── books-grid.tsx      → Client component for searchable book grid
│   │   ├── chapter-viewer.tsx  → Shared client component for verse-based books (BG/SB/CC/SB1962)
│   │   ├── extracted-verse-count.tsx → (i) tooltip for verse counts
│   │   ├── bg/                 → Bhagavad-gītā (18 chapters, 653 verses)
│   │   ├── sb/                 → Śrīmad-Bhāgavatam (10 cantos, 8258 verses)
│   │   ├── cc/                 → Caitanya-caritāmṛta (3 līlās, 11348 verses)
│   │   ├── sb1962/             → SB First Canto 1962 Edition (19 chapters, 762 verses)
│   │   ├── kb/                 → Kṛṣṇa Book (89 chapters, 2 volumes)
│   │   ├── nod/                → The Nectar of Devotion (51 chapters, 4 parts)
│   │   ├── tlc/                → Teachings of Lord Caitanya (32 chapters, 2 parts)
│   │   ├── iso/                → Śrī Īśopaniṣad (18 mantras + invocation)
│   │   ├── noi/                → The Nectar of Instruction (11 texts)
│   │   ├── ej/                 → Easy Journey to Other Planets (2 chapters)
│   │   ├── ek/                 → Elevation to Kṛṣṇa Consciousness (6 chapters)
│   │   ├── mg/                 → Kṛṣṇa Consciousness: The Matchless Gift (7 chapters)
│   │   ├── bbd/                → Beyond Birth and Death (5 chapters)
│   │   ├── owk/                → On the Way to Kṛṣṇa (5 chapters)
│   │   ├── rv/                 → Rāja-vidyā: The King of Knowledge (8 chapters)
│   │   ├── poy/                → The Perfection of Yoga (11 chapters)
│   │   ├── pqpa/               → Perfect Questions Perfect Answers (9 chapters)
│   │   ├── ttp/                → Transcendental Teachings of Prahlāda Mahārāja (5 chapters)
│   │   ├── ochkm/              → On Chanting the Hare Kṛṣṇa Mantra (4 chapters)
│   │   ├── hkh/                → The Kṛṣṇa Consciousness Handbook (19 chapters)
│   │   ├── ssr/                → The Science of Self-Realization (8 chapters, 50 sub-chapters)
│   │   └── ds/                 → Dialectic Spiritualism (13 chapters, 36 sub-chapters)
│   ├── essays/
│   │   ├── page.tsx            → Essays listing page
│   │   └── [slug]/page.tsx     → Individual essay reader
│   ├── glossary/
│   │   ├── page.tsx            → Server component wrapper
│   │   └── glossary-client.tsx → Searchable client component (2749 entries)
│   ├── rtfs/
│   │   ├── page.tsx            → RTF file listing (gated by ALLOW_RTF env)
│   │   └── [slug]/page.tsx     → RTF iframe viewer
│   └── api/
│       ├── books/
│       │   ├── route.ts        → GET all book metas
│       │   └── [book]/
│       │       ├── route.ts    → GET single book meta
│       │       └── verses/route.ts → GET verses (?chapter=&verse=&division=&indexOnly=&page=&limit=)
│       ├── glossary/route.ts   → GET all glossary entries
│       └── verify-access/route.ts → GET (check if password enabled) + POST (validate key)
├── components/
│   ├── ui/                     → shadcn components (button, card, badge, tooltip, input, drawer)
│   ├── page-header.tsx         → Shared header with ReadingSettings
│   ├── reading-settings.tsx    → Theme/font/size/justify accessibility settings panel
│   ├── mobile-nav.tsx          → Left-slide drawer for mobile sidebar navigation
│   ├── logo.tsx                → Theme-aware logo component (light/dark variants)
│   ├── password-gate.tsx       → Client-side password protection (runtime check)
│   └── theme-provider.tsx      → next-themes wrapper
├── lib/
│   ├── db.ts                   → Prisma client singleton
│   ├── api.ts                  → Data access layer (getAllBooks, getBookMeta, getChapterVerses, etc.)
│   ├── utils.ts                → cn() helper
│   ├── nod.ts                  → NoD data access (Prisma)
│   ├── tlc.ts                  → TLC data access (Prisma)
│   ├── iso.ts                  → Īśopaniṣad data access (Prisma)
│   ├── noi.ts                  → NoI data access (Prisma)
│   ├── ej.ts                   → Easy Journey data access (Prisma)
│   ├── ek.ts                   → Elevation to KC data access (Prisma)
│   ├── mg.ts                   → Matchless Gift data access (Prisma)
│   ├── bbd.ts                  → Beyond Birth and Death data access (Prisma)
│   ├── owk.ts                  → On the Way to Kṛṣṇa data access (Prisma)
│   ├── rv.ts                   → Rāja-vidyā data access (Prisma)
│   ├── poy.ts                  → Perfection of Yoga data access (Prisma)
│   ├── pqpa.ts                 → Perfect Questions data access (Prisma)
│   ├── ttp.ts                  → Prahlāda Mahārāja data access (Prisma)
│   ├── ochkm.ts                → On Chanting data access (Prisma)
│   ├── hkh.ts                  → KC Handbook data access (Prisma)
│   ├── ssr.ts                  → Science of Self-Realization data access (Prisma, hierarchical)
│   ├── ds.ts                   → Dialectic Spiritualism data access (Prisma, hierarchical)
│   ├── te.ts                   → Two Essays data access (Prisma, uses essays collection)
│   └── jsons/books/            → Extracted JSON data (all books)
│       ├── bg/, sb/, cc/, sb-1962/, kb/   → Original verse/prose books
│       ├── nod/, tlc/, iso/, noi/         → Extracted from other.html
│       ├── ej/, ek/, mg/, bbd/, owk/      → Small prose books
│       ├── rv/, poy/, pqpa/, ttp/, ochkm/ → More prose books
│       ├── hkh/, ssr/, ds/                → Large structured books
│       ├── te/                            → Two Essays
│       └── glossary/index.json            → 2,749 glossary entries
├── prisma/
│   └── schema.prisma           → Verse, BookMeta, ProseChapter, Essay, GlossaryEntry models
├── scripts/
│   ├── bg_extract.py           → BG extraction from bg.html
│   ├── sb_extract.py           → SB extraction from sb.html
│   ├── cc_extract.py           → CC extraction from cc.html
│   ├── sb1962_extract.py       → 1962 SB extraction
│   ├── nod_extract.py          → NoD extraction from other.html
│   ├── tlc_extract.py          → TLC extraction from other.html
│   ├── iso_extract.py          → Īśopaniṣad extraction from other.html
│   ├── noi_extract.py          → NoI extraction from other.html
│   ├── ej_extract.py           → Easy Journey extraction
│   ├── ek_extract.py           → Elevation to KC extraction
│   ├── mg_extract.py           → Matchless Gift extraction
│   ├── bbd_extract.py          → Beyond Birth and Death extraction
│   ├── owk_extract.py          → On the Way to Kṛṣṇa extraction
│   ├── rv_extract.py           → Rāja-vidyā extraction
│   ├── poy_extract.py          → Perfection of Yoga extraction
│   ├── pqpa_extract.py         → Perfect Questions extraction
│   ├── ttp_extract.py          → Prahlāda Mahārāja extraction
│   ├── ochkm_extract.py        → On Chanting extraction
│   ├── hkh_extract.py          → KC Handbook extraction
│   ├── ssr_extract.py          → Science of Self-Realization extraction (hierarchical sub-chapters)
│   ├── ds_extract.py           → Dialectic Spiritualism extraction (hierarchical sub-chapters)
│   ├── te_extract.py           → Two Essays extraction
│   ├── glossary_extract.py     → Glossary extraction
│   ├── seed-db.ts              → Main MongoDB seeder (BG, SB, CC, SB1962, KB, glossary)
│   ├── seed-nod.ts … seed-ds.ts → Individual book seeders
│   ├── seed-te.ts              → Two Essays seeder (uses essays collection)
│   ├── kb_extract_*.py         → KB extraction scripts (intro, vol1, vol2)
│   ├── inject-fonts.py         → Inject @font-face rules into converted HTML
│   └── fix-bengali-encoding.py → Fix Bengali font encoding in cc.html
└── public/
    ├── rtfs/                   → Original RTF files (~430MB, 17 files)
    ├── html/                   → HTML converted from RTF (textutil + @font-face injection)
    ├── fonts/                  → Custom TTF fonts (Balaram, ScaGoudy, Indevr, Inbenr, RM Devanagari, etc.)
    ├── logo_dark.png           → Logo for light theme (with "says.org")
    ├── logo_light.png          → Logo for dark theme (subtle script)
    └── robots.txt              → Disallow all crawlers

Database Schema (Prisma + MongoDB)

type Synonym {
  word     String
  meanings String[]
}

model Verse {
  id              String    @id @default(auto()) @map("_id") @db.ObjectId
  book            String    // "bg" | "sb" | "cc" | "sb1962" | "iso" | "noi"
  division        String?   // null for BG/SB1962/ISO/NOI; canto for SB; lila for CC
  chapter         Int
  verse           Int
  verseEnd        Int?
  reference       String
  bookTitle       String
  devanagari      String
  bengali         String?   // only CC has Bengali
  transliteration String
  synonyms        Synonym[]
  translation     String
  purport         String[]

  @@unique([book, division, chapter, verse])
  @@index([book])
  @@index([book, division])
  @@index([book, division, chapter])
  @@map("verses")
}

model BookMeta {
  id   String @id @default(auto()) @map("_id") @db.ObjectId
  book String @unique
  data Json

  @@map("book_meta")
}

model ProseChapter {
  id         String   @id @default(auto()) @map("_id") @db.ObjectId
  book       String
  volume     Int      // 0 = no volumes (sentinel for non-volume books)
  chapter    Int?     // null for intro segments
  title      String
  type       String   // "chapter" | "intro-segment" | "conclusion"
  slug       String
  order      Int
  paragraphs String[]

  @@unique([book, volume, slug])
  @@index([book])
  @@index([book, volume])
  @@index([book, volume, type])
  @@map("prose_chapters")
}

model Essay {
  id         String   @id @default(auto()) @map("_id") @db.ObjectId
  slug       String   @unique
  title      String
  author     String
  year       Int?
  group      String?  // e.g., "two-essays"
  order      Int
  paragraphs String[]

  @@index([group])
  @@map("essays")
}

model GlossaryEntry {
  id             String @id @default(auto()) @map("_id") @db.ObjectId
  term           String
  definition     String
  definitionHtml String

  @@unique([term])
  @@map("glossary")
}

Books Extracted

Verse-based Books (stored in verses collection)

Book Code Verses Chapters Division
Bhagavad-gītā As It Is bg 653 18 —
Śrīmad-Bhāgavatam sb 8,258 213 10 cantos
Śrī Caitanya-caritāmṛta cc 11,348 62 3 līlās
SB First Canto (1962 Edition) sb1962 762 19 —
Śrī Īśopaniṣad iso 19 — Invocation + 18 mantras
The Nectar of Instruction noi 11 — 11 texts
Śrī Brahma-saṁhitā bs 62 1 (Ch. 5) —
Mukunda-mālā-stotra mm 6 1 —
Nārada-bhakti-sūtra nbs 8 1 —

Prose Books (stored in prose_chapters collection)

Book Code Chapters Source
Kṛṣṇa Book kb 89 (2 volumes) other.html
The Nectar of Devotion nod 51 (4 parts) other.html
Teachings of Lord Caitanya tlc 32 (2 parts) other.html (1968 ed., plain English)
Easy Journey to Other Planets ej 2 other.html
Elevation to Kṛṣṇa Consciousness ek 6 other.html
Kṛṣṇa Consciousness: The Matchless Gift mg 7 other.html
Beyond Birth and Death bbd 5 other.html
On the Way to Kṛṣṇa owk 5 other.html
Rāja-vidyā: The King of Knowledge rv 8 other.html
The Perfection of Yoga poy 11 other.html
Perfect Questions Perfect Answers pqpa 9 other.html
Transcendental Teachings of Prahlāda Mahārāja ttp 5 other.html
On Chanting the Hare Kṛṣṇa Mantra ochkm 4 other.html
The Kṛṣṇa Consciousness Handbook hkh 19 other.html
The Science of Self-Realization ssr 50 sub-chapters (8 parents) other.html
Dialectic Spiritualism ds 36 sub-chapters (13 parents) other.html
Life Comes from Life lcl 16 other.html
Light of the Bhāgavata lob 48 other.html
Teachings of Lord Kapila tlk 18 other.html
Teachings of Queen Kuntī tqk 26 other.html
Gītār Gān gg 18 other.html (Bengali poetic BG)
Songs of the Vaiṣṇava Ācāryas sva 67 songs (4 parts, hierarchical) other.html
Message of Godhead mog 3 others-before-1977.html
Śrī Caitanya-bhāgavata Commentary cbhc 4 others-before-1977.html
Bhagavāner Kathā bk 2 others-before-1977.html (ScaGoudy)
Prayers of King Kulaśekhara (1958) pk 6 others-before-1977.html

Essays (stored in essays collection)

Essay Slug Group Year
Krishna The Reservoir Of Pleasure krishna-reservoir-of-pleasure two-essays 1966
Who Is Crazy? who-is-crazy two-essays 1966
The Spiritual Masters the-spiritual-masters cc-essays 1960
The Absolute Truth the-absolute-truth cc-essays 1957
The Causes of Lord Caitanya's Incarnation causes-of-lord-caitanyas-incarnation cc-essays 1957
The Confidential Reasons for Lord Caitanya's Appearance confidential-reasons-for-lord-caitanyas-appearance cc-essays 1957
The Glories of Lord Nityānanda glories-of-lord-nityananda cc-essays 1957
Vedānta-sūtra (Typed Transcript) vedanta-sutra-typed typed-transcripts 1969
Shaktipujah shaktipujah reviews —
Devotee and the Divinity devotee-and-the-divinity standalone —

Other Documents (stored in book_meta + prose_chapters with od- prefix)

Document Code Chapters
An Analysis of Bhagwat Geeta od-analysis-bg 3
Solution of Present Crisis by Bhagwat Geeta od-solution-crisis 4
Śrī Caitanya Mahāprabhu od-sri-caitanya 3
Conception of Geeta Nagari on the Principles of Gandhi od-geeta-nagari 1

Other

Content Collection
Glossary (2,749 entries) glossary

Font Encoding System

ScaGoudy → IAST mapping (used in BG, SB, CC, ISO, NOI, NoD, and most 1969+ books)

ä→ā  Ä→Ā  å→ṛ  Å→Ṛ  ñ→ṣ  Ñ→Ṣ  ö→ṭ  Ö→Ṭ  ë→ṇ  Ë→Ṇ  ò→ḍ  Ò→Ḍ
ç→ś  Ç→Ś  ì→ṅ  ï→ñ  ü→ū  Ü→Ū  é→ī  É→Ī  à→ṁ  ù→ḥ  è→ṝ  û→ṁl  ÿ→ḷ

Bengali fonts (Inbenr/Inbeni in CC)

Custom-encoded fonts where ASCII codepoints render as Bengali script. Fixed by fix-bengali-encoding.py.

RM Devanagari font (used in ISO, NOI)

Custom-encoded Devanagari font (p51 CSS class). The text appears as garbled ASCII without the font. Skipped during extraction — Unicode Devanagari is generated from IAST transliteration instead.

Devanagari generation

IAST transliteration → Devanagari via indic-transliteration library. Key fixes:

  • join_virama_words() — joins virāma + consonant AND virāma + vowel
  • normalize_devanagari_anusvara() — ङ् → ं before velars, ञ् → ं before palatals

Books without ScaGoudy encoding

  • TLC (1968 Edition) — plain English transliterations ("Krishna" not "Kṛṣṇa")
  • Two Essays (1966) — plain English
  • GG (Gītār Gān) — Bengali poetic text (ScaGoudy decoded for transliteration)
  • LCL (Life Comes from Life) — dialogue book, ScaGoudy decoded
  • MOG, CBHC, PK — pre-1977 handwritten documents, plain English
  • BK (Bhagavāner Kathā) — pre-1977, uses ScaGoudy encoding
  • CC Essays, Vedānta-sūtra transcript — plain English
  • All other books from other.html use ScaGoudy encoding

Book Types and URL Patterns

Verse-based books (use ChapterViewer client component)

Route Pattern Books
/books/bg/[chapter]/[verse] BG
/books/sb/[canto]/[chapter]/[verse] SB
/books/cc/[lila]/[chapter]/[verse] CC
/books/sb1962/[chapter]/[verse] SB1962
/books/iso/[mantra] Īśopaniṣad (verse + intro segments)
/books/noi/[text] Nectar of Instruction (verse + intro segments)
/books/bs/[chapter]/[verse] Brahma-saṁhitā (chapter 5, 62 verses)
/books/mm/[chapter]/[verse] Mukunda-mālā-stotra (6 mantras)
/books/nbs/[chapter]/[verse] Nārada-bhakti-sūtra (8 sūtras)

Prose books (use per-book data layers + reading pages)

Route Pattern Books
/books/kb/[volume]/[slug] Kṛṣṇa Book
/books/{code}/[chapter] NoD, TLC, EJ, EK, MG, BBD, OWK, RV, POY, PQPA, TTP, OCHKM, HKH, LCL, LOB, TLK, TQK, GG, MOG, CBHC, BK, PK

Hierarchical prose books (sub-chapters as separate pages)

Route Pattern Books
/books/ssr/[chapter] Science of Self-Realization (slugs: "1-1", "1-2", "intro-foreword", etc.)
/books/ds/[chapter] Dialectic Spiritualism (slugs: "1-1" = Socrates, "1-2" = Plato, etc.)
/books/sva/[chapter] Songs of the Vaiṣṇava Ācāryas (slugs: "1-1" = Śrī Guru Praṇāma, etc.)

Essays

Route Content
/essays All essays listing (10 essays across 4 groups)
/essays/[slug] Individual essay reader

Other Documents

Route Content
/other-documents All other documents listing
/other-documents/[slug] Document index (chapter listing)
/other-documents/[slug]/[chapter] Individual chapter reader

Other routes

Route Content
/ Landing page
/books Searchable book grid
/glossary Searchable glossary (2,749 entries)
/rtfs RTF viewer (gated by ALLOW_RTF=true)
/api/verify-access Password protection endpoint

Volume Convention

Books without volumes use volume: 0 as a sentinel value in the prose_chapters collection. This satisfies the Prisma schema's @@unique([book, volume, slug]) constraint without requiring schema changes.

  • KB uses volume: 1 and volume: 2
  • All other prose books use volume: 0

Hierarchical Books (SSR, DS)

SSR and DS have parent chapters with sub-chapters stored as individual prose_chapters docs:

  • Sub-chapter slugs: "1-1", "1-2", "2-1", etc.
  • Parent chapter info stored in intro.json metadata:
    {
      "chapters": [
        {
          "number": 1,
          "title": "Learning the Science of the Soul",
          "subChapters": [
            { "slug": "1-1", "title": "Seeing the Aim of Human Life" },
            { "slug": "1-2", "title": "Your Original Consciousness Is Kṛṣṇa Consciousness" }
          ]
        }
      ]
    }
    
  • Sidebar UI shows parent headings (non-clickable) with sub-chapters indented below
  • Prev/next navigation skips parent headings

UI Features

Reading Settings (accessibility)

  • Theme: Light / Dark / System toggle
  • Serif Font: Toggle to switch reading content to Georgia/serif
  • Font Size: Slider (XS → XXL) using CSS zoom on main and aside
  • Justify Text: Toggle for justified text alignment on reading content
  • Settings persist in localStorage under spsays_reading_prefs
  • Applied via CSS classes on <html> element

Mobile Navigation

  • Left-slide drawer (vaul) triggered by a menu button next to the Previous button
  • Only visible below lg breakpoint
  • Shows the full sidebar navigation grouped by section
  • Implemented in all 24+ reader pages via shared MobileNav component
  • Books page: diacritic-aware search (typing "Krsna" matches "Kṛṣṇa")
  • Glossary page: full-text search across terms and definitions
  • Uses Unicode NFD normalization + manual IAST character stripping

Color Palette

  • Light mode ("Aged Parchment"): Warm cream backgrounds, deep sepia text, saffron/ochre primary
  • Dark mode ("Ancient Manuscript"): Deep warm brown backgrounds, parchment text, golden saffron primary

Password Protection

  • Client-side gate component (PasswordGate) wrapping the entire app
  • Runtime check via GET /api/verify-access (checks if ACCESS_KEY env var is set)
  • Validation via POST /api/verify-access (compares submitted key)
  • Stores valid key in sessionStorage
  • Bypassed when ACCESS_KEY is not set

Environment Variables

DATABASE_URL=mongodb://user:pass@host:port/spsays?authSource=admin
ALLOW_RTF=true           # optional — enables RTF viewer routes
ACCESS_KEY="secret"      # optional — enables password protection (quote if contains #)

How to Run

# Development
npm run dev

# Prisma
npx prisma generate                  # Regenerate Prisma client after schema changes

# Extraction scripts (Python 3 + beautifulsoup4 + indic-transliteration)
python3 scripts/bg_extract.py        # Extract BG
python3 scripts/sb_extract.py        # Extract SB
python3 scripts/cc_extract.py        # Extract CC
python3 scripts/nod_extract.py       # Extract NoD from other.html
python3 scripts/iso_extract.py       # Extract Īśopaniṣad from other.html
python3 scripts/ssr_extract.py       # Extract SSR from other.html
python3 scripts/ds_extract.py        # Extract DS from other.html
# ... (similar for all other books)

# Database seeding
npx tsx scripts/seed-db.ts           # Seed BG, SB, CC, SB1962, KB, glossary
npx tsx scripts/seed-nod.ts          # Seed NoD
npx tsx scripts/seed-iso.ts          # Seed Īśopaniṣad
npx tsx scripts/seed-te.ts           # Seed Two Essays
# ... (similar for all other books)

# Build
npx next build

Verse JSON Schema (BG/SB/CC/SB1962/ISO/NOI)

{
  "book_title": "Śrīmad-Bhāgavatam",
  "canto": 1,
  "chapter": 1,
  "verse": 1,
  "verse_end": null,
  "reference": "SB 1.1.1",
  "devanagari": "ॐ नमो भगवते वासुदेवाय\nजन्माद्यस्य यतो ...",
  "bengali": null,
  "transliteration": "om namo bhagavate vāsudevāya\njanmādy asya yato ...",
  "synonyms": [
    { "word": "om", "meanings": ["O my Lord"] },
    { "word": "namaḥ", "meanings": ["offering my obeisances"] }
  ],
  "translation": "<b>I offer my obeisances unto Lord Śrī Kṛṣṇa...</b>",
  "purport": ["paragraph 1...", "paragraph 2..."]
}

Prose Chapter JSON Schema

{
  "book": "ek",
  "chapter": 1,
  "title": "Choosing Human and Animal Lives",
  "type": "chapter",
  "paragraphs": ["<b>heading</b>", "body text...", "<div style=\"text-align:center\"><i>verse</i></div>"]
}

Intro Segment JSON Schema

{
  "slug": "preface",
  "title": "Preface",
  "type": "intro-segment",
  "book": "ek",
  "order": 2,
  "paragraphs": ["paragraph 1...", "paragraph 2..."]
}

Essay JSON Schema

{
  "slug": "krishna-reservoir-of-pleasure",
  "title": "Krishna The Reservoir Of Pleasure",
  "author": "His Divine Grace A.C. Bhaktivedanta Swami Prabhupāda",
  "year": 1966,
  "group": "two-essays",
  "order": 1,
  "paragraphs": ["paragraph 1...", "paragraph 2..."]
}

Glossary JSON Schema

{
  "title": "Glossary of Vedic Terms",
  "description": "A comprehensive glossary...",
  "totalEntries": 2749,
  "letters": ["A", "B", "C", ...],
  "entries": [
    {
      "term": "Ācārya",
      "definition": "a spiritual master who teaches by his own example...",
      "definition_html": "a spiritual master who teaches by his own example..."
    }
  ]
}

Known Issues

  1. MongoDB BSON wire corruption: The MongoDB server occasionally corrupts large BSON documents. Workaround: seed using insertOne + $push for paragraphs one at a time.

  2. SB verse numbering: 5 duplicate verse reference tags in the HTML. Fixed by using the TEXT N header as authoritative.

  3. RTF routes gated: /rtfs only accessible when ALLOW_RTF=true.

  4. scripts/ excluded from tsconfig: Prevents TypeScript build errors from seed scripts.

  5. CSS zoom for font scaling: zoom property works in Chrome/Safari/Edge but may not work in older Firefox (< 126). A transform: scale() fallback is provided via @supports not (zoom: 1.1).

  6. Password protection requires ACCESS_KEY at runtime: The PasswordGate component checks the server at runtime via /api/verify-access. The env var must be available when the server is running, not just at build time.