Case study · Six surfaces

One contract, six surfaces, and a product that had to feel like a person made it.

A private media system built for two people. It runs on Apple TV, iPhone, iPad, Mac, an Apple TV Top Shelf extension and the web, and every one of those surfaces reads the same private contract. An Apple TV build reached TestFlight and entered Apple’s review process.

The brief

Not a media database. A record of two people.

The starting point was not a feature list. It was lived context: what two people had watched together, what they had watched apart, and which of those things carried something worth keeping. A generic catalogue answers none of that, because the interesting information is not the film. It is whose memory it is.

So the product model came first and the software came second. Shared memories, and distinct lenses for each person and for both together, kept separate from who is signed in. A seasonal calendar. Dates that matter. A companion character with a written voice, sarcastic and fond, rather than a general assistant wearing a name.

The artwork was chosen by hand and approved as final. No automated process was permitted to regenerate or replace an accepted master. That rule exists because a system that can improve your artwork can also quietly lose it, and the pieces in this product are not interchangeable.

What was built

Six surfaces, and none of them a port of another.

Apple TV, and the room it sits in

A native tvOS experience designed for a television rather than scaled up from a phone: Siri Remote focus movement, deterministic focus recovery, and destinations that keep the main hall visible behind them so the viewer never loses their place.

iPhone, iPad and Mac

Native SwiftUI on each, sharing one core architecture and build identity. Adaptive layouts including iPad multitasking, on-device dictation, keyboard navigation on the Mac, and accessibility behaviour for larger text, VoiceOver, Reduce Motion and increased contrast.

A Top Shelf extension

The strip of artwork Apple TV shows above the app. It picks seasonal and special-event art on a schedule, falls closed to a safe default when shared state is unavailable, and can only open destinations the app already owns.

The web application

A responsive experience carrying the same catalogue, recommendations, signals and invitation flow, with honest unavailable states rather than empty ones, and audio that never starts by itself.

One private JSON contract underneath all six. That is the part that makes this a system rather than six apps with a family resemblance. A change to scheduling, identity, audio, catalogue shape or artwork lands in one place and reaches every surface, and the schedule tests are time-zone and daylight-saving aware so a date window fails closed instead of revealing something on the wrong day.

The pace, stated precisely

202 commits and 990 files inside 22 hours of history.

The delivery history holds 202 commits and 990 tracked files at the Build 11 release candidate, commit 18bfcb9, and the first and last of those commits are 21 hours and 50 minutes apart. Those figures are pinned to that commit rather than to a date, because the repository is still moving and a count taken on a Tuesday is wrong by Wednesday.

That figure is the repository, and it is not the whole job. Concept, product model, artwork selection and the seasonal rules were settled before the first commit existed, and none of that appears in a git log. The total elapsed effort was longer and I have not measured it, so it is not stated here as though I had.

Verified from the repository

  1. 202 commits, 990 tracked files, on the release-candidate branch at commit 18bfcb9.
  2. 21 hours 50 minutes between the first and last commit in that history.
  3. Marketing version 1.0, build 11, and the project carries exactly one of each value, so the Apple targets are genuinely synchronised rather than nominally so.
  4. Separate schemes for TV, mobile and Mac, a shared Swift package underneath them, and an extension target for Top Shelf.

Who did what

I directed it. AI lanes did the building.

I was the product, creative, governance and acceptance authority. The concept, the relationship context, the artwork decisions, the seasonal calendar, the companion’s voice, the privacy boundaries and every correction came from me. An AI build lane did the implementation and integration under that direction, and a second lane did bounded review, audits and focused repairs.

The thing worth reporting is not that agents wrote code. It is what the arrangement had to look like before it produced something shippable. One lane owned the authoritative branch and the right to accept, reject or supersede anything before it entered the product. Everything else ran as bounded work with explicit files and acceptance criteria.

The finding, and it cost something to learn: the fastest arrangement is not the one with the most agents writing at once. It is one authoritative integration lane, strong human direction, and parallel agents given work narrow enough to verify independently. Open-ended competing builds create merge, context and worktree overhead that erases the parallelism that motivated them.

The same arrangement, on a smaller build

Where it stops

Release state, exactly as the record has it.

An Apple TV build reached TestFlight and was shown as waiting for review. That is Apple’s beta distribution system, and it is the furthest this product has travelled toward anyone outside it.

The current release candidate is synchronised across all five Apple targets in source, and is deliberately unsigned and not uploaded. Signing, upload, App Store platform records, processing, tester assignment and physical-device acceptance are separate authorised gates, and none of them is claimed here. Feature completeness runs ahead of release readiness for exactly that reason.

The backend follows the same rule. Local source completion is kept apart from production deployment authority, and only migrations with separate authorisation and a readback plan are activated.

What is not claimed

The limits of the figures above.

The commit, file and version figures are exact and were read from the repository on 3 September 2026. The 22 hours is the span of that history and nothing more: it is not a claim about total effort, which included work that predates the repository and which I have not measured.

The completion percentages in the internal record are conservative working estimates, not release certificates, so they do not appear here as figures. Test counts are not quoted either, because the suites are rerun as active repair lanes are integrated and a number taken mid-flight would be a different measurement wearing the same name.

The other person in this product is not named, and neither the artwork, the specific dates, nor the contents of the catalogue appear here. The product is private and stays that way; what is described is the method.

Mapped to the method

The same four steps, applied to six surfaces.

  1. Source of truth. One private JSON contract that every surface reads, rather than each client holding its own idea of the catalogue.
  2. Structured operating data. Stable catalogue identifiers, seasonal windows as scheduled data, and viewing lenses kept distinct from authenticated identity.
  3. Workflows and controls. Approved artwork protected from automated replacement, date windows that fail closed, audio that never starts by itself, and signing and deployment held as separate gates.
  4. Tested and handed off. Contract tests for identity, signing, navigation, seasonal art, accessibility, catalogue provenance and extension behaviour, and a build that reached Apple’s review process.

Read next

Where this method came from.

SCOPE is the same direct-and-review arrangement on a single build, with the notarisation record attached.

Family Care Hub is the other private application on this site, built for my own family, and published as a synthetic case study for the same reason this one names nobody.

Contact

Bring the product that has to work on every screen at once.

jwatson@thinksynergy.biz