Principal software engineer · Ph.D.

Eleven years at Microsoft building engineering systems — CI, pipelines, frameworks, and services — that help developers build, test, validate, and release complex products. My broader expertise is where systems meet scale: distributed systems, cloud architecture, and service-oriented architecture.

Interact with the field: move your pointer to connect nodes; tap, click, or press P to publish.

About

Systems that stay honest under load

Gabriel Loewen wearing round black glasses and a black sweater
Principal engineer · Protocol enthusiast · Rain-compatible

I've been at Microsoft since 2015, now as a principal software engineer focused entirely on the engineering system: its architecture, continuous integration, pipelines, frameworks, and services. Born and raised in the Pacific Northwest and still here; the rain is good for staying indoors and reading flame graphs.

The thread running through my broader technical work is systems at scale: distributed systems, cloud architecture, and service-oriented architecture. I build mostly in Python and Rust, and I gravitate toward the low-level stuff — protocols, transports, storage, the parts of a system that decide who gets slowed down when things get busy. That's what I'm working through right now with Felix: if a guarantee can't be enforced in code, it isn't a guarantee.

Rust Python QUIC Cloud architecture Service-oriented architecture Distributed systems Wire protocols Tail latency
At Microsoft · eleven years

Building the engineering system developers build on

Scope
Shared engineering systems
Discipline
CI · Pipelines · Frameworks · Services
Level
Principal engineer, individual contributor

I work on engineering systems — CI, pipelines, frameworks, and services — that help developers build, test, validate, and release complex products. My work is on the internal engineering system, not the customer-facing products or infrastructure.

Over eleven years, that work has grown from product-specific continuous integration into shared platforms serving multiple engineering teams. The goal has remained the same: make difficult workflows dependable, repeatable, scalable, and easier for developers to use.

Engineering architecture CI platforms Developer workflows Reliability Developer productivity
Eleven years, four levels, one job

The discipline has not changed: continuous integration, pipelines, frameworks, services, and the architecture that connects them — the engineering system developers use to build and validate their products. What changed is the scale: one driver, then one product, then two, then multiple product organizations.

  1. Aug 2015 — Mar 2016 Software Engineer One driver’s CI · OpenStack Hyper-V Continuous integration, testing, and metrics for the OpenStack Hyper-V driver. I had interned on that CI Lab team the summer before, building the tooling that measured which submitted patches passed and which broke, then came back to own it. The Jenkins PowerShell contribution further down this page came out of this work: a gap in the tooling I needed, fixed upstream rather than worked around.
  2. Mar 2016 — Dec 2020 Software Engineer II One product’s CI · Azure Stack Nearly five years on the continuous integration systems, pipelines, and frameworks that Azure Stack was built and validated on. Hybrid infrastructure ships into a customer’s datacentre, which changes what an escaped defect costs and therefore what the pipeline has to catch.
  3. Dec 2020 — Aug 2024 Senior Software Engineer Two products’ CI · Azure Stack Hub, Azure Stack HCI The same discipline across two hybrid-cloud products at once, as Azure Stack HCI — now Azure Local — grew up alongside Hub. Two products sharing engineering systems is where the pipelines stop being a product’s tooling and start being a platform.
  4. Aug 2024 — present Principal Software Engineer Cross-organization engineering system · service-oriented The same discipline at broader scale, re-architected as shared services, platforms, and frameworks for multiple engineering teams. Principal is the senior individual-contributor level, so the work centers on technical vision, architecture, and leverage rather than headcount.
2015 Ph.D., Computer Science The University of Alabama. Dissertation on Thunder, an IaaS cloud architecture designed for smaller organizations. Four years teaching alongside it — introductory CS in Python and C as a graduate teaching assistant, followed by work as an adjunct professor — made the doctorate as much about explaining systems as building them.
Doctoral research

Thunder: a private cloud architecture designed for high usability

My dissertation asked how underfunded and understaffed organizations—especially schools, libraries, and nonprofit medical facilities—could gain the cost benefits of private cloud computing without the deployment and management burden of a general-purpose platform.

The name is recursive: THUNDER Helps Underfunded Nonprofits Distribute Electronic Resources.

I designed and built a vertically integrated IaaS system that used PXE booting and preseeding for automated deployment, multicast discovery and a custom RPC layer for zero-touch node registration, and libvirt for virtual-machine orchestration. Controller, compute, and storage services could be expanded without interrupting the running cloud.

The research introduced RAIN—Rating Assisted Instantiation Negotiation—a scheduler that ranked compute nodes from real-time load metrics. Experiments found that it improved VM placement and avoided hardware over-utilization, especially in heterogeneous clusters, with the explicit tradeoff of slower placement decisions.

In comparative deployment studies, inexperienced users preferred Thunder's deployment model to OpenStack and Eucalyptus. The architecture also supported low-cost thin clients, browser-based guest access, and classroom teaching of virtualization, scalability, and elasticity.

Usability research RAIN scheduling libvirt PXE provisioning Distributed RPC
Next project · design started

Felix Canvas

A multiplayer drawing canvas whose entire backend is Felix. Shapes, cursors, presence, history and snapshots all live in Felix streams and caches — no Postgres, no Redis, no Kafka beside it.

That list is the usual build, not a strawman. A realtime canvas is normally four systems — a WebSocket tier with sticky sessions so a room's clients reach the process holding it, Redis pub/sub to fan out when they do not, Postgres for the document of record, and Kafka added later when history turns out to matter. It works; most collaborative software you have used is built that way. But the order of truth is split across all four, and Redis pub/sub carries no offsets, so a client that misses an update has no way to learn that it did — which is why reloading the page is collaborative software's universal repair. Felix Canvas keeps the merge rule those systems already use and changes only what sits underneath: one log per room, doing the live fanout and the history both, where a missed update is a gap in offsets and therefore something the client can notice and fix.

