<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kouki Badr</title>
    <description>The latest articles on DEV Community by Kouki Badr (@koukibadr).</description>
    <link>https://dev.to/koukibadr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F644740%2F2dc95912-aafe-4614-9c1a-5ce2568fa6df.jpeg</url>
      <title>DEV Community: Kouki Badr</title>
      <link>https://dev.to/koukibadr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/koukibadr"/>
    <language>en</language>
    <item>
      <title>from a CLI engine to four different usage: Cleanbev</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Tue, 08 Sep 2026 08:15:18 +0000</pubDate>
      <link>https://dev.to/koukibadr/from-a-cli-engine-to-four-different-usage-cleanbev-4gom</link>
      <guid>https://dev.to/koukibadr/from-a-cli-engine-to-four-different-usage-cleanbev-4gom</guid>
      <description>&lt;p&gt;If you've shipped a Flutter app for more than a few months, you know the drill: assets pile up. Old icons nobody swapped out, images from a design iteration three sprints ago, a splash screen you replaced but never deleted. assets/ quietly turns into a junk drawer, and nobody notices until app size becomes a conversation.&lt;/p&gt;

&lt;p&gt;That's the problem Cleanbev is solving — But in 4 different ways not only via a CLI.&lt;/p&gt;

&lt;p&gt;It started as just that: a CLI but today it covers every surface a developer might actually want to use it from.&lt;/p&gt;

&lt;p&gt;The four surfaces&lt;/p&gt;

&lt;p&gt;🖥️ CLI The original. dart pub global activate cleanbev, then run it in your project root.&lt;/p&gt;

&lt;p&gt;🤖 MCP Server Lets AI coding assistants (Claude, Cursor, and others) clean up unused assets as part of an agentic workflow, instead of you manually running commands mid-conversation.&lt;/p&gt;

&lt;p&gt;⚙️ GitHub Action Drop assets checks straight into CI which catch unused assets before they ever reach production.&lt;/p&gt;

&lt;p&gt;🧩 VS Code Extension: new Scan and clean unused assets without leaving your editor. This is what I'm actually writing this post about.&lt;/p&gt;

&lt;p&gt;What the extension does&lt;/p&gt;

&lt;p&gt;Two commands, both from the Command Palette:&lt;/p&gt;

&lt;p&gt;Cleanbev: Dry Run — scans your project and shows you exactly what's unused, as structured results, without touching anything. This is the one you run first, every time.&lt;br&gt;
Cleanbev: Clean — scans and removes unused assets, after you confirm the assets path.&lt;/p&gt;

&lt;p&gt;Requirements (for now)&lt;/p&gt;

&lt;p&gt;The extension is a UI layer on top of the real CLI, not a reimplementation — so it needs the CLI installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dart pub global activate cleanbev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I went this route deliberately for v1 rather than reimplementing the detection logic inside the extension itself. Once you have a CLI, an MCP server, and a GitHub Action all needing to agree on what "unused" means, keeping one canonical implementation that everything else calls into is a lot saner than three parallel implementations quietly drifting apart. A dependency-free bundled binary is on the roadmap, but "one source of truth" won out for launch.&lt;/p&gt;

&lt;p&gt;Try it&lt;br&gt;
📦 Cleanbev package &lt;a href="https://pub.dev/packages/cleanbev" rel="noopener noreferrer"&gt;https://pub.dev/packages/cleanbev&lt;/a&gt;&lt;br&gt;
🧩 Cleanbev extension &lt;a href="https://marketplace.visualstudio.com/items?itemName=koukibadr.cleanbev-vscode" rel="noopener noreferrer"&gt;VScode Extension&lt;/a&gt;&lt;br&gt;
🤖 The MCP tool &lt;a href="https://pypi.org/project/cleanbev-mcp/" rel="noopener noreferrer"&gt;https://pypi.org/project/cleanbev-mcp/&lt;/a&gt;&lt;br&gt;
🛞 The github action &lt;a href="https://github.com/marketplace/actions/cleanbev-asset-check" rel="noopener noreferrer"&gt;https://github.com/marketplace/actions/cleanbev-asset-check&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run into anything or have ideas for what the extension should do next, I'd genuinely love the feedback.&lt;/p&gt;

&lt;p&gt;This whole project has grown a lot more than I originally planned for one CLI tool, and that's mostly been driven by people actually using it and telling me what they needed next.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>opensource</category>
      <category>devops</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Automate Unused Asset Cleanup in Flutter</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Wed, 02 Sep 2026 07:54:01 +0000</pubDate>
      <link>https://dev.to/koukibadr/automate-unused-asset-cleanup-in-flutter-13ci</link>
      <guid>https://dev.to/koukibadr/automate-unused-asset-cleanup-in-flutter-13ci</guid>
      <description>&lt;p&gt;Let's be realistic, every Flutter project accumulates dead weight over time, big images not deleted, a logo variant from a rebrand, a placeholder image a dev forgot to delete.&lt;br&gt;
Individually they're small but they add up to real APK/IPA size.&lt;/p&gt;

