Nick Loubser

Network Tech / Manager & Developer · South Africa

IT manager and full-stack developer based in South Africa. I build secure, resilient networks and high-performance web and mobile software with React, React Native, Next.js, and Python — bridging the gap between infrastructure and code.

Maker of free game companion apps: Stardew Valley Tracker, NMS Tracker, Horror Quest. Support development on Buy Me a Coffee.

Apps & Games

All apps and games by ShadowsKeep

Stardew Valley Tracker

Stardew Valley Tracker overview screen showing overall completion and progress cards for the Community Centre, Fish, Museum and Golden Walnuts trackers

Desktop app · Free · Windows 10/11 (64-bit)

Stardew Valley Tracker is a free Windows desktop companion app for Stardew Valley. It keeps every checklist you would otherwise juggle between wiki tabs and paper notes in one place: every Community Center bundle (the game spells it Community Centre), all 75 fish, all 94 museum donations and all 130 Golden Walnuts on Ginger Island.

  • Every Community Centre bundle, with where, when and in what weather to find each item
  • 75 fish, 94 museum items and 130 Golden Walnuts
  • Works offline, saves locally, no account

Download for Windows · Learn more about Stardew Valley Tracker

NMS Tracker

NMS Tracker overview screen showing materials still to collect, open goals, ship repairs to do and the most needed materials right now

Desktop app · Free · Windows 10/11 (64-bit)

NMS Tracker is a free Windows desktop companion app for No Man's Sky. Tell it what you want to build and which ship components are broken, and it totals every material you still need, minus what you already own.

  • One collect list for all your goals and ship repairs, minus what you own
  • 2,300+ items and 1,600+ refiner and cooking recipes
  • Reads your save file read-only to fill in inventory and damaged slots

Download for Windows · Learn more about NMS Tracker

Horror Quest

Horror Quest key art: a gothic stone archway with gargoyles, candles, roses and drifting fog around the Horror Quest skull-and-roses emblem

Discord Activity · Free · Discord (desktop and web)

Horror Quest is a free multiplayer AI-generated horror murder mystery that runs as a Discord Activity inside a voice channel. There is no download and no install: 2 to 10 players read each scene, vote on what to do next, collect evidence and accuse a suspect.

  • A unique AI-generated story, suspects and clues every game
  • 2 to 10 players vote together in a Discord voice channel
  • Scene images and voice narration for every chapter, no download

Add to Discord · Learn more about Horror Quest · Case study: Horror Quest

About Nick Loubser

Nick Loubser is an IT manager and full-stack developer based in South Africa. Since 2021 he has built web and mobile applications with React, React Native, Next.js, Vue, Nuxt, TypeScript, and Python for Northroom Technologies / Evolver Systems, and since 2024 he manages business IT operations at North Support — covering server installation, network health, client websites, and email services.

Under the ShadowsKeep name he builds free game companion apps: Stardew Valley Tracker and NMS Tracker for Windows, and Horror Quest, a multiplayer AI-generated murder mystery that runs as a Discord Activity. He is available for remote freelance and contract work worldwide.

Services

Experience

IT Manager — North Support

2024 - Present

Manage full business operations including server installation, network health checks, and maintaining client websites and email services. Custom Python automation for email migration.

Full-stack Developer — Northroom Technologies / Evolver Systems

Jan 2023 - Present

Full-stack web and mobile development. Tech stack: React.js, React Native, Node.js, TypeScript, MobX, Supabase, MySQL. Focus on responsive design and system architecture.

Junior Web and Mobile Developer — Northroom Technologies

Jan 2023 - Jan 2023

Focused on mobile application development and responsive web design during transition from internship.

Senior Intern — Northroom Technologies

Jan 2022 - Jan 2023

Advanced internship role focusing on Git work flows, video editing, and mobile application development.

Intern — Northroom Technologies

Mar 2021 - Jan 2022

Initial internship gaining experience in development workflows, version control, and basic mobile development.

Skills

Contact

Email: contact@shadowskeep.co.za

GitHub: https://github.com/NICKLOUBSER · https://github.com/ShadowsKeep

LinkedIn: https://www.linkedin.com/in/petri-loubser-493676192/

