🔑 Issue new key
🔍 Verify key
💾 Data backup
Downloads a JSON backup of all critical D1 data: licences, installs, key requests, prospect CRM notes, and feedback suggestions.
- Licences — all issued keys and revocation status
- Installs — all heartbeating schools and CRM data
- Key requests — full history including approved keys
- Prospect notes — CRM status and notes per school
- Feedback suggestions — community board data
🔒 Access & security
The admin panel is protected by a shared secret. Cloudflare Access (email OTP) is planned as an additional layer.
- Current auth: shared EJJ_ADMIN_SECRET (Worker secret)
- Planned: Cloudflare Access — email OTP for founders
- Sessions: localStorage cached
- GitHub Issues: GITHUB_TOKEN Worker secret required for promote feature
✉ Weekly digest
Sends the weekly ops digest email immediately. The scheduled cron runs automatically every Monday at 08:00 UTC.
- Active installs, new this week, gone silent
- Pending key requests & expiring licences
- Multi-install flags with age
- Version breakdown across active installs
✉ Test email deliverability
Sends a sample licence-key email (the real template, with a dummy key) to any address via Resend — the exact path Community keys use. Use it to check inbox-vs-spam placement, or to reproduce a “didn’t receive it” report from a specific tenant.
⚙ Community auto-issue
When ON, key requests from recognised school/MAT domains are minted and emailed instantly. When OFF, every request — school domains included — is held in the Key Requests queue for manual approval instead. A no-redeploy kill switch if auto-issue is ever abused. Consumer/webmail domains are always queued regardless of this setting.