DevOps engineer. I keep telecom systems running for a living, and I'm building a systems-driven war sim in Godot the rest of the time.
Hobbies
CodingThe war sim, a Discord bot for the friend group, and a daily gun identification quiz.
AII use a lot of agentic AI, at work and on my own projects, to maximise efficiency and productivity without compromising on quality.
HistoryFrom the Scramble for Africa to Fallujah. WW1, WW2, Vietnam, and the Angolan and Rhodesian wars are the standouts.
Sport shootingFirst fired a gun in November 2023. Now it's range days and IPSC and defensive competitions.
GamingHearts of Iron IV, Bannerlord, War Thunder, Counter-Strike, No Man's Sky. Mostly things with a map and a supply line.
Commits
AugSepOctNovDecJanFebMarAprMayJunJul
MonWedFri
510 commits in the last year, all in private repos. Updates weekly.
LessMore
Personal projects
Under the Flares
Vietnam, 1968. You command a firebase through one bad stretch of nights, from a bunker, off a paper map that only shows what your men have reported.
Solo project, built in Godot. Every system is custom-built, including the night sim, intel model, dialogue engine, audio generation, and soldier generation. Inspired by Full Metal Jacket, Apocalypse Now, and We Were Soldiers.
Built as a passion project, the game I wish other games would be. Riding the line between historical authenticity and emergent gameplay is a unique challenge.
The map table mid-fight, tracers and speech pinned to itThe after action report sheetThe dawn walk, graves and the campfireA conversation, the typewriter reply half landed
The map
The map only shows what your men have reported, so it is always a little out of date and sometimes wrong. Positions that go quiet fade out. Fog cuts the counts down. Firing a flare gets you 60 seconds of real information over one lane, and it helps the enemy aim too.
Dialogue
All the words live in data files instead of code. A line can require a personality, a trait, or a memory the soldier has to hold before he is allowed to say it, so the same question gets a different answer depending on who is standing in front of you. I add dialogue to the game by adding a file.
The director
A director paces each night off what is actually happening in the fight, inspired by Left 4 Dead's director and RimWorld's storyteller systems. There is no hidden timer. Damage comes from the tracers you can see on the map, and runs are seeded, so the same seed plays out the same way twice.
SlothBot
A Discord bot for the friend group's server. Music playback, birthdays, a quote archive, and the daily Gundle post, with everything durable kept in SQLite.
Node.js and discord.js, running around the clock.
Built because of the limitations and frustrations of vanilla Discord. I wanted to customise the experience for the server, and it's just fun to build and use.
Basics
/helpList all available commands and their parameters/help
/pingCheck if SlothBot is awake/ping
/avatarGet a user's profile picture/avatar [user]
Utility
/quoteSave a quote to the quote box/quote <user> <text> [prefix] [suffix] [date]
/grabpostFetch images or video from an X, Instagram, Facebook, TikTok, or Reddit post/grabpost <url> [format] [source]
/rollRoll some dice/roll <dice>
/timerSet a countdown timer/timer <duration> <message>
/mixteamsShuffle and split everyone in your voice channel into two teams/mixteams [channel]
/rerollstatusPick a new random status from the pool/rerollstatus [status]
Music playback
/playPlay a song or URL in your voice channel/play <query>
/sharesongShow off a song or performance without queueing it/sharesong <query>
/queueShow the current music queue/queue
/nowplayingShow the current song with its source link/nowplaying
/radioStream internet radio in your voice channel/radio play <query> · /radio stop
Music controls
/pausePause the current song/pause
/resumeResume paused playback/resume
/skipSkip the current song/skip
/stopStop the music/stop
/leaveDisconnect from the voice channel/leave
/removeRemove a song from the upcoming queue/remove <position>
/shuffleShuffle the upcoming queue/shuffle
/moveMove an upcoming song to a different queue position/move <from> <to>
/loopSet the queue loop mode/loop <off|song|queue>
Gundle
/gundleIdentify the firearm! The great game of guns/gundle play · leaderboard · stats · badges · notify
Server
/birthdayManage birthdays/birthday set · edit · list
/releasePost the latest changelog entry to this channel/release
Gundle
A daily firearm identification quiz in the browser. One gun, four options, and the image fights back: zoomed, flipped, rotated, or blurred depending on the difficulty you pick.
Vue 3, no backend. SlothBot posts the day's round to the server every morning.