Commit Graph

894 Commits

Author SHA1 Message Date
kennethreitz 84fb89f806 Revert chapter.html to working state before navigation changes
Restored chapter.html to the version from commit fb4e970 which had the perfect working keyboard navigation. The recent changes to chapter view were not needed.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 09:07:33 -05:00
kennethreitz 1d7bd64600 Make keyboard navigation viewport-aware on initial keypress
When you scroll the page and then press ↑ or ↓ for the first time, the selection now intelligently starts from what's currently visible in the viewport instead of always starting at the top.

**Behavior:**
- If chapter section is visible → starts there
- If scrolled past chapters → starts at first visible paragraph
- Selection only moves when you press a key (not automatically on scroll)

This makes navigation feel natural when combined with mouse/trackpad scrolling.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 09:06:26 -05:00
kennethreitz 0a2931030a Revert "Add viewport-aware scroll behavior to book view navigation"
This reverts commit 3fc86a09c0.
2025-11-30 09:05:43 -05:00
kennethreitz 3fc86a09c0 Add viewport-aware scroll behavior to book view navigation
Selection now automatically updates when scrolling to match what's visible in the viewport:

- When in chapter drilldown mode, scrolling updates to the first visible chapter
- When viewing paragraphs, scrolling updates to the first visible paragraph
- When chapter section is selected and scrolled off-screen, switches to paragraphs
- Debounced for smooth performance (150ms)

This makes keyboard navigation feel natural when combined with mouse/trackpad scrolling.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 09:05:38 -05:00
kennethreitz 314fe21577 Fix duplicate selection items for blockquotes in book view
Changed selector from selecting all paragraphs to only selecting direct children paragraphs, which prevents selecting both the blockquote and the paragraph inside it.

Before: `section:not(.chapters-section) p` selected p inside blockquotes
After: `section:not(.chapters-section) > p` only selects direct p children

This fixes the issue where Key Verses blockquotes had two selection items.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 09:04:32 -05:00
kennethreitz 2a94971a38 Refactor book view to use drilldown navigation with green box styling
**Book View Changes:**
- Chapter section is now a single item with green box outline
- Press ↓ to select chapter section
- Press Enter to drill down into individual chapters
- Press Esc to exit drilldown mode
- All paragraphs now use green box outline styling (consistent UX)

**Chapter View Changes:**
- Removed 'c' keyboard shortcut (reserved keyword)
- Updated help text

**Navigation Flow:**
1. Start: Press ↓ → selects chapter section (green box)
2. Press Enter → drills into first chapter number
3. Navigate ↑/↓ through chapter numbers
4. Press Enter on a chapter → navigate to that chapter
5. Press Esc → exit back to chapter section
6. Press ↓ from chapter section → move to paragraphs below

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 09:03:33 -05:00
kennethreitz 18c4359e10 Add two-zone keyboard navigation to book and chapter views
Book view now supports navigating both chapter links and introduction paragraphs. Chapter view supports navigating action buttons, verses, and chapter selector controls.

**Book View:**
- Navigate through chapter numbers with ↑/↓
- Continue down to navigate through introduction paragraphs
- Press Enter on chapters to read them
- Visual feedback with green highlights for both zones

**Chapter View:**
- Three-zone navigation: actions, verses, chapter selector
- Press 'c' to jump to chapter selector
- Press Enter in chapter selector to focus dropdown
- Escape to clear selections

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 09:00:07 -05:00
kennethreitz 8537fb548f Remove offline functionality and PWA features
Removed service worker, PWA manifest, offline page, and all related UI components to simplify the application and reduce bloat.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 08:51:54 -05:00
kennethreitz fb4e970567 Refactor API and route functions to be asynchronous
- Updated all route handler functions in the API to be asynchronous by adding 'async' keyword.
- This change enhances performance and allows for better handling of concurrent requests.
- Adjusted related documentation comments to reflect the changes in function signatures.
2025-11-30 02:41:53 -05:00
kennethreitz 6a5414a1c8 Convert main route handlers to async for better concurrency
Converted 20 synchronous route handlers to async:
- search_page, interlinear_landing_page, random_verse
- verse_of_the_day_page, offline_reader, read_root
- books_page, reading_plans_page, reading_plan_detail
- topics_page, resources_page, topic_detail
- read_book, read_chapter, read_chapter_interlinear
- read_verse, strongs_index, strongs_hebrew_index
- strongs_greek_index, strongs_entry

