Professional

Hello, world.

12 years in industry as a software engineer, building and running production systems. That includes working on an industry-leading lead management tool, handling complex calculations, big data and mapping intelligence; building auto-scaling processing workers to handle load, database administration, and turning customer requirements into systems that hold up at scale. These are the technologies I've used professionally:

Python JavaScript Node.js Express .NET React Vue MySQL SQL Server MongoDB Redis Elasticsearch Data processing Encryption Linux/Ubuntu WebSockets

Solo side projects

A collection of solo projects.

Built end to end in my own time: real-time multiplayer servers, minimalist web apps, and personal productivity tools. Mostly an excuse to solve a tricky problem or build a tool I needed.

Projects

Landing

Live

A personal markdown notes and task app, with optional end-to-end encrypted private notes and a few games built in for downtime.

Crystal Kemal MySQL Alpine.js E2E encryption PWA

Features

  • Freeform markdown note-taking alongside a simple task list, where each task carries one of three statuses: todo, doing, or done.
  • Any note can optionally be encrypted end-to-end with its own separate password, for anything meant to stay private.
  • A few built-in games for downtime.

⚙ Under the hood

Per-note encryption is built on industry-standard cryptography (AES-256, with the key derived from your chosen password) applied entirely client-side, so the server only ever stores ciphertext and never sees the password or the plaintext note.

izrite.com/landing →

Bible Reader

Live

A minimalist Bible reading app built on the public-domain Berean Standard Bible, with accounts, notes, and cross-references.

Node.js Express SQLite EJS Alpine.js PWA

Features

  • Clean chapter-by-chapter reading (/read/GEN/1) preserving poetry line breaks, section headings, Psalm superscriptions, and "words of Jesus" styling.
  • Automatic linking of Bible references typed anywhere in a note.
  • Hovering a linked reference pops up the verse text without leaving the page.

⚙ Under the hood

The Bible text is imported from the official BSB USJ export straight into SQLite via an idempotent, safely re-runnable import script. Translator footnotes are deliberately dropped; everything structural is kept.

Sessions run through a hand-written SQLite-backed session store rather than a third-party one, written specifically to avoid pulling a GPL-licensed dependency into a project chosen from the ground up to be free of licensing entanglements.

izrite.com/bible →

Paddlebrook

In progress

A calm, cosy online game about ducks, a pond and a home of your own. Fish, collect and dress your duck, with no combat and no hurry. No framework and no sprite art.

Node.js Express EJS SQLite Canvas 2D Web Audio ws Binary protocol PWA

Features

  • Fishing, bug catching, fossil digging and flower growing, with what's about following the seasons, day and night, and the rain, on one clock shared by everyone.
  • A museum to fill with what you find, and a cottage and garden of your own to decorate, grow and show off to visitors.
  • Villagers to chat with, bounties to earn stamps for rare rewards, and a boat out to a tropical island.
  • A duck you can dress up, that breathes, blinks and waddles.
  • Everything drawn from canvas shapes and synthesised with Web Audio, with no image or audio files.

⚙ Under the hood

An authoritative server tick, and a zone-broadcast / private protocol sent as a single binary buffer. Every item is one row in a single registry that the shops, wardrobe and admin pages are all built from.

What's in the water and the grass is never sent over the wire: each player's fish and bugs are a pure function of their username and the clock, so the server and browser work out identical ones and only events travel. Daily changes work the same way, so no calendar is ever stored.

izrite.com/paddlebrook →

Puffin Bay

In progress

A Club Penguin-style online game on a seaside island. Wander about, chat, play minigames for gold and spend it on clothes and a burrow of your own. No framework and no sprite art.

Node.js Express EJS SQLite Canvas 2D Web Audio ws Binary protocol PWA

Features

  • Rooms to wander and chat in, an island map to hop between them, and a day and night shared by everyone.
  • Minigames that pay out gold, to spend on clothes, dyes and furniture.
  • A burrow of your own to decorate, that anyone can visit.
  • Everything drawn from canvas shapes and synthesised with Web Audio, with no image or audio files.

⚙ Under the hood

An authoritative server tick: the browser only says what it wants and the server decides, over a binary protocol defined once in a file the server, the browser and the test bots all share.

The minigames are deterministic simulations shared by both sides. You play your own copy at 60 frames a second with no lag, while the server replays your inputs on its own copy, never faster than real time, and pays out from that. A fingerprint of each copy's state travels alongside, so any drift between the two is caught.

izrite.com/puffin-bay →

Prism

V1

Xiangqi, Hex and Checkers on one site: rated 10-minute games against people online, or an 8-level computer opponent for each game that runs right in your browser.

Node.js Express EJS ws SQLite Elo Web Workers Alpha-Beta Monte Carlo tree search PWA

Features

  • Rated online play with server-run clocks, draw offers, resign and abort, and matchmaking that pairs you with the closest rating looking for the same game.
  • A separate Elo rating for each game, with a leaderboard and profiles showing rank, best rating and win/draw/loss record.
  • A full game history: every finished game, online or against the computer, opens in a step-through review with each game's own notation and both clocks at every move.
  • Board colours, Chinese or English xiangqi pieces, drag or click to move, coordinates, animations and sound.

⚙ Under the hood

The server is the only referee. It plays every online move on its own copy of the game using the same rules files the browser runs, and it keeps the clocks, so an illegal, repeated or stale move just sends the real position back.

Computer games never touch the server while you play: each engine runs in a Web Worker in your browser. When a game finishes, the server replays its moves on a fresh board and works out the result itself before saving it to your history.

izrite.com/prism →

Kanban

Live

A KanbanFlow-style task board: To-do, Doing and Done columns, colour-coded tasks and as many boards as you like, in a single server-rendered page.

Node.js Express SQLite EJS Alpine.js PWA

Features

  • Drag-and-drop between and within columns, with the card moving live into place as you drag.
  • A colour legend per board: filter by colour, rename or recolour them, and untick the ones you don't use.
  • Open tasks live in the URL and browser history, so Back closes them and unsaved edits prompt before they're lost.
  • Light and dark themes with no flash on load, and installable as an app.

⚙ Under the hood

Moves are applied in the browser straight away using the same reordering logic as the server, then rolled back if the save fails. While dragging, the original card stays hidden in the page rather than removed, because browsers only report the end of a drag to an element that's still there.

izrite.com/kanban →

Other projects

🔲

Picross

50 active players

A nonogram-style picture logic puzzle, picked up by a small steady player base.

izrite.com/picross →

Hearthvale

An online skilling game on an island of its own: gather, make and fight your way up a set of skills.

izrite.com/hearthvale →

Favourite tech

SQLite Node.js Express Alpine.js Crystal Kemal Ubuntu Elasticsearch MariaDB nginx PM2