Commit Graph

43 Commits

Author SHA1 Message Date
nmemmert 2ba9c9f7f4 Add Fetch from BSB button to admin lesson editor; v1.1.36
Adds a one-click "Fetch from BSB" button in the lesson passage text field
that calls the BSB API and overwrites the field with verse-numbered text.
Also fixes reference parsing to tolerate leading book abbreviations like
t:1-2 or col:1-2 by stripping letters before the chapter:verse pattern.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-10 10:23:48 -04:00
nmemmert 9e602e29ec Fetch BSB passage text from Bolls.life API in study lesson view; v1.1.35
Adds /api/bible-passage server route that proxies the Berean Standard Bible
from Bolls.life per-verse, with in-memory caching. Study lesson scripture
block now displays live BSB text instead of static passageText. Adds
bibleBook field to StudyProgram so admins can set the book name explicitly
when the study slug doesn't match (e.g. a study titled "ephesians-part-2").

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-10 10:12:25 -04:00
nmemmert abb4c87c41 Update runtime data: analytics events, episode plays, study user state
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-10 09:03:00 -04:00
nmemmert 9174331d2d Bug fixes (real breakage):
Newsletter nudge — was calling /api/study-account/profile (wrong endpoint, ignored subscription). Now correctly calls /api/study-account/preferences with PATCH.
Security:

Email regex — replaced the permissive [^\s@]+@[^\s@]+ pattern with a proper RFC-compliant regex in contact.js and downloads.js
Avatar magic bytes — server now checks actual PNG/JPEG/GIF/WEBP header bytes, not just the data URL prefix
Certificate rate limit — public /api/public/certificate/:token now has a 30 req/15min limiter
Session absolute TTL — admin sessions now have a 30-day hard cap; a stolen token can no longer be kept alive indefinitely by passive reads
Account lockout — 5 failed logins locks a study account for 1 hour
CSP headers — Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, and Referrer-Policy headers added globally
Data integrity:

Cascade delete — deleting a study account now also removes their certificates, community posts, comments, and progress file
UX / reliability:

Escape key on modals — all 3 modal groups (study index, notes, account) now close on Escape
Display name min-length — empty spaces-only names rejected; if provided, must be ≥2 chars
Note save rate limit — 30 saves/minute per user max
Analytics fetch timeout — 5s AbortController so a hanging server doesn't block the browser indefinitely
Email validation on signup — frontend catches bad email formats before hitting the server
Cleanup:

Deduplicated download forms — StudyDownloadForm and ResourceDownloadForm now share a single DownloadForm base; both are now thin wrappers
2026-06-18 09:35:44 -04:00
nmemmert fda9fa27a6 Update analytics cookie banner text
Clearer language explaining what's tracked and that no personal data
is sold or shared.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 14:39:54 -04:00
nmemmert 1010cb1f33 Update study reminders timestamp and exclude admin sessions from pageview analytics
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 13:24:48 -04:00
nmemmert 8eae361a73 Q&A mobile 2026-06-09 11:30:36 -04:00
nmemmert 75d490020b search download fix 2026-06-09 10:02:01 -04:00
nmemmert 9ad24df626 tweaks 2026-06-08 16:47:21 -04:00
nmemmert 3e1b1e0fae Enrolment issue 2026-06-08 14:45:04 -04:00
nmemmert 66699270f5 Clean. Here's what's live now:
- **Tag filter bar** appears above the grid whenever any download has tags assigned. Chips for "All" + each unique tag, centered under the heading.
- **Clicking a tag** filters the grid to only matching downloads. Clicking the active tag again (or "All") clears the filter.
- **Empty state** — if a tag has no results it shows a friendly message instead of a blank grid.
- The filter only shows when tags exist — so it's invisible today (your 3 current downloads have no tags) and appears automatically once you start tagging items in the admin.

To use it: go to Admin → Downloads → edit a download item → add tags like `Colossians`, `Worksheet`, `Devotional`. Those tags will show up as filter chips on the public page instantly after publishing.
2026-06-05 09:23:55 -04:00
nmemmert 285d837a0b publish error fix 2026-06-04 10:22:07 -04:00
nmemmert bccd1cfa60 TFL Resources 2026-06-04 09:46:51 -04:00
nmemmert cb78b6522d All green. You're good to build and deploy. Here's a summary of everything done since your last commit:
---

**🐛 Bugs fixed**
- Study hub/lesson pages turned gold — CSS merge error with `.study-index-page` fixed
- Lesson announcements not saving — `announcement` field missing from `sanitizeColossiansStudySections` whitelist
- 2FA email method blocked with "not configured" — guard checked `totpSecret` instead of `twoFaMethod`
- `STUDY_REMINDERS_FILE` constant never defined — server would crash on first reminder write
- `sanitizeStudyUsers` stripped all 2FA fields — data lost on every restart
- `scheduleStudyReminders` missing from refactored modules

** Features added**
- Commentary supports paragraph formatting (double newline = new paragraph)
- Lesson announcement banner — full-width gold stripe at top of lesson page
- "Take the Quiz" renamed to "Discussion Questions" throughout
- Students must complete checkpoint before unlocking next lesson (lesson list + Next Lesson button both gate on it)
- No checkpoint questions → simple Mark as Completed button as fallback
- Truth For Life syndication widget on homepage
- Newsletter welcome email updated to your new HTML template

