← Field notesMobile

How Flutter started — and how one codebase runs on every device

From a Google experiment called "Sky" to a single codebase for iOS, Android, web and desktop — and the rendering trick that makes it work.

Orbyte · June 16, 2026 · 8 min read

How Flutter started — and how one codebase runs on every device

Flutter began as an experiment inside Google. Around 2015 a prototype called "Sky" was shown running Dart on Android at high frame rates. The team's bet was unusual: instead of wrapping each platform's native UI components, Flutter would draw every pixel itself. That decision is the reason one codebase can look and behave the same everywhere.

Flutter 1.0 shipped in December 2018 for iOS and Android. Since then it has grown to target web and desktop (Windows, macOS, Linux) from the same project, and it powers apps used by millions, including parts of Google's own products.

Why one codebase actually works

Most cross-platform tools ask the OS to build the buttons and lists, then try to paper over the differences. Flutter takes a different route: it ships its own rendering engine (historically Skia, now increasingly Impeller) and paints the entire interface onto a canvas. The OS just provides a window, input events and services. Because Flutter controls the whole surface, a widget renders identically on an iPhone and a Pixel — no drift, no "works on one platform only" surprises.

A phone and a tablet resting side by side.
Phone, tablet, desktop, web — one Dart codebase renders the same UI on all of them.

Everything is a widget

Flutter's UI is built by composing small widgets into bigger ones. Written in Dart — which compiles ahead-of-time to native ARM/x64 for release — the same source produces real native binaries per platform. During development, Dart's just-in-time mode powers hot reload: change the code and see it on the device in under a second.

// The same widget tree runs on iOS, Android, web and desktop.
Widget build(BuildContext context) => Scaffold(
      appBar: AppBar(title: const Text('Orbyte')),
      body: Center(
        child: FilledButton(
          onPressed: _launch,
          child: const Text('Reach orbit'),
        ),
      ),
    );

Sources & further reading

Stay in orbit

New field notes, straight to your inbox.

Occasional engineering notes on what we build and how. No spam — unsubscribe anytime.

We store only your email — see our privacy policy.