I'm a DevOps & Platform Engineer on enterprise projects: CI/CD, Kubernetes, Terraform, cloud cost.
I wrote application code before I ran the infrastructure that hosts it, which pays off mostly when a build breaks and someone has to know where to look.
The open-source work here comes from the same place. Something misbehaves in a real deployment, I go read the source, and the fix goes upstream rather than into a patch I keep to myself.
role: DevOps & Platform Engineer
platform: [Azure, Kubernetes, GitOps, Terraform, Azure DevOps, GitHub Actions]
also: [FinOps, Agentic DevOps, .NET backend]
languages: [C#, TypeScript, Go, Rust, Python, Bash, PowerShell]
into: [correctness bugs, observability gaps, release plumbing, cloud cost]
based_in: Turin, Italy|
Platform & CI/CD Azure DevOps YAML pipelines and reusable templates · GitHub Actions · Helm charts and Helmfile releases · OCI push to ACR/GHCR · ApiOps policy automation on Azure API Management · Jinja2 templating · branch policies, PR review, code review as a gate |
Cloud & infrastructure Kubernetes on AKS and k3d on-prem · NGINX Ingress Controller · Terraform (azurerm, azuredevops) · VM Scale Sets as self-hosted agent pools · golden images for faster scale-out · Container Registry, Storage Accounts, Functions, Entra · reservation and cost governance |
|
Backend & architecture REST/HTTP APIs in .NET 8/9 · Worker Services · CQRS with MediatR · Domain-Driven Design · hexagonal and N-tier architectures · API gateway with Ocelot · EF Core and Dapper · PostgreSQL, MongoDB · NUnit + Moq, self-hosted integration tests |
Identity, storage & AI Keycloak with OAuth 2.0 · JWT bearer flows · SeaweedFS through the S3-compatible client · self-hosted LLM inference with Ollama · RAG pipelines with ChromaDB and embedding models · Copilot governance and AI spend controls |
Pull requests to projects I run or depend on.
| Project | Change | PR | |
|---|---|---|---|
| kubernetes/kube-openapi | Fix duplicate map keys when a type embeds two structs sharing a field | #631 |
|
| kubernetes-sigs/apiserver-network-proxy | Add connection_duration_seconds histogram for post-dial connection lifespan |
#899 |
|
| kubernetes/perf-tests | Unit tests for clusterloader2/pkg/errors |
#4261 |
|
| kubernetes/minikube | VirtualBox: strip surrounding quotes before parsing hostOnlyCIDR |
#23480 |
|
| docker/cli | Normalize registry server address to lowercase for credential lookup | #7184 |
|
| containerd/runwasi | Gate ctr image import --local by detected ctr version |
#1177 |
|
| argoproj/argo-workflows | Scope RemoveFromQueue to the calling controller |
#16739 |
|
| dotnet/runtime | CompareInfo.IsPrefix/IsSuffix with IgnoreSymbols not ignoring leading/trailing symbols |
#132397 |
|
| dotnet/runtime | Return empty string instead of throwing when getpwuid_r fails unexpectedly |
#132396 |
|
| dtolnay/cxx | Strip r# prefix from raw identifiers in generated C++ names |
#1749 |
|
| rust-embedded/heapless | Add shift_remove family to IndexMap/IndexSet |
#685 |
|
| ansible/terraform-provider-aap | Remove aap_host from state on 404 during Read |
#194 |
|
| Azure/azure-powershell | Fix Get-AzSubscription silently ignoring mismatched -TenantId under MSI auth |
#29994 |
|
| traefik/traefik-helm-chart | Restore secretResourceNames for namespaced Role |
#1972 |
|
| nunit/nunit-console | Fix --list-extensions showing the wrong target framework |
#1861 |
|
| dotnet-outdated/dotnet-outdated | Report packages whose source repo is archived or deleted | #781 |
|
The workflows behind my CI/CD and FinOps posts, including the caching benchmark I ran 10 times on one runner. |
token-optimization Cuts token usage when you work with LLM coding agents. Setup is idempotent, so re-running it is safe. |
I write on LinkedIn about platform details that usually pass unchecked: how Azure DevOps resolves its three expression syntaxes, the compliance rules for self-hosted runners, what Copilot code review does and does not decide, and whether an Azure reservation discount is still applying to anything.