Commit Graph

95 Commits

Author SHA1 Message Date
nmemmert 52d157be69 Update install docs and script for Ubuntu (apt/ufw instead of dnf/firewall-cmd)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-13 08:16:31 -04:00
nmemmert f9283de190 Add README with install, development, production, and migration instructions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-13 08:14:21 -04:00
nmemmert 6bbe045ea6 Add backup/restore npm scripts to package.json
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-13 08:05:42 -04:00
nmemmert eb066bc8cc Add backup and restore scripts for migrating user data between PCs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-13 08:00:49 -04:00
nmemmert 19d3a6b822 Add self-service "change my password" option in Account Settings
New section in Settings: current password + new password + confirm,
verified against the existing hash before accepting. On success it
signs out every other session for that account (in case one was
compromised) but keeps the current session logged in, so changing
your password doesn't immediately kick you back to the login screen.

Renamed the underlying db.js function (adminSetPassword ->
setUserPassword) since it's now shared by both this and the existing
admin-assisted reset.

Verified live: old password rejected after change, new password
works, current session stayed logged in throughout.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 14:42:28 -04:00
nmemmert 9e57f8088a Add admin-assisted password reset
There's no email infrastructure in this app, so a self-service
"forgot password" flow isn't feasible yet. Adds a "Reset Password"
button per user in the admin panel instead: generates a random
temporary password (shown once, for the admin to relay out-of-band),
overwrites the user's password hash, and signs them out of every
existing session so a stolen session can't outlive the reset.