&lt;p&gt;I built &lt;code&gt;cleanbev&lt;/code&gt; to fix that locally, and I now a new upgrade is available a GitHub Action so the check runs automatically on every pull request, instead of running it localy.&lt;/p&gt;
&lt;h2&gt;
  
  
  What cleanbev actually does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cleanbev&lt;/code&gt; is a command-line tool for Dart and Flutter projects. It:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads your &lt;code&gt;pubspec.yaml&lt;/code&gt; to find every declared asset&lt;/li&gt;
&lt;li&gt;Scans your Dart code for references to each one&lt;/li&gt;
&lt;li&gt;Reports anything declared but never referenced&lt;/li&gt;
&lt;li&gt;Optionally deletes what you confirm&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Locally, it's interactive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dart pub global activate cleanbev
dart pub global run cleanbev &lt;span class="nt"&gt;--assets-path&lt;/span&gt; assets/images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ Asset assets/images/logo_white_bg.png is not used in the project. Do you want to delete it? · no
Asset assets/images/logo_white_bg.png has not been deleted.

✓ Asset assets/images/download_image-car.jpeg is not used in the project. Do you want to delete it? · yes
Asset assets/images/download_image-car.jpeg has been deleted.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's also available as an MCP server, so editor-integrated agents (VS Code, Cursor, Visual Studio) can call it directly while you're working.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap: someone could forgot to cleanup some assets before pushing
&lt;/h2&gt;

&lt;p&gt;A local CLI tool only helps if someone remembers to run it but in practice, unused-asset cleanup falls into the same bucket as "update the changelog" or "check for outdated dependencies" but under&lt;br&gt;
deadline pressure this could be skipped.&lt;br&gt;
&lt;strong&gt;The only way it reliably happens is if CI enforces it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's what the new &lt;strong&gt;Cleanbev Asset Check&lt;/strong&gt; action does.&lt;/p&gt;
&lt;h2&gt;
  
  
  Using it
&lt;/h2&gt;

&lt;p&gt;Add this into any Flutter repo's &lt;code&gt;.github/workflows/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check Unused Assets&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;main"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cleanbev-asset-check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cleanbev Asset Check&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Cleanbev&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;koukibadr/cleanbev-action@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;assets-path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assets"&lt;/span&gt;
          &lt;span class="na"&gt;blocking&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inputs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;assets-path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Path to the assets directory to scan&lt;/td&gt;
&lt;td&gt;&lt;code&gt;assets&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;blocking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fail the job when unused assets are found&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Two ways to run it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;blocking: "false"&lt;/code&gt;&lt;/strong&gt; (default) — reports what it finds, cleans it up, never fails the build. Good for a low-friction "just keep things tidy" job on a schedule or on pushes to &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;blocking: "true"&lt;/code&gt;&lt;/strong&gt; — turns it into a real PR gate. If a PR introduces an asset that's never referenced, the check fails until it's cleaned up or actually used. This is what I run on pull requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Action: &lt;a href="https://github.com/marketplace/actions/cleanbev-asset-check" rel="noopener noreferrer"&gt;github.com/marketplace/actions/cleanbev-asset-check&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CLI on pub.dev: &lt;a href="https://pub.dev/packages/cleanbev" rel="noopener noreferrer"&gt;pub.dev/packages/cleanbev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP server on PyPI: &lt;a href="https://pypi.org/project/cleanbev-mcp" rel="noopener noreferrer"&gt;pypi.org/project/cleanbev-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a small tool solving a small, annoying problem. If you try it on a real project and hit a bug please send me your issues and PRs.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>opensource</category>
      <category>devops</category>
    </item>
    <item>
      <title>flutter_skin Alpha</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Wed, 12 Aug 2026 08:34:34 +0000</pubDate>
      <link>https://dev.to/koukibadr/flutterskin-alpha-4k0</link>
      <guid>https://dev.to/koukibadr/flutterskin-alpha-4k0</guid>
      <description>&lt;p&gt;Alpha V1 is live.&lt;/p&gt;

&lt;p&gt;→ Full Material 3 color token support&lt;br&gt;
→ Live skin preview directly in the dashboard&lt;br&gt;
→ Typography tokens — change your app's font remotely&lt;/p&gt;

&lt;p&gt;No rebuild. No App Store update. Publish from the &lt;br&gt;
dashboard, app updates live.&lt;/p&gt;

&lt;p&gt;──────────────────────────────────────&lt;/p&gt;

&lt;p&gt;🔗 Links&lt;/p&gt;

&lt;p&gt;📦 Package: pub.dev/packages/flutter_skin&lt;br&gt;
🖥️  Dashboard: app.fskin.dev&lt;br&gt;
📖 Docs: docs.fskin.dev&lt;/p&gt;

&lt;p&gt;──────────────────────────────────────&lt;/p&gt;

&lt;p&gt;What's coming in Beta:&lt;br&gt;
→ Spacing tokens&lt;br&gt;
→ Border radius tokens&lt;br&gt;&lt;br&gt;
→ A/B testing&lt;br&gt;
→ MCP server for AI-generated skins&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>flutter</category>
      <category>development</category>
      <category>design</category>
    </item>
    <item>
      <title>Change Flutter Themes Without Rebuilding</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Mon, 06 Jul 2026 07:20:22 +0000</pubDate>
      <link>https://dev.to/koukibadr/change-flutter-themes-without-rebuilding-5g4n</link>
      <guid>https://dev.to/koukibadr/change-flutter-themes-without-rebuilding-5g4n</guid>
      <description>&lt;p&gt;This is the first demo of flutter_skin — a remote skin engine &lt;br&gt;
