One account = one coach
Everything belonged to one coach account. Genuine staff collaboration required a new data-ownership model.
Case study · Sport & Technology
A full rebuild of a basketball coaching platform - migrating hundreds of thousands of records, enabling staff collaboration and offline work, and rescuing its tactical diagram editor.
The client had a coaching application that had been live for years: drills and plays, practice plans, rosters, educational content and a tactical diagram editor. It was in real use, but had stopped moving technically.
Everything belonged to one coach account. Genuine staff collaboration required a new data-ownership model.
Roughly 442k drills, 304k diagrams, 30k plays, 18k playbooks and thousands of practice plans per account had to survive the migration.
Numeric columns held text, relations were empty, slugs were missing, and documentation and types did not match production data.
The application required a live connection, could not be installed, and its frozen jQuery/Snap.svg editor no longer handled modern touch devices.
Articles were raw HTML and recordings were split between MP4 files and embeds without a consistent publishing model.
We rebuilt the coach-facing application: a new frontend, API and collaboration model on top of the same migrated production data. This was not a greenfield restart.
We proposed and delivered a workspace model in place of individual ownership. The selected workspace determines where records are created, which library is available, and who may edit or delete. This was a product decision prepared with the client, not merely an implementation task.
We also delivered the server layer: 52 Strapi content types, workspace-scoped endpoints, permissions, invitations, migrations and repair scripts for legacy data.
The old editor's scene format was the contract for roughly 304,000 drawings, so replacing it was not an option. We inherited a frozen 1.3 MB bundle with no build process and no vendor support.
Obsolete feature detection prevented finger input, while pinch-to-zoom left stray lines on the court.
jQuery 1.8.3 and JSZip were loaded without a real consumer.
XML-only scenes appeared neither in plans, nor thumbnails, nor print.
Dialogs escaped the layout, controls covered the court and some actions required a mouse.
We introduced disciplined vendor patching: a recorded baseline, a register for every patch, no deletion of original code, and readable sources mirroring every change. We kept all historical scenes compatible while turning the foreign engine into a safely maintainable part of the product.
All API communication happens server-side. The browser never calls the backend directly, and the session remains in an HttpOnly cookie.
The project ran as AI-assisted work from day one. The decisive part was not code generation itself, but the rigour that made its output safe to accept into production.
17 rule files and 7 documented workflows gave every model and tool the same requirements from the start.
40 self-contained briefs defined scope, file maps, API payloads and the rules most at risk. Results returned as ordinary pull requests.
Every backend fact was confirmed against the running API. Documentation and types remained hypotheses until real data proved them.
Types, tests and two linters decided whether work was complete. Nearly 3,800 tests enabled speed without regressions.
The highest-risk offline features went through 11 documented review rounds. Every defect received a fix and a regression test.
The workspace model, feedback scope, vendor-patching approach and choices about what not to build were prepared with consequences and approved by the client.
The result: 266 pull requests and 576 commits in 12 months while reconstructing an undocumented production data model and maintaining comprehensive test coverage.
75 screens are live in production, with staging updated automatically.
We migrated the library, diagrams, playbooks, recurring sessions and archived content without losing users' work.
Workspaces, invitations, roles and consistent permissions enabled shared work.
Plans, attendance and content editing work without a network, protected against conflicts and duplicate writes.
The PWA installs on iOS and Android and launches with native behaviour.
It is half the weight, works with touch and offline, and preserves roughly 304,000 historical drawings.
Around 3,800 tests and 64 end-to-end scenarios also cover network loss and browser restarts.
Every one of 266 pull requests passed review and the complete set of automated quality gates.