Support: https://buymeacoffee.com/fxshadowking

Case Study: How I Built Horror Quest — an AI-Generated Multiplayer Discord Activity

Nick Loubser · July 2026 · Source on GitHub

Horror Quest is a multiplayer horror murder mystery that runs inside a Discord voice channel. Up to 10 players investigate a procedurally generated murder case together: every game has a unique AI-generated story, suspects, clues, and red herrings, with fresh scene artwork each chapter and optional voice narration. The whole thing runs serverless on Cloudflare Workers and costs about $0.10 per full game session.

What is a Discord Activity?

A Discord Activity is a web app embedded directly inside a Discord voice channel via an iframe, using the @discord/embedded-app-sdk. Everyone in the channel shares the same session — which makes Activities a natural fit for party games, but also means you inherit an unusual runtime: your app lives inside Discord's sandbox, authenticates through Discord's OAuth2, and every network request is proxied through Discord's content security rules.

Architecture

LayerTechnology
Hosting + APICloudflare Workers (Hono router)
Multiplayer stateDurable Objects, SQLite-backed
Real-time syncWebSockets with hibernation
Story generationGemini 2.5 Flash
Scene imagesImagen 3.0 Fast
NarrationGemini 2.5 Flash TTS ("Charon" voice)
FrontendVite + TypeScript, no framework

One Worker serves the static frontend, exposes the API, and upgrades WebSocket connections. Each Discord channel maps to exactly one Durable Object instance (idFromName(channelId)), which is the single source of truth for that room's game state — players, votes, chapters, clues. No separate game server, no Redis, no sticky sessions: the platform guarantees one instance per room globally.

Multiplayer voting without a game server

The core loop is vote-gated: each chapter presents choices, and the story only advances when every connected player has voted. The Durable Object holds the vote tally and broadcasts state over WebSockets. Because Durable Objects support WebSocket hibernation, the object can be evicted from memory between messages while connections stay open — you pay for compute only in the moments someone actually votes. A 3-minute chapter timer creates urgency, but it's deliberately visual-only: the game waits for all votes, because getting kicked out of a story beat by a timer feels terrible in a group setting.

The AI pipeline

Three models cooperate per game:

Story. Gemini 2.5 Flash generates the full mystery scaffold — setting, suspects, the actual culprit, clues and red herrings — then writes each chapter in response to the group's votes, keeping earlier clues persistent so the mystery stays solvable.

Images. Imagen 3.0 Fast renders a new scene image every chapter, displayed with a Ken Burns pan/zoom so static images feel alive.

Narration. Gemini TTS reads scenes aloud on demand. TTS requests route through the Durable Object so the generated audio is cached per chapter — ten players clicking "Listen" costs one generation, not ten. That single routing decision is most of the cost model.

What running inside Discord's iframe breaks

Things that are trivial on the open web need care inside an Activity:

OAuth. The SDK's authorize() hands the client a code; the Worker exchanges it server-side so the DISCORD_CLIENT_SECRET never ships to the browser.

Autoplay. Narration audio needs Permissions-Policy: autoplay=(self) and a relaxed Cross-Origin-Embedder-Policy on every response, or Discord's iframe silently blocks playback.

URLs. All traffic goes through Discord's proxy under URL mappings you configure in the Developer Portal — local development means tunneling your dev server (cloudflared) and pointing the Activity at the tunnel.

What a game costs

Item (per ~8-chapter, 4-player game)Cost
Imagen 3.0 Fast — 8 scene images~$0.08
Gemini 2.5 Flash — full story~$0.002
Gemini TTS — per cached "Listen"~$0.01
Cloudflare Workers + Durable Objectsfree tier
Total~$0.10
A $10 API budget cap runs 100+ complete group games. Cost ceilings were a design input, not an afterthought — image count per chapter, TTS caching, and model tier were all chosen against that number.

Takeaways

Durable Objects are the right primitive for room-based multiplayer: one object per room deletes a whole category of distributed-state problems. Cache AI output at the room level, not the client level. And design for the sandbox you actually run in — half the engineering in a Discord Activity is respecting Discord's iframe, proxy, and OAuth constraints rather than fighting them.