for Flutter I've been building for the past few months.&lt;/p&gt;

&lt;p&gt;This is the alpha. Color tokens only for now. Typography, &lt;br&gt;
spacing, border radii, and A/B testing are coming.&lt;/p&gt;

&lt;p&gt;📦 Package (pub.dev):&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://pub.dev/packages/flutter_skin" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpub.dev%2Fstatic%2Fhash-937hlb57%2Fimg%2Fpub-dev-icon-cover-image.png" height="400" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://pub.dev/packages/flutter_skin" rel="noopener noreferrer" class="c-link"&gt;
            flutter_skin | Flutter package
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A runtime skin engine for Flutter projects, allowing dynamic theme changes without the need for app restarts.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpub.dev%2Fstatic%2Fhash-937hlb57%2Fimg%2Fflutter-logo-32x32.png" width="32" height="32"&gt;
          pub.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;🖥️ Dashboard:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://app.fskin.dev/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;app.fskin.dev&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;📖 Docs:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://docs.fskin.dev/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffskin.mintlify.app%2Fmintlify-assets%2F_next%2Fimage%3Furl%3D%252F_mintlify%252Fapi%252Fog%253Fdivision%253DGetting%252BStarted%2526title%253DIntroduction%2526description%253DFSkin%252B%2525E2%252580%252594%252Bremote%252Bskin%252Bmanagement%252Bfor%252BFlutter.%252BChange%252Byour%252Bapp%252527s%252Bcolors%252Blive%25252C%252Bwithout%252Bshipping%252Ban%252Bupdate.%2526logoLight%253Dhttps%25253A%25252F%25252Fmintcdn.com%25252Ffskin%25252FzNfqAH_2J4k62-LS%25252Flogo%25252Ffskin_trans.png%25253Ffit%25253Dmax%252526auto%25253Dformat%252526n%25253DzNfqAH_2J4k62-LS%252526q%25253D85%252526s%25253D9fff5369d566020144b83aaf40406d7c%2526logoDark%253Dhttps%25253A%25252F%25252Fmintcdn.com%25252Ffskin%25252FzNfqAH_2J4k62-LS%25252Flogo%25252Ffskin_trans.png%25253Ffit%25253Dmax%252526auto%25253Dformat%252526n%25253DzNfqAH_2J4k62-LS%252526q%25253D85%252526s%25253D9fff5369d566020144b83aaf40406d7c%2526primaryColor%253D%2525236663f1%2526lightColor%253D%2525236663f1%2526darkColor%253D%2525236663f1%2526backgroundLight%253D%252523fafaff%2526backgroundDark%253D%2525230c0c12%26w%3D1200%26q%3D100" height="630" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://docs.fskin.dev/" rel="noopener noreferrer" class="c-link"&gt;
            Introduction - fskin
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            FSkin — remote skin management for Flutter. Change your app's colors live, without shipping an update.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.fskin.dev%2Fmintlify-assets%2F_mintlify%2Ffavicons%2Ffskin%2FVzIM5WP5l3OmexB_%2F_generated%2Ffavicon%2Fandroid-chrome-192x192.png" width="192" height="192"&gt;
          docs.fskin.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;📌 About this project&lt;/p&gt;

&lt;p&gt;flutter_skin is open source. The SaaS dashboard (fskin.dev) &lt;br&gt;
is the cloud layer that handles skin delivery, team &lt;br&gt;
collaboration, and API key management.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>webdev</category>
      <category>dart</category>
    </item>
    <item>
      <title>Change Flutter Themes Without Rebuilding</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Mon, 06 Jul 2026 07:20:22 +0000</pubDate>
      <link>https://dev.to/koukibadr/change-flutter-themes-without-rebuilding-3ljj</link>
      <guid>https://dev.to/koukibadr/change-flutter-themes-without-rebuilding-3ljj</guid>
      <description>&lt;p&gt;This is the first demo of flutter_skin — a remote skin engine &lt;br&gt;
for Flutter I've been building for the past few months.&lt;/p&gt;

&lt;p&gt;This is the alpha. Color tokens only for now. Typography, &lt;br&gt;
spacing, border radii, and A/B testing are coming.&lt;/p&gt;

