The Browser tab. Published to the Gitea package registry; 1.4.35 is kept there as the
rollback copy.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new tab (globe, after Maps) shows one web page full-bleed in the content area —
no address bar, bookmarks or scrollbars — built for It Is Written but usable with
any page. It loads at startup and keeps running in the background.
Stage (browser-tab.js, browser-guest-preload.cjs):
- An Electron <webview> per Browser tab, in its own sandboxed process and persistent
session. The pages live in one persistent layer inside .tab-content: every tab
switch rebuilds .tab-content and moving a webview reloads it, so app.js now clears
around that layer (clearTabContentKeepingBrowser).
- Tapping a text field brings up the Prayer tab's keyboard (createPrayerKeyboard with
a sink) and types into the page with trusted input; Enter submits; the keyboard puts
itself away when the page moves focus on (e.g. after a search). The OS touch
keyboard is suppressed with inputmode="none" while a field is focused.
- Tapping a scripture reference opens it in a new Bible tab, in the translation
printed beside it when that one is switched on. References are found with the app's
own scanner: scripture-scan.js gains scanAll() (every match with its offsets),
translationAfter() and isTranslation(); scanText/parseSlide are unchanged.
- Input inside a webview never reaches the app, so the page reports activity (idle
splash) and five-finger touches (blank the screen) itself.
- main.cjs: webviewTag on; every webview is forced sandboxed, context-isolated, no Node,
http(s) only, with the guest preload. No new windows (opened in place), no permission
prompts, no downloads, no pinch-zoom, no alert/confirm/prompt boxes, and "Leave
site?" can never block Reload or Start page. The session reports plain Chrome.
- server.js CSP: frame-src allows http(s) (a webview is a frame to CSP); style-src and
font-src allow https (the follower's srcdoc copy inherits this policy).
Everywhere a tab kind is listed:
- app.js: create at startup and on Reset, icon, visibility defaults, + menu, fixed
mode, no ink layer, tool handling, OSC kind + information line (the page's search
term), phone remote scroll / tap / page buttons, OSC show / reload / home actions,
live setting changes, translation for tapped references.
- quick-dock, tool-wheel, presentation-tools: no drawing tools on the tab.
- Phone remote: tab label, one finger scrolls the page (taps still tap), hint text;
mirror-stream.js reports the page's scroll for the phone's local preview.
- Follower screen: the stage publishes a script-free copy of the page's DOM (only while
a follower is linked), its scroll and form fields; the follower shows it in
sandboxed, double-buffered frames; the relay keeps the page for late joiners.
- OSC: /bibleapp/browser, /bibleapp/browser/reload, /bibleapp/browser/home;
tab_kind/browser feedback. Admin and phone allow-lists updated.
- Settings: Tab Visibility, a Browser Tab section (start page, page size, scripture
taps, return to start page), Service Profiles carry its settings, OSC references.
- Admin console: show the tab, reload / start page, start page and page size.
- BROWSER_TAB.md documents it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gitea returns an empty created_at for generic package files, so sorting by it
left every build equally old and the "keep one previous for rollback" rule
retained whichever the listing happened to return first — the OLDEST build,
with the newest deleted. Rank by the version in the filename instead, numeric
segment by segment so 1.4.34 outranks 1.4.9, and fall back to created_at only
when a name carries no version.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Version 1.4.35, published to the Gitea package registry and verified: the app
downloads it, checks size and sha256, and lands a byte-identical installer.
- tools/build-full-installer.cjs picked node_modules/7zip-bin/win/x64/7za.exe
unconditionally, so the one-file Full Setup could only be built on Windows.
7za only packs the payload — the SFX stub and its config are concatenated
byte-for-byte — so the host's own 7za yields the same Windows .exe. Also names
the three payload files instead of passing a "*" that each 7za build expands
its own way, and that would otherwise sweep the output archive into itself.
- BUILD-AND-DEPLOY.md / UPDATES.md rewritten for the laptop workflow and the
Gitea update source.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The dev machine is now a laptop, so the release path had to stop assuming Windows
and a reachable network share.
- tools/build-win.cjs: build the Windows x64 installer from macOS or Windows.
electron-builder fetches its own mac wine build, so the only real trap is
architecture: a plain `electron-builder --win` on Apple Silicon silently
produces an arm64 installer the stage PC cannot run. This pins --x64 and
strips the CSC_* signing vars (an EMPTY WIN_CSC_LINK aborts the build).
- tools/publish-update.cjs: an http(s) destination now uploads to a Gitea
generic package registry. Not a Gitea release: this server caps release
attachments at 100 MB and disallows .exe, while the package registry takes the
750 MB installer and serves it anonymously — which the updater requires, since
it sends no credentials. Installer first, manifest last, so a TV checking
mid-publish never sees a manifest naming a file that is not there yet.
- tools/release.cjs: bump, build and publish in one command.
- server.js: honour "check for updates automatically when the app starts". The
setting was stored but never acted on. It checks only — installing restarts
the app, which must stay a deliberate tap.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
First commit on the local Gitea server, made after moving the tree off the
Windows machine. Build outputs, node_modules and the AI models stay out
(see .gitignore); everything the installer build needs is tracked.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>