Leon
Discord systems · Automation · Internal tooling
I build private platforms for communities, and the pipelines that keep them running.
Overview · Work · Stack · How I build · Contact
I work on systems that a community actually runs on — support, moderation, recruitment, engagement — rather than one-off scripts bolted onto someone else's bot. The through-line is consolidation: one codebase and one set of data instead of five third-party services that each know a fifth of the story.
The same instinct shows up in the small stuff. If a job runs twice, it should run on a cron; if a decision is a setting, it should not be a rebuild.
| Building | N3XT.sys — a complete Discord server operating system |
| Focus | Bot platforms, automation, developer tooling |
| Approach | One system per client, deployed and managed end to end |
| Agency | N3XT Agency |
N3XT.sys — Discord server operating system
One bot, one dedicated instance per community, replacing the usual stack of five or six.
Support tickets, moderation, staff recruitment, engagement, temporary voice, surveys, anti-raid, ban appeals, audit logs and presentation — all on one codebase and one dataset, so a member's ticket history, moderation record, staff status and activity level can appear in the same place.
| Stack | TypeScript · discord.js 14 · Node 20 · better-sqlite3 |
| Interface | Native Discord panels, plus an Ink/React operator console in the terminal |
| Quality | Typecheck, lint and tests on every push |
| Deployment | Dedicated instance per server, hard-locked to that guild |
| Area | What I reach for |
|---|---|
| Languages | TypeScript · Python · JavaScript |
| Runtime | Node 20 · discord.js · React (Ink) |
| Data | SQLite / better-sqlite3 |
| Automation | GitHub Actions · cron · shell |
| Quality | ESLint · Vitest · tsc --noEmit |
|
Channels, roles, thresholds, timers and wording are settings. Changing how many warnings trigger a ban, or where tickets open, is a config change — not a release. |
Timed actions, scheduled jobs and in-progress state are restored from storage. A reboot mid-task is an inconvenience, not data loss. |
|
When an upstream is rate-limited or unreachable, jobs log a skip and exit clean. A bad network day leaves yesterday's good state in place instead of writing a broken one. |
Typecheck, lint and tests run on every push. The interesting bugs are the ones a compiler cannot catch, so the boring ones should never reach a review. |
Work enquiries, custom systems, or a scoping call for a deployment — either channel reaches me directly.
N3XT Agency
n3xt-agency.com · leon.holetz@n3xt-agency.com