The Art of Retro UI: Building NES UI in Flutter

Technical Delivery Lead Erick Zanardo on NES UI, pixel-art widgets in Flutter, and the open source habit that fuels his games.

3 min read

NES UI is a retro 8-bit design system for Flutter, built by Erick Zanardo for his own games and open sourced for the wider Flutter community. In this episode of Very Good Engineering, host Jorge Coca talks with Erick about pixel-art widgets, the side project he built to embed icons in Dart code, and why a design system is really the same problem as organizing your code.

About Erick Zanardo

Erick is a Technical Delivery Lead at Very Good Ventures and a Google Developer Expert in Flutter and Dart. He’s one of the engineers behind Flame, the open source game engine with more than 10,000 GitHub stars, and contributed to Google’s I/O Pinball alongside other VGV activation demos. Outside of Flame, he ships his own games under Cherry Bit Studios.

A Design System Is a Rule Set

Erick’s definition is refreshingly direct. “It is when you duplicate rules and organize how a design should work. It’s not much different from how developers organize their code.” Color tokens with meaning, predictable spacing, components that look the same wherever they appear. The point of all those rules is the user. Familiar screens feel comfortable, and mismatched ones drive people away.

The Origin of NES UI

Erick came to Flutter through game development, and he wanted his games to look vintage. He also didn’t want to keep rewriting buttons and cards every time he started a new project. So he built NES UI for himself, studying screenshots from games like Final Fantasy 6 and CSS libraries that brought 8-bit styling to the web. Then he open sourced it.

“I felt because I was already in the Flame community and I was seeing this community growing, that making this open source could help other devs. And happily, I was right.”

Material as a Foundation

NES UI is built on top of Material. People hear “Material” and picture the default Android look, but Flutter’s Material is flexible enough to reskin into almost anything. Erick reuses Material’s structure for buttons, cards, and containers, then customizes the rendering so each widget reads as pixel art. The result is an 8-bit aesthetic that still feels familiar to any Flutter developer who has read the Material docs.

Mini Sprite: Icons as Strings

A big part of NES UI is its icon set, each one hand-drawn pixel art. The catch: Dart packages can’t ship binary assets. So Erick built a small image format called Mini Sprite that encodes pixel art as a compressed string. Icons live directly in the package code, and Erick built an editor so he can draw a new icon, copy the encoded string, and paste it into his widget tree.

Cherry Bit Studios and Fair Pricing

Cherry Bit is the umbrella for Erick’s own games, including Pixelado and Mine Cat Digger. Both are built with NES UI and Flutter, with small Flame components mixed in where animation calls for it. Both are free with ads, and a single in-app purchase removes the ads for good.

“I didn’t want to be that,” Erick says of the aggressive monetization common in mobile games. “I try to come up with a way that I think is fair, and I still might be able to get some revenue from that.”

Advice for Engineers Building a Design System

Two pieces of advice from Erick for anyone tackling their first design system:

  1. Learn atomic design. It is not a silver bullet, but it gives you the vocabulary of atoms, molecules, and organisms, and it will save you from reinventing concepts that already have names.
  2. Don’t over-engineer. “I start to create a new widget and then for some reason I decided everything would be customizable. And then I ended up with 200 lines of a theme data class. Then I realized it was not worth it. Maybe I should have different widgets.” Two focused widgets often beat one infinitely configurable one.

A tool like Widgetbook helps here. Hot reload on a widget in isolation makes it easier to spot over-engineering before it ships.

Building in the Open

For Erick, open source is the whole point. “If my thing is not open, it’s not useful for other people, just to me.” Watching other developers use NES UI is the motivation that keeps him coming back to it on weekends. Contributors have added widgets he never prioritized, growing the library faster than he could have alone.

What’s next? Erick is sketching out a fully hand-drawn game, scanning the art directly into Flutter to see how it lands. A long way from pixel art, but the same instinct for craft.

Frequently Asked Questions

Who is Erick Zanardo?

Erick Zanardo is a Technical Delivery Lead at Very Good Ventures and a Google Developer Expert in Flutter and Dart. He is one of the engineers behind the Flame game engine and the creator of NES UI, a retro 8-bit design system library for Flutter.

What is NES UI?

NES UI is an open source Flutter design system inspired by 8-bit retro video games. It ships buttons, text inputs, checkboxes, cards, dialogs, and a catalog of pixelated icons, all built on top of Material so Flutter developers can drop it into a project easily.

Why did Erick build NES UI?

Erick built NES UI for his own games. He wanted retro pixel-art widgets without rewriting buttons and cards for every new project. He then open sourced it so other Flutter developers building retro games could use the same components.

How are the pixel-art icons stored?

The icons live in a side project Erick built called Mini Sprite, a small image format that encodes pixel art as a compressed string. Dart packages can't ship binary assets, so Mini Sprite solves that by representing icons directly in code.

What is Erick's advice for engineers building their first design system?

Start by reading about atomic design so you have shared vocabulary for atoms, molecules, and organisms. Then guard against over-engineering. Erick says he has fallen into the trap of making one widget infinitely customizable when two simpler widgets would have been the right call. A tool like Widgetbook makes it easier to iterate and catch this early.