DevOps & CI/CD Automation
Shipping changes without drama
Tested, released and reversible, so changes reach customers on a Tuesday afternoon rather than late on a Friday night.

Photo: martex5 / Pixabay 
Photo: Rattakarn_ / Pixabay
Selected work demonstrating this service.
-
Automated GIS SaaS deployment with GitHub Actions
Automated GIS SaaS application deployment, data processing, and reporting system using GitHub Actions CI/CD, Python, Bash, and SQL.
-
Automated delivery of 20 GIS data pipelines
Automated delivery of 20 GIS data pipelines and app data ETL processes, streamlining infrastructure automation and reporting.
-
Overhauled internal processes, saving 8,000 hours
Overhauled internal processes, saving 8,000 hours by improving software architecture, systems, and scheduling efficiency.
-
A tenth of the cloud bill, and nothing lost
Optimized budget costs 10 times with zero loss in productivity for an international client by reimagining the overall infrastructure, eliminating unnecessary services, and relocating from the AWS cloud.
-
Generated the API contract from the database out
Generated the API contract outward from the database — OpenAPI, a 44,076‑line typed TypeScript client, 61 mock handlers and the limits the UI enforces — with a guard at every hop that fails on drift.
-
Built the entire core infrastructure from scratch
As one of the first hires, designed and built the entire core infrastructure and supporting processes from scratch for a green‑energy SaaS startup, laying the foundation for rapid growth.
-
Built a test suite across Go, SQL and browser
Built a layered automated test suite — 981 Go tests, 543 frontend and browser specs, 494 SQL behavioural tests — with mutation testing, property‑based tests and an accessibility gate.
-
Built a 268‑check guard engine for the repo
Built the repository's guard engine — 268 registered commit checks, 277 lint rules and 15 custom ESLint rules — plus 146 tests of the guards themselves, so the build holds the standard, not review.
-
Built first‑party error monitoring and tracing
Built first‑party error monitoring and OpenTelemetry tracing rather than buying them — payload sanitising, spike and regression detection, symbolication and a synthetic heartbeat — behind 11 operator views.
-
Your code on your own hardware
Deployed the company's own git forge on Soft Serve, private by default with no web panel and its SSH port bound to loopback behind a jump host, and made the landing page in front of it a build artefact of the main site rather than a hand‑kept copy.
-
Built a 22‑linter commit gate
Built a commit gate of 22 one‑line linters plus five that earn a paragraph, with no warning tier and no inline suppressions permitted, covering HTML, CSS, JavaScript, Python, YAML, Markdown, shell, links, spelling, secrets and typography.
-
A safety net that no longer costs half an hour
Cut the site's browser‑driven quality gate from 1,636 seconds to 615 by scheduling its checks longest‑first through a worker pool bounded to four lanes, after measuring that alphabetical order cost 320 seconds against 224.
-
Mirrored the site to Gemini and Gopher
Mirrored the entire site as 777 Gemini documents and 777 Gopher documents off the same deployed tree, at zero bytes of change to the HTML.
-
Fixed a sitemap with one shared timestamp
Fixed a sitemap where 172 of 176 URLs shared one modification timestamp, by taking the date from git history after establishing that the export rewrites every file on every run.
-
Linted the 10,242‑line quality gate itself
Brought 10,242 lines of quality‑gate JavaScript under a formatter and a linter after establishing it was the largest body of code in the repository and the only one nothing read, fixing 13 findings and suppressing none.
-
Held the generator to 981 tests and 92% coverage
Held the generator to 981 test cases at a 92% branch‑coverage floor with warnings treated as failures, and asserted idempotence by running the whole build pipeline twice from an empty file and requiring the second pass to change nothing.
-
Enabled every linter rule as an error
Selected every rule the Python linter has as an error, working through 1,815 findings to reach zero, with each of the few exemptions carrying a written reason and two of them backed by a checker instead of a comment.
-
Wrote tests for the checkers themselves
Wrote tests for the checkers themselves after establishing that a checker fed only clean input will one day report clean because it read nothing — planting a misspelling to confirm the spell‑check finds it, and taking an id range from the database rather than from a number in the test.
-
Wrote a parser verifying every FFI call
Wrote a parser that reads the real 7,308‑line C header and verifies every call site, every enum constant and that every pointer‑owning class is final, after a hand‑written placeholder header let calls to three removed functions compile, link and crash.
-
Reached the unused half of the core
Reached the half of the messaging core the application had never used — backup transfer, disappearing messages, message editing and resending, verified invitations, proxies and encryption policy — driving every test against the real library with no mocks.
If this is the work you need done, the next step is a conversation.
Tell us the problem and we will tell you honestly whether we are the right people.

