Make hosted web the primary roadmap lane
This commit is contained in:
@@ -1,5 +1,12 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.1.22 - 2026-07-12
|
||||||
|
|
||||||
|
- Reordered the roadmap around a web-first path to get Libre Study online privately on Christ Unscripted.
|
||||||
|
- Recorded the hosted online app as the primary permanently evolving product lane.
|
||||||
|
- Kept desktop and mobile as explicit future targets that should follow the proven online study model.
|
||||||
|
- Added the local edit, local commit, Gitea push, and live deploy workflow as the roadmap spine.
|
||||||
|
|
||||||
## 0.1.21 - 2026-07-12
|
## 0.1.21 - 2026-07-12
|
||||||
|
|
||||||
- Added the app roadmap for the shared desktop/web architecture.
|
- Added the app roadmap for the shared desktop/web architecture.
|
||||||
|
|||||||
+87
-47
@@ -1,6 +1,6 @@
|
|||||||
# Libre Study Roadmap
|
# Libre Study Roadmap
|
||||||
|
|
||||||
Libre Study is the study workspace that consumes LibreBible packages. The current build is desktop-first, but the interface is already a React/Vite web app that can run in a browser. Tauri is the desktop shell and native storage layer, not a reason to fork the user interface.
|
Libre Study is the study workspace that consumes LibreBible packages. The online experience is now the primary evolving product lane. The app should remain installable later, but current development should focus on getting the working interface online privately so Forrest can log in and use it from Christ Unscripted while local development continues on drive `W:`.
|
||||||
|
|
||||||
## Current Code Baseline
|
## Current Code Baseline
|
||||||
|
|
||||||
@@ -9,85 +9,124 @@ Libre Study is the study workspace that consumes LibreBible packages. The curren
|
|||||||
- Browser development data: static LibreBible JSON/JSONL packages loaded from a sibling `libre-bible-data` checkout.
|
- Browser development data: static LibreBible JSON/JSONL packages loaded from a sibling `libre-bible-data` checkout.
|
||||||
- Current resource behavior: KJV and NET text, Strong's links, Strong's lexicon entries, KJV/NET footnotes and study notes, Matthew Henry Concise commentary, and Easton/Smith dictionary entries.
|
- Current resource behavior: KJV and NET text, Strong's links, Strong's lexicon entries, KJV/NET footnotes and study notes, Matthew Henry Concise commentary, and Easton/Smith dictionary entries.
|
||||||
- Current user workspace behavior: browser sessions, settings, notes, exported session JSON, note drawer, and session timeline are stored in `localStorage`.
|
- Current user workspace behavior: browser sessions, settings, notes, exported session JSON, note drawer, and session timeline are stored in `localStorage`.
|
||||||
- Current gap: browser mode has the richer study-resource behavior, while Tauri SQLite import currently covers a smaller resource set. A shared service boundary is needed before public web hosting or desktop hardening.
|
- Current gap: browser mode has the richest study-resource behavior, but it is not yet hosted, authenticated, or backed by server-side persistence.
|
||||||
|
|
||||||
|
## Product Priority
|
||||||
|
|
||||||
|
Build the online experience first and let it keep evolving permanently. Desktop and mobile remain explicit future targets, but they should follow the online app after the study model, resource system, account model, and notes workflow are proven.
|
||||||
|
|
||||||
|
This does not require a permanent code fork right now. Prefer one shared app with a strong hosted-web lane and later desktop/mobile adapters. Create a separate Git branch only for normal development/release workflow reasons, not because the web app and desktop app are fundamentally different products yet.
|
||||||
|
|
||||||
|
## Workflow Rule
|
||||||
|
|
||||||
|
Keep the workflow simple and durable:
|
||||||
|
|
||||||
|
1. Develop locally in `W:\libre-study` and `W:\libre-bible-data`.
|
||||||
|
2. Commit locally.
|
||||||
|
3. Push to Christ Unscripted Gitea.
|
||||||
|
4. Deploy the pushed state to the live/private web app.
|
||||||
|
5. Keep the hosted online app as the main evolving surface.
|
||||||
|
6. Later, build signed desktop installers only from clean pushed release commits.
|
||||||
|
|
||||||
|
The online app should reflect pushed work, not random uncommitted local state.
|
||||||
|
|
||||||
## Architecture Rule
|
## Architecture Rule
|
||||||
|
|
||||||
Keep one application, not separate apps. Split the code by adapters:
|
Keep one application, not separate apps. Split the code by adapters:
|
||||||
|
|
||||||
- Shared core: resource catalog reading, Bible page model, search model, session model, note/timeline model, and study-resource rendering rules.
|
- Shared core: resource catalog reading, Bible page model, search model, session model, note/timeline model, and study-resource rendering rules.
|
||||||
- Browser/web adapter: server API, account session, remote persistence, static resource package URLs, and optional collaboration services.
|
- Local browser adapter: fast Vite preview, static package loading, and `localStorage` during development.
|
||||||
|
- Hosted web adapter: server API, login session, remote persistence, stable public/static resource package URLs, and optional collaboration services.
|
||||||
- Desktop adapter: Tauri commands, local SQLite, local resource packages, offline cache, import/update manager, and no required account.
|
- Desktop adapter: Tauri commands, local SQLite, local resource packages, offline cache, import/update manager, and no required account.
|
||||||
|
|
||||||
The web version may add login and collaboration. The desktop version must remain usable without accounts.
|
The hosted web version is the lead product lane and may add login and collaboration. The desktop version must remain usable without accounts when that lane resumes.
|
||||||
|
|
||||||
## Phase 1: Current Baseline And Roadmap
|
## Phase 1: Private Hosted Preview
|
||||||
|
|
||||||
Goal: write down what the code already does and define the web/desktop direction before more feature drift.
|
Goal: get the current working app online privately on Christ Unscripted as fast as possible and establish the hosted app as the main development target.
|
||||||
|
|
||||||
|
Recommended first hostname: `study.christunscripted.com`.
|
||||||
|
|
||||||
Tasks:
|
Tasks:
|
||||||
|
|
||||||
- Record that Libre Study can become a website because the primary UI is already React/Vite.
|
- Choose and create the Cloudflare DNS record for the private hosted app.
|
||||||
- Record that Tauri is the desktop wrapper and native storage path.
|
- Add a production web build/deploy path for the Vite app.
|
||||||
- Record that accounts are web-only and should not be required for local desktop use.
|
- Serve the app behind HTTPS through the Christ Unscripted server.
|
||||||
- Record maps, audio Bible, pronunciation audio, Nextcloud notes, collaboration, and database strategy in the roadmap.
|
- Point the hosted app at stable LibreBible package URLs instead of the local `W:\libre-bible-data` Vite `@fs` path.
|
||||||
- Keep LibreBible resource data separate from user workspace data.
|
- Keep the hosted version private or obscured until login exists.
|
||||||
|
- Document the deployment command and server path.
|
||||||
|
|
||||||
Definition of done:
|
Definition of done:
|
||||||
|
|
||||||
- This roadmap exists in the app repo.
|
- A pushed commit can be deployed to a real HTTPS URL.
|
||||||
- LibreBible's roadmap also names maps, audio, pronunciation, and web-consumption package needs.
|
- Forrest can open the hosted interface and see the same Bible study surface as local dev mode.
|
||||||
|
|
||||||
## Phase 2: Shared App Core And Data Boundary
|
## Phase 2: Server Persistence And Login
|
||||||
|
|
||||||
Goal: stop treating browser mode and Tauri mode as separate realities.
|
Goal: make the hosted app personally usable without relying on browser `localStorage`.
|
||||||
|
|
||||||
|
Tasks:
|
||||||
|
|
||||||
|
- Add a minimal server API for sessions, notes, settings, timelines, and active workspace state.
|
||||||
|
- Add a simple login path, starting with manually created accounts or invite-only access.
|
||||||
|
- Store only necessary account data: username or email, password hash, sessions, notes, settings, timeline events, created/updated timestamps.
|
||||||
|
- Move hosted sessions from `localStorage` to server persistence.
|
||||||
|
- Keep local browser preview and Tauri desktop able to run without accounts.
|
||||||
|
- Add basic backup expectations for the server-side user database.
|
||||||
|
|
||||||
|
Definition of done:
|
||||||
|
|
||||||
|
- Forrest can log in, create a study session, write notes, reload from another browser, and continue the same session.
|
||||||
|
|
||||||
|
## Phase 3: Deploy From Gitea
|
||||||
|
|
||||||
|
Goal: make local changes flow predictably to the live app through Git.
|
||||||
|
|
||||||
|
Tasks:
|
||||||
|
|
||||||
|
- Keep Christ Unscripted Gitea as the remote source of truth for deployable code.
|
||||||
|
- Add a deployment script that pulls or receives the pushed commit, installs/builds as needed, and publishes the web build.
|
||||||
|
- Record the deployed commit hash somewhere visible or inspectable.
|
||||||
|
- Decide whether deploys are manual first, then later automatic after push.
|
||||||
|
- Keep LibreBible package generation/deployment separate from Libre Study app deployment, but make the app consume the deployed package catalog.
|
||||||
|
|
||||||
|
Definition of done:
|
||||||
|
|
||||||
|
- Local edit, commit, push, deploy produces a live web change with an identifiable commit hash.
|
||||||
|
|
||||||
|
## Phase 4: Shared App Core
|
||||||
|
|
||||||
|
Goal: stop treating local preview, hosted web, and Tauri as separate code paths.
|
||||||
|
|
||||||
Tasks:
|
Tasks:
|
||||||
|
|
||||||
- Extract a client/service interface for translations, pages, Strong's links, notes, commentaries, dictionaries, maps, audio, sessions, settings, and timelines.
|
- Extract a client/service interface for translations, pages, Strong's links, notes, commentaries, dictionaries, maps, audio, sessions, settings, and timelines.
|
||||||
- Keep UI components pointed at that interface instead of hardcoding browser static paths or direct Tauri commands.
|
- Keep UI components pointed at that interface instead of hardcoding browser static paths or direct Tauri commands.
|
||||||
- Add a clear resource catalog configuration path for browser, desktop, and future hosted web modes.
|
|
||||||
- Define the session schema once: active translation, page anchor, selected verse, enabled resources, visual settings, notes, timeline, and exports.
|
- Define the session schema once: active translation, page anchor, selected verse, enabled resources, visual settings, notes, timeline, and exports.
|
||||||
- Add a migration path from `localStorage` sessions to SQLite/server persistence.
|
- Add a migration path from `localStorage` sessions to hosted persistence and Tauri SQLite persistence.
|
||||||
|
|
||||||
Definition of done:
|
Definition of done:
|
||||||
|
|
||||||
- The same UI can run against a browser static adapter, a Tauri SQLite adapter, or a future web API adapter.
|
- The same UI can run against local browser preview, hosted web API, or Tauri SQLite adapters.
|
||||||
|
|
||||||
## Phase 3: Storage And Search Foundation
|
## Phase 5: Storage And Search Foundation
|
||||||
|
|
||||||
Goal: make hundreds of thousands or millions of entries feel normal.
|
Goal: make hundreds of thousands or millions of entries feel normal.
|
||||||
|
|
||||||
Tasks:
|
Tasks:
|
||||||
|
|
||||||
- Keep SQLite for desktop and single-user/local workflows.
|
- Keep SQLite for desktop and private/single-user workflows.
|
||||||
- Add proper indexes for translation id, book/chapter/verse, Strong's number, lemma, resource id, and attachment relationships.
|
- Use server-side SQLite only for private alpha or low-concurrency hosted use.
|
||||||
|
- Plan Postgres or another server database before public multi-user accounts and collaboration.
|
||||||
|
- Add proper indexes for translation id, book/chapter/verse, Strong's number, lemma, resource id, place id, and attachment relationships.
|
||||||
- Add full-text search through SQLite FTS5 or a compatible indexed search layer.
|
- Add full-text search through SQLite FTS5 or a compatible indexed search layer.
|
||||||
- Avoid loading entire large resources into the browser when a chapter, page, verse, Strong's entry, or search result can be loaded on demand.
|
- Avoid loading entire large resources into the browser when a chapter, page, verse, Strong's entry, or search result can be loaded on demand.
|
||||||
- Define when public web hosting should move from SQLite to Postgres or another server database.
|
|
||||||
|
|
||||||
Definition of done:
|
Definition of done:
|
||||||
|
|
||||||
- Search, page loads, note loads, and Strong's lookups use indexed or sharded access instead of whole-library reloads.
|
- Search, page loads, note loads, and Strong's lookups use indexed or sharded access instead of whole-library reloads.
|
||||||
|
|
||||||
## Phase 4: Private Web Alpha On Christ Unscripted
|
## Phase 6: Notes, Exports, And Nextcloud
|
||||||
|
|
||||||
Goal: get a private hosted version usable by Forrest without changing the desktop-first promise.
|
|
||||||
|
|
||||||
Tasks:
|
|
||||||
|
|
||||||
- Build the Vite app as a static web frontend.
|
|
||||||
- Add a minimal server API for login, sessions, notes, settings, timeline, and resource catalog URLs.
|
|
||||||
- Start with manually created accounts or a very small invite-only account flow.
|
|
||||||
- Store only the minimum account data needed: username or email, password hash, sessions, notes, and timestamps.
|
|
||||||
- Add a plain privacy note before opening this beyond private use.
|
|
||||||
- Serve LibreBible packages as static files or through stable catalog URLs.
|
|
||||||
|
|
||||||
Definition of done:
|
|
||||||
|
|
||||||
- Forrest can log in on Christ Unscripted, open the study workspace, save a session, reload, and continue from the saved state.
|
|
||||||
|
|
||||||
## Phase 5: Notes, Exports, And Nextcloud
|
|
||||||
|
|
||||||
Goal: make study work portable without making Nextcloud the primary database.
|
Goal: make study work portable without making Nextcloud the primary database.
|
||||||
|
|
||||||
@@ -103,7 +142,7 @@ Definition of done:
|
|||||||
|
|
||||||
- A session's notes can be exported and optionally synced to a Nextcloud folder without breaking normal local or web persistence.
|
- A session's notes can be exported and optionally synced to a Nextcloud folder without breaking normal local or web persistence.
|
||||||
|
|
||||||
## Phase 6: Study Resource Depth
|
## Phase 7: Study Resource Depth
|
||||||
|
|
||||||
Goal: continue turning the page into a complete study workspace.
|
Goal: continue turning the page into a complete study workspace.
|
||||||
|
|
||||||
@@ -120,7 +159,7 @@ Definition of done:
|
|||||||
|
|
||||||
- The study margin can show relevant maps, audio controls, pronunciations, notes, dictionary entries, lexicons, and commentaries dynamically for the selected verse or page.
|
- The study margin can show relevant maps, audio controls, pronunciations, notes, dictionary entries, lexicons, and commentaries dynamically for the selected verse or page.
|
||||||
|
|
||||||
## Phase 7: Collaboration
|
## Phase 8: Collaboration
|
||||||
|
|
||||||
Goal: add shared Bible study without turning the basic app into a social network.
|
Goal: add shared Bible study without turning the basic app into a social network.
|
||||||
|
|
||||||
@@ -136,9 +175,9 @@ Definition of done:
|
|||||||
|
|
||||||
- Two logged-in users can study the same passage and contribute to a shared note surface without losing individual session state.
|
- Two logged-in users can study the same passage and contribute to a shared note surface without losing individual session state.
|
||||||
|
|
||||||
## Phase 8: Desktop Hardening
|
## Phase 9: Desktop Hardening
|
||||||
|
|
||||||
Goal: bring the installable app up to the same capability as the web study surface.
|
Goal: bring the installable app up to the same capability as the online study surface after the hosted lane proves the model.
|
||||||
|
|
||||||
Tasks:
|
Tasks:
|
||||||
|
|
||||||
@@ -152,13 +191,14 @@ Definition of done:
|
|||||||
|
|
||||||
- The Windows app can run offline with installed resources and preserve sessions locally.
|
- The Windows app can run offline with installed resources and preserve sessions locally.
|
||||||
|
|
||||||
## Phase 9: Public Web Release
|
## Phase 10: Public Web Release
|
||||||
|
|
||||||
Goal: open the hosted app responsibly after private use proves the model.
|
Goal: open the hosted app responsibly after private use proves the model.
|
||||||
|
|
||||||
Tasks:
|
Tasks:
|
||||||
|
|
||||||
- Add account creation, password reset, rate limiting, backups, and basic abuse protection.
|
- Add public account creation only after private login and persistence are stable.
|
||||||
|
- Add password reset, rate limiting, backups, and basic abuse protection.
|
||||||
- Add clear privacy, terms, license, and attribution pages.
|
- Add clear privacy, terms, license, and attribution pages.
|
||||||
- Separate public resource data from private user notes and collaboration data.
|
- Separate public resource data from private user notes and collaboration data.
|
||||||
- Add admin controls for disabling accounts and reviewing operational health.
|
- Add admin controls for disabling accounts and reviewing operational health.
|
||||||
@@ -168,7 +208,7 @@ Definition of done:
|
|||||||
|
|
||||||
- The hosted app can accept public users without guessing about data responsibility or resource licensing.
|
- The hosted app can accept public users without guessing about data responsibility or resource licensing.
|
||||||
|
|
||||||
## Phase 10: Mobile And Future Platforms
|
## Phase 11: Mobile And Future Platforms
|
||||||
|
|
||||||
Goal: adapt only after the desktop/web study model is proven.
|
Goal: adapt only after the desktop/web study model is proven.
|
||||||
|
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "libre-study",
|
"name": "libre-study",
|
||||||
"version": "0.1.21",
|
"version": "0.1.22",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "libre-study",
|
"name": "libre-study",
|
||||||
"version": "0.1.21",
|
"version": "0.1.22",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tauri-apps/api": "^2.11.1",
|
"@tauri-apps/api": "^2.11.1",
|
||||||
"react": "^19.2.7",
|
"react": "^19.2.7",
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "libre-study",
|
"name": "libre-study",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.1.21",
|
"version": "0.1.22",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --host 127.0.0.1",
|
"dev": "vite --host 127.0.0.1",
|
||||||
|
|||||||
Generated
+1
-1
@@ -77,7 +77,7 @@ checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "app"
|
name = "app"
|
||||||
version = "0.1.21"
|
version = "0.1.22"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"rusqlite",
|
"rusqlite",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "app"
|
name = "app"
|
||||||
version = "0.1.21"
|
version = "0.1.22"
|
||||||
description = "A Tauri App"
|
description = "A Tauri App"
|
||||||
authors = ["you"]
|
authors = ["you"]
|
||||||
license = ""
|
license = ""
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
||||||
"productName": "Libre Study",
|
"productName": "Libre Study",
|
||||||
"version": "0.1.21",
|
"version": "0.1.22",
|
||||||
"identifier": "org.librestudy.desktop",
|
"identifier": "org.librestudy.desktop",
|
||||||
"build": {
|
"build": {
|
||||||
"frontendDist": "../dist",
|
"frontendDist": "../dist",
|
||||||
|
|||||||
Reference in New Issue
Block a user