A broker does not argue for itself, so this is the application that puts Felix's properties in front of someone who has no reason to care about brokers. A publish is encoded once and delivered to five hundred viewers — measured on Azure at over a million deliveries a second with the publisher's acknowledgement holding flat at 206 µs and nothing dropped. A throttled client keeps drawing, notices its own gap in the log and rebuilds from its last offset while the other 499 are untouched. And the whole document scrubs backwards, because the log is the document.

The design is finished and the build starts at the edge. Felix is QUIC end to end, so the first milestone is the gateway that brings a browser onto that path: it terminates the browser connection, exchanges an OIDC token for one narrowed to a single room, and relays frames. It stays stateless by design. A room's truth lives in the log and the cache, which is what lets any client — new, lagging or reconnecting — recover through exactly one path.

Status Design started
Backend Felix, and nothing else
First milestone The browser gateway
Puts on show Fanout · isolation · replay
Personal project · what I'm building now

Felix

A QUIC-based distributed event and cache system in Rust: low-latency pub/sub, durable streams, multiplexed caching, and multi-broker clustering.

It exists because some questions don't yield to reading about them. What does backpressure actually cost when one subscriber falls behind and the others aren't supposed to notice? Is a cache genuinely just a log with different semantics on top — and where does that claim break? What happens to an in-flight publish at the moment a leader's lease expires? Felix is where I find out, and the answers arrive as benchmarks and failing tests rather than as opinions.

Streams are sharded across broker owners selected with rendezvous hashing. A publish can enter through any broker and be forwarded to the owner; subscriptions follow bounded owner redirects and resume from their last offset. Durable streams use append-only log shipping, lease-fenced leaders, Leader or Quorum consistency, and caught-up replica promotion so quorum-acknowledged records survive leader failover.

Cluster metadata replicates through a Raft group embedded in the control plane, so surviving the loss of an instance no longer requires an external database; Postgres still works for deployments that prefer it. The cluster suite covers cross-broker routing, broker loss, process suspension, fencing, failover, redirects, reconnect, and single-node/cluster conformance, and the Raft suite adds a killed leader and a wiped volume. It remains in early active development.

The numbers below were measured on an Azure cluster rather than on loopback, with Microsoft Entra checking every token on the publish path. Fanout is what the design is for: a publish is encoded once and shared with every subscriber, so adding 500 of them left the publisher's acknowledgement roughly where it started, around 206 µs. Ingest scales the way the design intends — horizontally. A second broker took the cluster to 2.1× with nothing tuned. Profiling then put a number on the headroom still on the table: one QUIC endpoint task per broker gates the receive path, so a single core sets the pace while the rest of the machine stays free, and encryption — the obvious culprit — turned out to be ~8% of broker CPU against ~22% for that path. More receive endpoints per broker is what that measurement bought. Against Redpanda on the same hardware, both acknowledging from memory, Felix held a p99 of 224 µs while Redpanda's tail reached tens of milliseconds behind its periodic flush; that gap narrows on faster disks, so it says more about a common deployment than about either engine.

181 µs p50 acked publish · real network
1.0M msg/s fanout out of one broker · 500 subscribers, zero loss
3.68M msg/s ingest into the cluster · 256 B, 24 publishers, zero loss
1.63 GB/s aggregate ingest · zero loss

Three 4-vCPU Azure brokers (D4as_v5) in one availability zone, QUIC with TLS 1.3, and real Microsoft Entra ID verifying every token on the hot path — no loopback, no demo auth. The two message rates measure opposite directions and are not comparable to each other: one counts deliveries leaving a single broker, the other publishes arriving across the cluster. Ingest scales with brokers rather than with a broker's vCPU count — the receive path is a single task per broker — so a per-vCPU figure would mislead. Latency figures are medians of five trials. One provisioned session, so read it as a measurement rather than a leaderboard; full method and caveats on the linked page.

Role Author
Built with Rust · QUIC · TLS 1.3
Cluster Sharding · Routing · Failover
Consistency Leader · Quorum
License Apache-2.0 · AGPL-3.0
Status Early active development
Personal project · also built

The Pale Harbor

A 2D psychological horror game set in a fog-shrouded coastal town, where you play the lighthouse keeper investigating your predecessor's disappearance.

Top-down exploration with a sanity system that distorts what you see, read and hear as it drains — hallucinations at low sanity, a day/night cycle that raises the supernatural activity after dark, and procedurally generated ambient audio. Built on HTML5 Canvas and the Web Audio API, which is a different kind of latency problem: everything has to land inside a frame.

ROLE Author
Built with Canvas · Web Audio
Genre Psychological horror
Plays in The browser
Open-source contribution

PowerShell support for Jenkins durable tasks

I designed and implemented PowerShell execution support for the Jenkins Durable Task plugin, which provides the long-running process layer behind Jenkins Pipeline steps.

That work grew out of an earlier role contributing to the OpenStack community by continuously validating new OpenStack releases against Windows-based Nova compute infrastructure, where cross-platform process behavior and PowerShell reliability were daily concerns.

The work covered cross-platform pwsh compatibility, reliable output capture, Unicode, exit-code and error propagation, and support for legacy PowerShell behavior.

Role PowerShell support author
Ecosystem Jenkins Pipeline
Focus Execution · Output · Errors
How I work

Three principles I build by

Lessons carried across distributed systems, doctoral research, and production open source. Open one.

Contact

Say hello.

Eleven years building engineering systems at Microsoft, and a distributed systems habit that does not switch off at five. Full history on LinkedIn, code on GitHub. Issues, pull requests and opinions about backpressure are all welcome.

Résumé available on request.