**🔧 Maintenance**
- `server.js` refactored from 6,013 lines into 12 focused modules
2026-06-04 09:17:34 -04:00
nmemmert e11858c2f3 gated lessions 2026-06-03 16:07:54 -04:00
nmemmert 346ecb217c refractor server.js 2026-06-03 15:08:14 -04:00
nmemmert e17a818deb fix 2026-06-03 14:31:22 -04:00
nmemmert 68f6212e9b cool stuff 2026-06-03 14:14:25 -04:00
nmemmert b187b19f18 feat: homepage newsletter, Q&A callout, episodes page redesign, SEO/sitemap, asset tagging
- Fix "Invalid Date" on student account page (memberSince guard)
- Fix study community author showing full email instead of username
- Add newsletter sign-up section to homepage (between PRISM and Current Series)
- Add newsletter opt-in nudge to study enrollment flow
- Redesign episodes page: latest episode featured card + per-episode Spotify embed
- Add SEO description field to episodes page (visually hidden, admin-editable)
- Expand default sitemap paths to include /about, /contact, /episodes, /resources, /study, /study/titus, /study/colossians
- Add featured Q&A callout section to homepage
- Add Q&A callout to study hub footer
- Tag both untagged image assets in Asset Manager
2026-06-03 10:56:55 -04:00
nmemmert 5b448aef0f stuff 2026-06-02 14:02:00 -04:00
nmemmert 33ac2fb5d0 Fix homepage external link placement and publish sanitization 2026-06-01 13:31:26 -04:00
nmemmert 1d536827e3 Improve admin UX and autosave handling 2026-06-01 12:56:26 -04:00
nmemmert 295c0b61f8 Default to login mode and make signup toggle a prominent button 2026-05-21 14:51:59 -04:00
nmemmert eee200cf9c Add study community discussion board and Ask Nate button 2026-05-21 14:04:12 -04:00
nmemmert 376088a52b Add study enrollment manager, profile settings, and email verification flow 2026-05-21 11:46:49 -04:00
nmemmert f14992350c adding 2026-05-18 08:27:24 -04:00
nmemmert d74151d91d Enforce study lesson release locks and schedule biweekly Monday dates 2026-05-12 15:09:38 -04:00
nmemmert affd903f40 Make homepage study card admin-editable with NEW tag controls 2026-05-12 12:47:13 -04:00
nmemmert 7568be368e Add Episode Highlights player with Spotify embed auto-resolution and direct embed URL support 2026-05-07 11:36:07 -04:00
nmemmert 583a9b7b66 Implement email tab redesign, archive support, manual Q&A creation, URL linking, and question admin tools
- Add dedicated Emails tab with inbox/archive views and two-pane layout
- Implement archive/unarchive for contact submissions with persisted state
- Add manual question creation endpoint and admin form (non-contact origin)
- Implement URL auto-linking in Q&A answers with safe rendering
- Add question admin tools: search, filter (All/Pending/Approved/Answered/Unanswered), pagination
- Expand admin panel widths to reduce cramping
- Restore and enhance Asset Manager table layout
- Update email reply template with fixed from-address and HTML support
2026-05-07 09:43:16 -04:00
nmemmert 42bac71fd6 Add podcast platform badges and Headliner widget 2026-05-06 10:54:38 -04:00
nmemmert 7c02062663 Make all site content editable from admin; add per-page content blocks 2026-05-05 16:17:23 -04:00
nmemmert 1551599305 Beta: TOTP 2FA, admin asset manager, resource page redesign, rate limiting, and security hardening 2026-05-04 13:56:04 -04:00
nmemmert 7f56060d6b Beta: admin assets, resource download forms, and resource page redesign 2026-04-30 15:47:10 -04:00
nmemmert b26103b7b1 Reorganize admin workflow and persist episode discussion questions 2026-04-27 16:25:26 -04:00
nmemmert b4f1c1dbdb Polish About, forms, and share/contact UI 2026-04-23 17:03:41 -04:00
nmemmert 287fa72462 Replace chatbot with Q&A and add archived series management 2026-04-16 08:25:04 -04:00
nmemmert 50459b7234 Enhance chatbot conversation engine and add retrieval eval suite 2026-04-14 10:36:22 -04:00
nmemmert 063f5d2a0e Add episode transcripts, expand chatbot Q&A database to 28 entries, and build scripts 2026-04-13 10:29:06 -04:00
nmemmert 2653d95605 update 2026-04-09 15:51:17 -04:00
nmemmert 057c856df7 Rebrand site for podcast, add admin CMS, social metadata, and platform links 2026-04-09 11:28:44 -04:00
nmemmert 8f165afcc9 feat: site-wide Swing Music player, persistent storage, mobile UX polish
- SiteWideMusicDock component at app level; persists across all routes
- Dock + player merged into single expandable panel
- Remove non-functional Hide button; one Minimize/Open control
- Swing Music label and action button on same row
- Mobile: dock z-index above player, larger touch target on iPad
- entrypoint.sh: seeds admin-content.json only on first boot/fresh volume
- Dockerfile: seed in /app/data-seed; live data in /app/data (volume)
- shell-with-music-bar padding on project and admin pages
2026-03-19 16:05:16 -04:00
Nate Emmert 695f124afe Set up Siteforge container deployment and registry publishing 2026-03-17 15:15:33 -04:00