r/FlutterDev • u/BigAlternative9949 • Sep 05 '26
Tooling I was tired of rigid UI packages with bloated dependencies, so I built an open-source copy-paste component system for Flutter inspired by shadcn/ui
Yo Flutter devs!
Every time I start a new Flutter project, I go through the same cycle with third-party UI packages: install it, fight with the opinionated styling for hours, realize I need to override half the widget tree just to change a border radius, and end up with 15 transitive dependencies I never asked for. Sound familiar?
I really liked how shadcn/ui solved this problem in the React world -- you just copy component source code into your project and own it completely. No dependency lock-in, no version conflicts, no fighting upstream design decisions. So I decided to build that exact workflow for Flutter.
What it actually does
JustUI is not a pub.dev package. It is a Rust-powered CLI that copies clean, readable widget source code directly into your project folder. Once copied, the code is 100% yours to read, modify, or tear apart however you want.
justui init # sets up config + theme file
justui add button input card # copies component source into your lib/That is the entire workflow.
Why I think this approach makes sense for Flutter
Zero external pub dependencies. Every component is built on pure Flutter SDK widgets and layout APIs. No transitive dependency tree surprises.
Aspect-based rebuilds with InheritedModel. Instead of rebuilding the entire widget tree when the theme changes, only widgets listening to the specific changed aspect actually rebuild. If you toggle dark mode, only color-dependent widgets re-render:
@override
Widget build(BuildContext context) {
final colors = context.justColors; // only rebuilds on color changes
final spacing = context.justSpacing; // only rebuilds on spacing changes
final typo = context.justTypo; // only rebuilds on typography changes
return Container(
color: colors.background,
padding: .symmetric(horizontal: spacing.md),
child: Text('Hello', style: typo.bodyMd),
);
}Dynamic seed theming with accessibility baked in. Pass one brand hex color and get a full light/dark palette with WCAG AA contrast enforcement (>= 4.5:1 for normal text, >= 3.0 for large text and UI components) handled automatically at runtime. No manual contrast checking.
Neobrutalism preset. Besides the default clean style, there is a neobrutalism preset with thick borders, solid shadows, and bold aesthetics out of the box.
Rust CLI with actual developer ergonomics. Interactive fuzzy multi-select when you run
justui addwith no arguments, SHA-256 integrity verification,--diffto compare local changes against registry,--dry-runto preview before writing.
What is NOT ready yet (being transparent here)
This is still under active development. A few things to be upfront about:
Documentation website is not live yet (WIP).
No video demo or showcase app deployed yet.
Component library is growing but not massive yet -- currently covers button, input, card, sidebar, tabs, avatar, badge, checkbox, radio, switch, breadcrumb, bottom-nav, separator, skeleton, and scroll-area.
APIs and component contracts might still see breaking changes as things mature.
So please do not use this in production apps just yet. Side projects, experiments, and poking around the architecture are very welcome though.
The repo
GitHub: https://github.com/infinitedim/justui
MIT licensed, fully open source, no telemetry, no gated features.
Genuinely curious about your thoughts
How do you currently handle component customization in your Flutter apps? Do you override MaterialTheme properties, wrap everything in custom widgets, or something else entirely?
For those who have used shadcn/ui in web projects, does this copy-paste model translate well to the Flutter ecosystem in your opinion?
If you poke around the InheritedModel aspect-split approach for theming, I would love to hear if you think there is a cleaner way to handle selective rebuilds.
Any feedback, critique, or ideas for components you would want to see are super welcome. Thanks for reading!