This allows FastAPI to handle these routes asynchronously,
improving performance under high concurrency.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:36:38 -05:00
kennethreitz e86c458e17 Add cached pages navigation with 'c' key
- Press 'c' to switch to cached pages navigation mode
- j/k navigate through cached URLs
- Enter opens the selected cached page
- Esc or h returns to cards mode
- Auto-expands categories when entering cached mode

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:30:02 -05:00
kennethreitz 05dd28258a Add verse selection with speech and drilldown to offline page
- Verses are selectable with j/k navigation
- Space speaks selected verse using Web Speech API
- Enter drills down to verse commentary page
- s stops speech
- v switches to verse mode from cards
- Clicking verses also selects them
- Visual feedback for selected and speaking verses
- Removed cached pages navigation (simplified)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:29:17 -05:00
kennethreitz e3605036ac Add keyboard navigation with drilldown to offline page
- j/↓ move down through quick access cards
- k/↑ move up through cards
- l/→ move right / next chapter in reader
- h/← move left / previous chapter / go back
- Enter opens selected card
- Esc clears selection
- g goes to Genesis 1
- ? shows help

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:26:11 -05:00
kennethreitz 1722c20445 Fix offline page JS not loading - remove extra_js block
The base.html template doesn't have an extra_js block defined,
so the JavaScript was being silently dropped. Moved the script
tag inside the content block where it will be rendered.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:23:08 -05:00
kennethreitz e961cd0a60 Move technical status front and center, fix SW caching
- Add no-cache headers to sw.js endpoint to prevent aggressive caching
- Move system status grid to top of offline page for debugging
- Show connection status, SW version, cache storage, bible data, pages cached
- Add SW version check that reads from actual sw.js file
- Keep download progress indicator in download section
- Move cached pages list to collapsible details

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:22:13 -05:00
kennethreitz e563218f75 Redesign offline page with breadcrumbs and cleaner card layout
- Add proper breadcrumb navigation (Home > Offline Access)
- Use consistent card-based design matching resources page
- Add italic category titles with underline styling
- Cleaner status card with connection badge
- Simplified download section with card container
- Quick access grid with icon cards
- Bible reader in bordered card
- Technical details in collapsible section
- Better dark mode support
- Responsive mobile layout

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:18:55 -05:00
kennethreitz 2cdfaa52cd Redesign offline page with cleaner layout
- Centered hero section with status badge
- Prominent status card with icon
- Clean download section with gradient background
- Quick access grid with larger icon cards
- Improved Bible reader section with styled controls
- Technical details collapsed by default
- Simplified cached URL list (limit 500 per category)
- Cleaner, more modern styling throughout
- Better dark mode support

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:15:36 -05:00
kennethreitz 9a1dc7a7af Disable nginx access logs (uvicorn handles logging)
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:12:43 -05:00
kennethreitz c5712d06f8 Reduce service worker concurrency to 80
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:10:35 -05:00
kennethreitz a66f457747 Revert docker-compose to direct uvicorn (no nginx)
Keep nginx only for production (Fly.io). Local dev uses uvicorn
directly for simpler hot-reloading.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:08:14 -05:00
kennethreitz ad5a1e6c64 Add /health endpoint directly in nginx
Fly.io's Consul health checks hit /health. Now nginx responds
directly with 200 OK without proxying to uvicorn, so health
checks won't fail under heavy load.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:07:20 -05:00
kennethreitz 6a65793579 Enable nginx request logging
- Changed error_log level from warn to info
- Removed access_log off from static files

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:03:59 -05:00
kennethreitz 0505a9e196 Add healthcheck to ensure nginx waits for uvicorn
- Web service has healthcheck on /api/health
- nginx depends on web being healthy before starting
- Added curl to Dockerfile for healthcheck

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:02:59 -05:00
kennethreitz d630e629bd Add nginx to docker-compose setup
- nginx.conf: docker-compose version (uses 'web:8001')
- nginx-prod.conf: production version (uses '127.0.0.1:8001')
- Separate nginx service in docker-compose
- uvicorn runs on port 8001, nginx exposes 8000

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:01:00 -05:00
kennethreitz a32b79c885 Add nginx for HTTP request buffering
- nginx handles slow client connections, freeing uvicorn workers
- Request buffering absorbs slow uploads
- Response buffering for efficient delivery
- Static files served directly by nginx with 1y cache
- Gzip compression enabled
- Keepalive connections to uvicorn

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 02:00:00 -05:00
kennethreitz 102115abd0 Convert offline page to extend base.html for sidebar
The offline page now uses Jinja2 template inheritance to get the
site sidebar automatically. All functionality preserved.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:59:01 -05:00
kennethreitz 09e7db70d9 Make cache progress indicator clickable
The 'Caching for offline' indicator is now a link to /offline page.
Also added toLocaleString() for page count formatting.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:55:35 -05:00
kennethreitz 371f3fc5ac Keep cache button clickable after completion
Button now shows 'Refresh Cache' and stays enabled after download
completes, allowing users to re-download/refresh the cache.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:55:07 -05:00
kennethreitz 014fb0b2fa Set progress interval to 200
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:52:32 -05:00
kennethreitz 3df9a95acb Increase download concurrency to 200 workers
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:52:16 -05:00
kennethreitz be2a2f0c62 Add collapsible URL list with keyboard navigation
- Collapsible category sections for cached pages
- Categories: Main Pages, Bible Chapters, Verse Commentary,
  Interlinear, Stories, Topics, Study Guides, etc.
