Zephan Johnson

Work

Latest work first, then the largest system, then the longest-lived product: a community event at a game studio, identity in a live auction, and a document viewer still in production years later.

Resume (PDF)

Flagships

Three systems, in detail

Battle Creek Games · 2026

Community Events

A shared odometer for a live player base, and a first run designed to measure rather than to win.

In-game event screen from No Limit Drag Racing 2. A Community Mileage Challenge panel shows a shared odometer reading 624,836 miles, the player's own contribution of 7 miles, and three reward tiers: Bronze at 600,000 miles marked complete, Silver at 700,000 marked current, and Gold at 800,000 locked.
The community odometer as players saw it, from a shipped public build of No Limit Drag Racing 2. Bronze cleared inside the three-day window; Silver and Gold did not.

Players join, race, and their mileage accrues to one shared odometer. If the community clears the Bronze, Silver, and Gold thresholds, the rewards unlock for everyone who joined, not just the players who logged the most miles.

I built a new event service with a cron-driven schedule that opens and closes the window, and surfaced event state through APIs the game client consumes via the SDK. In-game race telemetry flows to Kafka and onward to the data lake; the event service subscribes to the race-completed stream and aggregates from it, with Redis holding each player’s own contribution alongside the community total. Those two numbers have different requirements — the community total can lag a few seconds and nobody notices; a player’s contribution gates reward eligibility and has to be right. That is the same split Audience Hub needed, in a much smaller system: different guarantees by the cost of being wrong.

The calibration decision is the one that mattered. A shared goal has an ugly failure mode: set the threshold too high and every participant gets nothing, so on day one the feature reads as broken to the entire player base. The threshold could not be guessed, because it depends on aggregate throughput nobody had measured. So the first run shipped unmarketed, on a low-traffic day, with week-over-week race data setting the initial tiers. The event measured the community’s floor before any goal was promoted as real. The deliverable was a reusable scheduling and aggregation service plus a number nobody had.

  • Go
  • Kafka
  • Redis
  • Live ops
  • Unity / C# client

Unity · 2023–2025

Unity Audience Hub

Resolving identity inside a live auction at over a million queries per second, after mobile advertising lost its identity layer.

After ATT, the IDFA was gone, and brand buyers had no reliable way to value mobile inventory. That shows up as low bids or no bids, and it hit banner hardest. I owned the technical strategy for user identity on the Exchange, under three constraints: the lookup had to fit inside the auction’s latency budget on the hot path, it could not load the origin store in proportion to request volume, and opt-in had to be evaluated on every request for GDPR, CCPA, and ATT. The answer was a multi-layer cache — in-process hot cache, distributed tier, source of truth — so tail latency stayed in budget and the origin never saw anything close to full traffic. The product on that cache was extended identifiers (UID2 and ID5), traffic segments, seat-level filtering, and a clean-room integration so a brand buyer could resolve an audience without a shared mobile identifier.

Two decisions carried the design. I chose Valkey over Aerospike for the distributed tier on throughput and cost per operation at our access pattern. And I refused to let consent and segment data share a cache: a stale segment costs a rounding error of yield, a stale consent decision is a compliance violation, so they got different guarantees by the cost of being wrong, not by which system they lived in. The rollout was gated on the experimentation platform — identity-randomized A/B, measured to statistical significance on net revenue and impressions — not on a dashboard that moved after launch.

My work was the Exchange-side identity service. Banner net revenue rose 30%, and spend from key partners rose as much as 60%.

  • Go
  • Valkey
  • Multi-layer cache
  • GDPR / CCPA / ATT
  • Experimentation

Relativity · 2016–2020

Document Viewer

A green-field viewer rewrite, and the multi-tenant service that gave it something to render.

The front end. A green-field single-page refactor of Relativity’s document viewer, the surface where legal reviewers read every document in a case. It shipped with public front-end APIs so customers could build their own integrations against it instead of asking us for hooks. I built the MVP of the rewritten reviewer interface in under a week for the opening keynote at Relativity Fest 2019.

The back end. The viewer needed something to render, and that was Relativity’s first multi-tenant cloud service — I was one of its core contributors. It consumed from a message broker, converted native files into HTML5 for browser review, and published the result back to the waiting user. Native files meant everything a legal hold produces: emails, PDFs, Word documents, text messages. Median end-to-end was under a second, with a long tail on documents running hundreds of pages.

The interesting part is the queue. One service handled bulk conversion of entire directories and on-the-fly requests from reviewers actively waiting — batch work and interactive work against a sub-second target. A priority queue kept the bulk jobs from starving the person sitting there, and the service autoscaled on queue depth rather than CPU, so autoscaling served latency, not only cost.

  • C#
  • Single-page app
  • Multi-tenant
  • Message broker
  • Priority queue
  • Autoscaling

Selected work

Projects from the last decade

Battle Creek Games · 2026

Studio platform

Platform engineering for an 18-person studio across a three-title Unity and C# portfolio. I moved the games onto a server-authoritative architecture and replaced Unity Analytics with an in-house telemetry service in Go, streaming events through Kafka to the data warehouse so the studio owned its own pipeline instead of renting it. I also shipped the store-compliant React Native client on iOS and Android. Infrastructure spend came down $360k a year, and AI tooling spend was cut in half.

  • Go microservices
  • Kafka
  • React Native
  • iOS / Android

Unity · 2020–2025

Ads Exchange

Real-time programmatic auctions at 1M+ QPS on Kubernetes in GCP. I ran the cost work as a portfolio sequenced by blast radius, cheapest and safest first. CPU and memory profiling came before buying capacity. A rewrite of the capture service’s logic took that one service from about $4k a day to under $1k against rising bid traffic. Aerospike moved to Valkey. Ten-plus critical services moved onto a cheaper VM type with no downtime. A gRPC cutover unlocked zone-affinity load balancing. Infrastructure went from$91k/day to $60k/day, a 34% cut, while request volume grew 25%. Dynamic floors and consolidated bid requests raised average bid price more than 8% quarter over quarter.

A second path also ran live on the same params while the legacy path still served. Field-level match hit 99.5%; then impressions, revenue, eCPM, and auction wins were compared per DSP. That write-up is Same Request, Two Paths.

  • Go
  • GCP
  • Kubernetes
  • Kafka

Unity · 2025

Google Bidding

I led the rollout from launch to general availability in Q3 2025. It was a cutover, not a feature: sequential waterfall code came out, and real-time bidding became the default for that partner.

  • Header bidding
  • OpenRTB
  • Migrations

Unity · 2020–2023

Ad Supply Sync

I designed and planned the refactor of the ad supply syncing service, the path that keeps placement inventory in step with demand partners. That work generated over $16M a year in incremental Google AdMob spend. I also integrated an experimentation platform into the Exchange so revenue-critical auction changes shipped behind identity-randomized A/B tests instead of behind conviction.

  • Distributed systems
  • Kafka
  • Experimentation

Relativity · 2016–2020

Document Exporter

Legal teams export whole case sets. The legacy exporter pulled documents one at a time; I parallelized the downloads, and exports of millions of documents ran 75% faster.

  • C#
  • Concurrency

Experience

Where the work happened

  1. 2026

    Principal Software Engineer

    Battle Creek Games · Head of Platform

  2. 2023–2025

    Software Engineering Manager, Unity Exchange

    Unity

  3. 2020–2023

    Senior Software Engineer, Ads

    Unity

  4. 2016–2020

    Software Engineer I to II

    Relativity

  5. 2016

    B.S. Computer Science

    Illinois Institute of Technology