iOS architect · performance & release engineering

I help iOS teams ship releases that don’t crash, stall, or get stuck in review.

I’m Devin. Thirteen years inside large iOS platforms — live streaming, short video, and a 2M-line SDK consolidation. I measure the problem before I touch it, and write down the method so your own engineers can reproduce every number.

Fixed fees in USD: single-flow audit $500 · full-app audit $750 · architecture review $1,800. Retainers from $50/hr (15 hrs/week minimum). 50% at kickoff, 50% on delivery.

13 yrs shipping iOS
300M+ DAU live platform
2M+ lines in one SDK
30+ iOS engineers in the org

Selected work

Three programs, one method: measure first, then change one thing.

These three programs come from full-time iOS platform roles held between 2020 and 2026. They are employment track record, not paid consulting engagements. Each is written as problem → what I did → measured result, with the metric definition kept in the text.

Anonymized: client and product names, internal codenames, exact business metrics, absolute OOM baselines and sample sizes, and exact project dates. Not anonymized: the problem, the measurement definition, the tooling category, the role, and the relative change. No client testimonial is published here.

OOM and memory on a top short-video platform

iOS · short-video and live app · consumer scale

Context: iOS architect, 30+ iOS engineers platform-wide, employed role 2021–present. Measurement: in-house per-screen footprint sampler; the last run’s scene stack, footprint, and thread count persisted and reported on the next launch; OOM exits per session on low-tier devices.

Problem

Out-of-memory exits were rising faster than crash reports suggested. The team could see that a session had died, but not which screen was open, how much memory it held, or which asset pushed it over the limit. Image caches, player buffers, and editor retain cycles all competed for the same budget.

What I did

  1. Made memory attributable: sampled footprint per screen, persisted the last run’s scene stack, footprint, and thread count, and reported it on the next launch, so every OOM had a scene and a number attached.
  2. Replaced guesses with budgets: per-device image resolution tiers, thumbnail decoding before full decode, a hard image-cache cap tied to physical memory, and a bounded player buffer released on pause and exit.
  3. Worked the leak list: editor controllers held after dismissal, gift assets never released, rounded-corner image leaks. Each fix shipped behind a switch and was verified against a fixed replay.

Result

−3.18% relative OOM rate on low-tier devices
87.9 MB decoded images removed from one startup path
18 → 1.7 MB gift image memory

What this does and does not say: −3.18% is a relative change in OOM exits per session on low-tier devices, not a 3.18-point drop. The absolute baseline, sample size, and exact measurement window are withheld under client confidentiality.

Takeaway: OOM is usually a budget problem, not a single bug — make it attributable first, then set limits.

First screen for a live-streaming platform

iOS · live streaming · viewer path

Context: iOS architect, platform iOS team, full-time platform roles 2020–2026. Measurement: segmented first-screen instrumentation (app preparation, player pre-render, stream pull, surface wait); the same definition in lab and production; click-to-first-frame from a fixed replay on a mid-tier device.

Problem

Entering a live room felt slow even when the dashboard said it was fine. First screen was measured as one number, so app preparation, player pre-render, and the stream pull were mixed together. No one could tell which segment to cut, and business setup competed with playback for the same main thread.

What I did

  1. Split the path into segments — app preparation, player pre-render, stream pull, and surface wait — and instrumented each one, so lab runs and production used the same definition.
  2. Decoupled stream pull and rendering from business UI: started the player before the transition, reused player instances between rooms, lazy-loaded comments, gifts, and rank panels, and staged playback separately from business content.
  3. Kept the critical path short on low-tier devices by deferring non-critical SDKs and preloading until after first frame, with extras gated by device class.

Result

−166 ms total first-screen time (−18%)
−162 ms pre-render time (−73%)
732 → 126 ms click-to-first-frame in the lab (−82%)

Metric definition: first screen runs from room entry to the first rendered frame. The lab figure is from a fixed replay on a mid-tier device; production figures use the same segment definitions. Absolute production baselines are withheld.

Takeaway: users feel the critical path, not the average — break the first screen into segments, then move work off it.

720p at 30fps on a live-streaming platform

iOS · live streaming · playback and overlays

Context: iOS architect, platform iOS team, employed role 2021–present. Measurement: release build, fixed 720p30 room replay, one variable toggled per run, ten runs per case, percentiles instead of averages; GPU cost measured against a 12% baseline.

Problem

Moving live rooms to 720p at 30fps raised GPU and CPU pressure. Overlays — comments, gifts, floating hearts, gift slots, comment aggregation — shipped feature by feature, and nobody knew which one was eating the frame budget. On low-tier devices the result was dropped frames at the exact moment a room got busy.

What I did

  1. Built a repeatable 720p30 harness: release build, fixed room replay, clean background, one variable toggled at a time, ten runs per case, and percentiles instead of averages.
  2. Measured each overlay’s GPU cost against a 12% baseline, with and without gift rendering, to isolate cost rather than estimate it.
  3. Turned the measurements into a per-feature budget and a degradation ladder: cap animation frequency, lower asset resolution, and disable the heaviest effects on low-tier devices, with an independent switch per feature.

