lukia

Full-stack developer · Cape Town, ZA

Nothing here is a mockup.

A keyboard-playable strategy game, a self-hosted read-later app, payment starter kits for South African rails, free browser tools and an interaction lab. Each one is deployed where you can open it, and each one is written up with what the constraint was and what it cost.

A Circle Connect match in progress: towers scattered on a dark board with their unit counts, the rival faction holding nine of them in amber and streaming units down two beams, and the tick counter reading 0256 of 3600.
FIG 01 — play.iamlukia.com, keyboard only
Live nowplay.iamlukia.comlab.iamlukia.comJava · Spring · Kotlin · AWS · Astro · Next.js

01 — Products

All write-ups →

01 / GAME · TYPESCRIPT · CANVAS

Circle Connect

Connect a tower you hold to one you want, units stream down the beam until you cut it, and the last faction standing wins. Twenty levels with saved progress — and playable from the keyboard alone, in a genre that almost never is.

Circle Connect's campaign screen: twenty levels in order under the note that every one is a configuration of the same rules, with none cleared yet.

02 / APP · KOTLIN · NEXT.JS

readlater

A self-hosted read-later app where one cookie requirement decided the whole deployment — plus a fetcher that treats every saved URL as hostile, and what a passing test cannot tell you about a session.

readlater's sign-in screen — the app is single-user behind a GitHub allowlist, so this is as far as a visitor gets.

03 / STARTER KIT · SPRING BOOT

Payment webhooks done properly

The half of a PayFast integration that actually breaks: three different signature rules, idempotency as a database constraint, retries that survive a rollback, and the webhook that never arrives.

The PayFast sandbox checkout built from these kits: an amount and item field above a Pay with PayFast button, over a note that no money moves.

04 / TEMPLATE · ASTRO

Zero-JS Astro starter

A personal-site template with nothing in its script budget — Astro, plain CSS, WCAG AA throughout, and one flag that keeps a site out of search until launch. Extracted from this one.

The zero-JS Astro starter's live demo at template.iamlukia.com, showing the template's own home page.

02 — Free tools

All tools →
  • VAT calculator →

    Add or extract South African VAT at 15%, worked in whole cents so the three lines always add up.

  • SA ID number validator →

    Check a 13-digit South African ID number and decode what it says. The number never leaves your browser.

  • Email DNS checker →

    Look up a domain’s SPF, DKIM and DMARC records and get a plain-language read on each one.

Interaction craft on its own subdomain, built under the opposite constraint to this site: bundled React instead of no script at all.

  • The lab's Design Languages showcase, one layout rendered under several visual treatments.
    Design Languages

    One page of identical content redrawn in every design language on offer, switched live — because agreeing what a thing should feel like is the slowest part of starting it, and prose is a bad medium for that.

  • The lab's Flow Field showcase: a seeded particle field curling across a dark canvas, with particle-count and field-scale controls beneath it.
    Flow Field

    A few thousand particles steered by value noise, drawn on a canvas with no framework at all. The simulation is kept as pure functions, so the things it claims are tested rather than eyeballed.

  • The ZA Payments Demo signature tracer: a pasted PayFast ITN body above a green Valid verdict, over a table listing each field in the order it arrived with the exact string being hashed beside it.
    ZA Payments Demo

    Four payments showcases on their own site: a merchant application form with real South African validation and a recovery path you can look at, a dashboard over an invented ledger where money is integer cents the whole way through, a PayFast signature tracer that names which documented wrong rule a sender is applying rather than just calling it invalid, and a webhook lifecycle you can drive through retry, backoff and dead-letter. They started in the lab and outgrew it.

04 — Services

the same work, done for other people

Three ways it usually starts. Most projects turn out to be some combination of them.

  • New builds

    A product to build and no codebase yet: architecture, database, API, interface and deployment — handed over as something your team can actually maintain afterwards.

  • Existing systems

    Inherited code, pages that have got slow, a feature that keeps breaking. First step is working out what is actually wrong — usually cheaper than the rewrite it looked like it needed.

  • Getting to production

    Building it is half the job. Deployment, monitoring and backups set up so shipping is routine rather than an event, and so you hear about a break before your users do.

05 — About

Java · Spring · Kotlin

AWS · Astro · Next.js

The way to show what someone can build is to build things and let people use them, so that is what the work here is: finished products, each one deployed somewhere a stranger can reach.

The background is backend — Java and Spring on AWS — and it has widened over time to the whole slice, interface included, because shipping something usable means owning all of it: database, API, interface, and the deployment that carries it.

It is work built around the parts most people would rather skip: reading unfamiliar code, tracking down the bug that only shows up in production, making a deployment boring and repeatable. On a small team that means fewer handoffs, and someone who can follow a problem from the browser down to the database without passing it along. And when the simpler option is the better one, that is what you'll hear.

06 — Contact

Say what you're building.

Roughly what it is and roughly when you need it. You'll get an honest answer on whether this is the right place for it.

So a reply can reach you.