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.