- Clean URL display: %20 replaced with spaces, paths cleaned up
- Keyboard navigation: j/k to navigate, Enter/Space to expand,
  h/l for left/right, Esc to back out, u to enter URL nav mode
- Increased download concurrency from 50 to 100 workers
- Progress notifications every 250 completions (was 100)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:51:58 -05:00
kennethreitz 6dc6c60ec6 Use concurrent worker pool for faster offline caching
Replace sequential batch downloads with a concurrent pool pattern
using 50 simultaneous workers. This dramatically speeds up the
caching of ~48,000 pages for offline use.

- Each worker pulls URLs from a shared queue
- Progress notifications sent every 100 pages
- Workers run in parallel using Promise.all()

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:50:14 -05:00
kennethreitz 8f7a6097d7 Fix offline status to show accurate progress
- Site has ~48,000 total pages (17k main + 31k verses)
- Only show "Ready for offline use" when >45,000 pages cached
- Show percentage cached for partial downloads
- 12,349 cached is only 25%, not complete

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:47:47 -05:00
kennethreitz d676d5d2dd Add status card to /offline page
- Shows clear status with icon: ready (), warning (⚠️), or error (🚫)
- Displays helpful troubleshooting tips when service worker fails
- Instructions for disabling content blockers, checking browser settings
- Shows page count when cached
- Color-coded cards: green for OK, yellow for warning, red for error

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:47:10 -05:00
kennethreitz 9b262fce89 Add keyboard navigation to /offline page
- j/k or ↑/↓ to navigate quick links and verses
- h/l or ←/→ to move between quick links or change chapters
- Enter to open selected quick link
- g to jump to Genesis 1
- Escape to clear selection
- ? to show keyboard help

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:45:56 -05:00
kennethreitz 8f89fe9bfb Improve /offline page design and fix import error
Design improvements:
- Added Quick Access section with links to Books, Stories, Topics, etc.
- Moved technical debug info to collapsible "Technical Details" section
- Added styled quick link grid with hover effects
- Cleaner layout focusing on user-friendly features

Bug fix:
- Fixed import error: use load_all_stories() instead of get_all_stories()

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:43:36 -05:00
kennethreitz 47b74af662 Show offline caching progress on page load
- Service worker now responds to GET_CACHE_STATUS message
- /offline page queries caching status when it loads
- If download is in progress, shows progress bar immediately without requiring click

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:42:45 -05:00
kennethreitz 684719d34f Add interlinear and story pages to sitemap
- Added all 1,189 interlinear chapter URLs (/book/{book}/chapter/{chapter}/interlinear)
- Added all 186 individual story URLs (/stories/{slug})
- Now the sitemap includes everything for complete offline caching

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:42:16 -05:00
kennethreitz 365cef49c7 Disable PDF buttons when offline
- PDF links/buttons are greyed out (40% opacity) when offline
- Adds strikethrough and "not-allowed" cursor
- Shows tooltip "PDF unavailable offline"
- Prevents click events
- Re-enables automatically when back online

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:38:32 -05:00
kennethreitz c33dc5813b Dynamic sitemap-based offline caching
Major improvements to offline caching:
- Service worker now parses sitemaps dynamically instead of hardcoded URL lists
- Fetches /sitemap.xml and any child sitemaps (sitemap-main.xml, sitemap-verses.xml)
- Caches ALL pages found in sitemaps including 31,102 individual verse pages
- Much cleaner, smaller service worker (~300 lines vs ~1800 lines)
- Added status messages during sitemap parsing
- Better error handling with retry option

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:33:09 -05:00
kennethreitz b8124033bf Improve offline fallback: redirect uncached pages to /offline reader
- Interlinear pages now redirect to offline reader with book/chapter params
- All uncached HTML pages now go to /offline instead of homepage
- Bumped cache version to v5

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:30:49 -05:00
kennethreitz c6ae359e16 On-demand offline caching with all stories
Changes:
- Caching now only starts when user clicks "Download for Offline Use" on /offline page
- Added all 186 Bible stories (including kids mode) to cache list
- Added progress bar and status indicators on /offline page
- Bumped cache version to v4
- Total cacheable pages: ~1,500 (1189 chapters + 186 stories + 66 books + resources)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:27:24 -05:00
kennethreitz 357243c396 Cache entire site offline: all 1189 Bible chapters + resources
Updated service worker to pre-cache:
- All 1189 chapter pages (Genesis 1 through Revelation 22)
- All 66 book overview pages
- All resource/reference pages (topics, stories, study guides, etc.)
- Total: ~1300+ pages for complete offline access

