Commit Graph
213 Commits
Author SHA1 Message Date
nmemmertandClaude Sonnet 5.5 9268514219 Search bar pinned again, now flush under the header at every width (sticky offset follows the header's real height); v2.25.2
Publish Container / build (push) Successful in 15m47s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 16:10:31 -04:00
nmemmertandClaude Sonnet 5.5 5801af9dfb Search bar scrolls away with the page instead of staying pinned under the header; v2.25.1
Publish Container / build (push) Has been cancelled
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 16:07:04 -04:00
nmemmertandClaude Sonnet 5.5 d0741d628e Admin shortcut in the account menu, switched on per study user from /admin; v2.25.0
Publish Container / build (push) Has been cancelled
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 16:03:41 -04:00
nmemmertandClaude Sonnet 5.5 853e758bab Desktop type scale: page titles 48px, section headings 32px, hero 64px, About copy 17px; keep certificate title out of the scale; v2.24.0
Publish Container / build (push) Successful in 16m14s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 15:05:42 -04:00
nmemmertandClaude Sonnet 5.5 99d8b23567 Mobile: one type scale across public pages (h1 32px, hero 40px, h2 24px, nothing under 12px, About copy 17px); v2.23.3
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 14:46:39 -04:00
nmemmertandClaude Sonnet 5.5 5fb44f0490 Header: Follow on Spotify button gets the Spotify icon, solid gold style, hover/focus states and a bigger mobile tap target; v2.23.2
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 14:41:16 -04:00
nmemmertandClaude Sonnet 5.5 9e01c04249 Fix sideways scroll on phones: clip the hero glow on narrow screens; v2.23.1
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 14:39:18 -04:00
nmemmertandClaude Sonnet 5.5 54575c22ef Header: replace My Account nav link with an account icon in the top right (sign-in link / account menu), collapse header below 900px; v2.23.0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 14:36:22 -04:00
nmemmertandClaude Sonnet 5.5 4a7c3cc967 Q&A: pinned questions are featured on the home page, home cards link to the full answer, newest answer first; v2.22.1
Publish Container / build (push) Successful in 16m39s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 14:30:04 -04:00
nmemmertandClaude Sonnet 5.5 960ee41375 Rework Q&A: admin inbox with one-step publish, topics and scripture references; simpler public page with ask-a-question; stop exposing asker emails; v2.22.0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 14:27:17 -04:00
nmemmertandClaude Sonnet 5.5 e6bef529e6 Dashboard: Nuggets attention line counts uploads still open in the workflow and clears when finished; v2.21.0
Publish Container / build (push) Successful in 16m6s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 12:02:30 -04:00
nmemmertandClaude Sonnet 5.5 35d3c9ca33 Season Check: series card, study guide, next-season handover and unseasoned-script checks; v2.20.1
Publish Container / build (push) Has been cancelled
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 11:56:42 -04:00
nmemmertandClaude Sonnet 5.5 50b0e83c2b Add Season Check page and dashboard card: per-lane readiness (season, study, lessons, highlights, feed); v2.20.0
Publish Container / build (push) Has been cancelled
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 11:54:00 -04:00
nmemmertandClaude Sonnet 5.5 77bce2ae0c Hold episode highlights until the episode is in the Spotify feed; auto-fill study lesson audio from the feed by season + episode; v2.19.0
Publish Container / build (push) Successful in 16m16s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 11:47:22 -04:00
nmemmertandClaude Sonnet 5.5 69d445013a Podcast workflow: Finished seasons section grouping fully released seasons; v2.18.0
Publish Container / build (push) Successful in 16m19s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 10:34:44 -04:00
nmemmertandClaude Sonnet 5.5 1bf11a3669 Resolve the Seafile host over IPv4 only (musl/Alpine ENOTFOUND on IPv6 NXDOMAIN); v2.17.3
Publish Container / build (push) Successful in 14m53s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 10:01:13 -04:00
nmemmertandClaude Sonnet 5.5 22c0038ebb Nuggets workflow audio: include failure reason in the error message; v2.17.2
Publish Container / build (push) Successful in 15m27s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 09:38:17 -04:00
nmemmertandClaude Sonnet 5.5 11f3d76e9b Fix Nuggets workflow audio: serve with audio content type (nosniff blocked octet-stream), show playback errors; v2.17.1
Publish Container / build (push) Successful in 16m34s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:56:41 -04:00
nmemmertandClaude Sonnet 5.5 326838e5bc Podcast workflow: episodes start manually via Start new episode (name, season, ep #); scripts no longer create entries; v2.17.0
Publish Container / build (push) Successful in 16m42s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:33:23 -04:00
nmemmertandClaude Sonnet 5.5 3a69e03e60 Podcast workflow: per-lane season number set on the page, only that season shown; v2.16.1
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:28:04 -04:00
nmemmertandClaude Sonnet 5.5 900a3efee3 Podcast workflow: assign lanes by hand, match by season, unique keys for unseasoned episodes; drop old checklist data file; v2.16.0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:25:00 -04:00
nmemmertandClaude Sonnet 5.5 ac1b06f945 Fix admin dashboard crash after removing upcoming events (drop Upcoming card); v2.15.2
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:21:37 -04:00
nmemmertandClaude Sonnet 5.5 28fc822132 Podcast workflow steps: read script, record, edit, upload; v2.15.1
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:18:51 -04:00
nmemmertandClaude Sonnet 5.5 f181cdb182 Add Podcast Episode Workflow (Lane A / Lane B) with Nuggets steps; released dates from the feed; v2.15.0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:16:32 -04:00
nmemmertandClaude Sonnet 5.5 5c2f9113b7 Remove unused calendar styles; v2.14.4
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:12:22 -04:00
nmemmertandClaude Sonnet 5.5 13d0eb6651 Remove podcast checklist backend, calendar events and reminder emails; v2.14.3
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:11:09 -04:00
nmemmertandClaude Sonnet 5.5 99b19faede Remove Lane A/B production checklist panel from admin; v2.14.2
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:09:28 -04:00
nmemmertandClaude Sonnet 5.5 66b7bbef52 Remove standalone podcast-checklist app; admin checklist now uses the existing checklist backend; v2.14.1
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:06:32 -04:00
nmemmertandClaude Sonnet 5.5 d6d2c087b2 Add Podcast Production Checklist (Lane A / Lane B) to admin; v2.14.0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:04:10 -04:00
nmemmertandClaude Sonnet 5.5 ffb3551b7e Add Nuggets Episode Workflow to admin (listen, cold open, record, edit, Spotify); v2.13.0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 07:59:04 -04:00
nmemmertandClaude Sonnet 5.5 eff119e7f0 Redesign study Notes, Reflection questions and Community pages; v2.12.0
Publish Container / build (push) Successful in 15m20s
- Notes: two-pane reader with searchable lesson list and snippets, track chips, friendlier empty states
- Reflection questions: numbered question cards, answered progress bar, unsaved-changes status, sticky save bar, share-to-discussion only when discussion is open
- Community: compact header, lesson browser sidebar with post counts (select on mobile), guidelines card, card-style posts

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 12:00:09 -04:00
nmemmertandClaude Sonnet 5.5 0ab94bfcd4 Discussion stays open for finished studies; only planned studies are closed; v2.11.2
Publish Container / build (push) Successful in 16m10s
A finished study is just no longer the main study, so students who take it later still need discussion.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 11:52:56 -04:00
nmemmertandClaude Sonnet 5.5 f1d4909acb Discussion only open while a study is active; v2.11.1
Publish Container / build (push) Has been cancelled
- Community posts, replies, likes and lesson comments are refused (403) for finished and planned studies
- Reading a closed study's community/comments returns an empty list with closed:true
- Discussion hub lists only active studies; community page shows a closed notice
- Lesson page hides Lesson Discussion, 'Discuss this lesson' and 'Go to Community' for inactive studies; Community buttons hidden on study/dashboard pages
- Tests for isStudyDiscussionOpen

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 11:49:03 -04:00
nmemmertandClaude Sonnet 5.5 bb83f3e8c5 Completed studies: finishing a study keeps access after leaving; certificates always shown; no reminders for finished studies; v2.11.0
Publish Container / build (push) Successful in 15m31s
- Completion is stored on the user (completedStudySlugs, sticky) when every lesson is done; backfilled at startup
- Lessons, notes, progress, quiz, community and certificate stay open for completed studies after leaving the enrollment
- Dashboard/My Account list completed studies with Review Lessons and certificate access
- Study page shows a completed banner
- Lesson-release reminders, weekly digest and re-engagement emails skip finished studies
- Fix: streak fields (current/longest/last studied) and firstCompletionAt were dropped on every restart when users were loaded
- Tests for completion/access/re-engagement

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 11:42:58 -04:00
nmemmertandClaude Sonnet 5.5 7301982bb1 Fix certificate View link (wrong /study/certificate URL), certificates in My Account, name on certificate; v2.10.10
Publish Container / build (push) Successful in 15m29s
- Certificate URLs in the account overview and the issuance email pointed at /study/certificate/:token,
  which the router treated as a lesson page; now /certificate/:token (old links redirect)
- My Account Certificates card lists every enrolled study: progress, Generate, View, Copy link, Download PNG, Share
- Certificate canvas used a non-existent /api/study-account route and always printed 'Student'; now reads the account name
- Panel no longer collapses after generating

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 11:13:44 -04:00
nmemmertandClaude Sonnet 5.5 899e715067 Redesign My Account page: profile header, stats, progress cards, settings/security menus, danger zone; v2.10.9
Publish Container / build (push) Successful in 16m15s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 10:45:37 -04:00
nmemmertandClaude Sonnet 5.5 669cd6555c Redesign study landing page: track cards, numbered steps, tidier hero and Q&A callout, themed progress bars; v2.10.8
Publish Container / build (push) Has been cancelled
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 10:41:18 -04:00
nmemmertandClaude Sonnet 5.5 b8410da5f4 Study pages: progress bar, collapsible chapters, compact upcoming lessons, class-based badges, cleaner sign-in/enroll gates; v2.10.7
Publish Container / build (push) Has been cancelled
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 10:37:44 -04:00
nmemmertandClaude Sonnet 5.5 640d0c1c18 Redesign sign-in / create-account page: split layout, benefits panel, show/hide password, real form submit; v2.10.6
Publish Container / build (push) Has been cancelled
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 10:33:26 -04:00
nmemmertandClaude Sonnet 5.5 b708371cc5 Finished book page: move QR code up to the top right of the hero; v2.10.5
Publish Container / build (push) Successful in 15m22s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 10:18:27 -04:00
nmemmertandClaude Sonnet 5.5 fcc6604926 Finished book QR label: say it downloads the full album; v2.10.4
Publish Container / build (push) Successful in 15m11s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 09:50:01 -04:00
nmemmertandClaude Sonnet 5.5 4d37fac641 Finished Books detail: one tabbed Episodes section (Highlights / All Episodes), searchable playlist, on-demand player; v2.10.3
Publish Container / build (push) Has been cancelled
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 09:47:23 -04:00
nmemmertandClaude Sonnet 5.5 b96e9a79dc Redesign Start Here page: numbered step cards, icons, connectors, mobile stack; v2.10.2
Publish Container / build (push) Has been cancelled
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 09:25:54 -04:00
nmemmertandClaude Sonnet 5.5 2a64f29a00 Second hardening pass: atomic data writes, bible-passage limits, webhook SSRF guard, note sanitizing, CI gates; v2.10.1
Publish Container / build (push) Successful in 15m46s
- Atomic temp-file + rename for all JSON data writes (no truncated files on crash)
- /api/bible-passage: rate limit, range caps (60 verses), bounded cache
- Admin webhooks: https-only, block private/internal/Tailscale addresses (checked at registration and delivery), no redirects
- Resend webhook token compare is timing-safe
- DOMPurify on rendered study notes and broadcast preview
- CI runs lint + tests before build
- Permissions-Policy and HSTS (production) headers; JSON error handler for /api
- Tests for URL safety and atomic writes

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 09:00:28 -04:00
nmemmertandClaude Sonnet 5.5 8a796964b9 Security & hardening pass: scrypt password hashing, persisted admin sessions, upvote/analytics rate limits, dependency fixes, healthcheck, lint cleanup; v2.10.0
Publish Container / build (push) Successful in 17m3s
- Study passwords: salted scrypt; legacy SHA-256 hashes verified and upgraded on login
- Admin sessions persisted (hashed tokens) so deploys no longer log the admin out
- Upvotes: rate limit + one per client per question, approved questions only; rate limit on analytics play/event
- npm audit: 46 -> 4 vulnerabilities (tiptap bumped to 3.31.4)
- Untrack per-user data (study users/notes/progress/etc.) from git
- Dockerfile HEALTHCHECK; node --test suite for password hashing
- Fix email template cards remounting (lost input focus) on each keystroke
- Lint: 34 errors -> 0

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 08:45:39 -04:00
nmemmertandClaude Sonnet 5.5 e2150e1cd7 One companion study guide per series; v2.9.8
Publish Container / build (push) Successful in 21m12s
- Second series gets its own guide (Resources page card, download page, admin fields)
- When a series ends (scheduled or manual) its guide moves onto its Finished Book, which shows a guide button; the main series' guide is cleared unless the launch supplies a new one
- Lane B launch schedule can supply the incoming series' guide
- Download lookup covers second-series and finished-book guides; guide URLs are sanitized on save and on use

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 16:00:52 -04:00
nmemmertandClaude Sonnet 5.5 39691aedb3 Admin: show and manage highlights archived on Finished Books (restore/remove); v2.9.7
Publish Container / build (push) Successful in 15m33s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 15:43:04 -04:00
nmemmertandClaude Sonnet 5.5 752611d121 Episode scripts: file by season + episode so numbers can repeat per book; search labels for current series; v2.9.6
Publish Container / build (push) Successful in 16m51s
- Scripts keyed "<season>-<episode>" (legacy ones migrate on first start; unseasoned ones keep their plain key)
- Season backfill handles episode numbers shared across seasons (title match fallback)
- Fix: "Backfill seasons from RSS" was swallowed by the upload route
- Global search labels script results with the title of the series playing now (both lanes), not just finished books

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 15:31:11 -04:00
nmemmertandClaude Sonnet 5.5 4ddedf0f81 Revert accidental runtime data change to study-reminders.json; v2.9.5
Publish Container / build (push) Successful in 15m50s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 11:26:47 -04:00
nmemmertandClaude Sonnet 5.5 3bd467e198 Homepage: show two current series side by side as compact cards; v2.9.4
Publish Container / build (push) Successful in 15m53s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-08 11:26:41 -04:00