From b54b05140554105aa4c605c2d4202d62a3fc6a55 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Thu, 19 Jun 2025 13:04:11 -0400 Subject: [PATCH] Add Electron GUI and packaging scripts --- .github/workflows/release.yml | 6 ++++ README.md | 16 ++++++++++ gui/README.md | 16 ++++++++++ gui/electron/index.html | 16 ++++++++++ gui/electron/main.js | 28 +++++++++++++++++ gui/electron/package.json | 11 +++++++ gui/electron/preload.js | 5 ++++ packaging/build_appimage.sh | 30 +++++++++++++++++++ .../chocolatey/tools/chocolateyInstall.ps1 | 12 ++++++++ packaging/chocolatey/voxvera.nuspec | 12 ++++++++ packaging/homebrew/voxvera.rb | 15 ++++++++++ 11 files changed, 167 insertions(+) create mode 100644 gui/README.md create mode 100644 gui/electron/index.html create mode 100644 gui/electron/main.js create mode 100644 gui/electron/package.json create mode 100644 gui/electron/preload.js create mode 100755 packaging/build_appimage.sh create mode 100644 packaging/chocolatey/tools/chocolateyInstall.ps1 create mode 100644 packaging/chocolatey/voxvera.nuspec create mode 100644 packaging/homebrew/voxvera.rb diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b38cd6c..e9fcf15 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,6 +21,11 @@ jobs: run: python -m build --wheel --sdist - name: Build binary run: pyinstaller --onefile -n voxvera voxvera/cli.py + - name: Create AppImage + run: | + sudo apt-get update + sudo apt-get install -y wget + bash packaging/build_appimage.sh - name: Build Docker image run: docker build -t ghcr.io/${{ github.repository_owner }}/voxvera:${{ github.ref_name }} . - name: Login to GHCR @@ -42,3 +47,4 @@ jobs: dist/*.whl dist/*.tar.gz dist/voxvera + dist/VoxVera.AppImage diff --git a/README.md b/README.md index f45ef35..b392fe2 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,16 @@ See [docs/usage.md](docs/usage.md) for detailed usage instructions. Run the installer to set up all dependencies and the `voxvera` CLI in one step. +### GUI +An Electron wrapper is provided under `gui/electron` for users that prefer a graphical interface. +Run it with: + +```bash +cd gui/electron +npm install +npm start +``` + ### Linux/macOS ```bash @@ -116,5 +126,11 @@ Additional documentation is available in the `src/` directory; see [src/README.m Additional documentation, including step-by-step instructions and hosting guides, lives under the [docs](docs/) directory. +## Packages +Prebuilt binaries are published on the releases page. Linux users can run the +`packaging/build_appimage.sh` script after a PyInstaller build to create a +portable AppImage. Homebrew and Chocolatey formulas are provided under +`packaging/` for easy upgrades on macOS and Windows. + This project is licensed under the [MIT License](./LICENSE). diff --git a/gui/README.md b/gui/README.md new file mode 100644 index 0000000..81e66cd --- /dev/null +++ b/gui/README.md @@ -0,0 +1,16 @@ +# VoxVera GUI + +This directory contains a minimal Electron wrapper around the `voxvera` CLI. +It exposes a simple "Quickstart" button so non-technical users can generate +flyers without touching the command line. + +## Development + +``` +cd gui/electron +npm install +npm start +``` + +The Electron app invokes the `voxvera` binary from your `PATH`. +Make sure it is installed before launching the GUI. diff --git a/gui/electron/index.html b/gui/electron/index.html new file mode 100644 index 0000000..b47e298 --- /dev/null +++ b/gui/electron/index.html @@ -0,0 +1,16 @@ + + + + + VoxVera GUI + + +

VoxVera

+ + + + diff --git a/gui/electron/main.js b/gui/electron/main.js new file mode 100644 index 0000000..23c6d14 --- /dev/null +++ b/gui/electron/main.js @@ -0,0 +1,28 @@ +const { app, BrowserWindow, ipcMain } = require('electron'); +const { spawn } = require('child_process'); +const path = require('path'); + +function createWindow() { + const win = new BrowserWindow({ + width: 800, + height: 600, + webPreferences: { + preload: path.join(__dirname, 'preload.js') + } + }); + win.loadFile('index.html'); +} + +app.whenReady().then(createWindow); + +ipcMain.handle('run-quickstart', async () => { + return new Promise((resolve, reject) => { + const proc = spawn('voxvera', ['quickstart'], { stdio: 'inherit' }); + proc.on('close', code => resolve(code)); + proc.on('error', err => reject(err)); + }); +}); + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') app.quit(); +}); diff --git a/gui/electron/package.json b/gui/electron/package.json new file mode 100644 index 0000000..a9b8dbd --- /dev/null +++ b/gui/electron/package.json @@ -0,0 +1,11 @@ +{ + "name": "voxvera-gui", + "version": "0.1.0", + "main": "main.js", + "scripts": { + "start": "electron ." + }, + "devDependencies": { + "electron": "^29.0.0" + } +} diff --git a/gui/electron/preload.js b/gui/electron/preload.js new file mode 100644 index 0000000..9e73b83 --- /dev/null +++ b/gui/electron/preload.js @@ -0,0 +1,5 @@ +const { contextBridge, ipcRenderer } = require('electron'); + +contextBridge.exposeInMainWorld('voxvera', { + quickstart: () => ipcRenderer.invoke('run-quickstart') +}); diff --git a/packaging/build_appimage.sh b/packaging/build_appimage.sh new file mode 100755 index 0000000..1f8f2b7 --- /dev/null +++ b/packaging/build_appimage.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -e + +if [ ! -f dist/voxvera ]; then + echo "Run PyInstaller first" >&2 + exit 1 +fi + +APPDIR=dist/AppDir +mkdir -p "$APPDIR/usr/bin" +cp dist/voxvera "$APPDIR/usr/bin/voxvera" +chmod +x "$APPDIR/usr/bin/voxvera" + +cat > "$APPDIR/voxvera.desktop" < + + + voxvera + 0.1.0 + VoxVera + VoxVera + Generate flyers with QR codes + https://github.com/PR0M3TH3AN/VoxVera + voxvera flyers + + diff --git a/packaging/homebrew/voxvera.rb b/packaging/homebrew/voxvera.rb new file mode 100644 index 0000000..91d3173 --- /dev/null +++ b/packaging/homebrew/voxvera.rb @@ -0,0 +1,15 @@ +class Voxvera < Formula + desc "Generate QR-coded flyers" + homepage "https://github.com/PR0M3TH3AN/VoxVera" + url "https://github.com/PR0M3TH3AN/VoxVera/releases/latest/download/voxvera" + version "0.1.0" + sha256 "" + + def install + bin.install "voxvera" + end + + test do + system "#{bin}/voxvera", "--help" + end +end