Engineering
Shipping is easy. Running it is the job.
How we keep real products up, affordable and safe with a very small team.
The stack
Few moving parts, all understood.
Servers we operate
Our products run on machines we set up and maintain ourselves, so we decide how data is handled and know where everything is.
One front door
Cloudflare handles TLS and absorbs attacks; nginx is the only public entry point. Internal services listen on localhost and nothing else.
Hosted AI, with failover
AI features call commercial model providers. A circuit breaker moves traffic to a healthy provider when one degrades, instead of waiting out timeouts.
Boring databases
PostgreSQL and SQLite in WAL mode, clean shutdown checkpoints, and backups. Nothing clever where it doesn't need to be.
Under load
Slow down gracefully, never fall over.
Priority queue for AI
Every AI request waits for a slot. Moderation goes first, staff and flagged messages next, then chat, DMs and background jobs.
Fair between servers
One server can only hold a few slots at once, and among equal requests, the server that has used the least goes first.
Shedding, not stalling
When the queue gets long, new chat requests are turned away quickly with a friendly message instead of hanging for minutes.
Abuse limits
Per-person and per-server rate limits, and a guard that declines code generation, essays and repeat-spam before any model is called.
Watching it
Know before users do.
Health checks
The Discord connection, model providers, database writes, event-loop lag and memory are polled constantly, with alerts when something regresses.
Spend tracking
Every model call records its real token use, including cache hits, so we know what each feature actually costs.
Public status
Waguri has a public status page at waguri.xyz/status that checks the live system.
Error reports people can read
When a chat fails, the user gets a clear error with a reference and, on request, the real trace, with sensitive details removed.
Security and privacy
Least privilege by default.
No secrets in code
Credentials live in restricted environment files, never in the repository, and only the service that needs a credential can read it.
Tenant isolation
Every change on a multi-server feature checks that you own what you're touching, and we test that by trying to break it.
Card data stays with Stripe
When payments are running, card details go straight to Stripe and never touch our servers.
Reversible actions
Automated moderation and admin actions are logged with a trail and an appeals path, because undoing a mistake matters as much as the action.
How we work
Small team, careful habits.
Check it for real
Changes get tested by running the actual flow and watching the result. If we say it's fixed, we saw it fixed.
Stage before shipping
Website builds happen in a separate copy and get previewed before they replace the live version, with the previous build kept for a quick rollback.
Written down
Deploy notes and the reasons behind decisions are recorded, so whoever touches the system next can understand it.
Say what's broken
If something is paused, failing or unfinished, the site says so. Honest status beats a polished claim.