Result

+21 points GPU cost with all overlays on, against a 12% baseline
+10 / +8 / +7 points for gift slots, comments, floating hearts
+15 points for the four overlays measured together

What this does and does not say: this is a cost measurement, not a claim that GPU use fell. The deliverable was a per-overlay budget and a device-tier degradation ladder. Per-device frame-rate outcomes are withheld under client confidentiality, so I do not claim that 30fps was held on every low-tier device.

Takeaway: at 30fps, overlays are part of the performance budget, not decoration.

Engagements

Fixed scope, fixed fee, written output.

Every engagement is remote, priced in USD, and starts with a short call to confirm scope. Fixed-scope prices are one-off fees. The ongoing contract is billed weekly and has a 15-hour weekly minimum.

Single-flow audit

$500

3 business days

For one flow that feels slow or unstable.

  • Measured baseline for that flow
  • Top jank and memory hotspots
  • Prioritized fixes with traces
  • Report, 60-minute walkthrough, one revision
Request this scope →

Architecture review

$1,800

10 business days

For growing codebases and module boundaries that no longer hold.

  • Layering and dependency-direction review
  • Modularization and SPM split proposal
  • Dependency injection and test strategy
  • Phased migration roadmap and risk register
  • Report, 60-minute walkthrough, one revision
Request this scope →

Ongoing contract

$50/hr

Min 15 hrs/week · from $750/week

For teams that need hands-on delivery after the audit.

  • Production-ready code and pull requests
  • Investigation and fixes for performance issues
  • App Store submission and review support
  • Weekly written summary and next steps
Discuss a retainer →

Terms for fixed-scope work: one revision and one 60-minute walkthrough are included. 50% at kickoff, 50% on delivery. Quotes are valid for 30 days. A mutual NDA is available on request. What you provide: read-only repository access or a buildable archive, plus the flow and device class where the problem appears.

Deliverables

What lands in your inbox.

The report is written for the engineer who has to reproduce the result, not for a slide deck. Every claim carries its measurement definition.

Report length
Typically 15–22 pages for a full-app audit, 8–12 for a single flow, and 18–26 for an architecture review. Delivered as PDF and Markdown. The scope letter fixes the exact contents before kickoff.
Walkthrough
60 minutes, recorded, walking through each finding and the numbers behind it. Your team can ask for the trace live.
Revisions
One revision per fixed-scope engagement: corrections to the report and a re-check of the same scope. It does not add a new app or a new flow.
Evidence
The traces and measurement definitions behind every finding, so another engineer can reproduce the number instead of trusting the summary.
Backlog
Prioritized by impact and effort, with the owner and the check that proves the fix. On a retainer this becomes a 2-page weekly written summary plus the pull-request trail.

Process

Four steps, each with a written output.

Fixed-scope engagements do not run on an open-ended hourly meter. If the problem is outside what I can measure or fix, I say so and charge nothing.

  1. Step 1

    Send the app and the symptom

    Email the app, the flow that feels slow or unstable, the device class, and your timeline. A screen recording or a trace is enough to start.

  2. Step 2

    Scoping call and fixed quote

    Within one business day you get a 30-minute call slot and a fixed quote. We agree on the scope before any access is shared.

  3. Step 3

    Access, NDA, baseline

    Read-only repository access or a buildable archive, a mutual NDA if you need one, and the agreed baseline. I measure before I change anything.

  4. Step 4

    Report and walkthrough

    You get the written report, the prioritized backlog, and the traces, then a 60-minute walkthrough. One revision is included.

Boundaries

Three things I don’t do.

Clear edges save both sides a bad engagement. If you need one of these, I am probably not the right fit.

Not offered

On-site residency or staff augmentation

I work remote and fixed-scope, or on a bounded weekly retainer. I am not a body-shop substitute for a full-time hire, and I do not move into your office.

Not offered

Audits without source or a buildable archive

I need read-only repository access or a buildable archive. I do not guess from screenshots, a marketing demo, or a TestFlight build alone.

Not offered

Approval or performance guarantees

I stand behind the method, the written deliverables, and the revision. The report separates what changed, what did not, and what remains uncertain. No promise that a review passes or that a metric hits a number.

Contact

Tell me what’s blocked.

Send the app, the flow, the device class, and your timeline. I reply within one business day with a scope and a fixed quote. If it is not a fit, I will say so.

Currently accepting new audits and reviews

superapp.devin@gmail.com

What to send

  • The app name and the flow that feels slow, unstable, or blocked
  • The device class where it shows up, and how often
  • A trace, a screen recording, or the last crash report if you have one
  • Your timeline and the decision you need to make

Request a scoping call

Prefer email? Write to superapp.devin@gmail.com. The form goes to the same inbox.

Thanks — your request is in. I reply within one business day.

No newsletter and no follow-up sequence. Your details are used only to scope this request.