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.
-
Automated 100 critical data backups using Barman
Automated 100 critical data backups using Barman, Google Cloud, Bash, and Python, ensuring data integrity across databases.
-
Ran 20 Docker apps on Google Cloud and AWS
Deployed and maintained 20 Docker containerized applications, troubleshooting with Podman and Kubernetes, and managing R‑based apps on Google Cloud and AWS.
-
Cut operational risk with Grafana and Prometheus
Mitigated operational risks by implementing a monitoring dashboard using Grafana and Prometheus, improving system reliability.
-
Overhauled internal processes, saving 8,000 hours
Overhauled internal processes, saving 8,000 hours by improving software architecture, systems, and scheduling efficiency.
-
Automated SSL/TLS certs for 100 Docker apps
Automated SSL/TLS certificate creation for 100 Docker applications, ensuring secure connections across Ubuntu Linux hosts.
-
Streamlined CI/CD processes, saving 4,000 hours
Streamlined CI/CD processes, saving 4,000 hours by introducing automation in software development pipelines.
-
Saved 4,000 hours with GitHub and GitLab CI/CD
Streamlined data analysis and software development processes, saving 4,000 hours by introducing GitHub, GitLab, Bash, and Python CI/CD practices.
-
Automated data processing in Python and PL/pgSQL
Automated data processing tasks using Shell scripting, PL/pgSQL, Python, and Transact‑SQL, increasing productivity and 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 GitHub Actions CI/CD pipelines
Built GitHub Actions CI/CD pipelines with a distroless production frontend image and multi‑environment promotion.
-
Authored 578 go‑task automation targets
Authored 578 go‑task automation targets spanning native, Docker and HTTPS dev modes, linting, testing, database and deployment.
-
Owned end‑to‑end platform deployments to Azure
Owned end‑to‑end deployments of the platform to Azure, managing releases across development, staging and production environments.
-
Set a zero‑warnings bar across six languages
Set a zero‑warnings quality bar across six languages — Go, TypeScript, SQL, Python, Shell and Markdown — enforced by pre‑commit hooks.
-
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.
-
Automated team collaboration
Automated team collaboration, password management, task and time management, and built a semi‑automatic project‑showcase system, raising team productivity.
-
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.
-
1,022 migrations behind a schema drift gate
Kept the schema honest across 1,022 migrations with a CI gate that builds the database both ways — a fresh install, and an install plus every migration — and fails when the two disagree.
-
Ran a continuous security scanning programme
Established a continuous security programme — code scanning, DAST, dependency and vulnerability checks, SBOM generation, secret scanning and SHA‑pinned actions — alongside 21 written security audits.
-
Servers you can rebuild from scratch
Built the company's own infrastructure as 19 Ansible playbooks and 34 roles across 12,065 lines of YAML, converging a live host to a declared state with every play idempotent.
-
Made Ansible check mode tell the truth
Made check mode tell the truth across the whole platform after finding six probes deciding on a value the host never gave, because Ansible's command module reports success under --check while skipping the command entirely.
-
Added a one‑second preflight for secrets
Added a preflight play that runs the same code as the converge against operator‑local secrets in about a second, after a half‑applied production run died on its ninth task with the swap settings already written to the live host.
-
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.
-
Ran containers on Podman and Quadlet
Deployed a container plane on Podman and Quadlet under systemd rather than Docker, because Docker publishes container ports above the host firewall's own rules — and gave deploys an unprivileged user with one fixed command instead of root.
-
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.
-
Found the hooks and the gate disagreeing
Found the commit hooks and the quality gate running different checks while a document promised they were the same, by comparing the two lists in a test — the five that only ever ran by hand were the ones reading the CV prose.
-
Rehearsed the forge CI hook, found 2 defects
Rehearsed the forge‑side CI hook and found two defects unreachable by reading the file: a fallback that put an unresolvable argument on the hook's input, and git's own environment variable following the gate into the checkout and turning 19 tests red.
-
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.
-
Took the test suite to 8.9 seconds
Took the test suite from six tests over a sixty‑second limit to 135 passing in 8.9 seconds by profiling the main thread and removing the two calls it sat inside for 3,989 samples out of 4,017.
-
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.
-
Know the licence of everything you ship
Audited 644 Rust crates for licence compatibility on every build, and proved the check fires by rewriting one crate's licence and by moving the pinned core revision without regenerating.
-
Held 4 repositories to one history standard
Held four repositories to one history standard — conventional, emoji‑free, no attribution trailers, enforced by a commit‑message hook — alongside 48 instruction documents that govern how the work is done.
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.