Verified live: old password rejected after reset, new temporary
password logs in successfully.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 14:31:06 -04:00
nmemmert f853d5e301 Fix login quote to BSB wording, consolidate exports into one dropdown
The 2 Timothy 2:15 quote on the login screen was KJV phrasing ("shew
thyself", "needeth not") in an app that otherwise uses BSB throughout
— replaced with the actual BSB text (fetched from the same
bible.helloao.org API the app already calls) and labeled it as such.

The study page header had four separate export buttons (HTML, DOCX,
Markdown, Print/PDF) crowding the toolbar. Consolidated into a single
"Export" dropdown, same pattern as the existing Share panel.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 14:01:10 -04:00
nmemmert 60f3e4d489 Fix huge dead space on the login screen at wide viewports
The branding panel and sign-in card were two full-width grid columns
stretched edge to edge, so on a wide monitor they ended up far apart
with empty space between them, and the panel's content was pinned to
the very top/bottom of the viewport instead of grouped together.
Wraps both in a shared max-w-5xl container that's centered as a unit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 13:56:56 -04:00
nmemmert 5006d0bfbe Add a branding/feature panel next to the sign-in form
The login screen was just a bare card on a dark background. Adds a
feature-highlight panel alongside it (tagline, what the app does, a
scripture quote) on wider screens, using only colors already in the
app's palette (slate-900/300/400, white, sky-500) — no new theme.
Collapses to the original single-card layout on mobile.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 13:50:06 -04:00
nmemmert 7006fbf544 Add admin panel restricted to a single designated account
Adds a full admin view (users + projects, with view/delete) gated
server-side by ADMIN_EMAIL in server/auth.js (defaults to the site
owner's account, overridable via env var for other deployments). The
gate is enforced on every /api/admin/* route, not just hidden in the
UI — verified a non-admin session gets 403 even when it hits the
endpoints directly. Deleting a user leaves their projects in place
(not cascade-deleted) so admin cleanup can't accidentally destroy
someone's study data.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 13:07:54 -04:00
nmemmert 37cfcd55a0 Add study templates, exports, breadcrumb, whole-Bible search, bookmarks UX, and share links
- Study templates: richer multi-line guiding questions in the OIA placeholders
- PDF/print export: reuses buildExportHtml in a new tab + window.print()
- Markdown export: new buildMarkdownExport() with matching tests
- Breadcrumb: current chunk's passage reference shown in the Study page header
- Reader bookmarks: SVG icons instead of ambiguous emoji, always visible
  (not hover-only, so it works on touch devices), plus a Bookmarks panel
  that lists all saved verses across every book and jumps + scrolls to them
- Whole-Bible search: no server-side search endpoint exists, so this fetches
  the full translation once (~7MB) and searches an in-memory flat verse
  index client-side, with results linking back into the reader
- Read-only share links: per-project share token, a public unauthenticated
  /api/share/:token endpoint, and a ?share=TOKEN view that bypasses the auth
  gate entirely and renders the export HTML in a script-sandboxed iframe

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 10:12:00 -04:00
nmemmert 2735ef216c Generalize podcast-specific UI for study-only users
Other people using this app just want to do personal Bible study, not
produce a podcast episode, so the always-visible chrome (chunk
metadata, DOCX import, exports) now says "Session" instead of
"Episode" and marks podcast-only fields as optional. The "Prepare for
Podcast" prompt no longer hardcodes "Verse by Verse with Nate" for
every user — it now pulls from a new "Podcast / show name" field in
Account Settings, so it still works exactly as before once you set
yours, but produces a sensible generic prompt for anyone who hasn't.
Also added an explanatory blurb to the session-list import page and
loosened its docx parser to accept "Session N — Title" in addition to
"Ep. N — Title".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 09:25:28 -04:00
nmemmert 89e701bbda Auto-restore projects when signing in on a new device
Projects that exist on the server but not in this browser's local
cache (e.g. a fresh device) are now pulled down automatically, instead
of requiring a manual "Restore" click per project. Shows a brief
"synced N projects" toast instead. Conflict handling for projects that
exist locally but are stale is unchanged (still a manual "Pull latest"
action), since silently overwriting local edits there would risk data
loss.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 09:05:53 -04:00
nmemmert 5140958305 Add multi-user accounts with per-user data scoping and 2FA
Projects were previously global to anyone who could reach the server.
Adds email/password accounts with httpOnly cookie sessions, scopes
every project (both SQLite and localStorage) to the signed-in user,
and auto-claims pre-existing unowned projects for whoever registers
first. Also adds optional TOTP two-factor auth with backup codes,
managed from a new Account Settings page, since there's no
password-reset flow to fall back on otherwise.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 08:49:33 -04:00
nmemmert bf83dc7cc4 Add docx episode-list import to auto-create chunks
Upload a Word doc with an Ep./Title/Passage table (or "Ep. N — Title"
intro paragraphs) and it parses episodes, fetches the needed chapters,
and creates chunks with episode metadata and verse ranges pre-filled,
including cross-chapter spillover and zero-length markers for
passage-less rows.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 16:38:42 -04:00
nmemmert 103e20c6b4 Add top Prev/Next chunk navigation and improve speak audio click fix
- Add ‹ Prev / Chunk N of M / Next › buttons at top of chunk editor
  header so you can navigate without scrolling to the bottom
- Fix speak audio click: only cancel() when speech is active, append a
  period for a natural trailing pause, slow rate to 0.85, and chain a
  zero-volume tail utterance so the audio session fades out cleanly

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 08:18:17 -04:00
nmemmert 7b350d3683 Fix audio click at end of speech synthesis
Append trailing spaces so the audio session stays open briefly before
closing, preventing the hardware click/pop on webkit/macOS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 08:12:59 -04:00
nmemmert 01de7281a8 Fix Hebrew word picker showing verbose KJV definition instead of short gloss
Add shortHebrewGloss() helper that strips [idiom]/[phrase] prefixes and
takes the first word before any comma/semicolon/paren, matching the clean
one-word display Greek already had. Full kjv_def is preserved in
shortDefinition; englishGloss and the modal bold label now show one word.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 08:12:23 -04:00
nmemmert 145b840bf1 Fix Hebrew word lookup not populating English gloss field
The NT Strong's gloss file only contains G#### keys, so Hebrew lookups
always returned an empty englishGloss. Now falls back to short_definition
(kjv_def from the BDBT API) so Hebrew words match Greek behaviour.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 08:05:35 -04:00
nmemmert c30405b42d Enhance Bible reader with interlinear audio, bookmarks, cross-refs, search, and font size
- Add 🔊 Speak buttons on Greek/Hebrew word cards in both the reader interlinear panel and study-side word entries (Web Speech API, he-IL / el-GR)
- Click verse number to expand inline interlinear panel with original script, transliteration, gloss, parsing, and Strong's number
- Verse bookmarking with 5 highlight colors, persisted to localStorage
- 🔗 Cross-Refs toggle fetches open-cross-ref dataset and shows amber reference chips per verse
- 🔍 In-chapter search filters verses live with yellow keyword highlights
- S/M/L/XL font size controls
- 📋 Copy verse button outputs formatted citation (Book Ch:V BSB — text)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 08:01:03 -04:00
nmemmert 405cf7218b Add chapter audio playback to Bible reader, auto-matching selected book/chapter 2026-06-15 08:32:15 -04:00
nmemmert 1733df7879 Fix missing verse text for poetic OT content (Psalms etc.) 2026-06-15 08:27:18 -04:00
nmemmert ce93b42b83 Merge pull request #16 from nmemmert/claude/bible-reader-feature-qn0pz6 2026-06-11 23:41:09 -04:00
Claude b3c266fa66 Add a read-only Bible reader page (BSB)
Adds a "Read Bible" button on the home screen that opens a simple
chapter browser using the existing helloao BSB API, with book/chapter
pickers and prev/next navigation, separate from study projects.

https://claude.ai/code/session_013GXQxSaTF6zeBsSYTeF3fN
2026-06-12 03:38:01 +00:00
nmemmert d1861ec5d9 Fix broken test suite and untrack runtime artifacts
- Bridge jsdom localStorage/sessionStorage over Node 22+'s experimental
  globals that vitest's jsdom environment doesn't override
- Update Greek lookup tests to mock the OpenScriptures Strong's
  dictionary instead of the retired bolls.life path
- Update migrateChunk no-op test for backfilled fields
- Match en-dash verse range labels in chunk creation test
- Untrack .api.log/.api.pid and gitignore them

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 16:40:44 -04:00
nmemmert c0ceb68faa Avoid side effect in state updater for audio chapter advance
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 16:28:12 -04:00
nmemmert 9a3ed73d20 Fix BSB audio player not advancing past first chapter
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 16:22:23 -04:00
nmemmert 0f08721b48 Add BSB full-book audio player card to home page
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 16:15:28 -04:00
nmemmert 603c3bcbf2 Fix commentary JSON parse error for chapters without coverage 2026-06-11 14:45:47 -04:00
nmemmert bb92095ba4 Add word-by-word Greek/Hebrew interlinear under Scripture panel
Adds a collapsible Interlinear section beneath the Scripture text
(stacked and split layouts) showing each original-language word with
its BSB gloss, transliteration, parsing, and Strong's number on hover.
Data is generated offline from the Berean Standard Bible translation
tables via scripts/build-interlinear.mjs into per-book JSON files.
2026-06-11 14:29:24 -04:00
nmemmert 6c4658e244 Apply brand kit colors and fonts to DOCX export
Use antique gold accent, rich black text, Cormorant Garamond
headings, and Lora body text. Remove fill backgrounds, keeping
only the gold left-border scripture callout and section divider.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 09:18:05 -04:00
nmemmert c41916b3ce Improve DOCX export styling and include missing fields
- Add background notes, tags, and final script to the export
- Use shaded section labels, accent color, and a callout-style scripture box
- Switch accent color from indigo to teal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 09:14:15 -04:00
nmemmert 6fb3bfbd82 Suggest existing tags when tagging chunks
Shows quick-add chips and a datalist of tags already used elsewhere
in this project or across all projects.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 09:04:30 -04:00
nmemmert 3e84ea37be Add DOCX upload to populate Final Script from a document
Uses mammoth to extract raw text from an uploaded .docx file.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 08:59:31 -04:00
nmemmert e59bc25ed0 Add chunk tagging, persisted Split View prefs, sticky tab bar, and Strong's hover badges
- Tag chunks with topics; aggregate into project index and add a Home page tag filter
- Persist studyLayout/activeStudyTab in localStorage
- Make the Split View tab bar sticky while scrolling
- Show a hoverable Strong's number badge with gloss on each word study card

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 08:51:23 -04:00
nmemmert 65039d44a5 Show expandable definitions in word study suggestion list
Lets users preview a word's full Strong's definition before
deciding whether to add it.
2026-06-11 08:37:45 -04:00
nmemmert 5d0cc2934f Add 2-pane split study layout with tabbed reference panels
Scripture stays pinned in a sticky left column while Notes,
Cross-Refs, Word Study, Commentary, and Script become tabs in
the right column. Toggle via "Split View" / "Stacked View".
2026-06-11 08:33:52 -04:00
nmemmert 6f1a311ba9 Add commentary panel and smart cross-reference suggestions with hover preview
Adds a Commentary section (HelloAO commentaries) and a "Suggest from
passage" cross-reference feature using the open-cross-ref dataset, with
hover popups that show the referenced verse text.
2026-06-11 08:27:32 -04:00
nmemmert f95d5670ae Stop tracking SQLite database files
Local DB state shouldn't be versioned; only code, migrations, and schema belong in git.
2026-06-10 11:01:32 -04:00
nmemmert faf9ba9e2e Make episode info, general notes, and final script per-chunk fields
Each chunk is unique, so these fields no longer share a single project-level value.
2026-06-10 10:56:54 -04:00
nmemmert 91b01c3117 Revert restart.sh systemd auto-restart, keep dev setup.sh workflow 2026-06-10 09:35:28 -04:00
nmemmert b40f03846d fix install 2026-06-10 09:29:54 -04:00
nmemmert 33107cf7af install fix 2026-06-10 09:23:36 -04:00
nmemmert 7bfbe826a0 BIG UPGRADE 2026-06-10 09:12:47 -04:00
nmemmert caa781d039 Fix missing verses and add cross-chapter chunk spanning 2026-06-01 15:56:14 -04:00
nmemmert 587eedd192 Add typed and bulk chunk range entry 2026-06-01 15:47:54 -04:00
nmemmert e3b14fb25b Merge branch 'claude/greek-suggest-cross-device-sync' 2026-06-01 15:38:16 -04:00
nmemmert 7eadb8500b Add OT books and separate Greek/Hebrew lookup 2026-06-01 15:38:11 -04:00
nmemmert c378f85d1b Suggestions 2026-06-01 11:33:06 -04:00
nmemmert be62be0aa6 Merge pull request #15 from nmemmert/claude/greek-suggest-cross-device-sync
Fix sync: consistent lastEdited timestamp + persistent error + retry …
2026-05-28 15:00:41 -04:00