
Stop guessing what to build. User feedback SDK for @FlutterDev 🩵
Joined June 2024
- Tweets341
- Following2
- Followers264
- Likes2.1K
UserOrient retweeted
We collected all the feature requests and bug reports for unisched.app through our official support channels in messengers. Now, thanks to @kamranbekirovyz and @userorient, we're getting a brand-new in-app feedback experience 😃
UserOrient retweeted
Just noticed that @eseidel mentioned @userorient in the list of a companies ~"in the mission of filling in missing pieces in Flutter" 🫠
UserOrient retweeted
I have been following this Orient UI @FlutterDev development. It is a fantastic UI set and idea, plus very well made. Awesome work, thanks for making and sharing it ❤️
Story journey and used approach rationale was also a great read! Loved it 🚀
💯% #MaterialMike approved! 😅💙
Story: I made a set of Flutter widgets that aren't Material or Cupertino.
I use Flutter for web and desktop a lot. And if you do too, you probably know the pain: Material works fine for mobile, but on web and desktop it screams Google. Cupertino doesn't even make sense on larger screens. So, if you want your app to look like your own brand, you're building everything from scratch.
I've done that for 2 years at @UserOrient: it has a web dashboard built entirely with Flutter. Our designer made a clean, neutral design for it, I implemented it, and people kept saying it looks good. At some point I looked at all these widgets I built and thought: "I keep reusing these across projects anyway, why not let others use them too?"
But I didn't want to make a package. See, these are widgets, pixels, and if you import a package, you can't change how a button works inside without forking the whole thing. Then remembered, a friend told me once about shadcn in the web world and how it just gives you the component as a file. That felt right.
Decided to start with CLI: activate it, run a command, and it drops a plain Dart file into your lib folder. That file is yours. Edit it, move it, rename it, whatever.
That's Orient UI. It gives you two things:
1. style.dart: colors, typography, radii, durations, breakpoints. One file. Works with or without Material.
2. Widgets: buttons, toggles, navbars, toasts, popups, search fields, tabs, more. 25+ of them. All tested. All responsive.
One thing I didn't expect: style.dart became useful way beyond Orient UI's widgets. In my apps, I started putting all custom colors and typography there. It's now basically my whole app's design tokens in one place, and it doesn't fight Material's ThemeData at all.
Here's how it works:
> dart pub global activate orient_ui
> orient_ui init // creates lib/style.dart
> orient_ui add button // creates lib/button.dart
You don't replace MaterialApp either. Keep your Scaffold, your Navigator, everything. Orient UI sits next to it. Use its button but Material's TextField. Mix however you want.
Here's some questions I got and decisions I made along the way:
- Is this a design system?
Not really. It's foundational building blocks. You can use Orient UI's button next to Material's TextField and they won't fight each other. Use what you need, ignore the rest.
- Why plain files, not a package?
If it's a package, you can't change a button's internal logic without forking the whole thing. With plain files, you open button.dart and change whatever you want.
- Will there be Orient UI v2, v3, breaking changes?
No. There won't be. These are neutral, foundational widgets. A button is a button. A toggle is a toggle. You get the file, it's yours forever.
- Why not OrientButton, OrientApp?
I almost did. Then I realized that's annoying. Nobody wants to type a prefix on every widget. So the button is just Button. The theme is just Style. Simple names, no conflicts with Material's ThemeData.
- How do widgets know light/dark mode?
I could do Theme.of(context).brightness but that ties you to Material. What if someone uses CupertinoApp or just a plain WidgetsApp? So I made Style an InheritedWidget. You wrap your app with Style(), pass brightness, done. And if you don't wrap, it defaults to light. So wrapping is optional too.
- How does the CLI work?
It fetches templates from GitHub. No code generation, no build runner. You run a command, you get a file. That file imports style.dart for colors and typography. You point that import to wherever you put style.dart and you're set.
Also, Flutter team recently separated Material and Cupertino into their own packages. Maybe there's room for a third option. Maybe this is it.
Links in the first comment 👇🏻
UserOrient retweeted
Story: I made a set of Flutter widgets that aren't Material or Cupertino.
I use Flutter for web and desktop a lot. And if you do too, you probably know the pain: Material works fine for mobile, but on web and desktop it screams Google. Cupertino doesn't even make sense on larger screens. So, if you want your app to look like your own brand, you're building everything from scratch.
I've done that for 2 years at @UserOrient: it has a web dashboard built entirely with Flutter. Our designer made a clean, neutral design for it, I implemented it, and people kept saying it looks good. At some point I looked at all these widgets I built and thought: "I keep reusing these across projects anyway, why not let others use them too?"
But I didn't want to make a package. See, these are widgets, pixels, and if you import a package, you can't change how a button works inside without forking the whole thing. Then remembered, a friend told me once about shadcn in the web world and how it just gives you the component as a file. That felt right.
Decided to start with CLI: activate it, run a command, and it drops a plain Dart file into your lib folder. That file is yours. Edit it, move it, rename it, whatever.
That's Orient UI. It gives you two things:
1. style.dart: colors, typography, radii, durations, breakpoints. One file. Works with or without Material.
2. Widgets: buttons, toggles, navbars, toasts, popups, search fields, tabs, more. 25+ of them. All tested. All responsive.
One thing I didn't expect: style.dart became useful way beyond Orient UI's widgets. In my apps, I started putting all custom colors and typography there. It's now basically my whole app's design tokens in one place, and it doesn't fight Material's ThemeData at all.
Here's how it works:
> dart pub global activate orient_ui
> orient_ui init // creates lib/style.dart
> orient_ui add button // creates lib/button.dart
You don't replace MaterialApp either. Keep your Scaffold, your Navigator, everything. Orient UI sits next to it. Use its button but Material's TextField. Mix however you want.
Here's some questions I got and decisions I made along the way:
- Is this a design system?
Not really. It's foundational building blocks. You can use Orient UI's button next to Material's TextField and they won't fight each other. Use what you need, ignore the rest.
- Why plain files, not a package?
If it's a package, you can't change a button's internal logic without forking the whole thing. With plain files, you open button.dart and change whatever you want.
- Will there be Orient UI v2, v3, breaking changes?
No. There won't be. These are neutral, foundational widgets. A button is a button. A toggle is a toggle. You get the file, it's yours forever.
- Why not OrientButton, OrientApp?
I almost did. Then I realized that's annoying. Nobody wants to type a prefix on every widget. So the button is just Button. The theme is just Style. Simple names, no conflicts with Material's ThemeData.
- How do widgets know light/dark mode?
I could do Theme.of(context).brightness but that ties you to Material. What if someone uses CupertinoApp or just a plain WidgetsApp? So I made Style an InheritedWidget. You wrap your app with Style(), pass brightness, done. And if you don't wrap, it defaults to light. So wrapping is optional too.
- How does the CLI work?
It fetches templates from GitHub. No code generation, no build runner. You run a command, you get a file. That file imports style.dart for colors and typography. You point that import to wherever you put style.dart and you're set.
Also, Flutter team recently separated Material and Cupertino into their own packages. Maybe there's room for a third option. Maybe this is it.
Links in the first comment 👇🏻
UserOrient retweeted
Orient UI is now AI-native! 🎉
One command sets up theming for your Flutter app + AI rules for Claude Code, Antigravity, Windsurf and Codex.
After that, your AI coding agent uses Orient UI's theming and widgets instead of hardcoding values or defaulting to Material or Cupertino.
UserOrient retweeted
This new widget, I call: SegmentBar.
It's similar to Material's TabBar, but it wraps to more than one lines if you wish (also has horizontal-scroll version). Plus it's more neutral and cleaner.
I used it for Orient UI's widgets catalog as a switcher between widgets. Now each widget have its own previews and a VS Code-style code block 🔥
Though, I assume normally you'd use it for 5-8 items max, which will look cleaner.
With this, Orient UI now catalogs 23 widgets! All clean. All neutral. All fully customisable.
UserOrient retweeted
I hope Flutter can get more love for desktop & web, but building blocks aren't there yet. I struggled with this a lot building @UserOrient's web dashboard.
My dream is "Orient UI" can become a toolkit to make building desktop & web apps with Flutter much easier.
UserOrient retweeted
Replying to @userorient
@UserOrient v2.1.0 is live:
Now you can see user's device and app details alongside with their feature request.
UserOrient retweeted
UserOrient Flutter SDK v2.0.0 is here! 🎉
Biggest update yet:
- SDK now collects optional email from users
- More breathing UI, more features visible at a glance
- More neutral design, more like part of your app.
With every update, @UserOrient is trying to close gap between your Flutter app and its users 🩵
UserOrient retweeted
I questioned @UserOrient's comments view a lot...
And made lots of changes to the SDK:
🆕 Related feature pinned at top
🥷 Subtle shadow on the bottom text field
💬 Text hierarchy: comment first, name secondary
📅 Date moved to right
My brain loves doing this.
UserOrient retweeted
Adding floating pill button and limiting feature description to 2 lines freed-up a lot of space 🍀
UserOrient retweeted
Unexpected: Orient UI reached 1,000 downloads! 🎉
It already has 15 Flutter widgets, 20+ planned to be added by the end of February.
And soon it will be AI-native: Your coding agent will know every Orient UI widget and how to use them. That's something I'm still exploring, give me a few days...
UserOrient retweeted
Yess! @userorient keeps nailing it with user oriented feature delivery! I have been waiting for this feature 🙏
You can now reply to user comments on your @UserOrient roadmap board, and they get a simple & clean email 📧
UserOrient retweeted
You can now reply to user comments on your @UserOrient roadmap board, and they get a simple & clean email 📧
UserOrient retweeted
First public release of Orient UI is here! 🎉
It’s a collection of Flutter widgets without Material or Cupertino.
Don't worry! It doesn't force you to migrate your app to OrientApp, use OrientScaffold or anything. It works with them. These widgets are just pure templates.
As of v0.1.0 , there are 6 mature widgets: Button, Spinner, NavBar (mobile + web), EmptyState, Toast and ConfirmationPopup ✅ The more to come.
How it works? You just run “orient_ui add button” in your terminal, and 🥁🥁🥁 that widget copied to your Flutter project! It’s yours! Change it if you want. No pubspec dependencies and no dependencies at all!
And to give you a background, it's the design system powering @UserOrient's web and mobile dashboards that are built with Flutter 🩵
So, remember, it’s early public release, API and widgets might change a bit and the more feedback you give, the more we can make it better. Let's go!
Links in the first comment 👇🏻
UserOrient retweeted
Just released @UserOrient 1.7.0 that brings theme customization
This was much-requested, long-awaited feature request.
UserOrient retweeted
Experimenting theming in @UserOrient:
Just pass two colors: background & accent.
That's it:
UserOrient retweeted
🔥 You can now filter votes by paying users!
This will help you understand which features matter most to your revenue-generating customers.
For this to work just upgrade userorient_flutter package to latest version 1.6.0 and set "isPaying" variable when calling UserOrient.setUser. That's it.


















