PonyTales is a 3D world for children, aged roughly four to twelve. It runs in a browser — no download, click a link and you're in — and there's a native iOS app as well.
The two clients don't share a renderer. The web build draws with Three.js; the iOS app uses RealityKit and Metal. What they do share is the game itself: the rules live in a Rust core, compiled to WebAssembly for the browser and exposed to Swift through UniFFI on iOS. One implementation of how the game behaves, two renderers drawing it.
That split is the whole point. Rendering is where the platforms genuinely differ and where native wins, so each gets its own. The rules are where divergence is simply a bug waiting to be found, so there is only one copy. The core is written to be deterministic — randomness and time are passed in rather than read — and a set of frozen test vectors is replayed against both builds, so the two cannot quietly drift apart.
The look comes from a curved-world shader that bends the ground away from you and gives that "little planet" horizon. It exists twice, once for Three.js and once as a Metal geometry modifier for RealityKit, derived from the same maths — the renderers are the part you have to write twice.
It is built for children, so the data side matters more than the graphics. Accounts are created by a parent or guardian, never by the child. There are no third-party tracking cookies, no ad networks and no profiling: nothing about a child's play is used for advertising, and the analytics are aggregated with no personal data in them. The only outside services involved are Stripe for billing and Amazon SES for account email, and neither of them sees gameplay.