Case Studies/Mobile Engineering
Sports Technology

A stalled rebuild, rescued and shipped.

Three coaching apps were stranded on a React Native architecture Meta had frozen, and the rescue was off track. We re-platformed the suite and shipped it across iOS and Android, together.

 
4
apps shipped to production
the full coaching suite
 
2
platforms, one launch
iOS and Android, together
 
100%
of stalled work recovered
every workstream back on track
 
145
AI sessions on legacy code
mapped before any rewrite
The context

The client builds the performance tools that coaches and athletes live in: video review, scouting, recruiting, and the play-diagramming apps in its mobile coaching suite.

Those apps had grown up as separate native iOS apps. By the time This Dot joined, the client was rebuilding them on React Native to share code across platforms. The two simpler apps were finding their footing. The hardest one was not.

What was breaking

The rebuild was landing on React Native's Legacy Architecture, the version Meta froze on June 2, 2025. No more security patches. No compatibility fixes. No performance work. From release 0.81 onward it was dropped from React Native's own testing. The client was pouring new code onto a foundation that had already stopped moving.

The play-diagramming app was the crux. A coach uses it to draw plays, routes, marks, animated movement, and every stroke has to render instantly on a phone. The existing approach could not keep that promise. This is the kind of failure that never shows up in a unit test; it shows up when a coach drags a play across the screen and it stutters.

Reading the old code was its own tax. Migrating feature by feature meant first understanding what each piece of the legacy iOS codebase actually did, behavior that had accreted over years and lived nowhere but the source.

By September the trajectory was honest and unflattering: the scouting app on track, the recruiting app at risk, the play-diagramming app off track. The team did not have confidence the migration would finish on the original runway.

0

apps shipped to production, rebuilt across iOS and Android.

How we moved

The team rebuilt the play-diagramming app's rendering around a vector-graphics pipeline and pulled it out into a standalone package: a cross-platform SVG engine any surface in the suite could draw on, native or web. Extracting it as a package turned a single app's fix into shared infrastructure.

One decision paid off twice. A "light," read-only renderer layer was meant to improve performance, but it also opened a new product surface: play previews and collaboration features the client had not scoped going in.

This Dot engineers also paired directly with the client's engineers, showing them how the AI-assisted work actually happened, so the capability stayed in-house when the engagement ended.

Alongside the build, the team set up the app's Storyboard as an automated regression surface for the renderer, and charted the migration path off the frozen Legacy Architecture to React Native's New Architecture: Fabric rendering, better Worklet handling, security and performance back on the table.

0

AI sessions spent decoding undocumented legacy code, before a single line was rewritten.

AI in the loop

Most of the hard part was not writing new code; it was understanding code no one on the team fully understood anymore. Across roughly 145 archived Claude Code sessions in January and February 2026, the team aimed AI at the legacy iPad and JavaScript versions of the play-diagramming app and had it work out how they actually behaved: how marks get added, how anchors show and hide, how play state is tracked. Some sub-agents ran 25 to 50 tool calls of codebase archaeology before a line of new code was written. One investigation traced a blank-screen bug to a transformation layer that had never been documented or well understood by the team.

That work produced a structured migration map: file paths, API names, data flows, failure modes. The map turned 'reimplement this somehow' into a planned migration with known boundaries, the difference between guessing at legacy behavior and reproducing it on purpose.

AI also doubled as a reference manual for the dense Cartesian math the old apps leaned on. Drawing plays as crisp vectors meant fitting arrays of x,y coordinates to Bezier curves; rather than re-read an aging C library line by line, the team used AI to understand the original math and engineer a faster best-fit algorithm in JavaScript that ran on both web and native. That dropped a dependency on the old C library and moved the play, mark, and animation logic into one shared library both platforms could draw from.

The monorepo's tooling was strict by design: Vite for web, Metro for native, Yarn workspaces holding it together, and a small infraction could stall a branch for a day. Close to 40% of the sessions went to CI, lint, and TypeScript repair, handled with a tight loop, feed AI the exact failing output, ask for a focused fix, run the verification command. The team captured the repeated fixes as a reusable Skill, so 'make CI pass' became something the tooling could mostly resolve on its own and engineers kept their attention on features.

The reversal
Complete
Scouting app
from On track
Complete
Recruiting app
from At risk
On track
Play-diagramming app
from Off track
On track
Renderer package
from Not started
Workstream status, Sept 2025 to Mar 2026.
0%

of stalled workstreams recovered and back on track.

What changed

The scouting and recruiting apps released on schedule. The play-diagramming app and its renderer moved from off track to on track inside the extension period, the reversal the AI-assisted workflow was brought in to make.

Then the team shipped something no one had planned: iOS and Android launched simultaneously, a milestone that surfaced mid-engagement and was delivered anyway.

The render performance landed where it mattered most. Internally the team called it "not regular work," a step change rather than an increment, straight from rebuilding the app on the vector pipeline.

Four apps reached production. The renderer was handed off as a documented package, with the codebase domain knowledge transferred to the client's own engineers, so the platform keeps moving without us.

Why it matters

The renderer was never just a performance fix. Treated as product surface, it handed the client new collaboration features for free. And the AI-assisted workflow wasn't a demo; it was paired into the client's own team so the capability stayed after the engagement ended.

Working through something similar? Let's talk.

Start a conversation