&lt;p&gt;📦 Package (pub.dev):&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://pub.dev/packages/flutter_skin" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpub.dev%2Fstatic%2Fhash-937hlb57%2Fimg%2Fpub-dev-icon-cover-image.png" height="400" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://pub.dev/packages/flutter_skin" rel="noopener noreferrer" class="c-link"&gt;
            flutter_skin | Flutter package
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A runtime skin engine for Flutter projects, allowing dynamic theme changes without the need for app restarts.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpub.dev%2Fstatic%2Fhash-937hlb57%2Fimg%2Fflutter-logo-32x32.png" width="32" height="32"&gt;
          pub.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;🖥️ Dashboard:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://app.fskin.dev/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;app.fskin.dev&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;📖 Docs:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://docs.fskin.dev/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Ffskin.mintlify.app%2Fmintlify-assets%2F_next%2Fimage%3Furl%3D%252F_mintlify%252Fapi%252Fog%253Fdivision%253DGetting%252BStarted%2526title%253DIntroduction%2526description%253DFSkin%252B%2525E2%252580%252594%252Bremote%252Bskin%252Bmanagement%252Bfor%252BFlutter.%252BChange%252Byour%252Bapp%252527s%252Bcolors%252Blive%25252C%252Bwithout%252Bshipping%252Ban%252Bupdate.%2526logoLight%253Dhttps%25253A%25252F%25252Fmintcdn.com%25252Ffskin%25252FzNfqAH_2J4k62-LS%25252Flogo%25252Ffskin_trans.png%25253Ffit%25253Dmax%252526auto%25253Dformat%252526n%25253DzNfqAH_2J4k62-LS%252526q%25253D85%252526s%25253D9fff5369d566020144b83aaf40406d7c%2526logoDark%253Dhttps%25253A%25252F%25252Fmintcdn.com%25252Ffskin%25252FzNfqAH_2J4k62-LS%25252Flogo%25252Ffskin_trans.png%25253Ffit%25253Dmax%252526auto%25253Dformat%252526n%25253DzNfqAH_2J4k62-LS%252526q%25253D85%252526s%25253D9fff5369d566020144b83aaf40406d7c%2526primaryColor%253D%2525236663f1%2526lightColor%253D%2525236663f1%2526darkColor%253D%2525236663f1%2526backgroundLight%253D%252523fafaff%2526backgroundDark%253D%2525230c0c12%26w%3D1200%26q%3D100" height="630" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://docs.fskin.dev/" rel="noopener noreferrer" class="c-link"&gt;
            Introduction - fskin
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            FSkin — remote skin management for Flutter. Change your app's colors live, without shipping an update.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.fskin.dev%2Fmintlify-assets%2F_mintlify%2Ffavicons%2Ffskin%2FVzIM5WP5l3OmexB_%2F_generated%2Ffavicon%2Fandroid-chrome-192x192.png" width="192" height="192"&gt;
          docs.fskin.dev
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;📌 About this project&lt;/p&gt;

&lt;p&gt;flutter_skin is open source. The SaaS dashboard (fskin.dev) &lt;br&gt;
is the cloud layer that handles skin delivery, team &lt;br&gt;
collaboration, and API key management.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>webdev</category>
      <category>dart</category>
    </item>
    <item>
      <title>I built a remote skin engine for Flutter</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Sun, 28 Jun 2026 09:07:47 +0000</pubDate>
      <link>https://dev.to/koukibadr/i-built-a-remote-skin-engine-for-flutter-3b43</link>
      <guid>https://dev.to/koukibadr/i-built-a-remote-skin-engine-for-flutter-3b43</guid>
      <description>&lt;p&gt;Every one of us has been here.&lt;/p&gt;

&lt;p&gt;The designer opens Figma and changes the primary color from &lt;code&gt;#6C63FF&lt;/code&gt; to &lt;code&gt;#5B52E8&lt;/code&gt;. A small update (they think).&lt;/p&gt;

&lt;p&gt;Our release cycle: create a branch, update the color, build, test, submit to App Store, wait for store review, for just a hex code.&lt;/p&gt;

&lt;p&gt;This is the tax Flutter developers pay for a compile-time theming system. It's powerful and type-safe and beautiful — and completely frozen the moment your app ships.&lt;/p&gt;

&lt;h1&gt;
  
  
  flutter_skin
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;flutter_skin&lt;/code&gt; is a runtime skin engine. Instead of hardcoding your color values, you define them as named tokens. Those tokens are managed from a dashboard and delivered to your app.&lt;br&gt;
&lt;strong&gt;When you publish a new skin, every connected device updates instantly&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works in 2 lines
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;WidgetsFlutterBinding&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ensureInitialized&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;FlutterSkin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;apiKey:&lt;/span&gt; &lt;span class="s"&gt;'fsk_your_key_here'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In your MaterialApp:&lt;/span&gt;
&lt;span class="nl"&gt;theme:&lt;/span&gt; &lt;span class="n"&gt;FlutterSkin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toThemeData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's the integration. &lt;code&gt;FlutterSkin.init()&lt;/code&gt; fetches the active skin from the FSkin backend and opens a persistent SSE connection. From that point, any skin you publish reaches the app in about 2 seconds.&lt;/p&gt;
&lt;h2&gt;
  
  
  The live update architecture
&lt;/h2&gt;

&lt;p&gt;Here's what happens end to end when you click Publish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dashboard: click Publish
        ↓
Skin marked active in PostgreSQL
        ↓
Supabase Realtime detects the UPDATE on skins table
        ↓
Node.js backend receives the Realtime event
        ↓
Backend writes SSE event to all connected Flutter clients
        ↓
flutter_skin package receives the flag
        ↓
Package re-fetches active skin from CDN
        ↓
A stream emits new SkinTokens
        ↓
setState() → MaterialApp rebuilds → app repaints
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Total time: ~1–2 seconds. No polling. No App Store. No user action.&lt;/p&gt;

&lt;h2&gt;
  
  
  The full MaterialApp setup
&lt;/h2&gt;

&lt;p&gt;To react to live updates, wrap your app in a StatefulWidget:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatefulWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;createState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_MyAppState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;_MyAppState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;initState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;FlutterSkin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onSkinChanged&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mounted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;theme:&lt;/span&gt; &lt;span class="n"&gt;FlutterSkin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toThemeData&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;HomePage&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's available today
&lt;/h2&gt;

