Most "cross-platform" war stories are really UI stories: one framework draws the same button on two phones and everyone calls it a day. The one I want to tell is not that. At Geonode I built the Repocket C# SDK, a single networking core that had to run on Windows, Android and iOS and carry all the logic for internet sharing on every one of them. One codebase, three very different runtimes, and a piece of software that lives in the background of someone else's device and must never misbehave.

There is no screen to hide behind here. Repocket is an internet-sharing product, so the SDK is not a view, it is a long-lived networking client that sits quietly on a user's machine and routes traffic. If the shared core is wrong, it is wrong on Windows, Android and iOS at once, and it is wrong in the background where nobody is watching. That raises the bar for every decision, and it is why the lessons stuck. Here is what shipping one C# SDK to three platforms actually taught me.

Why C# for a job like this

The instinct for cross-platform native code is usually C or Rust with thin bindings. We went with C#, and for this product it was the right call. A single managed core meant the networking logic, the part that had to be identical everywhere, lived in one place with one set of tests. On Windows it ran natively. On Android and iOS it ran through the .NET mobile runtime, so the same compiled logic drove all three platforms instead of three hand-ported copies drifting apart over time.