Updating 1.4.35 -> 1.4.36 on the TV stopped at "Bible App cannot be closed. Please
close it manually and click Retry" with the app plainly closed. That message also
comes from the installer's copy step (and from removing the old version) when any
file in the install folder is in use — not only when Bible App.exe is running.
The app runs programs from its own folder: the local AI server (llama-server.exe),
speech (whisper-cli.exe), the upscaler. electron-builder's stock check closes only
Bible App.exe, and when it has to force-close the app, the app's own shutdown (which
stops the AI server) never runs. The orphaned llama-server.exe then holds its files
open forever, so Retry can never succeed.
- build/installer.nsh: customCheckAppRunning replaces the stock check. It asks the
app to close, force-closes any Bible App.exe left, force-closes the helpers by name,
then, as a backstop, every process whose executable is inside the install folder
(via WMI, which works from the 32-bit installer on 64-bit Windows; the folder is
passed in an environment variable and a bare drive is refused). It runs before the
old version is removed and before any file is copied.
- main.cjs: the in-app updater stops the AI server before launching the installer.
The fix is in the INSTALLER, so the TV still on 1.4.35 gets it with this release.
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>
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>