I've shipped three Buttons to production. The web one lives in your JS bundle. The iOS one is a SwiftUI view. The Android one is a Compose composable. They all say "Primary". None of them look the same.

That is the cross-platform tax. You don't see it on day one. You see it in month six — when the web team adds a loading variant, the iOS team is two sprints behind, and Android wrote a third one in a different design system. Three implementations, three design queues, three rounds of brand-color review.

The thesis: a shared component API — same name, same props, three render targets — is the smallest change that fixes the largest cross-platform problem. OTF is built around that bet.

1. The triple-Button problem

Every cross-platform team has three files that look like these: