Selected work Work
A short list, not a complete one. Most of this is on myColorado, the State of Colorado's
official app.
-
Mobile driver's license & verifiable credentials
2024–present Phase 1 shipped: issuance and presentation of an ISO/IEC 18013-5 mobile driver's license, alongside a generic verifiable-credential issuance flow. Integrated with PingOne IAM (OAuth 2.0 / PKCE), ID Dataweb identity proofing, FaceTec biometric liveness, and the SpruceKit credentials runtime. Also contributed to the law-enforcement Portal app that accepts these credentials at traffic stops. Phase 2 rollout is in production.
-
Crash-free user rate from 98% to 99.99%
2022–2024 A release-gating policy and a structured triage protocol on top of Firebase Crashlytics. Each sprint review walks the dashboards, every regression has a named owner, and phased rollouts hold until the rate clears the gate. The same surface is now where the team and customer support meet to investigate login and session issues.
-
Kotlin Multiplatform shared core
2025–present Phase 1 scaffold for shared business logic across iOS and Android. XCFramework distributed via Azure Blob Storage with a SAS URL (consumed by Swift Package Manager); Maven AAR distributed via an Azure Artifacts feed. CI is two-stage Azure Pipelines: Linux for lint, JVM tests, and AAR; macOS for XCFramework. Local dev uses sibling-folder overrides — Xcode drag-in for SPM, Gradle composite build for Android.
-
iOS network-surface catalog
2025 A team-internal source of truth for the iOS app's network surface: ~95 endpoints with request shapes, Codable response models, and a reverse index from call site to endpoint. Surfaced four cleanup candidates in the process — duplicate authorize calls, a refresh-token path outside the shared helper, dual insurance-upload routes, and dead legacy functions.
-
UIKit → SwiftUI and XML → Jetpack Compose, in production
2022–present Two framework migrations on a citizen-facing app, sequenced so they don't block feature delivery. New UI lands in the new framework by default; old screens get rewritten when an adjacent change makes it cheap. Migration work is the first thing to slip when a sprint runs hot, which keeps the rule honest.