Initial commit: Logos Bible Software flake
- logos: WINE-based desktop app (offline-capable) - logos-web: Electron wrapper for web app - logos-install: one-time GUI installer
This commit is contained in:
commit
f79a4784b4
10 changed files with 376 additions and 0 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
node_modules/
|
||||||
|
.result/
|
||||||
|
.direnv/
|
||||||
|
*.exe
|
||||||
36
README.md
Normal file
36
README.md
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# Logos Bible Software on NixOS
|
||||||
|
|
||||||
|
Nix flake providing:
|
||||||
|
- **`logos`** — Full Logos desktop app via WINE (offline-capable)
|
||||||
|
- **`logos-web`** — Lightweight Electron wrapper around app.logos.com
|
||||||
|
- **`logos-install`** — GUI installer that sets up WINE + downloads Logos
|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install the full desktop app (requires display — run from desktop)
|
||||||
|
nix run github:sscoble/logos-app#install
|
||||||
|
|
||||||
|
# Launch Logos (after install)
|
||||||
|
nix run github:sscoble/logos-app
|
||||||
|
|
||||||
|
# Or use the web wrapper (no install needed)
|
||||||
|
nix run github:sscoble/logos-app#web
|
||||||
|
```
|
||||||
|
|
||||||
|
## What's what
|
||||||
|
|
||||||
|
| Command | What it does | Offline? |
|
||||||
|
|---------|-------------|----------|
|
||||||
|
| `logos` | Windows Logos desktop app under WINE | ✅ Yes |
|
||||||
|
| `logos-web` | Electron wrapper around app.logos.com | ❌ No |
|
||||||
|
| `logos-install` | One-time setup: WINE prefix + Logos installer GUI | — |
|
||||||
|
|
||||||
|
## Offline setup
|
||||||
|
|
||||||
|
1. Run `logos-install` from your desktop
|
||||||
|
2. Sign into your Faithlife account in the Logos installer
|
||||||
|
3. Let Logos download your library resources
|
||||||
|
4. Subsequent launches with `logos` work fully offline
|
||||||
|
|
||||||
|
Data lives at `~/.local/share/logos-wine/` — back it up to keep your library.
|
||||||
152
flake.nix
Normal file
152
flake.nix
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
{
|
||||||
|
description = "Logos Bible Software — Electron wrapper + WINE installer for NixOS";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, flake-utils }:
|
||||||
|
flake-utils.lib.eachDefaultSystem (system:
|
||||||
|
let
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
|
||||||
|
# Shared user data path for persistent storage
|
||||||
|
dataDir = "$HOME/.local/share/logos-app";
|
||||||
|
|
||||||
|
# ── Electron web wrapper ──────────────────────────
|
||||||
|
logos-electron = pkgs.writeShellApplication {
|
||||||
|
name = "logos-web";
|
||||||
|
runtimeInputs = [ pkgs.electron ];
|
||||||
|
text = ''
|
||||||
|
mkdir -p "${dataDir}"
|
||||||
|
exec electron "${./main.js}"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
# ── WINE launcher (after desktop install) ──────────
|
||||||
|
logos-wine = pkgs.writeShellApplication {
|
||||||
|
name = "logos";
|
||||||
|
runtimeInputs = [ pkgs.wineWow64Packages.stagingFull ];
|
||||||
|
text = ''
|
||||||
|
WINEPREFIX="''${WINEPREFIX:-$HOME/.local/share/logos-wine}"
|
||||||
|
export WINEPREFIX WINEARCH=win64
|
||||||
|
|
||||||
|
LOGOS_EXE="$WINEPREFIX/drive_c/users/$USER/AppData/Local/Logos/Logos.exe"
|
||||||
|
|
||||||
|
if [ ! -f "$LOGOS_EXE" ]; then
|
||||||
|
echo "Logos not installed yet. Run: logos-install"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec wine "$LOGOS_EXE" "$@"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
# ── Installer script ───────────────────────────────
|
||||||
|
logos-install = pkgs.writeShellApplication {
|
||||||
|
name = "logos-install";
|
||||||
|
runtimeInputs = with pkgs; [ wineWow64Packages.stagingFull winetricks wget ];
|
||||||
|
text = ''
|
||||||
|
set -e
|
||||||
|
WINEPREFIX="''${WINEPREFIX:-$HOME/.local/share/logos-wine}"
|
||||||
|
export WINEPREFIX WINEARCH=win64
|
||||||
|
|
||||||
|
if [ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ]; then
|
||||||
|
echo "ERROR: No display. Run from your desktop, not SSH."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Logos Installer ==="
|
||||||
|
|
||||||
|
# Init WINE prefix
|
||||||
|
if [ ! -d "$WINEPREFIX" ]; then
|
||||||
|
echo "[1/3] Creating WINE prefix..."
|
||||||
|
wineboot -i && wineserver -w
|
||||||
|
winecfg -v win10
|
||||||
|
winetricks -q corefonts
|
||||||
|
else
|
||||||
|
echo "[1/3] WINE prefix exists"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Download installer
|
||||||
|
INSTALLER="/tmp/LogosSetup.exe"
|
||||||
|
if [ ! -f "$INSTALLER" ]; then
|
||||||
|
echo "[2/3] Downloading Logos installer..."
|
||||||
|
wget -q --show-progress -O "$INSTALLER" \
|
||||||
|
"https://downloads.logoscdn.com/LBS10/Installer/LogosSetup.exe"
|
||||||
|
else
|
||||||
|
echo "[2/3] Installer cached"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[3/3] Running installer — follow the GUI..."
|
||||||
|
wine "$INSTALLER"
|
||||||
|
echo "Done. Launch with: logos"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
# ── Desktop entries ────────────────────────────────
|
||||||
|
logos-desktop = pkgs.makeDesktopItem {
|
||||||
|
name = "logos";
|
||||||
|
exec = "logos";
|
||||||
|
icon = "logos";
|
||||||
|
desktopName = "Logos Bible Software";
|
||||||
|
comment = "Bible study and research (WINE)";
|
||||||
|
categories = [ "Education" "Office" ];
|
||||||
|
terminal = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
logos-web-desktop = pkgs.makeDesktopItem {
|
||||||
|
name = "logos-web";
|
||||||
|
exec = "logos-web";
|
||||||
|
icon = "logos-web";
|
||||||
|
desktopName = "Logos (Web)";
|
||||||
|
comment = "Logos web app wrapper";
|
||||||
|
categories = [ "Education" "Office" ];
|
||||||
|
terminal = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages = {
|
||||||
|
default = logos-wine;
|
||||||
|
logos = logos-wine;
|
||||||
|
logos-web = logos-electron;
|
||||||
|
logos-install = logos-install;
|
||||||
|
logos-full = pkgs.symlinkJoin {
|
||||||
|
name = "logos-full";
|
||||||
|
paths = [
|
||||||
|
logos-wine
|
||||||
|
logos-electron
|
||||||
|
logos-install
|
||||||
|
logos-desktop
|
||||||
|
logos-web-desktop
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
apps = {
|
||||||
|
default = {
|
||||||
|
type = "app";
|
||||||
|
program = "${logos-wine}/bin/logos";
|
||||||
|
};
|
||||||
|
web = {
|
||||||
|
type = "app";
|
||||||
|
program = "${logos-electron}/bin/logos-web";
|
||||||
|
};
|
||||||
|
install = {
|
||||||
|
type = "app";
|
||||||
|
program = "${logos-install}/bin/logos-install";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
devShells.default = pkgs.mkShell {
|
||||||
|
packages = with pkgs; [
|
||||||
|
wineWow64Packages.stagingFull
|
||||||
|
winetricks
|
||||||
|
electron
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
BIN
icon.png
Normal file
BIN
icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 70 B |
4
icon.svg
Normal file
4
icon.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
||||||
|
<rect width="256" height="256" rx="32" fill="#1a1a2e"/>
|
||||||
|
<text x="128" y="170" font-size="120" text-anchor="middle" fill="#c9a96e">📖</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 241 B |
80
install-logos.sh
Executable file
80
install-logos.sh
Executable file
|
|
@ -0,0 +1,80 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Logos Bible Software — WINE installer for NixOS
|
||||||
|
# Run this from your desktop terminal (not SSH — needs display)
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
WINEPREFIX="${WINEPREFIX:-$HOME/.local/share/logos-wine}"
|
||||||
|
WINEARCH="win64"
|
||||||
|
LOGOS_INSTALLER_URL="https://downloads.logoscdn.com/LBS10/Installer/LogosSetup.exe"
|
||||||
|
|
||||||
|
echo "=== Logos Bible Software Installer for NixOS ==="
|
||||||
|
echo "WINE prefix: $WINEPREFIX"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check for display
|
||||||
|
if [ -z "$DISPLAY" ]; then
|
||||||
|
echo "ERROR: No display found. Run this from your desktop, not SSH."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Step 1: Initialize WINE prefix if needed
|
||||||
|
if [ ! -d "$WINEPREFIX" ]; then
|
||||||
|
echo "[1/4] Creating WINE prefix..."
|
||||||
|
nix-shell -p wineWow64Packages.stagingFull winetricks --command "
|
||||||
|
export WINEPREFIX='$WINEPREFIX'
|
||||||
|
export WINEARCH='$WINEARCH'
|
||||||
|
wineboot -i
|
||||||
|
wineserver -w
|
||||||
|
winecfg -v win10
|
||||||
|
winetricks -q corefonts
|
||||||
|
"
|
||||||
|
echo "✓ WINE prefix ready"
|
||||||
|
else
|
||||||
|
echo "[1/4] ✓ WINE prefix exists"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Step 2: Download installer (skip if exists)
|
||||||
|
INSTALLER="/tmp/LogosSetup.exe"
|
||||||
|
if [ ! -f "$INSTALLER" ]; then
|
||||||
|
echo "[2/4] Downloading Logos installer..."
|
||||||
|
wget -q --show-progress -O "$INSTALLER" "$LOGOS_INSTALLER_URL" || {
|
||||||
|
echo "Download failed. Trying alternate URL..."
|
||||||
|
wget -q --show-progress -O "$INSTALLER" "https://downloads.logoscdn.com/LBS10/Installer/Logos-x64.msi"
|
||||||
|
}
|
||||||
|
echo "✓ Downloaded"
|
||||||
|
else
|
||||||
|
echo "[2/4] ✓ Installer already downloaded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Step 3: Install Logos
|
||||||
|
echo "[3/4] Running Logos installer — follow the GUI prompts..."
|
||||||
|
nix-shell -p wineWow64Packages.stagingFull --command "
|
||||||
|
export WINEPREFIX='$WINEPREFIX'
|
||||||
|
export WINEARCH='$WINEARCH'
|
||||||
|
wine '$INSTALLER'
|
||||||
|
"
|
||||||
|
echo "✓ Installation complete"
|
||||||
|
|
||||||
|
# Step 4: Create launcher
|
||||||
|
echo "[4/4] Creating desktop launcher..."
|
||||||
|
LAUNCHER="$HOME/.local/share/applications/logos-bible.desktop"
|
||||||
|
cat > "$LAUNCHER" << DESKTOPEOF
|
||||||
|
[Desktop Entry]
|
||||||
|
Name=Logos Bible Software
|
||||||
|
Comment=Bible study and research tool (WINE)
|
||||||
|
Exec=nix-shell -p wineWow64Packages.stagingFull --command "WINEPREFIX=$WINEPREFIX WINEARCH=$WINEARCH wine C:\\\\users\\\\$USER\\\\AppData\\\\Local\\\\Logos\\\\Logos.exe"
|
||||||
|
Icon=logos-bible
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
Categories=Education;Office;
|
||||||
|
StartupWMClass=logos.exe
|
||||||
|
DESKTOPEOF
|
||||||
|
|
||||||
|
echo "✓ Desktop launcher created at $LAUNCHER"
|
||||||
|
echo ""
|
||||||
|
echo "=== Done! ==="
|
||||||
|
echo "Launch Logos from your application menu, or run:"
|
||||||
|
echo " nix-shell -p wineWow64Packages.stagingFull --command \"WINEPREFIX=$WINEPREFIX wine 'C:\\\\users\\\\$USER\\\\AppData\\\\Local\\\\Logos\\\\Logos.exe'\""
|
||||||
|
echo ""
|
||||||
|
echo "First launch: sign in with your Faithlife account, then download your library for offline use."
|
||||||
32
launch-logos.sh
Executable file
32
launch-logos.sh
Executable file
|
|
@ -0,0 +1,32 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Launch Logos Bible Software under WINE
|
||||||
|
# Run from desktop terminal or use the .desktop file
|
||||||
|
|
||||||
|
WINEPREFIX="${WINEPREFIX:-$HOME/.local/share/logos-wine}"
|
||||||
|
WINEARCH="win64"
|
||||||
|
|
||||||
|
# Try multiple possible Logos install paths
|
||||||
|
LOGOS_PATH=""
|
||||||
|
for path in \
|
||||||
|
"$WINEPREFIX/drive_c/users/$USER/AppData/Local/Logos/Logos.exe" \
|
||||||
|
"$WINEPREFIX/drive_c/Program Files/Logos/Logos.exe" \
|
||||||
|
"$WINEPREFIX/drive_c/Program Files (x86)/Logos/Logos.exe"; do
|
||||||
|
if [ -f "$path" ]; then
|
||||||
|
LOGOS_PATH="$path"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$LOGOS_PATH" ]; then
|
||||||
|
echo "Logos not found. Run install-logos.sh first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Convert to WINE path
|
||||||
|
WINE_PATH="C:\\\\users\\\\$USER\\\\AppData\\\\Local\\\\Logos\\\\Logos.exe"
|
||||||
|
|
||||||
|
exec nix-shell -p wineWow64Packages.stagingFull --command "
|
||||||
|
export WINEPREFIX='$WINEPREFIX'
|
||||||
|
export WINEARCH='$WINEARCH'
|
||||||
|
wine '$WINE_PATH'
|
||||||
|
"
|
||||||
10
logos.sh
Executable file
10
logos.sh
Executable file
|
|
@ -0,0 +1,10 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Logos Bible Software — Electron wrapper launcher
|
||||||
|
# Requires: electron (from nixpkgs)
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
|
# Ensure data directory exists
|
||||||
|
mkdir -p "$HOME/.local/share/logos-app"
|
||||||
|
|
||||||
|
exec electron "$SCRIPT_DIR/main.js" "$@"
|
||||||
52
main.js
Normal file
52
main.js
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
const { app, BrowserWindow, session, shell } = require('electron');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
// Use a dedicated data directory for persistent storage
|
||||||
|
const userDataPath = path.join(app.getPath('home'), '.local/share/logos-app');
|
||||||
|
app.setPath('userData', userDataPath);
|
||||||
|
|
||||||
|
function createWindow() {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 1400,
|
||||||
|
height: 900,
|
||||||
|
minWidth: 900,
|
||||||
|
minHeight: 600,
|
||||||
|
title: 'Logos Bible Software',
|
||||||
|
icon: path.join(__dirname, 'icon.svg'),
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: false,
|
||||||
|
contextIsolation: true,
|
||||||
|
partition: 'persist:logos',
|
||||||
|
// Allow IndexedDB, localStorage, and Cache API to persist
|
||||||
|
enableRemoteModule: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Load Logos web app
|
||||||
|
win.loadURL('https://app.logos.com');
|
||||||
|
|
||||||
|
// Keep external links in the app when they're Faithlife domains
|
||||||
|
win.webContents.setWindowOpenHandler(({ url }) => {
|
||||||
|
if (url.includes('logos.com') || url.includes('faithlife.com') || url.includes('biblia.com')) {
|
||||||
|
return { action: 'allow', overrideBrowserWindowOptions: {
|
||||||
|
webPreferences: { partition: 'persist:logos' }
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
shell.openExternal(url);
|
||||||
|
return { action: 'deny' };
|
||||||
|
});
|
||||||
|
|
||||||
|
// Chrome user agent for full web app support
|
||||||
|
win.webContents.userAgent =
|
||||||
|
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
|
||||||
|
}
|
||||||
|
|
||||||
|
app.whenReady().then(createWindow);
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') app.quit();
|
||||||
|
});
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) createWindow();
|
||||||
|
});
|
||||||
6
package.json
Normal file
6
package.json
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"name": "logos-app",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Logos Bible Software — Nix flake for Electron wrapper + WINE install",
|
||||||
|
"private": true
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue