Central support desk for the Oumta project. Tickets arrive through a
self-hostable support-relay (public form, SMTP out), hyprcrd pulls
them in as cards, replies go back out through the relay, and KB
fragments are plain hyprcrd cards so the board + search + tags
machinery handles them for free.
support-relay/ (standalone PHP/SQLite service)
- Public form + submit endpoint with IP rate-limit, honeypot, and an
email-matched reply path so users can follow up by typing their
OUMTA-n issue id — mismatched email falls back to a fresh ticket
so a hostile submitter can't hijack someone else's thread.
- One-shot setup wizard configures branding, issue-id prefix, public
URL, mail footer template, SMTP creds (stored AES-256-GCM at rest),
and generates the X-Support-Key API token shown exactly once.
- Hyprcrd-facing API: GET /api/hyprcrd/tickets?since=<iso>, POST
…/reply (sends via SMTP, flips status to answered), PATCH
…/status, DELETE, GET /ping, plus GET/POST /api/hyprcrd/settings
exposing brand/public_url/mail_footer for post-setup edits.
- Minimal dependency-free SMTP client covering STARTTLS/TLS/none,
AUTH LOGIN, RFC 2047 subject encoding, dot-stuffing. Extended to
emit multipart/alternative (plain+HTML) + multipart/related so
outbound mails carry the branded logo via Content-ID embedding;
plain-text fallback stays intact for older clients.
- Mail footer template supports {brand}, {issue_id}, {public_url}
placeholders. Lines with an empty placeholder are dropped, so the
"Reply via …" line vanishes cleanly when no public URL is set.
- Favicon on all public pages. Logo (SVG by default, PNG preferred
when both exist) picked up from logo2026col.* at send time.
- Docker: Dockerfile + docker-compose.yml for a stand-alone test
container, plus a support-relay service in the main compose
(profile "support") so hyprcrd can reach it at http://support-relay
without host-networking shenanigans.
public/plugins/support (hyprcrd client)
- Full-screen Support overlay: ticket list (status-filterable),
active ticket thread, reply composer with KB-fragment search +
click-to-insert, "Save as fragment" button, "Close ticket" shortcut.
- KB fragments are regular cards in a configurable bucket. The
composer just adds a fast search-and-insert path on top.
- Sync-tick hook auto-polls the relay alongside the existing CalDAV
+ relay-mail cycle.
- Settings tab in the main overlay: relay URL, API key, inbox / KB
bucket pickers, connection test, and a "Relay config" subsection
that round-trips to /api/hyprcrd/settings so the mail footer and
branding can be edited without touching the relay's DB.
- Local cache tables support_tickets + support_replies mirror the
relay's authoritative data keyed by relay_id.
Tooling
- dev.sh now opts into both relay + support profiles.
- dev-down.sh wipes support-relay volumes and bind-mount data for a
clean re-setup. Hyprcrd + relay data is preserved.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
85 lines
1.5 KiB
JSON
85 lines
1.5 KiB
JSON
{
|
|
"name": "hyprcrd",
|
|
"version": "2.0.12",
|
|
"description": "hyprcrd — self-hosted card manager",
|
|
"main": "main.js",
|
|
"scripts": {
|
|
"start": "electron .",
|
|
"dist": "electron-builder"
|
|
},
|
|
"author": "th",
|
|
"license": "UNLICENSED",
|
|
"devDependencies": {
|
|
"electron": "^41.2.0",
|
|
"electron-builder": "^26.0.0"
|
|
},
|
|
"build": {
|
|
"appId": "com.hyprcrd.app",
|
|
"productName": "hyprcrd",
|
|
"files": [
|
|
"main.js",
|
|
"preload.js"
|
|
],
|
|
"extraResources": [
|
|
{
|
|
"from": "router.php",
|
|
"to": "router.php"
|
|
},
|
|
{
|
|
"from": "../public",
|
|
"to": "public",
|
|
"filter": [
|
|
"**/*"
|
|
]
|
|
},
|
|
{
|
|
"from": "../src",
|
|
"to": "src",
|
|
"filter": [
|
|
"**/*"
|
|
]
|
|
},
|
|
{
|
|
"from": "../config.php",
|
|
"to": "config.php"
|
|
},
|
|
{
|
|
"from": "../data",
|
|
"to": "data",
|
|
"filter": [
|
|
".gitkeep"
|
|
]
|
|
}
|
|
],
|
|
"mac": {
|
|
"target": "dmg",
|
|
"category": "public.app-category.productivity",
|
|
"extraResources": [
|
|
{
|
|
"from": "php-bin/darwin",
|
|
"to": "php-bin"
|
|
}
|
|
]
|
|
},
|
|
"win": {
|
|
"target": "nsis",
|
|
"extraResources": [
|
|
{
|
|
"from": "php-bin/win32",
|
|
"to": "php-bin"
|
|
}
|
|
]
|
|
},
|
|
"linux": {
|
|
"target": "AppImage",
|
|
"category": "Office",
|
|
"extraResources": [
|
|
{
|
|
"from": "php-bin/linux",
|
|
"to": "php-bin"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|