Three bugs fixed:
1. lastEdited mismatch: saveProjectToStorage stamped Date.now() in
localStorage but saveRemoteProject sent the React state's stale
lastEdited — server and localStorage had different timestamps, so
the "Pull latest" stale detection on a second device never fired.
Fix: stamp lastEdited once before both calls so they're identical.
2. saveProjectToStorage now returns the stamped object so callers don't
have to re-compute the timestamp.
3. Sync errors were auto-clearing after 2.5s making failures invisible.
Now the "⚠ Sync failed" badge stays visible until the next successful
sync, and a Retry button lets you force a re-push without making an edit.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New englishGloss field on every word object (editable input, placeholder "e.g. grace")
- Populated automatically from the macula-greek gloss map on lookup and suggest
- Shows alongside Short definition in the card's second row
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds public/nt-strongs-gloss.json (100 KB) — the most-common per-word
English gloss for each Strong's number, computed from the macula-greek
SBLGNT dataset. This replaces the fragile kjv_def comma-parsing approach:
grace now shows "grace" not "acceptable", God shows "God" not "X exceeding",
will shows "will" not "desire", etc.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Strip Strong's X/+ notation prefixes and take the first meaningful
English word from the comma-separated kjv_def — so G2316 shows
"God" instead of "exceeding", G40 shows "holy" instead of "(most) holy
(one", etc. Falls back to the raw def if all segments are filtered.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Render modal via createPortal(…, document.body) so it's never clipped
or offset by parent overflow/transform CSS — appears as a true centered
overlay regardless of page scroll position
- Reorder word rows: English definition leads (bold), then Greek lexeme,
transliteration, and Strong's number — makes it easy to recognise words
without reading the Greek
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Instead of adding all passage words automatically, the suggest button now
opens a modal listing every Greek word from the verse range as checkboxes.
Content words (nouns, verbs, adjectives) are pre-checked; function words
(articles, prepositions, conjunctions, common pronouns) are pre-unchecked.
Select all / Select none shortcuts included. Words already in the chunk
are excluded from the list entirely.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The previous implementation fetched SBLGNT from bible.helloao.org using
the wrong translation ID and an API that returns raw text strings, not
per-word Strong's data — so it always silently returned nothing.
Now uses a bundled NT Strong's concordance (public/nt-strongs-concordance.json,
~908 KB) derived from the Clear-Bible macula-greek SBLGNT dataset. This maps
each verse (book/chapter/verse) to the exact Strong's numbers that appear in it,
making the suggest feature accurate and offline-capable after first load.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- NT_BOOK_NUMBER map + suggestGreekWordsForChunk: fetches SBLGNT interlinear
from bible.helloao.org, extracts Strong's numbers for the exact verse range,
and auto-populates Greek word rows — fixes wrong/unrelated words from manual entry
- staleLocalProjects detection on startup: compares lastEdited timestamps so the
app knows when the server has a newer version of a project you already have locally
- pullLatestFromServer + amber banner on home page for one-click sync pull
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The Bolls.life BDAG endpoint (/dictionary-definition/BDAG/) now returns
empty arrays for all queries, and the search endpoint returns 404.
Switched Greek lookups to the OpenScriptures Strong's Greek Dictionary
served via jsDelivr CDN. The ~1.2 MB dictionary is fetched once on first
lookup and cached in a useRef for the session, so subsequent lookups are
instant. Hebrew lookups (Bolls BDBT) are unchanged and still working.
Supports Strong's number lookup (G4102, 4102) and English word search
(faith, apostle), returning lemma, transliteration, short definition,
and an extended definition with derivation and KJV keyword list.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Home page (project list/dashboard): projects stored in localStorage index,
Resume/Delete per project, sorted by last-edited date
- OIA notes: replace single `notes` field with observation/interpretation/application
textareas on each chunk following inductive study method
- Cross-references: string tag array per chunk with inline add/remove UI,
included in HTML and DOCX exports and Claude prompt
- Multi-chapter projects: chapters array on project, chapter tabs in setup view,
chapter-grouped sidebar in study view, global chunk navigation across chapters
- Migration: migrateChunk/migrateProject exported helpers auto-upgrade old
localStorage entries on startup
- Tests updated: new baseProject fixture, 11 additional tests (99 total)
Adds a buildClaudePrompt() utility that formats the completed study project
(scripture, notes, Greek word research) into a structured prompt ready to
paste into Claude. A "Prepare for Claude" button in the header copies it to
the clipboard and shows a brief confirmation. Button is disabled until at
least one chunk exists.
https://claude.ai/code/session_01C4T3bYHR2svLq7JVcxKJ6Y
Sets up Vitest + React Testing Library with jsdom, exports utility functions
for unit testing, and adds 78 tests covering pure functions and component
integration flows (chapter loading, chunk management, navigation, Greek word
lookup).
https://claude.ai/code/session_01C4T3bYHR2svLq7JVcxKJ6Y