&lt;p&gt;The alpha supports &lt;strong&gt;color tokens&lt;/strong&gt; — full Material ColorScheme mapping:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;primary&lt;/code&gt;, &lt;code&gt;secondary&lt;/code&gt;, &lt;code&gt;background&lt;/code&gt;, &lt;code&gt;surface&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;All the &lt;code&gt;on*&lt;/code&gt; counterparts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;brightness&lt;/code&gt; for light/dark&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dashboard (&lt;a href="https://app.fskin.dev" rel="noopener noreferrer"&gt;app.fskin.dev&lt;/a&gt;) gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project management&lt;/li&gt;
&lt;li&gt;Skin editor with JSON view&lt;/li&gt;
&lt;li&gt;Team collaboration with role-based permissions&lt;/li&gt;
&lt;li&gt;API key management (auto-generated per project)&lt;/li&gt;
&lt;li&gt;Publishing with confirmation + version history&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A lot of cool features still coming
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 Package: &lt;a href="https://pub.dev/packages/flutter_skin" rel="noopener noreferrer"&gt;pub.dev/packages/flutter_skin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🖥️ Dashboard: &lt;a href="https://app.fskin.dev" rel="noopener noreferrer"&gt;app.fskin.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 Docs: &lt;a href="https://docs.fskin.dev" rel="noopener noreferrer"&gt;docs.fskin.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 GitHub: github.com/koukibadr/flutter_skin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;It's still on alpha track.&lt;/strong&gt;&lt;br&gt;
I'd love feedback from anyone who tries it — bug reports, feature requests.&lt;br&gt;
don't forget to thumbs up our package on pub.dev 🥸 👀.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>LiveData vs Flows</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Thu, 30 Apr 2026 10:05:12 +0000</pubDate>
      <link>https://dev.to/koukibadr/livedata-vs-flows-4l3k</link>
      <guid>https://dev.to/koukibadr/livedata-vs-flows-4l3k</guid>
      <description>&lt;p&gt;A modern mobile application is expected to be as reactive as possible, otherwise it will lag behind other apps and users won't find it attractive.&lt;br&gt;
