Joined April 2024
1 Photos and videos
FlutterGigs retweeted
Scrollbars are dumb. They tell you where you are, not what you’re looking at. Inspired by @aydahnizzy , I turned this idea into a Flutter package 👇 pub.dev/packages/section_scr… Section-aware scrolling: • active section detection • contextual badge • per-section progress Better UX: • more context • less cognitive load • structured navigation Works great for lists, timelines, reports, content-heavy UIs. Senior Software Engineer • Dart & Flutter GDE Open to opportunities #FlutterDev @FlutterDev
Mar 20
This guy built a custom scrollbar with section headers for his portfolio 👀
4
13
148
9,707
FlutterGigs retweeted
Flutter Architecture Tip Most Flutter apps don’t have a UI problem. They have a domain leakage problem. It usually starts with good intentions. A quick validation inside a button callback. A small business rule in a widget. A state transition decided directly from the UI. Individually, none of this looks serious. But over time, the UI starts doing far more than rendering: - enforcing business rules - deciding whether an operation is allowed - orchestrating workflows At that point, the UI is no longer a presentation layer. It becomes part of the domain. This creates predictable issues: - duplicated logic across screens - harder tests - fragile refactors - tighter coupling between widgets and business rules A healthier boundary is simple: The UI should express intent, not decision. With Riverpod, this means widgets should call a notifier or provider method that owns the rule, instead of embedding the rule directly in the widget tree. While building LucidClip, this separation made a real difference. Clipboard flows, transformations, and validation rules live outside the UI. Widgets only express user intent and render the resulting state. Minimal example in the visual. Strong architectures do not make the UI smarter. They make it thinner. #Dart #Flutter #SoftwareEngineering
2
1
62
2,664
FlutterGigs retweeted
Designing AI-Native Desktop apps with Flutter AI features are easy to demo. AI-native products are hard to architect. Shared this at Flutter Montreal 🇨🇦 (March 20). Most apps wire UI → LLM. That breaks fast. Better approach: - UI expresses intent - State owns time - AI owns intelligence Built this in LucidClip. Slides coming soon after a few refinements. #FlutterDev #Dart @FlutterDev
1
4
17
713
FlutterGigs retweeted
Hey Twitter, Just got my first lifetime customer for LucidClip 🎉 It’s a small milestone, but it validates something important: People don’t want a “clipboard manager” They want their workflow to remember things for them. LucidClip turns your clipboard into working memory: → Search everything you copied → Access it across devices → Use AI (explain, summarize, translate) Free plan 3-day Pro trial available lucidclip.app
1
2
7
365
FlutterGigs retweeted
Shipping code and releasing features should not always be the same thing. In many applications, a feature becomes available the moment the code is deployed. This works for small projects, but it quickly becomes limiting as systems grow. Mature systems often separate deployment from activation. Features can be controlled dynamically through configuration or feature flags. This provides several advantages: • safer rollouts • gradual feature releases • the ability to disable problematic features instantly • experimentation without redeploying the application Even in client applications like Flutter apps, this approach can be extremely valuable. Instead of coupling feature availability directly to the code, the application can check whether the feature is enabled at runtime. Minimal example in the visual. Reliable systems don't just ship code. They control when and how features become active.
4
15
604
FlutterGigs retweeted
Dependency injection works well in Flutter… until the object graph starts growing. At the beginning, wiring dependencies manually with GetIt feels perfectly fine. A few services, a couple of repositories, maybe some Cubits. But as the application grows, the composition root becomes harder to maintain: • registrations grow linearly with the system • dependency wiring becomes repetitive • async initialization becomes harder to manage • infrastructure concerns start leaking everywhere The problem isn’t dependency injection. It’s that manual wiring doesn’t scale well once the object graph becomes large. This is where injectable, a popular Flutter library that generates dependency injection code for get_it, becomes extremely useful. Instead of manually registering everything, you describe the dependency graph with annotations and the composition root is generated automatically. Your classes keep explicit constructor dependencies, while the DI setup stays centralized and maintainable. Minimal example in the visual. Good dependency injection is not about avoiding boilerplate. It’s about keeping the object graph understandable as the system evolves.
1
3
39
1,950
FlutterGigs retweeted
Spent the last months building LucidClip, a clipboard manager built with Flutter. Tech Stack: • Flutter desktop • Drift (SQLite) • Supabase (auth sync infra) • Global hotkeys • Local-first architecture Now running on macOS and Windows. Flutter desktop is seriously underrated. Curious what others are building with it. lucidclip.app @FlutterDev #Dart #flutter
6
13
67
19,886
FlutterGigs retweeted
We copy more than we realize. Links. Commands. Snippets. Notes. Most of it disappears in seconds. That constant cycle of re-finding and re-copying quietly kills focus. The clipboard was built as a temporary buffer. Modern work isn’t temporary. So I built LucidClip. Instant search. Privacy-first Keyboard-first. Fully local. Now available on macOS and Windows. ⌘ Shift V Ctrl Shift V Download → lucidclip.app
1
2
7
362
FlutterGigs retweeted
Replying to @huge_icons
lucidclip.app, Fast Privacy-First Desktop clipboard manager that runs entirely locally. I've used @FlutterDev's HugeIcons package
1
2
43
FlutterGigs retweeted
One of the most subtle ways systems become fragile is when external models leak into the domain. APIs, databases, and platform services all expose their own representations. Those representations are shaped by infrastructure concerns:transport, serialization, storage, not by business meaning. When domain logic starts consuming those models directly, the system quietly becomes dependent on infrastructure semantics. At first, everything works. But over time, external changes begin to ripple through the system. A renamed field, a new response shape, a platform-specific constraint, and suddenly domain logic needs to adapt to something it should never have depended on. The issue isn’t the external system. It’s the absence of a semantic boundary. The domain should define its own entities, independently of how data is transported or stored. Infrastructure models must be translated at the boundary, so the domain remains stable even as infrastructure evolves. This keeps business logic focused on business intent, not technical representation. Minimal example in the visual. Systems that scale protect their domain not only from infrastructure changes, but from infrastructure semantics.
3
5
26
875
FlutterGigs retweeted
LucidClip just got its first paying user. $6/month. Not revenue. Validation. If you copy & paste every day, your clipboard is part of your thinking process. LucidClip makes it reliable, searchable, and private. Try it → lucidclip.app
1
2
6
205
FlutterGigs retweeted
Most developers underestimate how much cognitive load their clipboard creates. Not because it’s broken. Because the friction is subtle. You copy things all day: commands, snippets, URLs, temporary notes, API responses. Every small hesitation — switching back to find something, re-copying what you just lost, breaking focus for 10 seconds — adds up. Last week, I launched LucidClip. A clipboard manager built for developers who care about speed, keyboard flow, and privacy. When you build something that sits inside a daily workflow, you don’t compete on features. You compete on: – Perceived speed – Shortcut ergonomics – Trust – Zero-friction interaction If search isn’t instant, it feels broken. If a shortcut isn’t natural, it won’t be used. If privacy isn’t obvious, adoption stops. I’m currently refining the interaction loop and search layer. Not adding features. Reducing friction. If you use a clipboard manager daily: What’s the one flaw you’ve just accepted — but shouldn’t have to? If you’re curious how LucidClip feels in a real workflow, you can try it here: 👉 lucidclip.app Windows version coming soon Still early. Still tightening.
1
5
485
FlutterGigs retweeted
Idempotency is what makes retries safe. But it is also often misunderstood. Retries are a normal property of reliable systems. Networks fail. Processes restart. Operations are triggered more than once. Without idempotency, retries introduce state corruption: - duplicate side effects - inconsistent state - invalid system transitions Idempotency ensures that executing the same operation multiple times produces the same valid outcome. It defines a convergence boundary. But idempotency is not a universal requirement. It introduces additional coordination, storage, and lifecycle management. Applying it indiscriminately increases system complexity. Idempotency is critical only at mutation boundaries where retries can corrupt state. In Flutter applications, these boundaries typically exist at repository and remote operation layers. Minimal example in the visual. Reliable architectures don’t eliminate retries. They define where retries are safe.
1
1
21
658
FlutterGigs retweeted
🎉 I'm excited to officially launch LucidClip 🎊. A privacy-first Desktop clipboard manager built as local infrastructure, not a utility. Your clipboard becomes persistent, searchable, and reliable. Download → lucidclip.app/download Proudly built with Flutter! (macOS available, Windows coming soon) #macOS #Productivity #Privacy #Developers #BuildInPublic #FlutterDev @FlutterDev
3
4
14
4,745
FlutterGigs retweeted
Error handling is syntax. Failure containment is architecture. We often conflate the two. We wrap code in try/catch blocks and call it "robust." But if your UI logic is catching a SocketException or parsing a 404, you haven't handled the error, you’ve leaked the infrastructure. A true architectural failure boundary acts as a bulkhead. It stops the blast radius of a runtime exception from compromising the system's conceptual integrity. The mechanism is simple but strict: 1- Infrastructure Layer: Traps volatile exceptions (I/O, Parsing). 2- Boundary: Transforms them into domain-specific Failures (e.g., ServiceUnavailable, DataIntegrityViolation). 3- Presentation Layer: Reacts only to these sanitized failures to determine the UI state. In Flutter, this means your Cubits or BLoCs or orchestrator should never import dio or http. They should only know about the Result of a use case. When you enforce this boundary, you stop writing defensive UI code. The view doesn't need to know why the network failed, only that the service is unavailable. See the visual for the pattern implementation. Resilience isn't about preventing errors. It's about controlling who has to deal with them. #SoftwareArchitecture #SystemDesign #Flutter #CleanArchitecture #FailureBoundaries
3
25
944
FlutterGigs retweeted
🎉 I'm excited to officially launch LucidClip 🎊. A privacy-first clipboard manager built as local infrastructure, not a utility. Your clipboard becomes persistent, searchable, and reliable. Download → lucidclip.app/download (macOS available, Windows coming soon) #macOS #Productivity #Privacy #Developers #BuildInPublic #FlutterDev @FlutterDev
1
4
12
345
FlutterGigs retweeted
🎉 I'm excited to officially launch LucidClip 🎊. A privacy-first clipboard manager built as local infrastructure, not a utility. Your clipboard becomes persistent, searchable, and reliable. Download → lucidclip.app/download (macOS available, Windows coming soon) #macOS #Productivity #Privacy #Developers #BuildInPublic #FlutterDev @FlutterDev
1
4
19
1,207
FlutterGigs retweeted
Most Flutter apps accidentally duplicate their own data pipelines. This happens when multiple orchestrators (Cubits, Blocs, controllers) subscribe independently to the same repository stream. At first glance, it looks harmless: // user_cubit.dart repo.watchUser().listen(...) //settings_cubit.dart repo.watchUser().listen(...) //profile_cubit.dart repo.watchUser().listen(...) But under the hood, each subscription may recreate the entire upstream pipeline: - database watchers - websocket listeners - network polling - parsing and mapping layers This is the consequence of treating streams as factories rather than shared system signals. Each consumer creates its own execution path. As the system grows, this introduces hidden fan-out: duplicated work, increased CPU usage, redundant IO, and inconsistent state timing between orchestrators. The architectural boundary is wrong. A resource stream should not be recreated per consumer. It should be owned, shared, and replayed. The repository must expose a multicast stream with caching semantics so the upstream computation runs once, regardless of how many consumers exist. Minimal example in the visual. This is not a Flutter issue. It’s a system design issue. Cold streams model computations. Shared streams model state. Architectures that scale treat streams as infrastructure, not factories. @FlutterDev
1
9
74
3,667
FlutterGigs retweeted
🔹 Eliminate Constructor Bloat with a Static Facade Service Locator As Flutter apps grow, cross-cutting concerns start creeping into every layer: analytics, logging, crash reporting, feature flags… And suddenly your constructors look like flight itineraries. There’s a clean way to handle this without sacrificing testability: - Combine a Service Locator with a Static Facade. - The Service Locator resolves the implementation. - The Static Facade exposes a simple global API. - Your UI and Cubits stay clean. - No constructor pollution. - Still fully swappable in tests. Instead of passing analytics through 8 layers of widgets, you call: Analytics.track('app_opened'); The essential parts of the pattern are shown in the visual attached. This approach has helped keep large codebases readable while avoiding DI noise everywhere. If you want to go deeper into the architecture behind it, here’s the full article: 👉 medium.com/p/4c9c5d2bbb3b Small structural decision. Huge long-term clarity. 🚀
2
6
31
1,342
FlutterGigs retweeted
Flutter Tip 🔹 Don’t Await What Doesn’t Matter to the User Not every Future should block your flow. Analytics, logging, observability tools, non-critical telemetry, these are side effects. They shouldn’t delay navigation, slow down app startup, or block a UI transition. If the result of a Future does not impact correctness or state, treat it as fire-and-forget and make that intention explicit with unawaited. This keeps: - the UI responsive - startup fast - transitions smooth - intent clear in the code The minimal example is included in the visual attached. ⚠️ Important nuance: only use this pattern for non-critical operations. If failure should affect state or user experience, you must await it. User flow first. Observability in the background. 🚀
5
9
91
3,617