Eranaut
A voyage-timer PWA for an FFXIV player community
Eranaut lets players record when their submarines return and reminds them by Discord DM, channel mention or browser push. It is used internally by a community of about 100 people. I built everything on my own, from the screens and API to screenshot recognition and deployment, in collaboration with AI: I own the requirements, design decisions and on-device verification, and every decision is recorded in a decision log.
Architecture
Screens


Screenshots use the demo’s fake data.
Features
- Discord OAuth2 login with role-based access (rules combine with AND / OR)
- Screenshot recognition with a self-hosted PP-OCRv4: no external service, images are not stored, paste and screen-capture supported
- Three reminder channels: Discord DM, channel mention, browser push (Web Push)
- PWA: mobile and desktop layouts, adjustable interface size, offline app shell
- Admin and member commands (via the Eranarch bot calling an internal API)
Tech stack
Design trade-offs
- Server-side session cookies instead of JWT: a single API with SQLite means sessions can be revoked instantly.
- A public port and an internal port sharing one service layer: the bot can only use the internal port, which the internet cannot reach by construction.
- OCR runs in the same process, with no external service and no stored images, which keeps privacy and cost under control.
- Reminders use upsert and the whole system has just two schedulers, so data stays bounded and needs no cleanup job.
The hardest parts: OCR and Docker deployment
I validated OCR against 11 real screenshots plus 77 degraded variants (about 99.5% per-submarine accuracy) and ran the full test suite on both Windows x64 and Linux arm64. On arm64, Docker builds hit native-module problems (better-sqlite3, onnxruntime-node); I worked through them one by one and went live on my own machine.