I build systems that keep running without me: cloud infrastructure, CI/CD and nightly scheduled jobs underneath, with the dashboards, iOS and web apps on top. When something breaks it fails loudly, rather than quietly reporting success.
17 domain modules run on one immutable ledger, and forecasting and timelines were added later as new projections rather than a re-architecture.
ProblemOperational 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.
ApproachAn event-sourced modular monolith. Commands validate invariants and append immutable events to one universal ledger, a transactional outbox publishes them, and CQRS projectors build the per-module views the UI reads. Snapshots keep replay fast past a million events.
OutcomeAdding a feature means adding a projection, not migrating a schema. Every architecture decision is recorded as an ADR, and a money mask plus a demo seeder let the system be shown end to end without exposing real data.
Drawn from the project's own architecture specification and ADRs.
Event sourcingCQRSNode.jsSQLiteDocker
Private: write-up only
ML · Automated pipeline
Soccer Predictions (SportsNator)
Publishes a calibrated forecast for four competitions before kickoff every day, unattended, and reports its own accuracy instead of a claimed win rate.
ProblemMatch-outcome forecasts are only useful if they are produced and published before kickoff, every day, without anyone touching them.
ApproachA probability model with per-competition calibration, kept only where it improved held-out Brier score. A scheduled CI workflow retrains it and republishes the static dashboard four times a day, with a concurrency guard so two runs can never race the deploy.
OutcomeCovers the Premier League, Serie A, Brasileirão and Copa Libertadores. Every prediction is written to a forward log before kickoff and graded afterwards, so the published record can be checked rather than taken on trust.
A shipped iOS app whose own interface tells users that no selection method beats a random draw.
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 and Swift Charts with zero third-party dependencies, over a FastAPI and SQLite backend that ingests official WCLC results and cross-validates its sources before storing a draw.
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 charts are built to show what the history does not support as clearly as what it does.
A silent success had already cost one repository its backup, so the job was rewritten to hard-fail on a missing repo rather than report green.
ProblemWork spread across several repositories had no reliable backup, and the todos that governed it never reached a calendar.
ApproachNightly launchd jobs covering the whole tree and each standalone repository, committing per project rather than sweeping the index. A Python pipeline compiles every TODO.md into Apple Calendar, Apple Reminders and a tracker document, and scheduled GitHub Actions plus whitelist-staged deploy scripts ship the sites themselves.
OutcomeA missing repository is now a loud failure instead of a quiet one. Projects marked private publish under a neutral alias, so a calendar that syncs to a phone never carries a project name it should not.
BashPythonlaunchdGitGitHub ActionsCI/CD
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.