Full-Stack · Cloud · WebGLBallarat · AUS

PaulAtkins

Architecting systems that do not break.

Senior Backend Engineer & Cloud Architect

Scroll
01Philosophy

Model the business, not the database.

Before I write a line, I argue about what belongs where. Domain logic at the centre; the database and framework at the edges. That boundary is the only reason systems survive their second year.

SOLID keeps structure honest under new requirements. DRY means a rule lives in one place and means one thing. Types and tests are documentation that cannot go stale.

SOLID

Architecture that bends without breaking.

DRY

Write it once. Trust it everywhere.

DDD

Model the business, not the database.

02Selected Work

The Builds

  • 01SCRDReal-time / Cloud
  • 02BucketwiseSelf-hosted / AI
01

SCRD

Real-time · Cloud — 2025
scrd.au
scrd.au/court/1 · live
SCRD in-venue live scoreboard
SCRD courtside scoring controller on mobile
Live — in-venue display & courtside controller, synced
Fig.01 — Real-time score syncOne source of truth / match
Client
Venue Devicestablets · phones · TV
Edge
Realtime GatewayAWS · WebSockets
Service
Score EngineNode.js · owns rules
SquashLevels Syncnational rating
Data
PostgreSQLdurable match state
<40ms

score sync latency

99.9%

uptime, season-long

11

clubs live

5k+

matches scored

Challenge

Squash venues ran scores on paper. Nothing synced between courts, nothing counted toward a player's national ranking, and club admin lived in spreadsheets.

Approach

One authoritative match state, fanned out over WebSockets to every screen in the building. The score engine owns the rules and writes through to Postgres; each completed match posts to SquashLevels.

Outcome

Live scores on every device in the venue, sub-frame sync, and every game now counts toward a national rating — club management folded into the same app.

ReactNode.jsPostgreSQLAWSWebSockets
02

Bucketwise

Self-hosted · AI — 2025
Self-hosted
localhost:5173/dashboard · self-hosted
Bucketwise Planner self-hosted dashboard
Live — self-hosted dashboard, buckets & debt snowball
Fig.02 — Trust boundaryYour data never leaves the box
Your server · docker host
Web UIReact
APIExpress · TS
AI Advisorlocal only
PostgreSQLyour data
no sync
Third-party Cloudnever reached
0

bytes leave your box

1

compose up to run

100%

self-hosted

4

services, one stack

Challenge

Scott Pape's Barefoot-style bucket budgeting works, but every app that does it wants your bank logins sitting on someone else's servers.

Approach

Ship the whole product as one Docker stack you run yourself. An Express API, Postgres, and an AI advisor that reads only local data and returns plain-English guidance — no outbound sync.

Outcome

Bucket-method budgeting with an AI advisor, where financial data never leaves your machine — stood up with a single compose file.

DockerNode.jsTypeScriptExpressAI Advisor
03Contact

InitiateBuild.

Got a system that has to hold? Tell me what you're building.