I build and automate the systems software runs on — AWS infrastructure, CI/CD and scheduled pipelines, and the iOS and web apps on top of them. AWS Certified Cloud Practitioner, based in Toronto.
ProblemPersonal operational state lived across terminals, log files and scheduled scripts. The obvious fix, a CRUD dashboard, has a known failure mode: every feature owns its own history, so state drifts and the past cannot be reconstructed.
ApproachEvent-sourced modular monolith with CQRS read models. Commands validate invariants and append immutable events to one universal ledger; a transactional outbox publishes them; projectors build the per-module views the UI reads; snapshots keep replay fast past a million events. Architecture decisions are recorded as ADRs.
Outcome17 domain modules on a single ledger, with forecasting and timelines added later as new projections rather than a re-architecture. Ships with a money mask and a demo seeder, so the system can be demonstrated without exposing real data.
Event sourcingCQRSNode.jsSQLiteDocker
Private — write-up only
ML · Automated pipeline
Soccer Predictions
ProblemMatch-outcome forecasts are only useful if they are produced and published before kickoff, every day, without anyone touching them.
ApproachProbability model with per-competition calibration, kept only where it improved held-out Brier score, behind a launchd job that retrains and republishes a static dashboard nightly.
OutcomeRuns unattended at 08:00 daily across the Premier League, Serie A, Brasileirão and Copa Libertadores, with a public accuracy page rather than a claimed win rate.
ProblemLotto Max draw history is public but arrives as raw CSV, so players pick numbers with no view of what the data does and does not support.
ApproachSwiftUI app with Swift Charts and zero third-party dependencies, over a FastAPI and SQLite backend that ingests official WCLC results and cross-validates sources.
OutcomeShipped to the App Store under a developer account that has since lapsed, so the listing is no longer live. The web build serves the same data today, and the SwiftUI rebuild states in-app that no method beats a random draw.
ProblemWork spread across several repos had no reliable backup, and the todos that governed it never reached a calendar.
ApproachFour nightly launchd jobs covering the tree and each standalone repo, plus a Python pipeline compiling every TODO.md into Apple Calendar, Reminders and a generated document.
OutcomeThe backup job now hard-fails on a missing repo — replacing a silent success that had already cost one repository its backup.
BashPythonlaunchdGit
Private — write-up only
// Experience
Associate Software EngineerTD
// Skills
DevOps
CI/CD
Docker
GitHub Actions
Jenkins
Terraform
launchd
Git
Security
DevSecOps
Vulnerability management
Qualys VMDR
Policy compliance
Encryption at rest
Secrets handling
Cloud
EC2
S3
IAM
VPC
Lambda
CloudFormation
RDS
Route 53
Entra ID
Languages
Python
Swift
TypeScript
JavaScript
SQL
Bash
PowerShell
Application
SwiftUI
Node.js
React
REST API
MongoDB
HTML / CSS
Certifications
AWS Certified Cloud Practitioner
AWS Certified AI Practitioner
CompTIA Network+
Qualys VMDR Certified Specialist
Qualys Policy Compliance
AI Fluency Framework & Foundations — Anthropic
AWS re/Start Graduate
// Contact
Let's build something.
DevOps, cloud, AI security and platform engineering. Toronto or remote.