Also bumped cache version to v3 and increased batch size for faster caching.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:24:51 -05:00
kennethreitz 69be068188 Fix service worker registration by serving from root path
Service workers can only control URLs within their scope. A service worker
at /static/sw.js couldn't control the root scope (/) without special headers.

- Add /sw.js route that serves the service worker with Service-Worker-Allowed: /
- Update registration to use /sw.js instead of /static/sw.js

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:20:50 -05:00
kennethreitz 94f42ea751 Add 'Enable Offline' link to sidebar navigation
Adds a link to the /offline debug page at the bottom of the sidebar,
allowing users to easily access offline status and cached pages list.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:19:29 -05:00
kennethreitz 214d4c565b Add offline debug page with service worker status and cached pages list
- Shows service worker registration status
- Lists all cache storage names
- Checks if Bible data (31,102 verses) is cached
- Displays all cached pages grouped by category (clickable links)
- Shows online/offline connection badge
- Includes Bible reader for reading any chapter from cached JSON

Visit /offline to see what's available without internet.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:18:06 -05:00
kennethreitz e21ecfdf44 Fix service worker URL list with 388 verified pages
- Verified all URLs actually return 200 status
- Fixed topic URLs (need capital letters: /topics/Faith not /topics/faith)
- Fixed story URLs (use slugs like /stories/god-creates-the-world)
- Fixed resource URLs (e.g. /fruits-of-the-spirit not /fruits-of-spirit)
- Added all parables, reading plans, study guides
- Total: 388 pages now pre-cached in background

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:14:10 -05:00
kennethreitz bc8149ceb7 Add background pre-caching for full offline support
- Service worker now pre-caches ~160 pages in background after install
- Includes all resource pages, topics, study guides, stories, book pages
- Caches in batches of 5 with 1-second delays to avoid overwhelming server
- Progress indicator shows "Caching for offline: X%" in bottom-left
- Shows "Ready for offline! (X pages)" when complete, then fades out
- Bumped cache version to v2 to trigger re-cache

Combined with the Bible JSON (~4.7MB), the entire site is now
available offline after first visit.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:09:35 -05:00
kennethreitz 87926fa83c Add offline Bible reader with full 31,102 verses
- Created /offline route with client-side Bible renderer
- Loads verses from cached JSON (verses-1769.json)
- Full book/chapter navigation with dropdowns
- Keyboard navigation (← → for chapters)
- Service worker redirects to offline reader when Bible pages fail
- Pre-caches offline reader page on install
- Auto-parses URL params (?book=Genesis&chapter=1)

When offline, users can read any chapter of the Bible using
the cached JSON data - no need to have visited the page before.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:04:32 -05:00
kennethreitz 677f8f05b7 Add Service Worker for offline Bible access
- Created sw.js with caching strategies:
  - Static assets (CSS, JS, fonts) - cache first
  - Bible pages - network first, cache fallback
  - API requests - network first with offline cache
- Pre-caches verses-1769.json (~4.7MB) on install
- Added service worker registration to base.html
- Added offline indicator (red badge in bottom-right)
- Linked manifest.json for PWA support

Users can now read the Bible offline after first visit.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 01:00:29 -05:00