For this, the Kotlin team has provided many tools and APIs like Flows and LiveData.&lt;br&gt;
If you develop Kotlin apps, you already know LiveData (otherwise, we'll judge you 😄). LiveData is a stream of data that lets developers implement a reactive flow between a producer (the class that emits data) and its consumers. But this definition also applies to StateFlow and SharedFlow — so what is the difference between them?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initialization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first difference is how we initialize both classes.&lt;br&gt;
With LiveData, no initial value is required:&lt;br&gt;
&lt;code&gt;private val _myData = MutableLiveData&amp;lt;Int&amp;gt;()&lt;/code&gt;&lt;br&gt;
Meanwhile, StateFlow requires an initial value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;_myData&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MutableStateFlow&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;(&lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;_myData&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MutableStateFlow&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The examples above show a direct translation from LiveData to StateFlow — you either make the type nullable or provide a dummy initial value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lifecycle&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The second difference is lifecycle awareness.&lt;br&gt;
LiveData observers are tied to a Lifecycle object and clean up after themselves when their associated lifecycle is destroyed. If the observer is tied to an Activity or Fragment, it is automatically stopped when that Activity or Fragment is paused or destroyed — preventing memory leaks out of the box.&lt;/p&gt;

&lt;p&gt;StateFlow observers, on the other hand, are not lifecycle-aware by default, meaning we as developers need to manage the observer's lifecycle manually. The recommended solution is to collect the StateFlow inside repeatOnLifecycle, which makes the collection lifecycle-aware and behaves similarly to a LiveData observer.&lt;/p&gt;

&lt;p&gt;Happy Coding! 🤟&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Optimizing Performance in Android Apps with Kotlin</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Thu, 12 Feb 2026 10:08:43 +0000</pubDate>
      <link>https://dev.to/koukibadr/optimizing-performance-in-android-apps-with-kotlin-51l0</link>
      <guid>https://dev.to/koukibadr/optimizing-performance-in-android-apps-with-kotlin-51l0</guid>
      <description>&lt;p&gt;Optimizing the performance of your Android applications is crucial for providing a smooth and responsive user experience. Kotlin, with its concise syntax and powerful features, offers several ways to enhance the performance of your apps. In this article, we'll explore various techniques and best practices to help you get the most out of your Android applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Profiling Your App
&lt;/h2&gt;

&lt;p&gt;Before you can optimize your app, you need to understand where the performance bottlenecks are. Android Studio provides powerful profiling tools that can help you identify issues related to CPU usage, memory allocation, and network activity.&lt;/p&gt;

&lt;p&gt;CPU Profiling: Use the CPU profiler to identify methods that are consuming the most CPU resources. Look for methods that are called frequently or take a long time to execute.&lt;br&gt;
Memory Profiling: The memory profiler can help you track memory allocations and identify memory leaks. Pay attention to objects that are being created frequently or not being released properly.&lt;br&gt;
Network Profiling: Use the network profiler to monitor network requests and identify any delays or inefficiencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory Management
&lt;/h2&gt;

&lt;p&gt;Efficient memory management is essential for preventing memory leaks and reducing the risk of your app being killed by the system due to high memory usage.&lt;/p&gt;

&lt;p&gt;Use ViewHolder Pattern: When working with RecyclerView, use the ViewHolder pattern to recycle views and reduce the overhead of view inflation.&lt;br&gt;
Avoid Memory Leaks: Be cautious with anonymous inner classes and non-static inner classes, as they can hold references to their outer class instances, leading to memory leaks.&lt;br&gt;
Use Kotlin's Null Safety: Kotlin's null safety features can help you avoid null pointer exceptions and manage memory more efficiently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Efficient Coding Practices
&lt;/h2&gt;

&lt;p&gt;Writing efficient code is key to optimizing the performance of your Android apps.&lt;/p&gt;

&lt;p&gt;Use Kotlin Coroutines: Coroutines allow you to write asynchronous code in a sequential manner, making it easier to manage and optimize.&lt;br&gt;
Leverage Inline Functions: Inline functions can reduce the overhead of function calls, improving performance in hot code paths.&lt;br&gt;
Optimize Loops: Avoid performing expensive operations inside loops. Instead, precompute values and reuse them when possible.&lt;br&gt;
Use Efficient Data Structures: Choose the right data structures for your use case. For example, use Set for fast lookups and Map for key-value pairs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By following these techniques and best practices, you can significantly improve the performance of your Android applications. Remember that performance optimization is an ongoing process, and it's important to continuously profile and optimize your app as it evolves.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>development</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Bottom_Picker new Major version</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Sat, 26 Jul 2025 10:50:26 +0000</pubDate>
      <link>https://dev.to/koukibadr/bottompicker-new-major-version-2kee</link>
      <guid>https://dev.to/koukibadr/bottompicker-new-major-version-2kee</guid>
      <description>&lt;p&gt;🎉 Exciting News for Flutter Devs! 🎉&lt;/p&gt;

&lt;p&gt;We're thrilled to announce a major update to our beloved bottom_picker package! We've bumped the version all the way to 4.0.0! 🚀&lt;/p&gt;

&lt;p&gt;This release is packed with awesome new features and improvements for your Flutter applications, including:&lt;/p&gt;

&lt;p&gt;✨ Filter Options: &lt;br&gt;
Now you can easily add filters to unpickable or blocked days in your date pickers! Say goodbye to those unwanted dates. 🗓️&lt;/p&gt;

&lt;p&gt;➕ Year Picker: Selecting a year just got a whole lot easier with the new dedicated year picker. ⚙️&lt;/p&gt;

&lt;p&gt;🛠️ Enhanced Title Flexibility: We've transformed the pickerTitle into an optional header builder callback, giving you full control over the picker's header!&lt;/p&gt;

&lt;p&gt;But wait, there's more! We've also squashed a pesky bug where selectedItemIndex parameters weren't working correctly for simple pickers. 🐛&lt;/p&gt;

&lt;p&gt;⚠️ Breaking Changes Alert! ⚠️&lt;/p&gt;

&lt;p&gt;Due to the significant enhancements, especially the title customization via the new callback, this release includes potential breaking changes.&lt;br&gt;
All attributes that are related to the old title, description and closing widget are now deprecated if you're planning to upgrade to 4.0.0 version.&lt;/p&gt;

&lt;p&gt;We believe these changes will greatly improve the flexibility and usability of bottom_picker in your Flutter projects.&lt;/p&gt;

&lt;p&gt;Check out the full release notes and upgrade guide here: &lt;a href="https://pub.dev/packages/bottom_picker" rel="noopener noreferrer"&gt;Bottom_Picker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#flutter #dart #bottompicker #mobiledev #opensource&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Say "Oui" to Global Users: Localize Your Flutter App with Gemini</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Sun, 09 Jun 2024 15:09:41 +0000</pubDate>
      <link>https://dev.to/koukibadr/fast-localization-with-gemini-on-flutter-4keh</link>
      <guid>https://dev.to/koukibadr/fast-localization-with-gemini-on-flutter-4keh</guid>
      <description>&lt;p&gt;Why localize your app?  Think about it, ignoring international users is like making a fire meme and forgetting to post it online - what's the point?  But don't worry, we hear you screaming Fear not, for Gemini is here to  be your Yoda in the localization swamp.  We'll tackle all your app translation woes, so buckle up and get ready for a smooth ride and dive deep with us in this post!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is localization and How it's done?&lt;/strong&gt;&lt;br&gt;
To conquer the globe, you need some serious localization skills.&lt;/p&gt;

&lt;p&gt;Think of locales as your app's Rosetta Stone – they unlock the ability to understand different languages, date formats (no more confusing July 4th with 4th of July!), currencies, and all those cultural nuances. So, French users see euros and "dd/mm/yyyy," while Spanish speakers get their pesos and the familiar "dd/mm/aaaa."&lt;/p&gt;

&lt;p&gt;Now, managing these locales can feel like herding cats. But fear not, there's a better way than wrestling with JSON files (because, let's be honest, that's a recipe for disaster).&lt;br&gt;
Enter the dynamic duo of flutter_localizations and intl – these packages are your knight in shining armor, recommended by the official Flutter people themselves.&lt;/p&gt;

&lt;p&gt;Here's the battle plan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recruit your allies: Integrate flutter_localizations and intl into your app.&lt;/li&gt;
&lt;li&gt;Set up your command center: Create a l10n.yaml config file.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;arb-dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;lib/l10n&lt;/span&gt;
&lt;span class="na"&gt;template-arb-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_en.arb&lt;/span&gt;
&lt;span class="na"&gt;output-localization-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app_localizations.dart&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Deploy your troops: Create .arb files under the lib/l10n folder (or a location of your choosing, just update the config file accordingly). These .arb files will house all your app's localized strings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this battle plan in place, you'll be a localization champion in no time, ready to take your app to a global phenomenon!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With Gemini&lt;/strong&gt;&lt;br&gt;
Feeling overwhelmed by app localization? Manually translating endless lines for every language can be a daunting task. But fear not, developer! Google Gemini has your back with the arb_translate package.&lt;/p&gt;

&lt;p&gt;Think of arb_translate as your personal localization assistant. You simply write the default translations, and then unleash the power of Gemini! With a single arb_translate command, Gemini translates all the other languages you need, taking context (e-commerce, cars, coding?) into account for natural-sounding translations.&lt;/p&gt;

&lt;p&gt;Ditch the manual translation grind and let Gemini be your localization hero. It's a much more efficient way to conquer the world with your app! Now that you've got a taste of Gemini's localization magic.&lt;/p&gt;

&lt;p&gt;why not jump in and try it for yourself you can finally overcome the language barrier and reach new heights, just like Lara Croft raiding tombs and uncovering hidden treasures across the globe!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.flutter.dev/ui/accessibility-and-internationalization/internationalization" rel="noopener noreferrer"&gt;https://docs.flutter.dev/ui/accessibility-and-internationalization/internationalization&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/arb_translate" rel="noopener noreferrer"&gt;https://pub.dev/packages/arb_translate&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>gemini</category>
    </item>
    <item>
      <title>EasyDeps : brick-ception</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Sun, 12 May 2024 16:34:56 +0000</pubDate>
      <link>https://dev.to/koukibadr/easydeps-brick-ception-2jcl</link>
      <guid>https://dev.to/koukibadr/easydeps-brick-ception-2jcl</guid>
      <description>&lt;p&gt;The Flutter ecosystem is abuzz with a new framework – Mason. Boasting over 300 bricks and counting, it's a construction zone of awesome functionality. But what if we could take things a step further? Enter the meta-brick, a brick built specifically for other brick developers.&lt;/p&gt;

&lt;p&gt;This isn't your average UI brick. It's about streamlining the workflow for fellow brick builders. Imagine a world without manually managing dependencies in each brick. This innovation offers centralized dependency management through a dedicated package.json file, keeping your code clean and organized.&lt;/p&gt;

&lt;p&gt;Picture this: You integrate your brick into a Flutter project, and poof! All necessary dependencies are installed automatically. That's the magic of this brick.&lt;br&gt;
Additionally, it champions project structure, residing within a dedicated hooks directory for a minimalist's dream layout.&lt;/p&gt;

&lt;p&gt;Ready to unlock this developer superpower? Buckle up – we'll be diving into &lt;a href="https://brickhub.dev/bricks/easy_deps/0.1.0+1" rel="noopener noreferrer"&gt;EasyDeps&lt;/a&gt;, with clear instructions that demystify the process. It's recursion made simple, without the headache of explaining Inception.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this project work?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation:
&lt;/h3&gt;

&lt;p&gt;Get your brick on board with mason add &lt;a href="https://brickhub.dev/bricks/easy_deps/0.1.0+1" rel="noopener noreferrer"&gt;easy_deps&lt;/a&gt; (or go global with mason add -g easy_deps).&lt;/p&gt;

&lt;h3&gt;
  
  
  Generation:
&lt;/h3&gt;

&lt;p&gt;Unleash the magic with mason make &lt;a href="https://brickhub.dev/bricks/easy_deps/0.1.0+1" rel="noopener noreferrer"&gt;easy_deps&lt;/a&gt;. This brick is low-maintenance – no pesky questions to slow you down.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependency Nirvana:
&lt;/h3&gt;

&lt;p&gt;Boom! You've got yourself a packages.json file nestled within your brick's folder.&lt;/p&gt;

&lt;p&gt;But Wait, There's More!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://brickhub.dev/bricks/easy_deps/0.1.0+1" rel="noopener noreferrer"&gt;easy_deps&lt;/a&gt; doesn't stop at a fancy package.json. It also introduces some undercover heroes:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;package_installation_handler&lt;/code&gt;: This bad boy parses your package.json, ensuring all the dependencies are listed and ready for action.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;post_gen.dart&lt;/code&gt;: In the early days, easy_deps might be a little overzealous, replacing your existing post_gen.dart It simply includes the call to the package_installation_handler code, ensuring your dependencies are installed smoothly.&lt;/p&gt;

&lt;p&gt;Don't worry the package.json will be deleted once your brick is integrated into the app project, It's all temporary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here's the good stuff:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Manual configuration?
&lt;/h3&gt;

&lt;p&gt;More like "manual vacation!" This bad boy handles it all, so you can spend your time on more important things.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cleanliness
&lt;/h3&gt;

&lt;p&gt;The dependency handler chills in the hooks directory, keeping your project looking like a masterpiece.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dedicated package.json for dependencies?
&lt;/h3&gt;

&lt;p&gt;Think of it as your own personal spice rack – everything neatly organized and ready to flavor your app just right. No more hunting for that elusive sprinkle of unicorn dust dependency.&lt;/p&gt;

&lt;p&gt;Well, that's just next-level meta, who are we to judge brick-ception dreams?&lt;/p&gt;

&lt;p&gt;Feel like to contribute to this project? head to github and send me your PRs and Issues &lt;a href="https://github.com/koukibadr/B-Bricks" rel="noopener noreferrer"&gt;https://github.com/koukibadr/B-Bricks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also head to brickhub page to learn more about easy_deps&lt;br&gt;
&lt;a href="https://brickhub.dev/bricks/easy_deps/0.1.0+1" rel="noopener noreferrer"&gt;https://brickhub.dev/bricks/easy_deps/0.1.0+1&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>opensource</category>
      <category>mason</category>
    </item>
    <item>
      <title>Internationalization? More Like International-WIN-ization with Flutter Mason! (Effortless Internationalization)</title>
      <dc:creator>Kouki Badr</dc:creator>
      <pubDate>Sun, 05 May 2024 10:42:47 +0000</pubDate>
      <link>https://dev.to/koukibadr/internationalization-more-like-international-win-ization-with-flutter-mason-effortless-internationalization-349e</link>
      <guid>https://dev.to/koukibadr/internationalization-more-like-international-win-ization-with-flutter-mason-effortless-internationalization-349e</guid>
      <description>&lt;p&gt;Flutter devs, ever feel like you're stuck in a loop localization drudgery?&lt;/p&gt;

&lt;p&gt;Fear not, weary coder! Even if you're not a Flutter master (yet!), this article will have you saying "I'm beginning to see the pattern...".&lt;/p&gt;

&lt;p&gt;We all know Flutter is fast compared to native development (looking at you, Android Studio!), but buckle up because Flutter Mason is about to blow your development speed right out of the water. ️  This article will be your guide to the specific Flutter Mason trick that'll make ARB localization a breeze.&lt;/p&gt;

&lt;h2&gt;
  
  
  Localiz
&lt;/h2&gt;

&lt;p&gt;As it's description mentioned "Ease and Speed up Internationalizing Flutter Apps" this brick integrate all the arb dependencies, configuration and arb files for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  How ? 🤔
&lt;/h3&gt;

&lt;p&gt;Alright, installation time! But before we dive in, here's a friendly reminder:&lt;/p&gt;

&lt;p&gt;We've got two options for getting Mason and mason_cli on your machine. For the command-line cowboys,there's the classic &lt;br&gt;
&lt;code&gt;dart pub global activate mason_cli&lt;/code&gt;.&lt;br&gt;
But if you're a true programmer of culture (and a Homebrew user), you can unleash the power of &lt;br&gt;
&lt;code&gt;brew tap felangel/mason; brew install mason&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Finally, the moment we've all been waiting for: installing the localiz brick.&lt;br&gt;
You can do this locally with &lt;code&gt;mason add localiz&lt;/code&gt; or go full global dominance with &lt;code&gt;mason add -g localiz&lt;/code&gt;. The choice is yours, but choose wisely!&lt;/p&gt;
&lt;h3&gt;
  
  
  Use it
&lt;/h3&gt;

&lt;p&gt;All you need to do now it to use it on your project&lt;br&gt;
&lt;code&gt;mason make localiz&lt;/code&gt;&lt;br&gt;
this will trigger the brick, and it will ask you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Choose language to include &lt;span class="k"&gt;in &lt;/span&gt;your app?
  ◯  English &lt;span class="o"&gt;(&lt;/span&gt;en&lt;span class="o"&gt;)&lt;/span&gt;
  ◯  Arabic &lt;span class="o"&gt;(&lt;/span&gt;ar&lt;span class="o"&gt;)&lt;/span&gt;
  ◯  Chinese &lt;span class="o"&gt;(&lt;/span&gt;zh-CN&lt;span class="o"&gt;)&lt;/span&gt;
  ◯  Spanish &lt;span class="o"&gt;(&lt;/span&gt;es&lt;span class="o"&gt;)&lt;/span&gt;
  ◯  French &lt;span class="o"&gt;(&lt;/span&gt;fr-FR&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it's a multiple selection so use the spacebar to select the languages you want to include when localizing your app&lt;/p&gt;

&lt;p&gt;after this the brick will ask you which language of those you select it's the default and will act like the arb template reference.&lt;/p&gt;

&lt;p&gt;That's it! Now you can high-five yourself, commit your changes, push it to the repo, mark your Jira ticket as "DONE" with the smug satisfaction of a champion.&lt;/p&gt;

&lt;p&gt;The localiz brick takes care of everything: installing those pesky packages (intl, flutter_localizations), generating the l10n.yaml config file with your default language, and even creates the l10n folder within your lib directory pre-populated with all the languages you selected.&lt;/p&gt;

&lt;p&gt;Basically, it saves you a ton of time on tedious setup, freeing you up to focus on the real coding magic. Because, let's be honest, life is way too short to be wrangling ARB files manually.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>mason</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
