Files
hyprcrd/electron
thandClaude Opus 4.7 1e51bdec7c v2.0.5 — Read feature (mobile zen reader on the relay)
Per-card opt-in push to the relay for distraction-free mobile reading.
Not tag-based: a real cards.read_push column so the reading state
stays independent of whatever tags the user organises by.

hyprcrd
- cards.read_push column (0/1, default 0) via Database migration.
- POST /api/cards + PATCH /api/cards/{id} accept read_push; save hook
  posts the card (title+body, encrypted) and referenced images
  to the relay's /api/read endpoint. First inline image is flagged
  as the hero. Toggle-off / DELETE wipes the remote copy.
- Detail-bar toggle button ("Read" → "On relay") with filled book
  icon + inverted accent background when active; outline book icon
  in the bottom meta row of the board card when read_push=1.

relay
- read_items + read_attachments tables, encrypted under the
  inter-tenant key like messages (dual-format envelope).
- Client API: POST /api/read, DELETE /api/read/{uid}, POST
  /api/read-attachments. Session API: GET /api/read (list),
  GET /api/read/{uid} (single decrypted), GET /api/read-attachments/
  {uid}/{filename} (serves decrypted image bytes).
- Payload size caps raised to 15MB (attachments) / 2MB (items).
- New nav tab + view: list with thumbnails, click opens a zen reader
  overlay. Reader caps article width at 680px, bumps type to 17px/1.7,
  renders a minimal markdown subset (headings, lists, code fences,
  blockquotes, links, inline images), rewrites uploads/ references
  to the session-authed image endpoint. Escape closes the reader.
- Mobile-first: wider touch targets, tighter padding at ≤640px.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 16:10:04 +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)