Kai Cryan

_
Who I am

About

Penultimate-year Bachelor of Information Technology student at Macquarie University (Software Technology major), based in Sydney. I work as a Junior Developer at Japan Secure Solutions, and outside that I keep building things that actually run rather than just live in theory — this site, its case studies, and the server hosting all of it are part of that habit.

Day to day that's backend work in Go against PostgreSQL and Redis, freelance WordPress builds taken from spec through to launch, a home lab running my own DNS/DHCP and home automation, and daily algorithmic practice across Java and C++ — with C/C++ fundamentals the thing I'm actively learning right now.

StudyingB.IT (Software Technology), Macquarie University
WorkingJunior Developer @ Japan Secure Solutions
Based inSydney, Australia
Currently learningC/C++ fundamentals
Go JavaScript Java C++ PostgreSQL Redis Docker Linux Git WordPress Home Assistant
How I work

Approach

01

Learn by building

Go, at work, by shipping backend services against Postgres and Redis. C, in a university systems course, through file-parsing labs and pointer bugs. Docker and networking, by replacing my home router with a self-hosted server that now runs its own DNS for the whole house. Different contexts, same habit — build the real thing, not the tutorial version.

02

Team habits and solo habits, both

At work that means PR review, tickets, and Go services built inside someone else's existing architecture. At home it means a 20-sensor Zigbee automation system and a DNS server nobody's reviewing before it ships. Doing both keeps each one honest — one keeps me disciplined, the other keeps me able to just start.

03

Built through iteration

CODE369 went from a written spec and a hand-drawn wireframe to a hybrid WordPress-and-Shopify build, then kept changing after it launched. Nothing on this site — including the site itself — shipped in one pass.

The shape of it

Process

Discovery

A client's written spec and hand-drawn wireframe, or just an itch to replace another ISP router's defaults — figuring out what's actually worth building before committing to it.

Build

Design and development happen together, not as separate handoff stages.

Launch

Deployed to infrastructure I own and maintain — the same self-hosted server behind this site runs everything else I ship.

Support

CODE369 is still getting updates months after it first shipped, and the home server behind it never really stops needing attention either.

Selected

Work

WordPress Shopify Self-hosted

CODE369

A client-commissioned brand site spanning fashion, music, and digital tokens, built from a written spec and hand-drawn wireframe. I chose a hybrid WordPress + Shopify build — trading a fully custom storefront for faster, more reliable commerce — and self-hosted the entire stack. It went well enough to lead to a second freelance project.

Explore CODE369
CODE369 homepage screenshot
Docker Networking Home Automation Self-hosted

Home Lab

Replaced a stock ISP router and third-party cloud apps with a self-built ZimaOS server. AdGuard Home took over DNS/DHCP, 20 Zigbee sensors close the loop on climate control by driving automated blinds, and photo storage moved off the cloud entirely. It's the same server hosting this site.

Explore the Home Lab
Home Assistant dashboard screenshot

More projects will be added here as they launch.

Occasional writing

Notes

GoAug 2026

Async work in Go: goroutines & channels

A slow network call inside a hot path can drag down the whole request if it runs synchronously. The fix: push the work onto a channel and return immediately, while a background goroutine started once at startup drains it and sends on its own schedule — paired with a blocking Flush/Shutdown at the end of the program's life so nothing queued gets silently dropped.

GoAug 2026

Go, coming from Java: quirks worth knowing

No exceptions — every fallible function returns (result, error), so if err != nil is everywhere. := infers a type and declares in one step, function-scope only. Every type has a zero value, so nothing is ever truly uninitialized. And internal/ is enforced by the compiler, not a lint rule — outside code simply can't import it.

CI/CDAug 2026

What actually happens in CI before code ships

CI runs on every push — build, test, check quality — before a human looks at it. CD is the later, separate step that ships it. "Linting" is really layered checks (formatting, then bug-pattern detectors) that never run the code — that's what tests are for — and security scanning is a different question again: your own code for anti-patterns, or your dependencies' versions for known CVEs.

GitAug 2026

A git workflow that keeps small teams sane

One ticket, one branch, one PR, off an up-to-date main. Run whatever mirrors CI locally before opening the PR — find out in seconds, not in a queue. Push more commits to the same branch after review feedback instead of opening a new one. And stage deliberately: git add <file>, not -A out of habit.

TypeScriptAug 2026

TypeScript & Expo: notes from a first React Native project

Type annotations are checked at compile time and stripped before anything runs — what executes is plain JS. An interface is a compile-time-only contract, gone once the checker finishes. unknown is an honest placeholder for "exists, shape unconfirmed." And Expo hides most native-build complexity behind one command and a QR code, scanned with the Expo Go app.

ToolingAug 2026

Two WSL gotchas that cost me an afternoon

Both traced back to one root cause: a running terminal doesn't re-read its shell config after you edit it. An unquoted PATH export broke silently on an unescaped-parentheses Windows path, killing every new shell's startup — and a correctly-installed tool still came back "not found" in a terminal that had been open since before the fix.

Say hello

Get in touch

Have a project in mind?