Files
hyprcrd/electron
thandClaude Opus 4.7 f986a41ccc v2.0.4 — re-auth on 401, robust bucket-switch test
- auth: when a background poll or save returns 401 (session expired
  while the UI is still open), the api() helpers now prompt for the
  password instead of letting the save fail silently. Concurrent 401s
  collapse onto a single dialog via a shared reauthPromise, and each
  caller retries its original request once after login. /api/auth/* is
  excluded from the retry path. Extracts promptLogin() in app.js and
  exposes it as window._reauth so both the core util.js api() and the
  plugin-SDK hyprcrd.js api() can share the flow.
- tests: the "open-switches-bucket" detail test assumed buckets[0] was
  a plain top-level bucket, but the bar renders super-bucket parents
  with data-bucket-super and hides child buckets entirely, so the
  .bucket-tab.active[data-bucket] selector found nothing on setups
  with nested layouts. Test now picks two plain top-level buckets or
  skips.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 12:50:44 +02:00
..
2026-04-12 16:09:34 +02:00
2026-04-12 16:09:34 +02:00
2026-04-12 16:09:34 +02:00
2026-04-12 16:09:34 +02:00
2026-04-12 18:00:06 +02:00

hyprcrd — Electron Desktop App

Wraps the PHP backend in an Electron shell. A static PHP binary is bundled per platform so users don't need PHP installed.

How it works

  1. On launch, the app starts PHP's built-in server on a random port (127.0.0.1)
  2. router.php replaces Apache's .htaccess rewrite rules
  3. A BrowserWindow loads http://127.0.0.1:<port>/
  4. On quit, the PHP process is killed cleanly

User data (database + uploads) is stored outside the app bundle so it survives updates:

  • Dev: electron/appdata/
  • Linux: ~/.config/hyprcrd/data/
  • macOS: ~/Library/Application Support/hyprcrd/data/
  • Windows: %APPDATA%/hyprcrd/data/

Development

cd electron
npm install
npm start          # launches the app using system or bundled PHP

Requires PHP 8.1+ with pdo_sqlite and zip extensions — either on the system PATH or as a static binary in php-bin/<platform>/.

Bundling PHP

Static PHP binaries are not checked into git. Fetch them before building:

./fetch-php.sh     # downloads ~20MB per platform from static-php-cli

Or place them manually (see php-bin/README.md for sources):

php-bin/linux/php
php-bin/darwin/php
php-bin/win32/php.exe

The app prefers the bundled binary. If none is found, it falls back to system PHP. If neither exists, a dialog tells the user what to install.

Building distributables

npm run dist

Uses electron-builder. Output:

Platform Format Location
macOS .dmg dist/
Windows NSIS dist/
Linux AppImage dist/

File structure

electron/
  main.js          Electron main process — spawns PHP, creates window
  preload.js       Exposes window.hyprcrdElectron (platform, isElectron)
  router.php       PHP built-in server router (replaces .htaccess)
  fetch-php.sh     Downloads static PHP binaries for all platforms
  php-bin/         Platform-specific PHP binaries (gitignored)