This episode opens the history of Flutter: the birth of the project at Google, the Skia and Impeller rendering architecture, the advantages of a single codebase for mobile, web, and desktop, and a comparison with native development, React Native, and Xamarin along with realistic use cases.

Your environment is ready from episode 0. Now it's time to understand why Flutter exists and why you should choose it. Before writing widgets, you need to know the long history that shaped how Flutter works today — because its rendering architecture is a direct answer to the problems faced in cross-platform mobile development.
Episode 1 dissects Flutter's journey from an internal Google experiment to a framework used by millions of developers: the Skia and Impeller rendering architecture, the advantages of a single codebase, a direct comparison with native, React Native, and Xamarin, and the use cases where Flutter truly excels.
The material is divided into four parts. First we look at the history and rendering architecture that form Flutter's foundation, then the single-codebase advantage and the hot reload workflow. After that we honestly compare Flutter with alternative approaches, and finally we map the most sensible use cases for each category of application. With this map, choosing a framework for your next project becomes far more focused.
Flutter began as an internal Google project called Sky, developed in 2015 to test whether it was possible to build a UI that stays consistent at 60 frames per second. Its approach was radical: rather than translating widgets to native controls, Flutter draws the entire interface itself directly onto the canvas.
This architecture is what makes Flutter unique. Flutter uses Skia as its rendering engine, and since version 3.7 it has begun transitioning to Impeller — a GPU-based rendering engine that eliminates stuttering during cold start. Because Flutter draws everything itself, the app looks identical on Android, iOS, web, and desktop, regardless of platform conventions.
The implications of this approach are important to understand. When you write a widget in Flutter, it is not translated into a native button or text field from the operating system; instead, it is drawn pixel by pixel on the screen. The result is a visual consistency that other frameworks struggle to match, and this is why Flutter apps feel equally smooth on devices with very different specs.
Flutter uses Dart — a language with JIT (just-in-time) compilation for hot reload during development, and AOT (ahead-of-time) compilation for release performance. This combination delivers two advantages at once: a fast development cycle and a fast runtime.
flutter --versionThe output shows the Flutter and Dart versions active on your machine. The command flutter --version is also useful for making sure you're on the stable channel.
If your version is already behind the latest official release, update it before continuing the series. The code examples in all episodes assume you're running the latest Flutter version, so the behavior you see will match what's explained here.
Flutter's main advantage: write one codebase, run it on iOS, Android, web, Windows, macOS, and Linux. The self-drawn UI means UI code doesn't need to be adapted per platform. This cuts development costs and keeps the product consistent.
From a team perspective, a single codebase means one language, one tool set, one test pipeline, and one release path. For startups and small teams, this advantage is often the deciding factor.
With JIT, Flutter provides hot reload: code changes appear on screen within seconds without losing application state. This accelerates UI iteration dramatically compared with native development, which must recompile. The workflow becomes: change code, save the file, see the result — a cycle that makes design experimentation feel effortless.
flutter runflutter run builds and launches the app on the active device or emulator, then waits for hot reload commands by pressing the letter r in the terminal. Once the app is running, notice the iteration speed: each press of r only swaps the widgets that changed, without rebuilding the entire project.
Hot restart, with the letter R, still keeps hot reload for changes that involve more state. This workflow makes design experimentation much cheaper, and is a strong reason Flutter is loved for rapid prototyping.
Native development (Kotlin on Android, Swift on iOS) gives full access to platform APIs and the best performance. However, it costs two full codebases. Flutter offers significant savings with a small trade-off on very specific API access — which can usually be solved with plugins or platform channels (episode 12).
React Native translates JavaScript components into native widgets, so the look follows the operating system style. Flutter draws its own UI, so cross-platform consistency is better preserved. React Native leverages the huge JavaScript ecosystem, while Flutter offers an integrated toolchain and centralized documentation.
Xamarin (now .NET MAUI) uses C# and native bindings to compose UI. Flutter bundles its own Dart runtime and rendering engine, producing larger bundles but more consistent behavior on every platform. Xamarin suits teams already in the .NET ecosystem; Flutter is more neutral regarding your language background.
The most mature category: consumer apps with complex UI, smooth animations, and the need for simultaneous releases to two app stores. Retail stores, financial apps, and super apps fall into this category. High performance and consistent rendering make Flutter a strong choice for apps that prioritize a uniform visual experience across all devices.
With CanvasKit, Flutter web delivers an experience close to a desktop application. For internal apps and dashboard tooling, Flutter web is very efficient because it uses the same codebase as the mobile app.
Flutter desktop (Windows, macOS, Linux) uses the same renderer as mobile. Productivity and internal tooling are the primary use cases, especially since distribution is as simple as a standalone bundle.
Flutter also runs on embedded devices thanks to runtime support without a built-in UI — the same foundation as Flutter's initiatives for fuchsia and smart devices.
flutter config --enable-linux-desktop
flutter config --enable-macos-desktop
flutter config --enable-windows-desktopflutter config --enable-linux-desktop enables the desktop target so the same project can run on Linux in addition to mobile and web.
After enabling the platform, flutter run -d linux runs the app as a native desktop application. Try combining it with hot reload: UI changes appear immediately without rebuilding the app — the same experience as mobile development.
Key takeaways:
In the next episode 2 we'll dive into core concepts and Flutter architecture — how Widgets, the rendering engine, and the Dart runtime work together, the reactive UI model and widget lifecycle, the relationship between the widget tree, element tree, and render tree, and the JIT and AOT compile model with hot reload. This foundation determines how you think when writing Flutter.