<?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: GeekyAnts</title>
    <description>The latest articles on DEV Community by GeekyAnts (geekyants).</description>
    <link>https://dev.to/geekyants</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%2Forganization%2Fprofile_image%2F12611%2F12ba258b-c1e8-4802-9a86-9447eacb706a.png</url>
      <title>DEV Community: GeekyAnts</title>
      <link>https://dev.to/geekyants</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/geekyants"/>
    <language>en</language>
    <item>
      <title>From Prompting to Process: What Changed When Flutter Shipped Agent Skills</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Mon, 28 Sep 2026 11:44:01 +0000</pubDate>
      <link>https://dev.to/geekyants/from-prompting-to-process-what-changed-when-flutter-shipped-agent-skills-38p9</link>
      <guid>https://dev.to/geekyants/from-prompting-to-process-what-changed-when-flutter-shipped-agent-skills-38p9</guid>
      <description>&lt;p&gt;Google is starting to ship Flutter's engineering workflows as machine-readable guidance for AI agents. It may look like another AI feature, but it hints at a much bigger shift in how teams build with Flutter.&lt;/p&gt;

&lt;p&gt;The Consistency Problem&lt;/p&gt;

&lt;p&gt;Over the past few years, AI coding tools like Cursor, Claude Code, Copilot, and OpenCode have become part of many developers' daily workflows. They produce code, explain unfamiliar APIs, write tests, and navigate large codebases with impressive accuracy.&lt;/p&gt;

&lt;p&gt;But if you have been using them on a reasonably large project, you have probably noticed something.&lt;/p&gt;

&lt;p&gt;They are not very consistent.&lt;/p&gt;

&lt;p&gt;Ask an AI to implement the same feature in two different sessions, and there's a good chance you will get two different approaches. Switch models, and the implementation changes again. Sometimes it follows the latest framework recommendations. Other times, it relies on outdated patterns.&lt;/p&gt;

&lt;p&gt;Most teams respond the same way: write better prompts, add repository rules, or create a custom skill.md files to steer the agent toward the right decisions.&lt;/p&gt;

&lt;p&gt;We took the same approach by documenting our architecture, coding conventions, review expectations, and engineering practices as custom Skills. They made the agent noticeably more consistent.&lt;/p&gt;

&lt;p&gt;So when Flutter announced official Agent Skills, my first reaction was not: "How do we use them?" It was: "If we already have our own Skills, what problem are Flutter's official Skills actually solving?"&lt;/p&gt;

&lt;p&gt;That question turned into a couple of experiments.&lt;/p&gt;

&lt;p&gt;Three Layers of AI-Assisted Development&lt;/p&gt;

&lt;p&gt;Looking back, Flutter's recent AI investments weren't isolated features. They were building on each other.&lt;/p&gt;

&lt;p&gt;First came Rules, giving teams a way to define project-specific conventions and preferences.&lt;/p&gt;

&lt;p&gt;Then came Model Context Protocol (MCP), allowing AI agents to inspect, debug, and interact with running Flutter applications instead of reasoning purely from static code.&lt;/p&gt;

&lt;p&gt;And then came Agent Skills.&lt;/p&gt;

&lt;p&gt;If Rules tell an agent how your team works, and MCP tells it what's happening inside your application, Agent Skills answer a different question: how does Flutter itself recommend solving this problem?&lt;/p&gt;

&lt;p&gt;That is the important shift.&lt;/p&gt;

&lt;p&gt;Flutter is now versioning its engineering workflows alongside the framework itself. Instead of relying entirely on what an AI model happened to learn during training, agents can follow workflows maintained by the Flutter team.&lt;/p&gt;

&lt;p&gt;Today, those workflows cover areas like:&lt;/p&gt;

&lt;p&gt;Localization&lt;br&gt;
Responsive layouts&lt;br&gt;
Routing&lt;br&gt;
Widget and unit testing&lt;br&gt;
Static analysis&lt;br&gt;
JSON serialization&lt;br&gt;
Platform integration&lt;br&gt;
Architecture best practices&lt;/p&gt;

&lt;p&gt;In other words, Flutter is shipping its engineering knowledge as structured workflows.&lt;/p&gt;

&lt;p&gt;That naturally led to the next question: does this actually change how an AI agent behaves?&lt;/p&gt;

&lt;p&gt;I ran two experiments to find out.&lt;/p&gt;

&lt;p&gt;First Experiment: Declarative Routing&lt;/p&gt;

&lt;p&gt;It is one of those features where there is not just one thing to do. Depending on the prompt, an AI could jump straight into writing routes, miss platform-specific configuration, skip deep linking altogether, or recommend an approach based on what it learned during training rather than Flutter's latest guidance.&lt;/p&gt;

&lt;p&gt;So I kept the prompt intentionally simple:&lt;/p&gt;

&lt;p&gt;"Set up declarative routing for this Flutter application."&lt;/p&gt;

&lt;p&gt;I wanted to see how the agent would approach the problem before I told it how to solve it.&lt;/p&gt;

&lt;p&gt;The first thing it did caught my attention.&lt;/p&gt;

&lt;p&gt;Before generating an implementation plan, it explicitly selected the flutter-setup-declarative-routing skill.&lt;/p&gt;

&lt;p&gt;Show Image&lt;/p&gt;

&lt;p&gt;From that point on, it was not about figuring out a solution; it was following Flutter's own workflow.&lt;/p&gt;

&lt;p&gt;That was the interesting part.&lt;/p&gt;

&lt;p&gt;Without Agent Skills, the implementation depends on the model's reasoning and whatever Flutter knowledge it has internalized. With Agent Skills, the framework itself becomes the starting point.&lt;/p&gt;

&lt;p&gt;What happens when Flutter's Skills and our own Skills are both available?&lt;/p&gt;

&lt;p&gt;I tested this with a login screen.&lt;/p&gt;

&lt;p&gt;It needed:&lt;/p&gt;

&lt;p&gt;Flutter's localization workflow&lt;br&gt;
Our project conventions for authentication, repositories, dependency injection, and state management&lt;/p&gt;

&lt;p&gt;I kept the prompt simple and let the agent decide how to approach it -&lt;/p&gt;

&lt;p&gt;"Implement a login screen for this application. Follow the existing project architecture and add localization for all user-facing strings.&lt;/p&gt;

&lt;p&gt;It picked the right source every time.&lt;/p&gt;

&lt;p&gt;For localization, it used Flutter's official Skill. For everything related to our application architecture, it followed our custom Skills. I did not have to tell it which one to use or write a carefully engineered prompt.&lt;/p&gt;

&lt;p&gt;The two sets of Skills worked together naturally. Flutter handled the framework guidance, while our repository continued to define how our application was built.&lt;/p&gt;

&lt;p&gt;Show Image&lt;/p&gt;

&lt;p&gt;Why This Matters: A Floor, Not a Finish Line&lt;/p&gt;

&lt;p&gt;So, what actually changed?&lt;/p&gt;

&lt;p&gt;Flutter is taking ownership of its engineering expertise.&lt;/p&gt;

&lt;p&gt;Engineering teams no longer need to teach AI how Flutter expects routing, localization, responsive layouts, or testing to be implemented. Flutter now ships that knowledge itself.&lt;/p&gt;

&lt;p&gt;That removes a significant amount of duplication. Instead of every team maintaining its own version of Flutter best practices inside prompts or custom Skills, the official workflows become the source of truth.&lt;/p&gt;

&lt;p&gt;Even better, those workflows evolve alongside Flutter. As recommendations change, the official Skills change too, and every compatible AI agent benefits automatically.&lt;/p&gt;

&lt;p&gt;Of course, that's only half the story.&lt;/p&gt;

&lt;p&gt;Flutter's Agent Skills provide a strong foundation, but they do not replace your organization's architecture, coding standards, or business-specific workflows. Those remain your responsibility, and that is exactly how it should be.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;Looking back, Flutter's recent AI features fit together surprisingly well.&lt;/p&gt;

&lt;p&gt;Rules capture how your team works. MCP gives agents runtime context. Agent Skills teach them how Flutter itself expects problems to be solved. Custom Skills layer on everything unique to your organization.&lt;/p&gt;

&lt;p&gt;Together, they reduce the amount of engineering knowledge an AI has to infer. That is the real significance of Flutter's recent AI investments. Engineering knowledge is becoming explicit, versioned, reusable, and maintained by the people best positioned to own it.&lt;/p&gt;

&lt;p&gt;Today's skill library covers foundational workflows, but it already hints at what's possible. Imagine Skills for performance profiling, DevTools workflows, accessibility audits, plugin development, migrations, or advanced rendering patterns. Every new skill moves another piece of framework knowledge out of documentation and into a reusable workflow.&lt;/p&gt;

&lt;p&gt;The answer to how much of Flutter an agent should really guess keeps shrinking with every release.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>ai</category>
      <category>promptengineering</category>
      <category>agents</category>
    </item>
    <item>
      <title>Feature Flags as Technical Debt: The Cleanup Nobody Schedules</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Mon, 28 Sep 2026 08:46:47 +0000</pubDate>
      <link>https://dev.to/geekyants/feature-flags-as-technical-debt-the-cleanup-nobody-schedules-1j9o</link>
      <guid>https://dev.to/geekyants/feature-flags-as-technical-debt-the-cleanup-nobody-schedules-1j9o</guid>
      <description>&lt;p&gt;Feature flags are one of the cheapest tools in engineering to adopt and one of the most expensive to leave unmanaged. Teams use them for gradual rollouts, A/B tests, kill switches, and gating unfinished work, but few teams have a matching process for removing them once they have served their purpose. As a result, flags that were meant to be temporary become permanent, adding unnecessary complexity to the codebase.&lt;/p&gt;

&lt;p&gt;This article explains why flag cleanup gets skipped and why it creates a real engineering cost. It also walks through a staleness-detection implementation, a flag-removal exercise, and a practical checklist for managing flags across their full lifecycle, from creation to removal.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Flags Are Easy to Add and Hard to Remove&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Adding a flag is a small, fast PR. Wrapping a block of code in a conditional and wiring it to a config value takes minutes, and it ships in the same PR as the feature it gates — there's no separate approval step, no extra review, no reason for anyone to push back. Removing a flag involves a different kind of work. You have to find every place it is checked, including references in logging, analytics, and monitoring code, confirm which branch is now permanently "on" or "off," delete the dead branch, update or delete the tests that covered it, and verify that nothing downstream depends on the old behavior. This multi-step effort competes with new feature work for the same sprint capacity, so cleanup often gets pushed to a later sprint until the flag becomes a permanent part of the codebase.&lt;/p&gt;

&lt;p&gt;There's also a confidence problem. Once a flag has been live for months, the person who added it may have moved teams, changed roles, or forgotten why it was added. Removing the conditional can feel risky when its dependencies are unclear, so teams may leave it in place. That decision can turn a two-week release flag into a permanent part of the codebase.&lt;/p&gt;

&lt;p&gt;Underneath both of these is a structural gap: a flag rarely comes with a ticket, an expiry date, or a named owner responsible for its removal. By default, creating a flag does not create a corresponding task to revisit it later. Without documented future work, the flag can remain in place. Meanwhile, teams add new flags every sprint while removing few of the old ones, so the backlog grows and cleanup becomes more complex as additional flags enter the same code paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Flag Lifecycle&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The diagram below lays out the full path a flag should take, from creation to retirement. The critical fork sits in the middle of the diagram: once a flag reaches "stable at 100%," it either gets caught by an automated staleness check and routed to a removal PR, or it gets ignored and drifts into permanent technical debt. Most flags fail at exactly this point — not because removal is technically difficult, but because nothing in the default engineering workflow forces the question to be asked. Without an automated trigger, a flag can sit at "stable" for years with nobody ever explicitly deciding to leave it that way; it simply never comes up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8qokj4l5h2e5loqsajio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8qokj4l5h2e5loqsajio.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Figure 1: The feature flag lifecycle, from creation through rollout to either scheduled removal or stale limbo.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why This Is a Real Cost, Not Just Clutter&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Each independent binary flag can double the number of possible runtime states. A function gated by three independent flags can have up to eight possible states, but teams may have designed or &lt;a href="https://geekyants.com/engineering/quality-assurance/functional-testing" rel="noopener noreferrer"&gt;&lt;strong&gt;tested&lt;/strong&gt;&lt;/a&gt; only a subset of those combinations. The remaining states can introduce interactions that were not considered during development or testing.&lt;/p&gt;

&lt;p&gt;Stale flags can create bugs through untested interactions. Two flags that are each considered "basically always on" can still interact in a combination the team did not anticipate. If the team assumes that only one meaningful state is live, that interaction may not be covered during testing or code review and can surface only under production traffic.&lt;/p&gt;

&lt;p&gt;New engineers may avoid code affected by unfamiliar flags. When it is unclear which flags are critical and which can be removed, team members may work around that code rather than risk breaking an unknown dependency. This can slow down simple changes and introduce workarounds that add further complexity.&lt;/p&gt;

&lt;p&gt;The number of dependencies can grow the longer a flag remains in place. Flag checks can extend into related systems, including analytics events tied to flag state, log lines that reference the flag, monitoring dashboards built around it, and configurations in other services. As these dependencies accumulate, removing the flag can require changes across several parts of the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Not All Flags Are the Same&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A major reason cleanup gets mishandled is that teams treat every flag the same, even though the appropriate lifespan depends on why the flag exists. Classifying a flag at creation establishes its expected lifespan and removal requirements before the original context is lost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foa6ishiuwda41of87lzk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foa6ishiuwda41of87lzk.png" alt=" " width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;release flag&lt;/strong&gt; usually lasts from a few days to a few weeks and is used to gate an in-progress feature during development and rollout. Its cleanup urgency is high, so it should be removed once the feature has reached 100% rollout and the release has stabilized. An &lt;strong&gt;experiment flag&lt;/strong&gt; typically remains active only for the duration of a test, such as an A/B experiment or a gradual, data-driven rollout. Its cleanup urgency is also high, and it should be removed as soon as the experiment concludes, regardless of the outcome. An &lt;strong&gt;ops or kill-switch flag&lt;/strong&gt;, by contrast, is designed to remain in place indefinitely. It acts as a manual override for risky dependencies or emergency controls, so it does not need immediate removal. Instead, it should be reviewed periodically to confirm that it is still necessary and working as intended.&lt;/p&gt;

&lt;p&gt;This highlights a common cleanup problem: a release or experiment flag with a short intended lifespan can receive the same caution as an ops kill switch designed to remain in place. That mismatch can turn a two-week flag into a permanent one.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Building the Staleness Detector&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The checklist below recommends automating staleness detection, so it helps to show what that implementation looks like. The following example presents the core logic, simplified for readability. In practice, it receives data from the flag provider in use, such as LaunchDarkly, Unleash, or a homegrown configuration table, with each flag providing a rollout percentage, type, and the length of time its state has remained unchanged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz0d8rbrnjwij86ayseaw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz0d8rbrnjwij86ayseaw.png" alt=" " width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two design choices here matter more than the code itself:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thresholds are per-type, not global.&lt;/strong&gt; A single "flag unchanged for 90 days" rule either fires constantly on ops flags that are correctly untouched, or lets release flags rot for far too long. Splitting the threshold by type — pulled directly from the classification the team should already be doing at creation — makes the report something people trust instead of something they learn to ignore.&lt;/p&gt;

&lt;p&gt;The report identifies UNASSIGNED owners. An unowned stale flag has no person or team responsible for acting on the report, which can leave it in the codebase without a clear path to removal. Surfacing that ownership gap instead of defaulting to "team lead" makes responsibility for cleanup visible.&lt;/p&gt;

&lt;p&gt;Wiring this into a weekly Slack post or a lightweight internal dashboard, including a spreadsheet as a starting point, turns staleness into something the team reviews on a fixed cadence rather than discovers during an unrelated investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Removing a Stale Flag: A Worked Example&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Detection is only half the problem. Deleting a flag safely requires a defined procedure because missed dependencies can create production issues. The sequence below shows how to remove a release flag that has remained at 100% for several weeks, using a checkout-discount flag as an example.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Confirm the resolved state, not just the current one.&lt;/strong&gt; Check the flag's rollout history, not just its current value — a flag sitting at 100% today that was flipped back to 0% twice in the last month is not actually stable, regardless of what the staleness report says this week.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search for every reference, not just the obvious one.&lt;/strong&gt; A project-wide search for the flag's key (checkout_discount_v2) can reveal references beyond the if branch in the checkout service, including a log line that prints the flag's value, an analytics event property, and a conditional in a monitoring dashboard's alert query. All of these references need to be accounted for so the cleanup does not leave dead references behind.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Delete the dead branch, not just the flag check.&lt;/strong&gt; Before removal, the code checks the flag and branches between apply_discount_v2(cart) and apply_discount_legacy(cart). After removal, it calls apply_discount_v2(cart) directly, with both the flag check and the unused branch removed. Leaving both branches as dead code "just in case" preserves unnecessary code outside the flag inventory. If apply_discount_legacy has no other callers, remove it as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Remove the tests for the dead branch, not just add tests for the surviving one.&lt;/strong&gt; The legacy-path test coverage is now testing code that no longer exists in any reachable state; leaving it in the suite either silently rots (mocking a function that's been deleted) or keeps a maintenance burden alive for behavior nobody can trigger anymore.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ship it as its own PR, reviewed as a deletion.&lt;/strong&gt; Bundling flag removal into an unrelated feature PR can reduce the attention given to the search results from step 2. A standalone "remove checkout_discount_v2" PR keeps the review focused on deletion. Any addition in that diff warrants additional review. This procedure is often undocumented, which can make cleanup PRs feel riskier than they are.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When Cleanup Doesn't Happen: A Technical Walkthrough
&lt;/h2&gt;

&lt;p&gt;The scenario below illustrates a failure pattern common enough that most teams running flags at any scale will recognize a version of it, even if the specifics differ. A team adds checkout_discount_v2 to gate a new checkout flow. The rollout succeeds within two weeks and reaches 100% — by every functional measure, the flag has done its job. But it stays in the code for over a year, because removal was never written into any ticket and nobody was assigned to come back to it.&lt;/p&gt;

&lt;p&gt;Months later, a second flag, checkout_pricing_experiment, is added to the same checkout path for an unrelated pricing test. It runs after the discount flag: it takes whatever total the discount logic produced and applies an experimental pricing adjustment on top. Individually, each flag was tested and behaved correctly. However, apply_experimental_pricing was written and reviewed under the assumption that total came from apply_discount_legacy. By that point, checkout_discount_v2 had remained at 100% long enough that engineers working on the checkout path no longer considered it a meaningful variable, even though it remained in the code and continued to execute.&lt;/p&gt;

&lt;p&gt;apply_discount_v2 returned a total that had already been floored to two decimal places; apply_discount_legacy had not. apply_experimental_pricing applied a percentage multiplier and then rounded. This worked with apply_discount_legacy's unrounded output but could produce an off-by-one-cent total with apply_discount_v2's pre-rounded output for a narrow set of cart values. This type of bug can escape testing when no test covers the combination of two flags operating on the same code path. The fix required a two-line change to apply rounding consistently in one place. The greater cost came from the bug reaching production and requiring someone to identify a cent-level discrepancy in reconciliation data and trace it through a code path that was not expected to contain two active flags. This is the pattern the checklist below is designed to prevent: the gradual accumulation of untracked complexity that can lead to production issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Build vs. Buy: Tooling Trade-offs&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Teams generally use one of three approaches for flag management, and the right choice depends less on team size than on how comfortable the organization is with an external SaaS dependency in the request path.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;managed feature flag platform&lt;/strong&gt;, such as LaunchDarkly, provides rich targeting rules, built-in audit logs and change history, and features for identifying stale flags or monitoring usage with relatively little setup. The tradeoff is recurring cost, which can increase with seats or monthly active users. It also introduces another network dependency into the request path, and while the platform may identify stale flags, someone still needs to own and act on that cleanup.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;open-source, self-hosted platform&lt;/strong&gt;, such as Unleash, avoids per-seat licensing costs and gives teams greater control over data residency and customization. However, the engineering team becomes responsible for operating the flag service, including uptime, upgrades, maintenance, and scaling. These platforms may also provide fewer built-in insights than managed alternatives unless additional monitoring and reporting are configured.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;homegrown configuration table&lt;/strong&gt; keeps the setup simple because it does not require introducing a separate feature flag platform. Teams can query the data directly and build custom staleness reports, such as the automated cleanup check described above. The downside is that there is usually no dedicated interface or audit trail unless those capabilities are built intentionally. Targeting logic can also spread across the codebase over time if it is not kept centralized.&lt;/p&gt;

&lt;p&gt;The staleness detector shown earlier works with all three approaches because it requires only a list of flags with a rollout percentage and a last-modified timestamp. This keeps the implementation compatible with each approach. Managed platforms may expose this information through a report or webhook, while the other two approaches can use the script above or a similar implementation. The tooling decision affects how much the team needs to build, but each approach still requires a process for detecting stale flags and assigning cleanup work.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;A Practical Checklist for Managing Flag Lifecycle&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Each step below maps directly to a stage in the feature flag lifecycle. Together, they turn the lifecycle from a diagram into a process that teams can follow consistently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Classify at creation.&lt;/strong&gt; Every flag should be tagged as a release, experiment, or ops flag when it is created. This establishes the expected lifespan and removal requirements from the beginning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Assign an owner and expiry.&lt;/strong&gt; Each flag should have a named person or team responsible for it, along with a target removal date, even if that date is approximate. Without clear ownership or a deadline, a flag can remain in the codebase indefinitely without a defined cleanup path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Bake removal into the ticket.&lt;/strong&gt; Flag removal should be included in the original story's definition of done. This prevents cleanup from becoming a separate task that has to compete for priority later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Automate staleness detection.&lt;/strong&gt; Teams should run scheduled checks for flags that have remained at 0% or 100% rollout beyond their type-specific staleness threshold. This makes stale flags visible without relying on someone to remember them manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Maintain a flag inventory.&lt;/strong&gt; A central dashboard should track every live flag, including its type, owner, and age. This gives teams a quick answer to questions such as how many flags are active and which ones may need attention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Establish a recurring review cadence.&lt;/strong&gt; Teams should review flag ownership and staleness data monthly or quarterly. Regular reviews help catch neglected flags before they accumulate into a larger cleanup backlog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Prioritize removal PRs.&lt;/strong&gt; Pull requests that remove obsolete flags should be treated as focused cleanup work. Because these changes primarily remove code rather than add new behavior, they can often have a narrower review scope while reducing unnecessary complexity in the codebase.&lt;/p&gt;

&lt;p&gt;A note on step 2: individual ownership can become outdated when the named owner changes teams or leaves the company. Tying ownership to a service or feature area rather than a specific person provides continuity when personnel change and reduces the risk of flags becoming orphaned.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Closing Thought&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Feature flags are useful, but flag creation represents only part of their lifecycle. A temporary flag without a removal plan can become a permanent addition to the codebase and increase its complexity over time.&lt;/p&gt;

&lt;p&gt;Closing that gap requires a per-type staleness threshold, a script that checks it on a schedule, and a removal procedure that treats deletion PRs as part of planned engineering work. This approach builds removal into the same process as creation, classifies flags by type when they are created, and uses automated staleness checks to identify flags that require attention. Together, these changes make flag removal part of the same engineering process as flag creation.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Make Feature Flag Cleanup Part of the Engineering Lifecycle&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Feature flags work best when removal is treated as part of the same &lt;a href="https://geekyants.com/blog/what-is-the-geekyants-agentic-development-life-cycle-how-adlc-changes-conventional-product-engineering" rel="noopener noreferrer"&gt;&lt;strong&gt;engineering lifecycle&lt;/strong&gt;&lt;/a&gt; as creation and rollout. Clear ownership, type-specific staleness checks, scheduled reviews, and focused removal PRs help teams prevent temporary controls from becoming permanent technical debt. For teams looking to strengthen these practices across deployment, automation, monitoring, and production operations, &lt;a href="https://geekyants.com/engineering/devops" rel="noopener noreferrer"&gt;&lt;strong&gt;GeekyAnts’ DevOps consulting services&lt;/strong&gt;&lt;/a&gt; provide support across the software delivery lifecycle.&lt;/p&gt;

</description>
      <category>techtalks</category>
      <category>devops</category>
      <category>softwaredevelopment</category>
      <category>featureflags</category>
    </item>
    <item>
      <title>The Bug That Doesn't Show Up in Code Review: Why Your Flutter Web App Reloads on Safari</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Mon, 28 Sep 2026 06:46:46 +0000</pubDate>
      <link>https://dev.to/geekyants/the-bug-that-doesnt-show-up-in-code-review-why-your-flutter-web-app-reloads-on-safari-2elp</link>
      <guid>https://dev.to/geekyants/the-bug-that-doesnt-show-up-in-code-review-why-your-flutter-web-app-reloads-on-safari-2elp</guid>
      <description>&lt;p&gt;Demo example app*:* &lt;a href="https://github.com/manuindersekhon/flutter-image-memory-demo" rel="noopener noreferrer"&gt;&lt;strong&gt;github.com/manuindersekhon/flutter-image-memory-demo&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://geekyants.com/en-in/hire-ai-developers" rel="noopener noreferrer"&gt;&lt;strong&gt;AI-assisted teams&lt;/strong&gt;&lt;/a&gt; now ship correct code faster than ever. But this article is about a class of failure that is not in the code at all. It lives in the gap between what the code says and what the device actually does. And that gap is exactly where all the velocity we gained gets eaten back.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Bug Report That Made No Sense&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Some time back, one of our production apps had a leaderboard. A simple, scrollable list of 100+ players, each row with a name, a score, and a 50x50 profile picture. Nothing fancy.&lt;/p&gt;

&lt;p&gt;Then the bug reports started coming in.&lt;/p&gt;

&lt;p&gt;“The leaderboard page keeps refreshing on Safari.” “The app closed by itself on my iPhone while scrolling.” No error in the console. No crash log with a stack trace. Nothing reproducible on our development machines. The page would simply reload on Safari as if the user had pressed refresh, and on &lt;a href="https://geekyants.com/en-in/service/mobile-app/ios-app-development-services" rel="noopener noreferrer"&gt;&lt;strong&gt;iOS the app&lt;/strong&gt;&lt;/a&gt; would just disappear.&lt;/p&gt;

&lt;p&gt;Two different platforms, two different symptoms, and as it turned out, one single bug. One that no code review could have caught.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Code That Passed Review&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here is the code at the centre of it. This is roughly what our leaderboard row looked like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ListTile(
  leading: CircleAvatar(
    radius: 25,
    backgroundImage: NetworkImage(user.avatarUrl),
  ),
  title: Text(user.name),
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Take a moment and review it. It compiles. It is an idiomatic Flutter, straight from the documentation. The analyzer is happy. It renders perfectly on the MacBook and in every demo. Whether a teammate wrote it or an &lt;a href="https://geekyants.com/en-in/ai/ai-agent-development-services" rel="noopener noreferrer"&gt;&lt;strong&gt;AI agent&lt;/strong&gt;&lt;/a&gt; generated it, any of us would have approved this diff.&lt;/p&gt;

&lt;p&gt;Nothing in the code is wrong. The defect only exists at the intersection of three layers that no code-level reviewer is looking at: &lt;em&gt;what the backend serves, what the image decoder does with it, and what the device does when memory runs out.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Layer One: What the URL Actually Returns&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Our users uploaded their profile pictures from their phones. A modern phone camera produces a 12-megapixel image, around 4032x3024 pixels, a few MB of JPEG. Our backend stored it exactly as uploaded, and the avatar URL served it exactly as stored.&lt;/p&gt;

&lt;p&gt;The UI contract says “50 pixel avatar”. The API contract says “whatever the user uploaded”. There is no type system, no lint rule, and no review checklist that connects these two, and that mismatch travels silently all the way to the user's device.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Layer Two: File Size Is Not Memory Size&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is the part of image handling that is easy to forget. A JPEG is a compressed format, but a screen cannot draw compressed bytes. Before anything is rendered, the image is decoded into a raw bitmap: four bytes for every pixel.&lt;/p&gt;

&lt;p&gt;So that 3 MB JPEG from the user's phone becomes 4032 x 3024 x 4 bytes, which is about 46.5 MB of memory. For one avatar. In a 50-pixel circle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And here is the key Flutter behaviour&lt;/strong&gt;: unless you tell it otherwise, &lt;em&gt;Flutter decodes an image at its full intrinsic size,&lt;/em&gt; not at the size of the widget displaying it. The CircleAvatar's 50-pixel constraint never reaches the decoder. The full bitmap is decoded, kept, and scaled down on every frame.&lt;/p&gt;

&lt;p&gt;To verify this, we built a small demo app that recreates the leaderboard and prints what the engine actually holds for each image. This is not theory, this is the app reporting its own image cache:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fymn3g0szwt2qgkrxq6k3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fymn3g0szwt2qgkrxq6k3.png" alt="Chrome demo leaderboard showing Flutter image memory usage with full-size avatar decoding" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo leaderboard in Chrome. The bar at the bottom is the app reporting its own decoded image memory: avatar #1 is held at 4032x3024, 46.51 MB, for a 50px circle.&lt;/p&gt;

&lt;p&gt;Multiply that by a leaderboard. Scrolling through 100+ entries asks the engine for several gigabytes of decoded bitmaps. Flutter's built-in image cache has a 100 MB budget, but that budget only applies to images that are no longer on screen. Images that are currently visible, or kept alive by the layout, are held regardless of it. The cap we were all silently relying on was never going to save us.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Layer Three: Every Platform Has a Ceiling, and They Are All Different&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here is where the story splits by platform, and where “works on my machine” stops being a joke and becomes the actual mechanism of the bug.&lt;/p&gt;

&lt;p&gt;Chrome survives this abuse. It decodes images through a dedicated browser API into memory it can discard and re-decode at will. When we scrolled our naive leaderboard in Chrome, the tab stayed around a few hundred MB and nothing bad happened. This is exactly why the bug never appeared on our development machines.&lt;/p&gt;

&lt;p&gt;Safari has no such decode path. The decoded bitmaps land inside the tab's own web content process, and &lt;strong&gt;WebKit&lt;/strong&gt; enforces a hard memory budget on that process. On the same page, same scroll, Safari's process climbed to four times what Chrome used. Push further, and WebKit does exactly what its source code says it will do: &lt;em&gt;it kills the web content process and reloads the page.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In our stress test, the process crossed 7 GB and was terminated, and the page came back fresh, exactly the “random refresh” our users reported.&lt;/strong&gt; Safari even tells the user politely: “This webpage was reloaded because it was using significant memory.”&lt;/p&gt;

&lt;p&gt;There is also a subtler symptom on iPads and iPhones. Before killing the page, WebKit fights back by purging decoded images. We watched the iOS Safari process balloon, get purged, and keep running with the leaderboard text intact but every avatar blank:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fugfh70yb1fwuajb1i3d0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fugfh70yb1fwuajb1i3d0.png" alt="iOS Safari leaderboard after WebKit memory purge causes profile avatars to disappear" width="800" height="1739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;iOS Safari after WebKit's memory purge: the page survives, but the avatars are silently gone.&lt;/p&gt;

&lt;p&gt;And the native iOS app? Same bug, different executioner. iOS enforces a per-app memory budget through a system called &lt;strong&gt;Jetsam&lt;/strong&gt;. The budget depends on the device, community measurements put it under 1 GB on older iPhones and around 2 GB on mid-range ones. A leaderboard holding a few dozen 46 MB bitmaps alive walks into that limit within a couple of screen-heights of scrolling. &lt;strong&gt;The app is killed by the OS, not by your code.&lt;/strong&gt; There is no Dart exception and no useful stack trace, and your crash reporting tool shows an “out of memory session” at best. &lt;em&gt;That was our mysterious iOS crash.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One bug. Three ceilings. Three completely different symptoms.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Review Never Had a Chance&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now go back to that CircleAvatar snippet and ask: where in the diff is this bug?&lt;/p&gt;

&lt;p&gt;It is not there. The reviewer sees idiomatic widget code. The tests see an image that renders. CI is green. The 46.5 MB number exists only at runtime, on a real device, with real production images. The defect is spread across three systems whose owners never appear in the same pull request: the upload pipeline that stores 12-megapixel photos, the framework default that decodes at intrinsic size, and the platform policy that kills the process.&lt;/p&gt;

&lt;p&gt;This is also why the AI angle matters to us. An agent will write you this exact code, and it will be right by every static standard. An AI reviewer will approve it for the same reason a human does: &lt;em&gt;the evidence is simply not in the artifact being reviewed.&lt;/em&gt; As AI compresses the cost of writing code, the defects that survive migrate to the layers that neither the agent nor the reviewer can see. The cost does not disappear. It moves to a production incident three weeks later, on a device you do not own.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Fix Is One Parameter (and a Better One Upstream)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The immediate fix is embarrassingly small. Flutter lets you tell the decoder what size you actually need:&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="n"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;width:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;height:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;fit:&lt;/span&gt; &lt;span class="n"&gt;BoxFit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;cacheWidth:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;devicePixelRatioOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// CircleAvatar has no sizing hook, so wrap the provider:&lt;/span&gt;
&lt;span class="n"&gt;CircleAvatar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;backgroundImage:&lt;/span&gt; &lt;span class="n"&gt;ResizeImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;NetworkImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nl"&gt;width:&lt;/span&gt; &lt;span class="mi"&gt;150&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;p&gt;With cacheWidth set, the same avatar decodes at 150 pixels instead of 4032. In our demo, that took each image from 46.51 MB down to 0.06 MB, roughly 775 times less memory, with zero visible difference in a 50-pixel circle. The whole leaderboard now fits in less than one megabyte of decoded images:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F39rfqeopi0aufllo80gx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F39rfqeopi0aufllo80gx.png" alt="Optimized leaderboard showing reduced image memory usage with efficient avatar caching" width="800" height="1739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The fixed build: same leaderboard, same photos, 0.8 MB of decoded images in total. The probe shows avatar #1 now decodes at 150x112, 0.06 MB.&lt;/p&gt;

&lt;p&gt;But honestly, the client-side parameter is the band-aid. The &lt;strong&gt;real fix is to never ship a 12-megapixel file to a 50-pixel widget in the first place&lt;/strong&gt;: serve resized images from your CDN or an image proxy. That also fixes what cacheWidth cannot, because the full-size download and the browser-side decode of the original file still happen either way. Fix it at the source and every client, including the ones you have not written yet, gets it for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Making Sure It Never Comes Back&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;A bug that review cannot catch needs guardrails that do not depend on review.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The one we wish we had turned on earlier is &lt;a href="https://geekyants.com/en-in/hire-flutter-developers" rel="noopener noreferrer"&gt;&lt;strong&gt;built into Flutter&lt;/strong&gt;&lt;/a&gt; itself. Set debugInvertOversizedImages to true in your debug builds, and the framework will flip and invert the colours of any image that was decoded significantly larger than its display size, and log the wasted bytes. Our leaderboard lit up like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqj0runs1b00rwznp7qkc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqj0runs1b00rwznp7qkc.png" alt="Flutter leaderboard with debugInvertOversizedImages highlighting oversized decoded avatars" width="800" height="1739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;debugInvertOversizedImages in action: the framework flags every avatar that was decoded far larger than the size it is displayed at.&lt;/p&gt;

&lt;p&gt;Beyond that flag, a few habits close the loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wrap remote images in one shared widget&lt;/strong&gt; (an AppAvatar of your own) that requires a decode size, so the naive version cannot be written casually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test on the smallest-RAM device you actually support&lt;/strong&gt;, with production images, not neat little asset placeholders.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When a “random refresh on Safari” or an “app just closed” report comes in, &lt;strong&gt;put memory on the suspect list before routing and state management.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The most interesting thing about this bug is how ordinary the code was. No clever trick went wrong, no obscure API was misused. A default did exactly what it was documented to do, on inputs nobody in the pull request could see, on devices with limits nobody in the pull request was thinking about.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://geekyants.com/en-in/ai" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;AI&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;has made the code layer cheap. It has not made the other layers cheap.&lt;/em&gt; The asset pipeline, the decoder, the memory ceilings of a five-year-old iPhone, someone on the team still has to own those. The teams that move fastest with AI will not be the ones that generate the most code. They will be the ones who know exactly which questions the diff cannot answer, and go looking for the evidence themselves.&lt;/p&gt;

&lt;p&gt;The demo app used for every number and screenshot in this article is open source, and reproduces the whole story, including the Safari reload: &lt;a href="https://github.com/manuindersekhon/flutter-image-memory-demo" rel="noopener noreferrer"&gt;&lt;strong&gt;github.com/manuindersekhon/flutter-image-memory-demo&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>ai</category>
      <category>webdev</category>
      <category>code</category>
    </item>
    <item>
      <title>Why Legacy Systems Make Business Growth More Expensive: Navigate A Smarter Path to Legacy Modernization</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Wed, 23 Sep 2026 11:53:55 +0000</pubDate>
      <link>https://dev.to/geekyants/why-legacy-systems-make-business-growth-more-expensive-navigate-a-smarter-path-to-legacy-57e</link>
      <guid>https://dev.to/geekyants/why-legacy-systems-make-business-growth-more-expensive-navigate-a-smarter-path-to-legacy-57e</guid>
      <description>&lt;p&gt;Learn how legacy systems make business growth more expensive and how edge-first modernization can remove constraints without replacing the existing system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six Brands, Six Rebuilds, Until We Changed the Equation
&lt;/h2&gt;

&lt;p&gt;A North American restaurant group came to &lt;a href="https://geekyants.com/" rel="noopener noreferrer"&gt;GeekyAnts&lt;/a&gt; with six casual-dining brands and a digital estate. The system encountered challenges every time it needed to change as per the business requirements.&lt;/p&gt;

&lt;p&gt;There was an aging JSP web application, a separate native mobile app for each brand, and separate build and release pipelines for each of the systems. Each brand also had its own web and &lt;a href="https://geekyants.com/service/hire-mobile-app-development-services" rel="noopener noreferrer"&gt;mobile development teams&lt;/a&gt;. A change that should have been made once had to be implemented six times.&lt;/p&gt;

&lt;p&gt;Adding another brand took two to three months, and most of that time was going into creating another app, another pipeline, and duplicated work across the web and mobile teams. The core systems were not the issue since some of the routine tasks like ordering, menus, pricing, and availability were already working in a functional manner.&lt;/p&gt;

&lt;p&gt;The cost was actually spent in the existing digital layer around the system, where every additional brand meant another application, another pipeline, and more duplicated work. We started with a two-page &lt;a href="https://geekyants.com/blog/building-a-proof-of-concept-a-complete-guide-with-implementation-strategies" rel="noopener noreferrer"&gt;proof of concept&lt;/a&gt;. The question that needed to be answered was if the same components could genuinely be shared between web and native mobile. Once this assumption was tested, it gave us the basis to replace the edge while keeping the core systems in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bringing Changes to One Digital Platform Instead of Adding Six New Rebuilds
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiwd8dyvgkly71srxmxwv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiwd8dyvgkly71srxmxwv.png" alt="Digital platform modernization architecture with edge components replaced while core systems are retained" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We focused on the layer where the duplication was happening and built one platform for web and mobile, so that the changes could be made once instead of across six separate brand applications. A shared component library removed repeated development work, while a single mobile app shell let the team configure and roll out new brands instead of building another app from scratch. Over-the-air updates also meant changes could reach users without repeating the full app release cycle for every brand.&lt;/p&gt;

&lt;p&gt;The first brand went live in 6-8 months. After that, a new brand was onboarded in 2-3 weeks instead of 2-3 months. The per-brand teams were consolidated into one web team and one mobile team, freeing them from rebuilding the same screen and flow.&lt;/p&gt;

&lt;p&gt;The seventh brand was added after the platform existed, without recreating the old setup. The goal was to remove the multiplication that came with every new brand.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Does Legacy Infrastructure Become a Business Problem?
&lt;/h2&gt;

&lt;p&gt;Aging infrastructure alone is not the best reason to replace a system. In actuality, business constraints are one of the crucial reasons why legacy infrastructure needs to be replaced.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mckinsey.com/capabilities/tech-and-ai/our-insights/demystifying-digital-dark-matter-a-new-standard-to-tame-technical-debt" rel="noopener noreferrer"&gt;McKinsey&lt;/a&gt; estimates that technical debt can account for 20-40% of the value of an organization’s technology estate. So when a system becomes a problem, the business starts paying for its limitations. A release that once took two weeks can stretch into a quarter. Adding a new brand, region, or product can mean adding another technology stack. An integration task that should be a simple process becomes a whole project if the system doesn’t connect with it the right way.&lt;/p&gt;

&lt;p&gt;The same pattern shows up in other business operations where a compliance change that should take weeks takes months, engineering teams spend more time keeping duplicated experiences running than building the next product, and each new unit of growth costs more as the business has to repeat the work it has already done.&lt;/p&gt;

&lt;p&gt;The better question ideally would be “What is this system preventing the business from doing, and what is that constraint costing us?” because it changes the modernization conversation from replacing old technology to removing the things that hold business growth back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Did We Modernize Edge Before the Core System?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5zv8t2xq35czxn9gz9mg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5zv8t2xq35czxn9gz9mg.png" alt="Edge-first modernization diagram with before and after architecture with shared web and mobile components" width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When a core system starts holding the business back, the first instinct would be to replace it, which may be a risky process.&lt;/p&gt;

&lt;p&gt;Most of the business processes may not be documented in one place, as some may exist in code, some in old integrations, and some may only be known by the people who have worked with the system for years.&lt;/p&gt;

&lt;p&gt;The edge is different. It is where customers, employees, and partners interact with the business: &lt;a href="https://geekyants.com/service/hire-web-app-development-services" rel="noopener noreferrer"&gt;web&lt;/a&gt; and mobile experiences, APIs, integrations, workflows, automation, and deployment pipelines.&lt;/p&gt;

&lt;p&gt;Modernizing the edge gives the businesses enough room to be adaptive to changes without immediately disrupting the logic on which the systems run. You can improve how customers place an order, connect a new channel, or streamline an employee workflow without interrupting the system that handles ordering or pricing tasks.&lt;/p&gt;

&lt;p&gt;The risk, however, changes as you move closer to the core system. The more business logic and dependencies you have to uncover, the more you risk finding rules nobody remembered were there.&lt;/p&gt;

&lt;p&gt;Needless to say, &lt;strong&gt;modernization risk increases with the amount of business logic you have to rediscover.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven Decisions To Be Considered for Modernization of Legacy Systems
&lt;/h2&gt;

&lt;p&gt;Every part of the legacy system can have a different path forward. Depending on what it does and where it creates friction, you can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Retire&lt;/strong&gt; the system when nothing depends on it anymore.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Retain&lt;/strong&gt; when it works and creates no business constraint.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expose&lt;/strong&gt; when the capability is useful but trapped behind poor interfaces.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Augment&lt;/strong&gt; when the core works but the surrounding experience does not.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Re-platform&lt;/strong&gt; when the application works but the underlying runtime has become the problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Refactor&lt;/strong&gt; when the business logic is worth keeping but the architecture prevents change or scale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Replace&lt;/strong&gt; when the economics no longer make sense or the system's business logic no longer matches how the company operates.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Modernization Should Create Room for Business Growth
&lt;/h2&gt;

&lt;p&gt;The best place to begin the modernization process often starts from navigating which business process is actually hindering its growth. The real opportunity in &lt;a href="https://geekyants.com/enterprise-system-modernization" rel="noopener noreferrer"&gt;legacy modernization&lt;/a&gt; lies in making &lt;strong&gt;room for business’s growth without creating unnecessary risks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Planning a legacy modernization initiative? Talk to GeekyAnts about identifying what is actually constraining growth and modernizing it without replacing the existing system.&lt;/p&gt;

</description>
      <category>legacycode</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>From Prompting to Process: What Changed When Flutter Shipped Agent Skills</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Wed, 23 Sep 2026 10:52:52 +0000</pubDate>
      <link>https://dev.to/geekyants/from-prompting-to-process-what-changed-when-flutter-shipped-agent-skills-4jjk</link>
      <guid>https://dev.to/geekyants/from-prompting-to-process-what-changed-when-flutter-shipped-agent-skills-4jjk</guid>
      <description>&lt;p&gt;Google is starting to ship Flutter’s engineering workflows as machine-readable guidance for &lt;a href="https://geekyants.com/ai/ai-agent-development-services" rel="noopener noreferrer"&gt;AI agents&lt;/a&gt;. It may look like another AI feature, but it hints at a much bigger shift in how teams build with &lt;a href="https://geekyants.com/hire-flutter-developers" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Consistency Problem
&lt;/h2&gt;

&lt;p&gt;Over the past few years, &lt;a href="https://geekyants.com/blog/how-is-ai-making-software-development-easier" rel="noopener noreferrer"&gt;AI coding tools&lt;/a&gt; like &lt;a href="https://geekyants.com/blog/cursor-vs-lovable-vs-replit-which-vibe-coding-tool-builds-the-most-production-ready-code" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;, Claude Code, Copilot, and OpenCode have become part of many developers’ daily workflows. An AI coding tool can produce code, explain unfamiliar APIs, write tests, and navigate large codebases with impressive accuracy.&lt;/p&gt;

&lt;p&gt;That capability now stretches across stacks and workflows, from Node.js, TypeScript, and React to Python projects. It can help with debugging, boilerplate automation, integrations with services such as Stripe’s API, and work involving MongoDB or AWS tools.&lt;/p&gt;

&lt;p&gt;But if you have been using these tools on a reasonably large project, you have probably noticed something.&lt;/p&gt;

&lt;p&gt;They are not very consistent.&lt;/p&gt;

&lt;p&gt;Ask an AI to implement the same feature in two different sessions, and there’s a good chance you will get two different approaches. Switch models, and the implementation changes again. Sometimes it follows the latest framework recommendations. Other times, it relies on outdated patterns. The same problem can appear whether the agent is changing a Flutter feature, a React app, a fintech prototype, or larger Enterprise apps.&lt;/p&gt;

&lt;p&gt;Most teams respond the same way: write better prompts, add repository rules, or create custom &lt;a href="https://agentskills.io/home" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;skill.md&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; files to steer the agent toward the right decisions.&lt;/p&gt;

&lt;p&gt;At GeekyAnts, we took the same approach by documenting our architecture, coding conventions, review expectations, and engineering practices as custom Skills. They made the agent noticeably more consistent.&lt;/p&gt;

&lt;p&gt;So when Flutter announced official Agent Skills, my first reaction was not: &lt;em&gt;“How do we use them?”&lt;/em&gt; It was: &lt;em&gt;“If we already have our own Skills, what problem are Flutter's official Skills actually solving?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That question turned into a couple of experiments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Layers of AI-Assisted Development
&lt;/h2&gt;

&lt;p&gt;Looking back, Flutter's recent AI investments weren't isolated features. They were building on each other.&lt;/p&gt;

&lt;p&gt;First came &lt;strong&gt;Rules&lt;/strong&gt;, giving teams a way to define project-specific conventions and preferences.&lt;/p&gt;

&lt;p&gt;Then came &lt;a href="https://geekyants.com/blog/mcp-in-action-a-developers-take-on-smarter-service-coordination" rel="noopener noreferrer"&gt;&lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;&lt;/a&gt;, allowing AI agents to inspect, debug, and interact with running Flutter applications instead of reasoning purely from static code.&lt;/p&gt;

&lt;p&gt;And then came &lt;strong&gt;Agent Skills.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If Rules tell an agent &lt;strong&gt;how your team works&lt;/strong&gt;, and MCP tells it &lt;strong&gt;what’s happening inside your application&lt;/strong&gt;, Agent Skills answer a different question: &lt;strong&gt;how does Flutter itself recommend solving this problem?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the important shift.&lt;/p&gt;

&lt;p&gt;Flutter is now versioning its engineering workflows alongside the framework itself. Instead of relying entirely on what an &lt;a href="https://geekyants.com/ai/ai-development-services" rel="noopener noreferrer"&gt;AI model&lt;/a&gt; happened to learn during training, agents can follow workflows maintained by the Flutter team.&lt;/p&gt;

&lt;p&gt;Today, those workflows cover areas like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Localization&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Responsive layouts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Routing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Widget and unit testing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Static analysis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JSON serialization&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Platform integration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Architecture best practices&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In other words, Flutter is shipping its engineering knowledge as structured workflows.&lt;/p&gt;

&lt;p&gt;That naturally led to the next question: &lt;strong&gt;does this actually change how an AI agent behaves?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I ran two experiments to find out.&lt;/p&gt;

&lt;h2&gt;
  
  
  First Experiment: Declarative Routing
&lt;/h2&gt;

&lt;p&gt;It is one of those features where there is not just one thing to do. Depending on the prompt, an AI could jump straight into writing routes, miss platform-specific configuration, skip deep linking altogether, or recommend an approach based on what it learned during training rather than Flutter's latest guidance.&lt;/p&gt;

&lt;p&gt;So I kept the prompt intentionally simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Set up declarative routing for this Flutter application.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wanted to see how the agent would approach the problem before I told it how to solve it.&lt;/p&gt;

&lt;p&gt;The first thing it did caught my attention.&lt;/p&gt;

&lt;p&gt;Before generating an implementation plan, it explicitly selected the &lt;strong&gt;&lt;em&gt;flutter-setup-declarative-routing&lt;/em&gt;&lt;/strong&gt; skill.&lt;/p&gt;

&lt;p&gt;Flutter Agent Skill Selection for Declarative Routing&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnkjmffp22i4a3qgunft7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnkjmffp22i4a3qgunft7.png" alt="Flutter Agent Skill Selection for Declarative Routing" width="760" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From that point on, it was not about figuring out a solution; it was following Flutter's own workflow.&lt;/p&gt;

&lt;p&gt;That was the interesting part.&lt;/p&gt;

&lt;p&gt;Without Agent Skills, the implementation depends on the model’s reasoning and whatever Flutter knowledge it has internalized. With Agent Skills, the framework itself becomes the starting point.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when Flutter's Skills and our own Skills are both available?
&lt;/h2&gt;

&lt;p&gt;I tested this with a login screen.&lt;/p&gt;

&lt;p&gt;It needed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Flutter's localization workflow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Our project conventions for authentication, repositories, dependency injection, and state management&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I kept the prompt simple and let the agent decide how to approach it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Implement a login screen for this application. Follow the existing project architecture and add localization for all user-facing strings.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It picked the right source every time.&lt;/p&gt;

&lt;p&gt;For localization, it used Flutter’s official Skill. For everything related to our application architecture, it followed our custom Skills. I did not have to tell it which one to use or write a carefully engineered prompt.&lt;/p&gt;

&lt;p&gt;The two sets of Skills worked together naturally. Flutter handled the framework guidance, while our repository continued to define how our application was built.&lt;/p&gt;

&lt;p&gt;Flutter Localization Workflow Using Agent Skills&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyzt1uc0p3ky07614ryyt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyzt1uc0p3ky07614ryyt.png" alt="Flutter Localization Workflow Using Agent Skills" width="799" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters: A Floor, Not a Finish Line
&lt;/h2&gt;

&lt;p&gt;So, what actually changed?&lt;/p&gt;

&lt;p&gt;Flutter is taking ownership of its engineering expertise.&lt;/p&gt;

&lt;p&gt;Engineering teams no longer need to teach AI how Flutter expects routing, localization, responsive layouts, or testing to be implemented. Flutter now ships that knowledge itself.&lt;/p&gt;

&lt;p&gt;That removes a significant amount of duplication. Instead of every team maintaining its own version of Flutter best practices inside prompts or custom Skills, the official workflows become the source of truth.&lt;/p&gt;

&lt;p&gt;Even better, those workflows evolve alongside Flutter. As recommendations change, the official Skills change too, and every compatible AI agent benefits automatically.&lt;/p&gt;

&lt;p&gt;Of course, that’s only half the story.&lt;/p&gt;

&lt;p&gt;Flutter’s Agent Skills provide a strong foundation, but they do not replace your organization’s architecture, coding standards, or business-specific workflows. Those remain your responsibility, and that is exactly how it should be.&lt;/p&gt;

&lt;p&gt;This distinction matters across software development, whether teams are building for the web, mobile, or domains such as cybersecurity. Framework guidance can standardize common implementation patterns, while teams still need to define the context that is specific to their products and systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Looking back, Flutter’s recent AI features fit together surprisingly well.&lt;/p&gt;

&lt;p&gt;Rules capture how &lt;strong&gt;your team&lt;/strong&gt; works. MCP gives agents &lt;strong&gt;runtime context&lt;/strong&gt;. Agent Skills teach them &lt;strong&gt;how Flutter itself expects problems to be solved&lt;/strong&gt;. Custom Skills layer on everything unique to your organization.&lt;/p&gt;

&lt;p&gt;Together, they reduce the amount of engineering knowledge an AI has to infer. That is the real significance of Flutter’s recent AI investments. Engineering knowledge is becoming explicit, versioned, reusable, and maintained by the people best positioned to own it.&lt;/p&gt;

&lt;p&gt;The same idea is becoming increasingly relevant as teams work with LLMs and AI-driven automation. The more implementation knowledge can be made explicit and reusable, the less an agent has to guess from prompts or training data alone.&lt;/p&gt;

&lt;p&gt;Today’s skill library covers foundational workflows, but it already hints at what’s possible. Imagine Skills for performance profiling, DevTools workflows, accessibility audits, plugin development, migrations, or advanced rendering patterns. Every new skill moves another piece of framework knowledge out of documentation and into a reusable workflow.&lt;/p&gt;

&lt;p&gt;The answer to &lt;strong&gt;how much of Flutter an agent should really guess keeps&lt;/strong&gt; shrinking with every release.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>ai</category>
      <category>agentskills</category>
    </item>
    <item>
      <title>Building a Production-Ready Canva-like Editor with Konva.js, React 19 and Next.js 15</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Thu, 10 Sep 2026 10:31:18 +0000</pubDate>
      <link>https://dev.to/geekyants/building-a-production-ready-canva-like-editor-with-konvajs-react-19-and-nextjs-15-3imd</link>
      <guid>https://dev.to/geekyants/building-a-production-ready-canva-like-editor-with-konvajs-react-19-and-nextjs-15-3imd</guid>
      <description>&lt;p&gt;This blog explains how to build a production-ready canvas editor with&lt;br&gt;
Konva.js, React, and Next.js, covering architecture, performance, and&lt;br&gt;
key engineering decisions.&lt;/p&gt;

&lt;p&gt;Author: Priyanka Rokhade, Software Engineer III&lt;br&gt;
Subject Matter Expert: Deepanshu Goyal, Senior Software Engineer -&lt;br&gt;
III&lt;/p&gt;

&lt;p&gt;Executive Summary: Why Build an In-App Canvas Editor?&lt;/p&gt;

&lt;p&gt;Modern SaaS&lt;br&gt;
applications&lt;br&gt;
increasingly require users to create visually rich documents directly&lt;br&gt;
inside the browser. Whether it is travel itineraries, reports,&lt;br&gt;
certificates, brochures, or marketing collateral, users expect the same&lt;br&gt;
drag-and-drop experience offered by tools like Canva---but without&lt;br&gt;
leaving the application.&lt;/p&gt;

&lt;p&gt;Our challenge was straightforward:&lt;/p&gt;

&lt;p&gt;"How do we build a Canva-like editor that feels native, performs&lt;br&gt;
smoothly, and integrates seamlessly with our product?"&lt;/p&gt;

&lt;p&gt;After evaluating multiple approaches---including embedded design&lt;br&gt;
tools,&lt;br&gt;
HTML-based editors, and a fully custom canvas engine---we built our&lt;br&gt;
editor on Konva.js + React-Konva.&lt;/p&gt;

&lt;p&gt;The result was a production-ready editor capable of:&lt;/p&gt;

&lt;p&gt;60 FPS interaction&lt;/p&gt;

&lt;p&gt;250+ canvas objects&lt;/p&gt;

&lt;p&gt;Rich text editing&lt;/p&gt;

&lt;p&gt;Autosave&lt;/p&gt;

&lt;p&gt;Multi-page documents&lt;/p&gt;

&lt;p&gt;Responsive previews&lt;/p&gt;

&lt;p&gt;Pixel-perfect rendering between editor and viewer&lt;/p&gt;

&lt;p&gt;This article presents the architecture, design&lt;br&gt;
decisions,&lt;br&gt;
production challenges, and engineering lessons behind building a&lt;br&gt;
production-ready canvas editor.&lt;/p&gt;

&lt;p&gt;Business Objectives&lt;/p&gt;

&lt;p&gt;Beyond replicating Canva-like functionality, the primary objective was&lt;br&gt;
to eliminate dependence on external design tools and bring document&lt;br&gt;
creation directly into our platform. By integrating editing, previewing,&lt;br&gt;
and publishing into a single workflow, the editor reduces operational&lt;br&gt;
overhead, shortens content turnaround time, and enables teams to create&lt;br&gt;
production-ready documents without switching between multiple&lt;br&gt;
applications. This also gives the product team complete control over the&lt;br&gt;
editing experience, data ownership, and future feature development.&lt;/p&gt;

&lt;p&gt;Why We Chose Konva.js Over Other Alternatives&lt;/p&gt;

&lt;p&gt;When we started designing the editor, we evaluated three possible&lt;br&gt;
approaches.&lt;/p&gt;

&lt;p&gt;At first glance, embedding a tool such as Canva or Figma looked&lt;br&gt;
attractive because this approach reduced implementation effort. However,&lt;br&gt;
licensing costs, limited customization, and data ownership concerns&lt;br&gt;
quickly ruled it out.&lt;/p&gt;

&lt;p&gt;Next, we experimented with HTML-based editors built using absolutely&lt;br&gt;
positioned &lt;/p&gt; elements. Although this worked for simple layouts,&lt;br&gt;
performance degraded significantly as documents became more complex.

&lt;p&gt;Ultimately, we chose Konva.js because it provided a scene graph&lt;br&gt;
architecture, high-performance rendering, and complete control over the&lt;br&gt;
editing experience.&lt;/p&gt;

&lt;p&gt;When evaluating how to build this visual editor, we assessed three&lt;br&gt;
architectural paths:&lt;/p&gt;

&lt;p&gt;Architectural Approach  How It Works            Why It Succeeded or&lt;br&gt;
Failed in Production&lt;/p&gt;

&lt;p&gt;Third-Party Embeds      Embeds an external      Failed: High recurring&lt;br&gt;
(e.g.&amp;nbsp;Canva / Figma SDK design tool inside our  per-user licensing&lt;br&gt;
via iFrame)             web page using an       fees; user data lives&lt;br&gt;
iFrame.                 on external servers;&lt;br&gt;
inability to build&lt;br&gt;
custom domain features&lt;br&gt;
such as custom torn&lt;br&gt;
image frames, Unsplash&lt;br&gt;
search panel, and&lt;br&gt;
specific Google Font&lt;br&gt;
pickers.&lt;/p&gt;

&lt;p&gt;HTML/DOM-Based Editors  Renders elements as     Failed: When a document&lt;br&gt;
(e.g.&amp;nbsp;GrapesJS /        standard HTML &lt;/p&gt;   contains 50+ elements&lt;br&gt;
Absolute CSS Divs)      tags positioned with    with rotations, drop&lt;br&gt;
CSS.                    shadows, and masks, DOM&lt;br&gt;
repaints cause&lt;br&gt;
noticeable lag during&lt;br&gt;
dragging. Rotation and&lt;br&gt;
corner resize handle&lt;br&gt;
math also glitch across&lt;br&gt;
different web browsers.

&lt;p&gt;Practical Benefits of Our Konva.js Architecture&lt;/p&gt;

&lt;p&gt;100% Visual Fidelity (Zero Rendering Drift): Both the admin&lt;br&gt;
design editor and the public viewer application use the exact same&lt;br&gt;
Konva shape primitives (Konva.Text, Konva.Image, Konva.Rect). What&lt;br&gt;
the creator designs on their screen is 100% identical to what&lt;br&gt;
end-users see---no displaced text, shifting margins, or&lt;br&gt;
browser-specific rendering bugs.&lt;/p&gt;

&lt;p&gt;Lightweight Universal Canvas Format (UCF JSON): Instead of&lt;br&gt;
saving heavy image files or fragile HTML, our editor serializes&lt;br&gt;
document pages into clean, portable JSON, including item&lt;br&gt;
coordinates, font size, and fill colors. A complete 10-page document&lt;br&gt;
is under 15 KB, loads instantly, and is stored securely in our cloud&lt;br&gt;
database and object storage.&lt;/p&gt;

&lt;p&gt;Production Impact: Beyond the technical architecture, the editor&lt;br&gt;
delivered measurable improvements to our internal workflow: reduced&lt;br&gt;
document creation time from 1--2 days to under 15 minutes by&lt;br&gt;
eliminating external design tools; supports 250+ canvas objects&lt;br&gt;
while maintaining smooth 60 FPS interactions; replaced fragmented&lt;br&gt;
designer-to-operations workflows with a fully integrated in-app&lt;br&gt;
editing experience; and enabled creators to design, preview, and&lt;br&gt;
publish documents without leaving the platform.&lt;/p&gt;

&lt;p&gt;Customer Value: Enables operations teams to publish customer&lt;br&gt;
documents 95% faster. Eliminates dependence on external design&lt;br&gt;
tools. Keeps customer data inside the platform. Reduces onboarding&lt;br&gt;
time for non-design users.&lt;/p&gt;

&lt;p&gt;What the Editor Does&lt;/p&gt;

&lt;p&gt;The editor operates inside the web&lt;br&gt;
application&lt;br&gt;
workspace and enables users to:&lt;/p&gt;

&lt;p&gt;Compose multi-page visual documents featuring text, vector shapes,&lt;br&gt;
high-resolution photography, video clips, buttons, and hyperlinks.&lt;/p&gt;

&lt;p&gt;Drag, resize, rotate, and layer elements with pixel-level precision&lt;br&gt;
on an interactive 2D canvas.&lt;/p&gt;

&lt;p&gt;Apply custom Google Fonts, decorative frames (torn edge, square&lt;br&gt;
borders), mask clippings (circle, star, heart, diamond), image&lt;br&gt;
cropping, and character-level rich text formatting.&lt;/p&gt;

&lt;p&gt;Preview responsive layouts in real-time across web and mobile&lt;br&gt;
device&lt;br&gt;
viewports.&lt;/p&gt;

&lt;p&gt;Autosave design state with debouncing and publish completed&lt;br&gt;
documents directly to the client viewing application.&lt;/p&gt;

&lt;p&gt;Primary users: The editor is designed for internal operations teams,&lt;br&gt;
content creators, and administrators responsible for producing&lt;br&gt;
customer-facing documents. Instead of relying on external design&lt;br&gt;
software, users can create, review, and publish visual content directly&lt;br&gt;
within the application, reducing context switching and simplifying&lt;br&gt;
day-to-day workflows.&lt;/p&gt;

&lt;p&gt;Application scope: Integrated visual design module within the Admin&lt;br&gt;
Web Workspace.&lt;/p&gt;

&lt;p&gt;Why Konva?&lt;/p&gt;

&lt;p&gt;Konva provides decisive technical advantages for our production&lt;br&gt;
requirements:&lt;/p&gt;

&lt;p&gt;Scene Graph Hierarchy: A clean Stage → Layer → Group → Shape&lt;br&gt;
tree that maps 1:1 to document pages and layered canvas items.&lt;/p&gt;

&lt;p&gt;Built-in Drag, Transform &amp;amp; Hit Detection: Accelerated&lt;br&gt;
mathematical routines for drag-and-drop, multi-node rotation, corner&lt;br&gt;
scaling, and pointer hit detection.&lt;/p&gt;

&lt;p&gt;Interactive Transformer: Customizable bounding box with 8 anchor&lt;br&gt;
handles, rotation anchor, and aspect-ratio constraints out of the&lt;br&gt;
box.&lt;/p&gt;

&lt;p&gt;Declarative React Bindings: Allows canvas elements to be&lt;br&gt;
composed declaratively with standard React props, state hooks, and&lt;br&gt;
component lifecycles.&lt;/p&gt;

&lt;p&gt;Universal Canvas Format Serialization: Rather than storing the&lt;br&gt;
document as an image, we store every object as JSON. Each element&lt;br&gt;
records information such as position, size, color, font, rotation,&lt;br&gt;
and opacity. This lightweight format allows us to recreate the exact&lt;br&gt;
same document anywhere using Konva.&lt;/p&gt;

&lt;p&gt;Konva Fundamentals&lt;/p&gt;

&lt;p&gt;For developers exploring Konva, four foundational primitives form the&lt;br&gt;
foundation of our canvas architecture:&lt;/p&gt;

&lt;p&gt;Konva Concept           Core Responsibility     Implementation in Our&lt;br&gt;
Editor&lt;/p&gt;

&lt;p&gt;Stage                   The root canvas         One Konva Stage per&lt;br&gt;
container managing      document page inside&lt;br&gt;
global dimensions,      our canvas container.&lt;br&gt;
viewport scaling, and&lt;br&gt;
top-level mouse/touch&lt;br&gt;
events.&lt;/p&gt;

&lt;p&gt;Layer                   An independent HTML5 2D Three discrete layers:&lt;br&gt;
canvas drawing surface  Background layer,&lt;br&gt;
with isolated redraw    elements layer, and&lt;br&gt;
loops.                  transformer/UI overlay&lt;br&gt;
layer.&lt;/p&gt;

&lt;p&gt;Shape                   Drawable nodes on the   One Konva shape per&lt;br&gt;
canvas (Text, Rect,     document element&lt;br&gt;
Circle, Line, Arrow,    dispatched dynamically&lt;br&gt;
Image, Star, etc.).     via our shape rendering&lt;br&gt;
engine.&lt;/p&gt;

&lt;p&gt;Shape Registration: All required Konva shapes are registered at app&lt;br&gt;
initialization---including Rect, Circle, Ellipse, Text, Image, Line,&lt;br&gt;
Arrow, RegularPolygon, Star, Wedge, and Arc---ensuring tree-shaking&lt;br&gt;
keeps bundle size minimal while guaranteeing all element types render&lt;br&gt;
without runtime errors.&lt;/p&gt;

&lt;p&gt;Editor Architecture at a Glance&lt;/p&gt;

&lt;p&gt;The editor is engineered as a hybrid Next.js/React application wrapped&lt;br&gt;
around a high-performance Konva canvas. React governs the outer UI&lt;br&gt;
chrome, toolbar actions, sidebar panels, and state management, while&lt;br&gt;
Konva drives the 2D visual layout surface.&lt;/p&gt;

&lt;p&gt;Figure: High-Level Architecture: React UI Chrome, State Layer, Canvas&lt;br&gt;
Engine, and Output Pipeline&lt;/p&gt;

&lt;p&gt;The Hybrid Canvas Model&lt;/p&gt;

&lt;p&gt;One of the biggest engineering decisions was not using the canvas for&lt;br&gt;
everything. At first, we tried rendering every interaction directly&lt;br&gt;
inside Konva. It quickly became obvious that some browser features&lt;br&gt;
simply work better in the DOM.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;p&gt;Blinking text cursor&lt;/p&gt;

&lt;p&gt;Spell check&lt;/p&gt;

&lt;p&gt;Video controls&lt;/p&gt;

&lt;p&gt;Copy/paste&lt;/p&gt;

&lt;p&gt;Text selection&lt;/p&gt;

&lt;p&gt;Instead of fighting the browser, we built a Hybrid Canvas Architecture&lt;br&gt;
where Konva renders graphics while temporary HTML overlays handle&lt;br&gt;
editing.&lt;/p&gt;

&lt;p&gt;To combine the performance of canvas with the rich UX of the DOM, our&lt;br&gt;
editor implements a Hybrid Canvas Architecture:&lt;/p&gt;

&lt;p&gt;Figure: The Hybrid Canvas Architecture: Synchronized Konva Canvas and&lt;br&gt;
HTML DOM Overlays&lt;/p&gt;

&lt;p&gt;Why the Hybrid Model Matters&lt;/p&gt;

&lt;p&gt;Inline Text Editing: When a user double-clicks a text item, an&lt;br&gt;
invisible HTML  is mounted at the exact bounding box and&amp;lt;br&amp;gt;
rotation of the Konva text node---providing native cursor blinking,&amp;lt;br&amp;gt;
typing, and keyboard shortcuts.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Rich Text Formatting: Multi-range formatted text (bold, italic,&amp;lt;br&amp;gt;
underline per character slice) is painted directly onto the canvas&amp;lt;br&amp;gt;
via a custom sceneFunc (drawFormattedTextOnCanvas)---ensuring&amp;lt;br&amp;gt;
correct z-ordering without persistent DOM elements.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Video Playback: Video items display a poster thumbnail on&amp;lt;br&amp;gt;
canvas, while interactive playback, trimming, and audio controls&amp;lt;br&amp;gt;
appear in a synchronized DOM overlay.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Real-Time Overlay Synchronization: Floating toolbars and editing&amp;lt;br&amp;gt;
inputs continuously recalculate their CSS transforms during canvas&amp;lt;br&amp;gt;
panning, zooming, and item dragging.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Architectural Takeaway: By keeping DOM overlays transient (active&amp;lt;br&amp;gt;
only during direct editing) and painting all normal elements inside&amp;lt;br&amp;gt;
Konva, we preserve 60 FPS canvas performance while giving users full&amp;lt;br&amp;gt;
browser editing ergonomics.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;How a User Action Becomes Canvas State&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Every user interaction follows a strict unidirectional loop:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;UI event → Global Editor State → Konva re-render → history push →&amp;lt;br&amp;gt;
debounced autosave&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Interaction Loop Steps&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;User Triggers Action: User clicks "Add heading" in the sidebar&amp;lt;br&amp;gt;
or drags an element on canvas.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Context Mutation: The action invokes addItem() or&amp;lt;br&amp;gt;
updateItem() in the global editor state.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;History Recording: The history manager pushes the previous&amp;lt;br&amp;gt;
snapshot onto the 50-state undo stack.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Canvas Re-draw: React-Konva receives updated props and&amp;lt;br&amp;gt;
re-renders the modified shapes on the elements layer.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Debounced Serialization: The autosave pipeline serializes canvas&amp;lt;br&amp;gt;
items to JSON and dispatches a debounced (2-second) PATCH request to&amp;lt;br&amp;gt;
the backend API.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Key User Flows&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Flow 1 --- Adding and Editing Text&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Figure: Flow 1: Adding, Rendering, and Inline-Editing Text Elements&amp;lt;br&amp;gt;
(Vertical Workflow)&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Konva Touchpoints: Konva.Text node, custom sceneFunc for formatted&amp;lt;br&amp;gt;
character ranges, and Transformer with scale-to-fontSize baking (scaling&amp;lt;br&amp;gt;
corner anchors adjusts fontSize directly to avoid pixelated text).&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Flow 2 --- Adding an Image from Unsplash&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Figure: Flow 2: Searching, Loading, and Rendering Unsplash Images&amp;lt;br&amp;gt;
(Vertical Workflow)&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Konva Touchpoints: Konva.Image node with HTMLImageElement source;&amp;lt;br&amp;gt;
mask clipping via custom clipFunc; aspect ratio preservation during&amp;lt;br&amp;gt;
transform handles.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Flow 3 --- Selection, Transform, and Snap&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Figure: Flow 3: Single/Multi-Selection, Transformer Attachment, and&amp;lt;br&amp;gt;
Snap Grid Guides&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Konva Touchpoints: Canvas Transformer with 8 anchor handles,&amp;lt;br&amp;gt;
real-time snap grid logic calculating alignment guidelines against&amp;lt;br&amp;gt;
canvas edges and sibling elements; arrows bypass Transformer and use&amp;lt;br&amp;gt;
2-point anchor handles.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Flow 4 --- Save, Preview, and Publish&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Figure: Flow 4: Autosave, UCF Serialization, Live Preview, and&amp;lt;br&amp;gt;
Production Publish&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Konva Touchpoints: Serialization transforms page scenes into&amp;lt;br&amp;gt;
Universal Canvas Format (UCF) JSON. The same Konva shape vocabulary is&amp;lt;br&amp;gt;
reused in the client viewer for 100% visual fidelity between editor&amp;lt;br&amp;gt;
preview and production viewer.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Supported Element Types&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The editor supports 12 distinct element types, each mapped to a Konva&amp;lt;br&amp;gt;
primitive or custom renderer:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Element Type            Konva / Custom Renderer Technical Implementation&amp;lt;br&amp;gt;
Notes&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Text                    Konva.Text + custom     Inline HTML textarea&amp;lt;br&amp;gt;
sceneFunc               editing; rich formatted&amp;lt;br&amp;gt;
character ranges&amp;lt;br&amp;gt;
(bold/italic/underline)&amp;lt;br&amp;gt;
painted on canvas.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Rectangle               Konva.Rect              Solid and gradient fills,&amp;lt;br&amp;gt;
border strokes,&amp;lt;br&amp;gt;
customizable corner&amp;lt;br&amp;gt;
radius, opacity.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Circle / Ellipse        Konva.Circle /          Uniform and non-uniform&amp;lt;br&amp;gt;
Konva.Ellipse           radial scaling with&amp;lt;br&amp;gt;
aspect lock support.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Line                    Konva.Line              Point coordinate array&amp;lt;br&amp;gt;
scaling and rotation&amp;lt;br&amp;gt;
handling during&amp;lt;br&amp;gt;
transform.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Arrow                   Konva.Arrow             Custom 2-point anchor&amp;lt;br&amp;gt;
editing (head and tail&amp;lt;br&amp;gt;
moved independently).&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Polygon / Star          Konva.RegularPolygon /  Configurable vertex&amp;lt;br&amp;gt;
Konva.Star              count, inner/outer radius&amp;lt;br&amp;gt;
ratio.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Wedge / Arc             Konva.Wedge / Konva.Arc Custom selection overlay&amp;lt;br&amp;gt;
with start/end angle&amp;lt;br&amp;gt;
dragging.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Image                   Konva.Image             Crop rectangle math,&amp;lt;br&amp;gt;
shape masks (circle,&amp;lt;br&amp;gt;
star, heart, diamond),&amp;lt;br&amp;gt;
opacity, filters.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Video                   Konva.Image frame +     Video poster on canvas;&amp;lt;br&amp;gt;
HTML overlay            synchronized DOM player&amp;lt;br&amp;gt;
(max 3 videos per&amp;lt;br&amp;gt;
document).&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Button / Link           Custom Group (Rect +    Clickable interactive&amp;lt;br&amp;gt;
Text)                   hotspot, URL navigation,&amp;lt;br&amp;gt;
document action binding.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Frame                   SquareFrameRenderer /   Decorative organic image&amp;lt;br&amp;gt;
TornFrameRenderer       container with clipping&amp;lt;br&amp;gt;
masks.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Dispatch logic operates using a clean TypeScript discriminated union&amp;lt;br&amp;gt;
(CanvasItem).&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;What Worked Well &amp;amp; Architectural Strengths&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Dev--Prod Parity for Rendering&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Designs export to UCF JSON and render in the client viewing app with the&amp;lt;br&amp;gt;
identical Konva primitives. Creators see in preview exactly what&amp;lt;br&amp;gt;
end-users experience---zero rendering drift or font mismatches.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Hook-Based Interaction Logic&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Complex canvas behaviors are decomposed into dedicated, testable custom&amp;lt;br&amp;gt;
React hooks rather than one monolithic component:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Custom React Hook                   Core Responsibility&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;useDragHandlers                   Single-item drag, multi-selection&amp;lt;br&amp;gt;
drag, and transformer drag&amp;lt;br&amp;gt;
coordination.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;useTransformHandlers              Resize, rotate, scale commit per&amp;lt;br&amp;gt;
item type with aspect ratio&amp;lt;br&amp;gt;
constraints.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;useSelectionHandlers              Single click, shift/cmd&amp;lt;br&amp;gt;
multi-select, background click&amp;lt;br&amp;gt;
deselect.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;useTextEditing                    Double-click text editing&amp;lt;br&amp;gt;
activation, textarea placement,&amp;lt;br&amp;gt;
keyboard commit.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;useArrowHandlers                  Two-point arrow anchor handle&amp;lt;br&amp;gt;
dragging and coordinate&amp;lt;br&amp;gt;
calculation.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;useSnapGridLines                  Real-time alignment guide&amp;lt;br&amp;gt;
calculation and snapping against&amp;lt;br&amp;gt;
canvas &amp;amp; elements.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;useCanvasEffects                  Transformer attachment lifecycle,&amp;lt;br&amp;gt;
keyboard nudge handling (arrow&amp;lt;br&amp;gt;
keys).&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;useHistory                        50-state undo/redo stack with state&amp;lt;br&amp;gt;
compression and debounced push.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;useAutosave                       Debounced 2-second canvas&amp;lt;br&amp;gt;
serialization and PATCH API save&amp;lt;br&amp;gt;
pipeline.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;This modular structure keeps canvas orchestration clean, readable, and&amp;lt;br&amp;gt;
maintainable.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Production Performance Benchmarks &amp;amp; Metrics&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;To maintain smooth interactions on resource-constrained client machines,&amp;lt;br&amp;gt;
the canvas engine underwent rigorous benchmarking:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Performance Dimension   Production Metric       Engineering Mechanism&amp;lt;br&amp;gt;
Achieved&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Interaction Frame Rate  Solid 60 FPS across     Node ref mutations&amp;lt;br&amp;gt;
250+ canvas elements    bypass React virtual&amp;lt;br&amp;gt;
DOM during active&amp;lt;br&amp;gt;
dragging and transform&amp;lt;br&amp;gt;
cycles.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Transformer Rotation    &amp;lt; 12 ms per frame      Layer splitting:&amp;lt;br&amp;gt;
Latency                 redraw cycle            transformer anchors&amp;lt;br&amp;gt;
render on an isolated&amp;lt;br&amp;gt;
canvas layer without&amp;lt;br&amp;gt;
invalidating elements.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Autosave Network        94% reduction in API    2-second debounce timer&amp;lt;br&amp;gt;
Reduction               write volume            on state mutations;&amp;lt;br&amp;gt;
payload diffing&amp;lt;br&amp;gt;
prevents redundant&amp;lt;br&amp;gt;
PATCH requests.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;History Heap Memory     &amp;lt; 14 MB for 50-state   Structured cloning of&amp;lt;br&amp;gt;
undo/redo buffer        lightweight UCF state&amp;lt;br&amp;gt;
trees with debounced&amp;lt;br&amp;gt;
300ms snapshot&amp;lt;br&amp;gt;
intervals.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Production War Stories &amp;amp; Solved Edge Cases&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Building a production canvas editor revealed complex graphics and&amp;lt;br&amp;gt;
browser synchronization edge cases that standard documentation&amp;lt;br&amp;gt;
overlooks.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Challenge 1: Solving Text Blurriness on High-DPI / Retina Displays&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Symptoms: Vector shapes rendered crisply, but canvas text and stroke&amp;lt;br&amp;gt;
borders appeared slightly blurry on Apple Retina screens and 4K&amp;lt;br&amp;gt;
displays.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Root Cause: Browser window.devicePixelRatio (2x or 3x) scales&amp;lt;br&amp;gt;
canvas CSS display dimensions without automatically scaling the&amp;lt;br&amp;gt;
underlying canvas backing buffer resolution.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Production Fix: Konva automatically handles pixel ratio scaling, but&amp;lt;br&amp;gt;
custom formatted text painted via HTML5 2D Canvas context (sceneFunc)&amp;lt;br&amp;gt;
required explicit scale normalization:&amp;lt;br&amp;gt;
ctx.scale(pixelRatio, pixelRatio) to ensure sub-pixel font&amp;lt;br&amp;gt;
anti-aliasing matching native DOM text.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Challenge 2: The Google Fonts Asynchronous Loading Race Condition&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Symptoms: When opening a document with custom fonts such as Playfair&amp;lt;br&amp;gt;
Display and Montserrat, text elements briefly measured with default&amp;lt;br&amp;gt;
fallback fonts, resulting in incorrect line wraps, clipped bounding&amp;lt;br&amp;gt;
boxes, and transformer handle misalignments.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Root Cause: Konva renders immediately on mount before&amp;lt;br&amp;gt;
document.fonts.load() resolves webfont TTF files.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Production Fix: We implemented a font management provider that&amp;lt;br&amp;gt;
prefetches document fonts, listens to document.fonts.ready, and&amp;lt;br&amp;gt;
triggers an atomic stage batchDraw() with text node bounding box&amp;lt;br&amp;gt;
recalculations once font glyphs are resident in GPU memory.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Challenge 3: Transformer Corner Scaling vs.&amp;nbsp;Text Box Aspect Distortion&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Symptoms: Dragging a transformer corner handle on a text box caused&amp;lt;br&amp;gt;
font characters to stretch non-uniformly (ovaled glyphs) instead of&amp;lt;br&amp;gt;
reflowing text naturally.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Root Cause: Konva Transformer applies scaleX and scaleY matrix&amp;lt;br&amp;gt;
multipliers to the target node during transform.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Production Fix: On transformend, our transform handling hook&amp;lt;br&amp;gt;
intercepts the event, resets node.scaleX(1) and node.scaleY(1), and&amp;lt;br&amp;gt;
bakes the scale multiplier directly into the text element's fontSize&amp;lt;br&amp;gt;
and width properties:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;newFontSize = Math.round(oldFontSize * scaleX)&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;This guarantees crisp, undistorted font rendering.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Challenge 4: CSS Zoom Matrix Decoupling&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Symptoms: When users zoomed the viewport using the footer slider&amp;lt;br&amp;gt;
(50% to 200%), inline text editing text areas and crop overlays drifted&amp;lt;br&amp;gt;
away from their target shapes.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Root Cause: Canvas pan and CSS scale zoom apply outside Konva's&amp;lt;br&amp;gt;
internal coordinate matrix.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Production Fix: In our UI position calculator, overlay screen&amp;lt;br&amp;gt;
coordinates are computed by multiplying the shape's absolute Konva&amp;lt;br&amp;gt;
transform matrix by the stage's parent CSS transform scale factor:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;clientPos = shape.getAbsolutePosition() * zoomScale + stageOffset&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Exporting UCF JSON into High-Resolution Image Views for End Users&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Once a visual document is designed and saved as Universal Canvas Format&amp;lt;br&amp;gt;
(UCF) JSON, end users need to view, share, and consume it across various&amp;lt;br&amp;gt;
client devices. Our architecture supports two distinct consumption&amp;lt;br&amp;gt;
modes.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Real-Time Interactive Canvas Rehydration&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;In web applications across desktop and mobile devices, the document&amp;lt;br&amp;gt;
viewer mounts a lightweight, read-only Konva Stage. It consumes the UCF&amp;lt;br&amp;gt;
JSON directly and renders the scene graph using the same shape&amp;lt;br&amp;gt;
dispatchers---with zero editor overhead (no toolbars, no transformer&amp;lt;br&amp;gt;
handles, no editing textarea overlays). This enables smooth interactive&amp;lt;br&amp;gt;
page flips, video playback, and clickable hyperlink hotspots.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Headless Offscreen Image Generation (PNG/WebP/PDF)&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;For generating static thumbnails, social sharing cards, downloadable&amp;lt;br&amp;gt;
PNGs, and print-ready PDFs, the application executes a client-side&amp;lt;br&amp;gt;
headless rendering pipeline:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Offscreen Stage Mount: An invisible DOM container is dynamically&amp;lt;br&amp;gt;
created outside the visible viewport (left: -10000px) with the&amp;lt;br&amp;gt;
exact width and height of the document page.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Asset Preload Verification: The headless viewer renders the UCF&amp;lt;br&amp;gt;
scene graph and pauses capture until all remote assets (Unsplash&amp;lt;br&amp;gt;
images, Google Fonts TTF files, custom shape masks) have fully&amp;lt;br&amp;gt;
resolved.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Frame Settling: Double requestAnimationFrame() cycles allow&amp;lt;br&amp;gt;
font kerning, image decodes, and canvas clipping paths to paint&amp;lt;br&amp;gt;
completely.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;High-DPI Raster Capture: We execute&amp;lt;br&amp;gt;
stage.toDataURL({ pixelRatio: 2, mimeType: 'image/png' }) on the&amp;lt;br&amp;gt;
rendered Konva stage. Setting pixelRatio: 2 produces ultra-sharp,&amp;lt;br&amp;gt;
publication-grade raster images without blurriness or distortion.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Automatic Cleanup: Once the image data URL / Blob is resolved&amp;lt;br&amp;gt;
for download or preview, the offscreen root is safely unmounted to&amp;lt;br&amp;gt;
prevent browser memory leaks.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Engineering Lessons&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;After building this editor, five lessons stood out:&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Don't fight the browser. Use the DOM for text editing.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Keep rendering deterministic. The editor and viewer should use&amp;lt;br&amp;gt;
the same rendering engine.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Performance starts with architecture. Optimizations matter less&amp;lt;br&amp;gt;
than choosing the right rendering model.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Serialize state, not pixels. JSON scales better than images.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Invest in reusable interaction hooks. Hooks kept our codebase&amp;lt;br&amp;gt;
maintainable as the editor grew.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Tech Stack &amp;amp; Further Resources&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The editor is built on a modern React ecosystem centered around Next.js&amp;lt;br&amp;gt;
15 (App Router) and Konva.js with React-Konva, which together provide a&amp;lt;br&amp;gt;
scalable foundation for high-performance 2D canvas rendering, scene&amp;lt;br&amp;gt;
graph management, and interactive editing. React Context manages editor&amp;lt;br&amp;gt;
state, selections, history, and document metadata, while TanStack Query&amp;lt;br&amp;gt;
and an internal API client handle data fetching, caching, and debounced&amp;lt;br&amp;gt;
autosave operations.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The interface is styled with Tailwind&amp;lt;br&amp;gt;
CSS,&amp;lt;br&amp;gt;
typography is powered by the Google Fonts API with a custom TTF loader&amp;lt;br&amp;gt;
for accurate font rendering, and media assets are sourced through the&amp;lt;br&amp;gt;
Unsplash API and stored in cloud storage backed by a CDN. Documents are&amp;lt;br&amp;gt;
serialized into a lightweight Universal Canvas Format (UCF) JSON,&amp;lt;br&amp;gt;
enabling fast persistence, portability, and pixel-perfect rendering&amp;lt;br&amp;gt;
consistency between the editor and viewer.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Developers interested in exploring the underlying technologies can refer&amp;lt;br&amp;gt;
to the official Konva.js&amp;lt;br&amp;gt;
documentation, including the&amp;lt;br&amp;gt;
Getting Started guides, React-Konva integration guide, API Reference,&amp;lt;br&amp;gt;
Performance Tips, Select &amp;amp; Transform documentation, Interactive Sandbox&amp;lt;br&amp;gt;
examples, and the Konva and React-Konva GitHub repositories.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Core Engineering Takeaways&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Building a production-grade canvas editor requires coordination across&amp;lt;br&amp;gt;
rendering, state management, browser APIs, networking, and user&amp;lt;br&amp;gt;
experience.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Konva.js provided the rendering engine, while the surrounding&amp;lt;br&amp;gt;
architecture handled hybrid editing, history management, autosave,&amp;lt;br&amp;gt;
performance optimization, and rendering fidelity across the editor and&amp;lt;br&amp;gt;
viewer. Beyond solving interesting engineering problems, the editor&amp;lt;br&amp;gt;
transformed our document creation workflow.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Tasks that previously required external design tools and lengthy&amp;lt;br&amp;gt;
collaboration can now be completed entirely within the application in&amp;lt;br&amp;gt;
minutes, while maintaining consistent rendering between editor and&amp;lt;br&amp;gt;
viewer.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The current architecture was intentionally designed for extensibility.&amp;lt;br&amp;gt;
Planned capabilities include collaborative real-time editing, reusable&amp;lt;br&amp;gt;
templates, version history, AI-assisted layout generation, reusable&amp;lt;br&amp;gt;
design components, and plugin-based extensibility. Because the editor is&amp;lt;br&amp;gt;
built around a scene graph and serialized document model, these features&amp;lt;br&amp;gt;
can be introduced without fundamental architectural changes.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;The architecture and lessons shared in this article can help engineering&amp;lt;br&amp;gt;
teams avoid similar pitfalls when building scalable, production-ready&amp;lt;br&amp;gt;
canvas applications.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;For teams building web applications with complex interactions and&amp;lt;br&amp;gt;
demanding performance requirements, the right frontend architecture can&amp;lt;br&amp;gt;
shape how the product scales. Our Next.js Development&amp;lt;br&amp;gt;
Services support teams&amp;lt;br&amp;gt;
in building web applications designed for performance, maintainability,&amp;lt;br&amp;gt;
and growth.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Original article:&amp;lt;br&amp;gt;
GeekyAnts&amp;lt;/p&amp;gt;
&lt;/p&gt;

</description>
      <category>design</category>
      <category>aiproductengineering</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Next Wave of Mobile Apps is The Instant Prototype</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Thu, 06 Aug 2026 10:45:04 +0000</pubDate>
      <link>https://dev.to/geekyants/the-next-wave-of-mobile-apps-is-the-instant-prototype-4aaf</link>
      <guid>https://dev.to/geekyants/the-next-wave-of-mobile-apps-is-the-instant-prototype-4aaf</guid>
      <description>&lt;p&gt;By Amrit Saluja, Technical Content Writer at GeekyAnts. Originally published on &lt;a href="https://geekyants.com/blog/the-next-wave-of-mobile-apps-is-the-instant-prototype" rel="noopener noreferrer"&gt;GeekyAnts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Is the local IDE becoming optional? Sanket Sahu discusses the rise of vibe-coding and how browser-native tools such as RapidNative are reshaping mobile app development.&lt;/p&gt;

&lt;p&gt;Editor's note&lt;br&gt;
Sanket Sahu, co-founder of GeekyAnts and creator of gluestack, recently explored how to build an entire development server inside the browser. The engineering is interesting, but the larger question is what this architecture means for founders, product managers, and the future of enterprise AI.&lt;/p&gt;

&lt;p&gt;We spoke with Sanket about the reasons behind the build, the browser-native technologies that make it possible, and the product opportunities created by near-instant feedback. The conversation below has been edited for clarity.&lt;/p&gt;

&lt;p&gt;Is the local IDE becoming optional?&lt;br&gt;
Amrit Saluja: We hear a great deal about vibe-coding. Does browser-native architecture make the local IDE optional, or are we moving toward a hybrid future?&lt;/p&gt;

&lt;p&gt;Sanket Sahu: Vibe-coding is growing because browser-based tools remove setup friction and make &lt;a href="https://geekyants.com/service/hire-mobile-app-development-services" rel="noopener noreferrer"&gt;building apps&lt;/a&gt; more accessible. Development is moving toward a hybrid model rather than abandoning local tools altogether.&lt;/p&gt;

&lt;p&gt;What did RapidNative change?&lt;br&gt;
AS: For readers who have not seen the technical deep dive, what did you build?&lt;/p&gt;

&lt;p&gt;SS: I rebuilt the development server inside the browser. RapidNative does not require npm run dev, a CLI, or an external server. A code change appears in the preview in under 100 milliseconds while preserving application state.&lt;/p&gt;

&lt;p&gt;AS: Why replace the earlier approach?&lt;/p&gt;

&lt;p&gt;SS: The previous version ran a sandbox in the cloud. That architecture worked, but an AI tool that streams code in real time makes every network round-trip visible. The goal was not merely a fast response. It was an instant one.&lt;/p&gt;

&lt;p&gt;How can a development server run in a browser tab?&lt;br&gt;
AS: A traditional development server handles a lot of work. How did you move those responsibilities into the browser?&lt;/p&gt;

&lt;p&gt;SS: A server such as Metro watches the file system, transpiles code, bundles modules, and serves the result over HTTP. We replaced each responsibility with a browser-native capability. Service Workers take the place of the HTTP server. IndexedDB and a virtual file system replace the physical file system. Babel Standalone performs transpilation, while Import Maps remove the need to bundle modules during development.&lt;/p&gt;

&lt;p&gt;AS: That sounds similar to Vite. Was it an influence?&lt;/p&gt;

&lt;p&gt;SS: Yes. Both approaches begin with the same observation: modern browsers understand ES modules, so development does not always need a bundling step. Vite still relies on &lt;a href="https://geekyants.com/hire-nodejs-developers" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; and a CLI. RapidNative extends the idea by moving the full development loop into the browser.&lt;/p&gt;

&lt;p&gt;Why use two virtual file systems?&lt;br&gt;
AS: What makes the dual-VFS architecture necessary?&lt;/p&gt;

&lt;p&gt;SS: The two file systems have separate responsibilities. The Source VFS holds the original TypeScript and JSX files. When a source file changes, the browser transforms it and writes plain JavaScript into the Destination VFS. The Service Worker serves only from that destination. Keeping source and output separate makes the pipeline predictable and fast.&lt;/p&gt;

&lt;p&gt;What does a sub-100ms preview mean for founders?&lt;br&gt;
AS: How does that preview speed help a founder or a non-technical decision-maker?&lt;/p&gt;

&lt;p&gt;SS: Fast iteration protects the creative flow. It helps teams produce better MVPs, test their thinking sooner, and reach a first paying user faster. For many people, seeing an app idea running on a phone in less than two minutes is the moment the product becomes real.&lt;/p&gt;

&lt;p&gt;AS: How is RapidNative different from Expo Snack?&lt;/p&gt;

&lt;p&gt;SS: The products serve different purposes. Snack is a browser-based REPL that helps developers test snippets and run them on devices. RapidNative focuses on building full apps with AI assistance and instant browser feedback. Its sub-100ms update loop matters when an AI is continuously streaming code changes.&lt;/p&gt;

&lt;p&gt;Who is RapidNative for today?&lt;br&gt;
AS: Is the current product aimed at startups or enterprises?&lt;/p&gt;

&lt;p&gt;SS: Today, it is best suited to individuals and startups that want to turn an idea into a working app. Customization, team features, and compliance capabilities are on the roadmap so that agencies and enterprises can adopt it as well.&lt;/p&gt;

&lt;p&gt;What comes next?&lt;br&gt;
AS: What remains on the technical roadmap?&lt;/p&gt;

&lt;p&gt;SS: Three major additions are planned: a TypeScript Language Server for editor autocomplete, browser-native Git operations through isomorphic-git, and native-device support through Expo Go. Together, they should combine instant browser feedback with the advantages of running an app on a real device.&lt;/p&gt;

&lt;p&gt;AS: You have built NativeBase, gluestack, and now RapidNative. Has AI changed your goal?&lt;/p&gt;

&lt;p&gt;SS: The goal remains the same: remove friction for developers, designers, founders, and product managers. AI is an enabler and an accelerator. It shortens the distance between imagining an idea and seeing it work on a screen.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mobile</category>
      <category>app</category>
    </item>
    <item>
      <title>OpenClaw.ai — Your Personal AI That Actually Does Things</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Thu, 30 Jul 2026 13:21:16 +0000</pubDate>
      <link>https://dev.to/geekyants/openclawai-your-personal-ai-that-actually-does-things-4pn9</link>
      <guid>https://dev.to/geekyants/openclawai-your-personal-ai-that-actually-does-things-4pn9</guid>
      <description>&lt;p&gt;OpenClaw is a powerful, self-hosted AI assistant that connects to your tools to perform actions. Explore its Gateway architecture, real-world use cases, and security precautions.&lt;/p&gt;

&lt;p&gt;There is a new kind of &lt;a href="https://geekyants.com/case-studies/ai-interview-system-for-automated-candidate-screening" rel="noopener noreferrer"&gt;AI tool&lt;/a&gt; making waves. It is called OpenClaw, and it acts and does things.&lt;/p&gt;

&lt;p&gt;OpenClaw is an open-source, self-hosted &lt;a href="https://geekyants.com/blog/mirai-the-ai-powered-personal-growth-assistant-that-adapts-to-you" rel="noopener noreferrer"&gt;AI assistant&lt;/a&gt; created by Peter Steinberger. Launched as "Clawdbot" in November 2025, it is now called OpenClaw and has 145,000 GitHub stars. Nature, Wired, DigitalOcean, and VirusTotal have covered it.&lt;/p&gt;

&lt;p&gt;But what exactly is it? And more importantly, is it something you should set up?&lt;/p&gt;

&lt;h2&gt;
  
  
  Is OpenClaw for Everyone? No.
&lt;/h2&gt;

&lt;p&gt;OpenClaw is powerful, but it is not a plug-and-play consumer app. One of OpenClaw's own maintainers put it bluntly: "If you can't understand how to run a command line, this is far too dangerous a project for you to use safely."&lt;/p&gt;

&lt;p&gt;Here is why. OpenClaw runs on your machine with access to your files, shell, browser, and messaging apps. It installs extensions called "Skills." In February 2026, security researchers found over 300 malicious skills on ClawHub (the skill marketplace), disguising malware as helpful tools. A Cornell audit found 26% of skill packages contained vulnerabilities.&lt;/p&gt;

&lt;p&gt;OpenClaw partnered with VirusTotal for automated skill scanning and hired a security advisor. But they are clear: this is not a silver bullet. Prompt injection attacks—where malicious instructions hide in natural language—remain unsolved.&lt;/p&gt;

&lt;p&gt;If you understand what's installed on your system, can audit code, and know command-line tools, OpenClaw is exciting. If not, wait until it matures or work with someone who can set it up for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does OpenClaw Work—Through the Gateway?
&lt;/h2&gt;

&lt;p&gt;At OpenClaw's core sits the Gateway—a &lt;a href="https://geekyants.com/hire-nodejs-developers" rel="noopener noreferrer"&gt;Node.js process&lt;/a&gt; that controls everything.&lt;/p&gt;

&lt;p&gt;Think of it as an Agent Server. The Gateway is responsible for managing all your channel connections (WhatsApp, Telegram, Slack, Discord, and more), routing messages to the &lt;a href="https://geekyants.com/consulting-services/artificial-intelligence-consulting/agentic-ai" rel="noopener noreferrer"&gt;right AI agent&lt;/a&gt;, maintaining session state and conversation history, coordinating tool execution (file operations, shell commands, browser automation), and providing a WebSocket interface for CLI tools, &lt;a href="https://geekyants.com/service/hire-mobile-app-development-services" rel="noopener noreferrer"&gt;mobile apps&lt;/a&gt;, and the &lt;a href="https://geekyants.com/service/ui-ux-design-services" rel="noopener noreferrer"&gt;web UI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Every message, whether from WhatsApp or Telegram, flows through the Gateway, gets routed to the right agent, and the response flows back. By default, it runs on localhost:18789, keeping everything local.&lt;/p&gt;

&lt;p&gt;What makes this interesting: you can run multiple agents behind one Gateway, each with its own personality, workspace, model, and tool access. For example, route WhatsApp messages to Claude Sonnet and Telegram messages to Claude Opus, all from one Gateway.&lt;/p&gt;

&lt;p&gt;It is &lt;a href="https://geekyants.com/blog/microservices-architecture-from-theory-to-practice" rel="noopener noreferrer"&gt;microservices&lt;/a&gt; for personal AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  For the Masses, What Does OpenClaw Actually Do?
&lt;/h2&gt;

&lt;p&gt;OpenClaw is an &lt;a href="https://geekyants.com/blog/building-a-smart-assistant-without-cloud-the-future-of-local-ai" rel="noopener noreferrer"&gt;AI assistant&lt;/a&gt; that performs actions. Unlike &lt;a href="https://geekyants.com/blog/how-to-build-ai-chatbots-using-chatgpt-api-with-live-demo-video" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt; or Claude's chat interface, which respond with text, OpenClaw connects to your tools and systems. It reads and writes files on your computer, executes shell commands, browses the web, sends messages through your apps, and interacts with APIs.&lt;/p&gt;

&lt;p&gt;This is organized through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://geekyants.com/blog/revolutionizing-business-process-automation-with-ai-agents" rel="noopener noreferrer"&gt;Agents&lt;/a&gt;: The AI brains with isolated workspaces and sessions&lt;/li&gt;
&lt;li&gt;Tools: Built-in capabilities like exec, read, browser, cron, and message&lt;/li&gt;
&lt;li&gt;Skills: Community or custom packages that teach the agent how to use specific tools and &lt;a href="https://geekyants.com/hire-graphql-api-developers" rel="noopener noreferrer"&gt;APIs&lt;/a&gt;, like GitHub, Notion, Slack, or Google Calendar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In plain language: You tell it what to do—through any messaging app you use—and it does it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Do You Talk to Your OpenClaw AI Assistant?
&lt;/h2&gt;

&lt;p&gt;You do not need a special app to create an AI assistant with OpenClaw. This is one of OpenClaw's best design decisions. You use the messaging platforms you already have.&lt;/p&gt;

&lt;p&gt;OpenClaw supports WhatsApp, Telegram (recommended for first setup), Slack, Discord, Signal, iMessage, Google Chat, Microsoft Teams, and WebChat. It also supports Matrix, BlueBubbles, Zalo, and more. It can speak and listen on macOS, &lt;a href="https://geekyants.com/hire-ios-developers" rel="noopener noreferrer"&gt;iOS&lt;/a&gt;, and &lt;a href="https://geekyants.com/hire-android-app-developers" rel="noopener noreferrer"&gt;Android&lt;/a&gt; through companion apps.&lt;/p&gt;

&lt;p&gt;The experience: message your bot on Telegram, and it responds. It does not respond with just words but with actions as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can OpenClaw Schedule Things for You?
&lt;/h2&gt;

&lt;p&gt;Yes. And it is built right in.&lt;/p&gt;

&lt;p&gt;OpenClaw includes a powerful built-in scheduler called Cron, which runs inside the Gateway process itself. It supports full 5-field cron expressions with timezone awareness, one-shot reminders (e.g., "remind me at 4 PM"), recurring jobs (e.g., "every weekday at 9 AM, summarize my unread emails"), isolated agent turns where a scheduled job runs in its own session, and delivery to any connected channel — so the result can show up in your WhatsApp, Telegram, or Slack.&lt;/p&gt;

&lt;p&gt;Jobs persist under &lt;code&gt;~/.openclaw/cron/&lt;/code&gt;, so even if the Gateway restarts, your schedules survive.&lt;/p&gt;

&lt;p&gt;For example, you could set up a job that checks your email every 10 minutes. If it finds a message from a specific sender — say your manager or a key client — it immediately notifies you on WhatsApp. People are doing this today.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Webhooks and External Triggers?
&lt;/h2&gt;

&lt;p&gt;OpenClaw's Gateway provides a WebSocket interface and can be integrated with external systems in multiple ways. You can trigger agents via CLI commands, connect through the WebSocket API, set up cron-based polling workflows, and use skills that integrate with external services and APIs. The architecture is deliberately open-ended, encouraging creative integrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Use Cases that People are Building
&lt;/h2&gt;

&lt;p&gt;Here is where things get exciting. OpenClaw is a productivity multiplier. People are using it to manage their calendars by scheduling events, getting daily briefings, and rescheduling conflicts through a simple &lt;a href="https://geekyants.com/blog/how-to-build-a-chat-and-messaging-app-from-scratch" rel="noopener noreferrer"&gt;chat message&lt;/a&gt;. They are processing emails, with agents that scan your inbox, summarize important threads, draft replies, and flag urgent messages from specific senders.&lt;/p&gt;

&lt;p&gt;Developers are running coding agents in the background, using skills for Claude Code, Codex, and other &lt;a href="https://geekyants.com/blog/codegen-streamlining-your-journey-to-simplicity" rel="noopener noreferrer"&gt;code-generation&lt;/a&gt; tools that build features, run tests, and open pull requests — while they sleep. One user described kicking off Claude Code sessions from his phone and waking up to completed PRs.&lt;/p&gt;

&lt;p&gt;Early adopters are automating household workflows. One user configured OpenClaw to build a weekly meal planning system in Notion, saving his family an hour every week. Others are monitoring health data, connecting WHOOP and other services to track biomarkers and daily habits through chat.&lt;/p&gt;

&lt;p&gt;Some have even built entire websites from their phones, controlling file operations and deployment through Telegram messages.&lt;/p&gt;

&lt;p&gt;The pattern is that anything you would ask a skilled executive assistant to do. The assistants check information, draft content, and provide reminders. Anything you need to keep an eye on, it can be handled by OpenClaw.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example of OpenClaw Usage
&lt;/h3&gt;

&lt;p&gt;Wednesday, 6 AM: Your assistant checks email. Client needs a deliverable update. It drafts a reply and waits for your approval. Your accountant sent something about taxes - flagged as urgent. The newsletter you follow gets summarized and saved to Notion.&lt;/p&gt;

&lt;p&gt;7 AM: Health check on your staging server. Green. No alert.&lt;/p&gt;

&lt;p&gt;8 AM: Morning briefing hits your phone. "Three meetings today. First one at 10 AM. Two-hour focus block this afternoon. Your mom's birthday is tomorrow. Want me to order flowers?"&lt;/p&gt;

&lt;p&gt;You are still in bed. You type: "Yes."&lt;/p&gt;

&lt;p&gt;That is OpenClaw, running right now, on someone's laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I run it Completely On-Premise?
&lt;/h2&gt;

&lt;p&gt;Yes. This is a key differentiator from existing chatbot or assistant &lt;a href="https://geekyants.com/blog/how-to-build-chatgpt-powered-mobile-apps" rel="noopener noreferrer"&gt;AI builders&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;OpenClaw is model-agnostic. While it works beautifully with cloud-based models like Claude, GPT-4, and &lt;a href="https://geekyants.com/blog/deepseek-r1-vs-openais-o1-the-open-source-disruptor-raising-the-bar" rel="noopener noreferrer"&gt;DeepSeek&lt;/a&gt;, you can run it entirely on local models using Ollama. This means zero data leaves your machine.&lt;/p&gt;

&lt;p&gt;Supported local models include Llama 3.x, Mistral, Qwen, Phi, DeepSeek-R1, and more. The setup is straightforward: install Ollama, pull a model, point OpenClaw's config at your local endpoint (&lt;code&gt;http://127.0.0.1:11434/v1&lt;/code&gt;), and you're running a fully private, on-premise AI assistant.&lt;/p&gt;

&lt;p&gt;OpenClaw even supports hybrid configurations — use a fast local model as your everyday coordinator and fall back to a cloud model for complex reasoning tasks.&lt;/p&gt;

&lt;p&gt;For organizations with strict data residency or compliance requirements, this is a game-changer.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Word on Security — Take It Seriously
&lt;/h2&gt;

&lt;p&gt;OpenClaw gives an AI agent real access to your system. That power comes with real risk.&lt;/p&gt;

&lt;p&gt;In the past few weeks, researchers discovered 341 malicious skills in a campaign called "ClawHavoc" that targeted &lt;a href="https://geekyants.com/blog/how-to-build-a-crypto-trading-app-like-coinbase-security-compliance--ux-tips" rel="noopener noreferrer"&gt;cryptocurrency wallets&lt;/a&gt;. Cisco's security team found third-party skills performing data exfiltration without user awareness. BitSight and CrowdStrike flagged exposed instances as enterprise security risks. 22% of enterprise customers in one study had employees running OpenClaw without IT approval.&lt;/p&gt;

&lt;p&gt;OpenClaw is improving: VirusTotal partnership, sandbox modes for Docker-isolated execution, tool allowlists and denylists, DM pairing for access control, and a formal security program at trust.openclaw.ai.&lt;/p&gt;

&lt;p&gt;But the responsibility falls on you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit skills before installing them&lt;/li&gt;
&lt;li&gt;Enable sandbox mode&lt;/li&gt;
&lt;li&gt;Restrict tool access per agent&lt;/li&gt;
&lt;li&gt;Keep sensitive credentials out of the agent's reach&lt;/li&gt;
&lt;li&gt;If deploying for a team, treat it like privileged infrastructure—with &lt;a href="https://geekyants.com/ai" rel="noopener noreferrer"&gt;governance&lt;/a&gt;, monitoring, and clear boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Mental Model Shift
&lt;/h2&gt;

&lt;p&gt;The tool is only as useful as the workflows you design for it.&lt;/p&gt;

&lt;p&gt;Setting it up is just the beginning. The real work—and the real value—comes from thinking about what you want automated. What tasks do you repeat every day? What decisions could be offloaded? What monitoring would save you from fire drills?&lt;/p&gt;

&lt;p&gt;OpenClaw is not magic. It is infrastructure. And like any infrastructure, it rewards planning.&lt;/p&gt;

&lt;p&gt;You need a mental model for what is possible, then build, iterate, and refine. The people getting the most out of OpenClaw are not the ones with the fanciest hardware—they're the ones who've thought about their workflows.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://geekyants.com/en-us" rel="noopener noreferrer"&gt;GeekyAnts&lt;/a&gt;, we help people plan, build, deploy, and manage personal AI assistants—from initial &lt;a href="https://geekyants.com/ai/business-process-automation-services" rel="noopener noreferrer"&gt;architecture to production automation&lt;/a&gt;. Whether you want to run OpenClaw on-premise, integrate it with your existing tools, or build custom skills for your team, &lt;a href="https://geekyants.com/hire" rel="noopener noreferrer"&gt;reach out&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://geekyants.com/blog/openclawai-your-personal-ai-that-actually-does-things" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
    </item>
    <item>
      <title>Exploring Anti-Design Through a Neo-Brutalist Product Experience</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Tue, 28 Jul 2026 13:12:30 +0000</pubDate>
      <link>https://dev.to/geekyants/exploring-anti-design-through-a-neo-brutalist-product-experience-4men</link>
      <guid>https://dev.to/geekyants/exploring-anti-design-through-a-neo-brutalist-product-experience-4men</guid>
      <description>&lt;p&gt;&lt;em&gt;A comprehensive article on customising design systems, experimenting responsibly, and designing with intention in 2026's most defining trend.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When Good Design Becomes Invisible
&lt;/h2&gt;

&lt;p&gt;Most &lt;a href="https://geekyants.com/service/digital-product-design-services" rel="noopener noreferrer"&gt;modern digital products&lt;/a&gt; are well designed. They are clean, usable, and follow best practices. Yet somewhere along the way, many of them started feeling interchangeable, polished to the point of sameness.&lt;/p&gt;

&lt;p&gt;During our early project discussions, one question kept surfacing: How do we create something that feels distinct without sacrificing usability?&lt;/p&gt;

&lt;p&gt;That tension became our entry point into anti-design—not as a visual trend to adopt, but as a design method to explore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Anti-Design Is Defining 2026
&lt;/h2&gt;

&lt;p&gt;Anti-design has emerged as one of the dominant design trends of 2026, representing a fundamental shift in how designers approach their craft. After years of algorithm-friendly, hyper-polished aesthetics, the design community is experiencing what many are calling a creative rebellion.&lt;/p&gt;

&lt;p&gt;Industry leaders are witnessing a deliberate rejection of AI's overly smooth visual language in favour of work that feels unmistakably human. &lt;a href="https://geekyants.com/service/ui-ux-design-services" rel="noopener noreferrer"&gt;Designers&lt;/a&gt; are choosing imperfection, messiness, and rawness as proof that a person, not an algorithm, made this. This is not only an aesthetic preference; it is a response to digital saturation and a hunger for authenticity.&lt;/p&gt;

&lt;p&gt;The data backs up this shift:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Searches for bold fonts have surged over 65%&lt;/li&gt;
&lt;li&gt;Collage art and handmade textures continue to climb in popularity&lt;/li&gt;
&lt;li&gt;Brands are moving away from safe, predictable design toward experiences that feel alive, emotional, and intentionally chaotic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article documents how we rode this wave early by understanding anti-design as a principled methodology that could help us stand out in an increasingly homogenised market.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Started With Anti-Design, Not Ended With It
&lt;/h2&gt;

&lt;p&gt;Anti-design typically appears late in the process, applied as visual flair over an already-finished product. We took a different approach.&lt;/p&gt;

&lt;p&gt;We chose to explore anti-design from the beginning, working at the system level rather than the surface level. Instead of discarding our &lt;a href="https://geekyants.com/solution/design-system-development-service" rel="noopener noreferrer"&gt;design system&lt;/a&gt;, we used it as a foundation and began questioning its assumptions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens when typography leads instead of layout?&lt;/li&gt;
&lt;li&gt;What if spacing becomes expressive, not just consistent?&lt;/li&gt;
&lt;li&gt;What if components feel editorial rather than purely functional?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions shaped our early explorations and helped us test boundaries without losing control.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F32vwphpv7tswtfq9wxs0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F32vwphpv7tswtfq9wxs0.png" alt="Early Design System exploration with multiple button styles and interaction states" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Early explorations showing multiple variations of the same screen or layout concept&lt;/p&gt;

&lt;h2&gt;
  
  
  Customising a Design System Without Breaking It
&lt;/h2&gt;

&lt;p&gt;The challenge was not to push boundaries; it was how to do it without creating chaos.&lt;/p&gt;

&lt;p&gt;Rather than changing everything at once, we focused on small, deliberate experiments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modified Button types to start establishing the new brutalism softly on the screen&lt;/li&gt;
&lt;li&gt;Introduced layout flexibility for content-heavy sections&lt;/li&gt;
&lt;li&gt;Created component variants instead of entirely new patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, we did not build new card components from scratch. Instead, we experimented with existing ones by introducing heavier borders, uneven internal spacing, and Bolder and larger typographic contrast.&lt;/p&gt;

&lt;p&gt;This kept us system-aligned while allowing the visual language to evolve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Neo-Brutalism Worked in a Product Context
&lt;/h2&gt;

&lt;p&gt;Neo-brutalism gave us a middle ground between expressive design and functional usability.&lt;/p&gt;

&lt;p&gt;Unlike traditional brutalism, which can feel harsh or inaccessible, neo-brutalism allows you to use bold typography without harming readability, create visual tension without confusion, and embrace rawness while maintaining structure.&lt;/p&gt;

&lt;p&gt;For us, this approach supported a magazine-inspired experience where content felt curated and intentional, not templated and generic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-World Success Stories
&lt;/h3&gt;

&lt;p&gt;Platforms like Figma and Gumroad have embraced neo-brutalist approaches, demonstrating how raw, unpolished aesthetics can succeed in commercial contexts.&lt;/p&gt;

&lt;p&gt;Figma's brand refresh uses bold contrasts and unconventional typography to emphasize creative freedom and flexibility, perfectly aligning with their &lt;a href="https://geekyants.com/blog/top-10-ai-tools-every-uiux-designer-should-master" rel="noopener noreferrer"&gt;design tool's&lt;/a&gt; purpose. The visual language reinforces what the product enables—unrestricted creativity.&lt;/p&gt;

&lt;p&gt;Gumroad's raw aesthetic aligns with its mission of empowering independent creators. The rebellious visual language communicates that it is a platform for people charting their own paths, not another corporate marketplace. The deliberately utilitarian interface becomes part of the brand promise.&lt;/p&gt;

&lt;p&gt;These are strategic decisions that align visual identity with brand values, proving that neo-brutalism works when it serves a purpose beyond shock value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv22g2n2kp1ln3z70zrqv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv22g2n2kp1ln3z70zrqv.png" alt="Design System layout blocks demonstrating typography scale and editorial influence" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Typography scale experiments or layout blocks showing editorial influence&lt;/p&gt;

&lt;h2&gt;
  
  
  The Psychology Behind Why It Works
&lt;/h2&gt;

&lt;p&gt;There's solid research backing why anti-design captures attention. The Von Restorff Effect, a psychological principle documented by German psychiatrist Hedwig von Restorff in 1933, demonstrates that when multiple similar items are presented, the one that differs from the rest is significantly more likely to be remembered.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 15-Second Window
&lt;/h3&gt;

&lt;p&gt;In a world where users spend an average of 15 seconds on a webpage, shock value works. A brutalist design does not ask for attention it demands it. The distinctive nature of anti-design creates what psychologists call enhanced memory encoding, making experiences more memorable than conventional alternatives.&lt;/p&gt;

&lt;p&gt;When users encounter something unexpected:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Their brain registers the deviation from the norm&lt;/li&gt;
&lt;li&gt;Additional cognitive resources are allocated to processing it&lt;/li&gt;
&lt;li&gt;The experience becomes more deeply encoded in memory&lt;/li&gt;
&lt;li&gt;Recall is significantly improved compared to conventional alternatives&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a measurable impact on user engagement and brand recall, translating to higher engagement metrics, stronger word-of-mouth sharing, and more memorable user experiences.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anti-Design ≠ Careless Design
&lt;/h3&gt;

&lt;p&gt;Anti-design that ignores fundamental principles is just bad design with a rebellious aesthetic. True anti-design respects these principles while finding new ways to express them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Design Must Still Respect Accessibility
&lt;/h2&gt;

&lt;p&gt;This is non-negotiable. WCAG (Web Content Accessibility Guidelines) organizes accessibility requirements under four principles: content must be Perceivable, Operable, Understandable, and Robust.&lt;/p&gt;

&lt;p&gt;Anti-design does not exempt you from these standards—it challenges you to meet them creatively.&lt;/p&gt;

&lt;h3&gt;
  
  
  What You MUST Do for Accessibility:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Color Contrast (WCAG AA Standard)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Maintain a minimum contrast ratio of 4.5:1 for normal text and 3:1 for large text&lt;/li&gt;
&lt;li&gt;Bold typography and heavy borders can work if contrast ratios are maintained&lt;/li&gt;
&lt;li&gt;Use tools like WebAIM's contrast checker to verify compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Typography &amp;amp; Readability
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Keep body text at minimum 16px&lt;/li&gt;
&lt;li&gt;Ensure generous line height (1.5x minimum)&lt;/li&gt;
&lt;li&gt;Avoid extremely condensed or decorative fonts for body copy&lt;/li&gt;
&lt;li&gt;Bold, expressive headlines are fine—just keep body text readable&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Keyboard Navigation &amp;amp; Focus States
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;All interactive elements must be keyboard-accessible&lt;/li&gt;
&lt;li&gt;Visible focus indicators are required (not just on hover)&lt;/li&gt;
&lt;li&gt;Logical tab order must be maintained even with unconventional layouts&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Alternative Text &amp;amp; Screen Readers
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;All images need descriptive alt text&lt;/li&gt;
&lt;li&gt;Ensure heading hierarchy (H1, H2, H3) follows logical structure&lt;/li&gt;
&lt;li&gt;Do not break semantic HTML structure for visual effect&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Sufficient Target Sizes
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Interactive elements must be at least 44x44 pixels&lt;/li&gt;
&lt;li&gt;Even if your design feels raw, buttons must be easily tappable/clickable&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What NOT to Do:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Don not sacrifice contrast for aesthetics
&lt;/h4&gt;

&lt;p&gt;Low-contrast text might look sophisticated but excludes users with visual impairments and violates legal standards.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Do not hide navigation or controls
&lt;/h4&gt;

&lt;p&gt;Experimental layouts are fine, but users must always know how to navigate and complete tasks.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Do not rely solely on color to convey information
&lt;/h4&gt;

&lt;p&gt;Use additional indicators like icons, labels, or patterns alongside color.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Do not break fundamental interaction patterns
&lt;/h4&gt;

&lt;p&gt;Buttons should look clickable, links should be distinguishable, forms should be predictable.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Do not use motion without controls
&lt;/h4&gt;

&lt;p&gt;If you include animations, provide pause/stop controls and respect &lt;strong&gt;prefers-reduced-motion&lt;/strong&gt; settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-World Balance
&lt;/h3&gt;

&lt;p&gt;Gumroad's raw aesthetic includes heavy borders and bold typography, but maintains proper contrast ratios and clear interactive states. The visual rebellion works because the accessibility fundamentals remain intact.&lt;/p&gt;

&lt;p&gt;The principle is to push visual boundaries, not accessibility boundaries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fegtz1ipko9bzc8y4ke2e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fegtz1ipko9bzc8y4ke2e.png" alt="Gumroad homepage showing bold typography, heavy borders, and high-contrast design aesthetic" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Design Still Follows Heuristic Principles
&lt;/h2&gt;

&lt;p&gt;Jakob Nielsen's 10 Usability Heuristics, developed in 1990 and refined in 1994, remain the gold standard for interface design. Anti-design does not reject these principles—it interprets them differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Anti-Design Aligns With Heuristics:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Visibility of System Status
&lt;/h4&gt;

&lt;p&gt;Anti-design can actually enhance this through bold, unmissable feedback states. Heavy borders and strong typography make status changes more visible, not less.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Match Between System and Real World
&lt;/h4&gt;

&lt;p&gt;Neo-brutalism often embraces real-world metaphors—raw materials, physical textures, tactile elements. This can create stronger connections than sterile digital interfaces.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. User Control and Freedom
&lt;/h4&gt;

&lt;p&gt;Unconventional does not mean confusing. Clear "undo" actions, visible navigation, and predictable controls still apply—they just might look different.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Consistency and Standards
&lt;/h4&gt;

&lt;p&gt;This is where anti-design requires the most discipline. You can bend conventions, but you must be consistent within your own system. If one button has a heavy border, all buttons should follow a predictable pattern.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Error Prevention
&lt;/h4&gt;

&lt;p&gt;Bold visual treatments can actually improve error prevention by making warnings more noticeable and actions more deliberate.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Recognition Rather Than Recall
&lt;/h4&gt;

&lt;p&gt;Strong visual hierarchy and distinctive elements aid recognition. Anti-design's boldness can reduce cognitive load by making important elements impossible to miss.&lt;/p&gt;

&lt;h4&gt;
  
  
  7. Flexibility and Efficiency of Use
&lt;/h4&gt;

&lt;p&gt;Power users benefit from predictable patterns. Anti-design can support efficiency through clear visual affordances and consistent interaction models.&lt;/p&gt;

&lt;h4&gt;
  
  
  8. Aesthetic and Minimalist Design
&lt;/h4&gt;

&lt;p&gt;This seems contradictory, but it is not. The heuristic is about ensuring that visual elements support user goals, not about adhering to flat design. Bold typography can create a clearer hierarchy than minimalist layouts if used intentionally.&lt;/p&gt;

&lt;h4&gt;
  
  
  9. Help Users Recognise, Diagnose, and Recover from Errors
&lt;/h4&gt;

&lt;p&gt;Heavy borders, bold text, and strong colour can make error messages more noticeable and actionable.&lt;/p&gt;

&lt;h4&gt;
  
  
  10. Help and Documentation
&lt;/h4&gt;

&lt;p&gt;Even rebellious designs need clear documentation. The visual language might be unconventional, but the help content must remain accessible and searchable.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Key Difference:
&lt;/h3&gt;

&lt;p&gt;Traditional design applies heuristics conservatively. Anti-design applies them expressively—but it still applies them. The rebellion is in the execution, not the abandonment of principles.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Should You Use Anti-Design?
&lt;/h2&gt;

&lt;p&gt;Anti-design is not universally applicable, but it can be powerful when used intentionally.&lt;/p&gt;

&lt;h3&gt;
  
  
  It works well when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Differentiation is a key product goal&lt;/li&gt;
&lt;li&gt;Brand personality matters&lt;/li&gt;
&lt;li&gt;Content needs to feel expressive or editorial&lt;/li&gt;
&lt;li&gt;Your audience is open to visual experimentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  It is less effective when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Speed and efficiency are the primary user goals&lt;/li&gt;
&lt;li&gt;Accessibility constraints are extremely strict&lt;/li&gt;
&lt;li&gt;Users rely on predictable patterns under high-pressure conditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is knowing when expression adds value—and when it becomes noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Experiment Safely With Anti-Design
&lt;/h2&gt;

&lt;p&gt;If you are curious about anti-design but hesitant to try it in live projects, here is how to start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Experiment early: Explore unconventional ideas before the system becomes locked in.&lt;/li&gt;
&lt;li&gt;Isolate risk: Test bold ideas on a few screens or components, not the entire product.&lt;/li&gt;
&lt;li&gt;Use the system as a base: Bend components before you replace them entirely.&lt;/li&gt;
&lt;li&gt;Document intent: Be prepared to explain every rule you break.&lt;/li&gt;
&lt;li&gt;Balance expression with restraint: Not everything needs to be loud. Some elements should anchor the chaos.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What This Approach Taught Us
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1zup0enzkwhelhbh4m6j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1zup0enzkwhelhbh4m6j.png" alt="Design system exploration with anti-design poster, sketches, and creative layout ideas on desk" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This project reinforced several principles worth carrying forward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design systems should enable exploration, not restrict it&lt;/li&gt;
&lt;li&gt;Intentional experimentation leads to stronger outcomes than random novelty&lt;/li&gt;
&lt;li&gt;Anti-design works best when grounded in purpose, not rebellion&lt;/li&gt;
&lt;li&gt;Expression and usability do not have to compete—they can complement each other&lt;/li&gt;
&lt;li&gt;Accessibility and heuristics are creative challenges&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Riding the Wave of Biggest Design Shifts
&lt;/h2&gt;

&lt;p&gt;Anti-design is the design philosophy defining 2026. As the industry moves away from algorithmic perfection and toward human authenticity, designers who understand this shift will create experiences that truly resonate.&lt;/p&gt;

&lt;p&gt;Our exploration proved that anti-design is not about rejecting structure—it's about reshaping it with intention. When approached thoughtfully, it helps you move beyond visual sameness and create experiences that feel memorable, expressive, and purposeful.&lt;/p&gt;

&lt;p&gt;In a market flooded with polished sameness, imperfection has become the new differentiator. The brands and products that will stand out in 2026 are not the ones with the cleanest interfaces—they are the ones with personality, emotion, and unmistakable human touch.&lt;/p&gt;

&lt;p&gt;Sometimes, the most impactful design decisions begin with a simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if we did not do it the usual way?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2026, that question is essential.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://geekyants.com/blog/exploring-anti-design-through-a-neo-brutalist-product-experience" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>design</category>
      <category>uxdesign</category>
    </item>
    <item>
      <title>Building a Self-Healing CI/CD System with an AI Agent</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Fri, 24 Jul 2026 13:21:42 +0000</pubDate>
      <link>https://dev.to/geekyants/building-a-self-healing-cicd-system-with-an-ai-agent-5hea</link>
      <guid>https://dev.to/geekyants/building-a-self-healing-cicd-system-with-an-ai-agent-5hea</guid>
      <description>&lt;p&gt;Engineering teams know when CI pipelines fail. What follows is the problem: a developer stops what they are doing, opens the logs, spends twenty minutes tracing the error, writes a fix, and waits for the pipeline to run again.&lt;/p&gt;

&lt;p&gt;This pattern repeats 3-5 times per week per developer. Across a team of ten engineers, this compounds to 6-8 hours of interrupted work weekly.&lt;/p&gt;

&lt;p&gt;CI failure detection exists. The gap is automated failure resolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Cost of CI Failures
&lt;/h2&gt;

&lt;p&gt;CI pipelines validate code changes before deployment. On each code push, the pipeline compiles the application, executes tests, and reports results. When everything works, developers barely notice it. Failures require immediate developer attention.&lt;/p&gt;

&lt;p&gt;Most failures are not complex. A dependency version changed. A test assertion has been updated. A configuration value is absent. These are routine maintenance issues.&lt;/p&gt;

&lt;p&gt;The cost lies in the interruption overhead. Interruption, context switching, and release cycle delays accumulate. For teams deploying 3-5 times daily, these delays compound.&lt;/p&gt;

&lt;p&gt;Automated error resolution addresses this gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Idea: A Pipeline That Fixes Itself
&lt;/h2&gt;

&lt;p&gt;The systems built by &lt;a href="https://geekyants.com/en-us" rel="noopener noreferrer"&gt;GeekyAnts&lt;/a&gt; treat CI failures as programmatically solvable problems. On failure, the system follows standard debugging workflow: it reads the logs, identifies what went wrong, looks at the relevant code, generates a fix, tests it, and submits the patch for review.&lt;/p&gt;

&lt;p&gt;This process follows systematic patterns recognizable across most CI failures. Error messages are structured. Stack traces identify affected files. Fixes are straightforward with proper context.&lt;/p&gt;

&lt;p&gt;These characteristics enable automation. An &lt;a href="https://geekyants.com/ai/ai-agent-development-services" rel="noopener noreferrer"&gt;AI agent&lt;/a&gt; with codebase access and failure context completes this process without context-switching overhead.&lt;/p&gt;

&lt;p&gt;The result is a self-healing CI/CD system, a pipeline that not only detects failures but responds to them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the System Is Made Of
&lt;/h2&gt;

&lt;p&gt;The platform is built across three layers, each with a distinct role.&lt;/p&gt;

&lt;p&gt;The Application Layer is a Spring Boot backend service representing a simple product management system. It handles user role management, inventory updates, and discount calculations. A test suite validates these services and provides failure scenarios during CI execution. A GitLab CI pipeline runs on every push: compile, test, report. Stage failures trigger agent analysis.&lt;/p&gt;

&lt;p&gt;The AI Agent Layer performs failure analysis and resolution. A &lt;a href="https://geekyants.com/hire-python-developers" rel="noopener noreferrer"&gt;Python service&lt;/a&gt; built with FastAPI monitors pipeline state. On failure detection, it fetches logs, analyzes them, queries the codebase structure, generates a fix, validates it, and creates a merge request.&lt;/p&gt;

&lt;p&gt;The agent uses multiple data sources: a language model for reasoning, a structural codebase map, and historical failure memory. These improve accuracy beyond single-source analysis. The agent is backed by a Neo4j graph database for codebase relationships and a Qdrant vector database for failure memory.&lt;/p&gt;

&lt;p&gt;The Monitoring Dashboard, built with &lt;a href="https://geekyants.com/hire-next-js-developers" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;, provides visibility into active investigations, processing stages, generated fixes, and escalated failures. The dashboard surfaces agent activity and decision rationale in real time.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works: From Code Push to Merge Request
&lt;/h2&gt;

&lt;p&gt;Pipeline failure sequence:&lt;/p&gt;

&lt;p&gt;A developer pushes code. The GitLab pipeline starts: compile, test, report. The pipeline fails due to a broken test or a compilation error. The agent detects the failure event.&lt;/p&gt;

&lt;p&gt;Rather than passing the full raw log to an &lt;a href="https://geekyants.com/blog/ai-in-business-custom-models-for-scalable-innovation" rel="noopener noreferrer"&gt;AI model&lt;/a&gt;, which would be slow, expensive, and full of noise, the agent first cleans it. Dependency downloads, verbose build output, and unrelated stack traces are stripped out. What remains is signal: error messages, stack traces, failing test names, and affected source files. This reduces the search space and improves reasoning accuracy.&lt;/p&gt;

&lt;p&gt;The agent performs deep analysis: it queries the codebase structural map to identify component relationships before proposing changes.&lt;/p&gt;

&lt;p&gt;A fix is generated based on that full context. The fix is validated locally before pushing. If validation passes, the patch is pushed, and a merge request is created for developer review. If the agent cannot resolve the issue, it escalates with a structured diagnostic report rather than raw logs.&lt;/p&gt;

&lt;p&gt;The developer's role shifts from debugging to reviewing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes It More Than a Script
&lt;/h2&gt;

&lt;p&gt;Many &lt;a href="https://geekyants.com/blog/top-devops-automation-tools" rel="noopener noreferrer"&gt;CI automation tools&lt;/a&gt; detect failures and send alerts. This system differs through multi-layered analysis:&lt;/p&gt;

&lt;h3&gt;
  
  
  Log Intelligence
&lt;/h3&gt;

&lt;p&gt;Raw CI logs sent to language models produce suboptimal results. Raw logs contain high noise-to-signal ratios.&lt;/p&gt;

&lt;p&gt;The agent solves this with a dedicated cleaning stage. Before AI reasoning, deterministic parsing extracts error messages, stack traces, and test failures. The model then operates on a smaller, focused input, which improves both speed and accuracy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Codebase Understanding Using AST and Graph Modeling
&lt;/h3&gt;

&lt;p&gt;Knowing that a test failed is not enough context to fix it reliably. The system maintains a structural codebase map built through Java AST parsing.&lt;/p&gt;

&lt;p&gt;This extracts structural elements such as classes, methods, imports, method calls, and dependencies, all stored in a Neo4j graph database as connected relationships. Class contains Method. Method calls Method. Service depends on Repository.&lt;/p&gt;

&lt;p&gt;On failure, the agent traces affected components through the map before proposing fixes. This provides relationship context beyond error messages alone.&lt;/p&gt;

&lt;p&gt;To keep this map accurate without rebuilding it from scratch on every commit, the system performs incremental updates. For each commit, modified files are reprocessed, their AST recalculated, and the graph updated. The map stays current without unnecessary computation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning from Past Failures
&lt;/h3&gt;

&lt;p&gt;CI failures repeat across commits and projects. Recalculating a solution that has already been found once is wasteful.&lt;/p&gt;

&lt;p&gt;The agent maintains a searchable vector memory of historical failures using Qdrant. Each entry stores the error signature, failure context, and generated fix. When a new failure occurs, its error signature is embedded and the database is queried. If a similar failure is found, the system reuses the existing solution, reducing LLM token usage, response latency, and repeated reasoning costs.&lt;/p&gt;

&lt;p&gt;The system improves through accumulated failure data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Active Investigation, Not Passive Generation
&lt;/h3&gt;

&lt;p&gt;The agent provides investigation tools rather than log-only input: it can call getGitDiff() to inspect recent code changes, readFile() to retrieve file contents, queryGraph() to explore code relationships in Neo4j, and blastRadius() to determine the impact scope of a change.&lt;/p&gt;

&lt;p&gt;These tools enable hypothesis formation, evidence testing, and conclusion validation before fix generation. This shifts from single-shot generation to iterative investigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-Time Visibility Into an Autonomous System
&lt;/h2&gt;

&lt;p&gt;Autonomous code changes require engineer visibility into system decisions.&lt;/p&gt;

&lt;p&gt;The dashboard connects to the agent via WebSocket, streaming updates without page refresh. Engineers observe each analysis stage and decision rationale. Events streamed include agent activity, pipeline updates, and metrics updates.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The dashboard surfaces four key views:&lt;/li&gt;
&lt;li&gt;The Overview shows aggregated metrics: total CI incidents, automated fix success rate, escalation rate, and recent pipeline activity.&lt;/li&gt;
&lt;li&gt;The Live Monitor shows the current pipeline, the active agent stage, and logs streaming from the backend.&lt;/li&gt;
&lt;li&gt;The History view lets engineers inspect past failures in detail: root cause analysis, generated patches, fix attempts, and merge request links.&lt;/li&gt;
&lt;li&gt;The Escalations view displays unresolved failures with diagnostic reports.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dashboard enables team adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Impact on Engineering Teams
&lt;/h2&gt;

&lt;p&gt;The immediate benefit is straightforward: fewer interruptions. When the agent handles a routine failure, developers do not need to context-switch. A merge request appears, they review it, and they move on.&lt;/p&gt;

&lt;p&gt;The downstream effects compound. Pipelines that recover faster stay green more often. Increased confidence enables more frequent deployment. Delivery cycles become predictable without debugging delays.&lt;/p&gt;

&lt;p&gt;Longer-term benefits accumulate: Initially, the agent analyzes each failure independent. Over time, it builds a library of known solutions. Common failure patterns resolve through memory lookup. The system becomes more valuable the longer it runs.&lt;/p&gt;

&lt;p&gt;For teams managing multiple projects, a single agent monitors all pipelines—coverage requiring multiple engineers to replicate manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Goes Next
&lt;/h2&gt;

&lt;p&gt;The current system is built around Java and Maven projects. The underlying architecture is not language-specific.&lt;/p&gt;

&lt;p&gt;The log cleaning logic, the vector memory, the LLM reasoning layer, and the merge request workflow are all transferable. &lt;a href="https://geekyants.com/hire-nodejs-developers" rel="noopener noreferrer"&gt;Node.js projects&lt;/a&gt;, Python services, Go &lt;a href="https://geekyants.com/blog/microservices-architecture-from-theory-to-practice" rel="noopener noreferrer"&gt;microservices&lt;/a&gt;—the same approach applies. The primary adaptation required is language-specific AST parsing in the code graph layer. Other components transfer without modification.&lt;/p&gt;

&lt;p&gt;The longer-term direction: a single agent monitoring polyglot organizations and handling CI failures across languages and building systems.&lt;/p&gt;

&lt;p&gt;Beyond language support, the system can expand failure type coverage. The current scope covers test failures and compilation errors. Future iterations could address environment-specific failures, infrastructure misconfigurations, and dependency resolution issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Reactive to Proactive: A Different Way to Think About CI/CD
&lt;/h2&gt;

&lt;p&gt;Traditional &lt;a href="https://geekyants.com/engineering/devops" rel="noopener noreferrer"&gt;CI/CD pipelines&lt;/a&gt; are built to report. They run when code is pushed, surface failures, and wait for a human to act.&lt;/p&gt;

&lt;p&gt;That model made sense when diagnosis required human judgment at every step. It makes less sense now. The patterns are recognizable. The process is systematic. The tooling to automate it exists.&lt;/p&gt;

&lt;p&gt;Self-healing CI/CD systems do not remove developers from the loop. The merge request step is deliberate. Human judgment belongs before fixes reach production. What changes is where developers enter that loop. Instead of starting with a raw log file and no context, they start with a proposed solution and a clear explanation of the problem.&lt;/p&gt;

&lt;p&gt;That shift from debugging to decision-making is where engineering time should be spent.&lt;/p&gt;

&lt;p&gt;Teams building this capability will resolve failures faster. They will compound that advantage with each independently resolved incident.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://geekyants.com/blog/building-a-self-healing-cicd-system-with-an-ai-agent" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building an Autonomous Multi-Agent Fraud Detection System in Under 200ms</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Wed, 22 Jul 2026 13:14:13 +0000</pubDate>
      <link>https://dev.to/geekyants/building-an-autonomous-multi-agent-fraud-detection-system-in-under-200ms-1p64</link>
      <guid>https://dev.to/geekyants/building-an-autonomous-multi-agent-fraud-detection-system-in-under-200ms-1p64</guid>
      <description>&lt;p&gt;Indian banks lose $1.49 billion USD to fraud every year. The systems built to stop it take 3 to 5 seconds to reach a decision. UPI payments settle in 2 seconds. By the time the fraud system responds, the money has already moved.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://geekyants.com/en-us" rel="noopener noreferrer"&gt;GeekyAnts'&lt;/a&gt; internal event, we tackled this problem with a different kind of system. Instead of a single, all-purpose AI model, we built five specialized AI programs that work together in sequence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Existing Fraud Detection Fails
&lt;/h2&gt;

&lt;p&gt;Before understanding the solution, it helps to understand why current systems fall short. There are five structural problems, and each makes the others worse.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. They are too slow.
&lt;/h3&gt;

&lt;p&gt;A 3 to 5 second response time may seem reasonable in isolation. But when payments settle in 2 seconds, a fraud decision that arrives after settlement is record-keeping instead of prevention.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. They cover too little ground.
&lt;/h3&gt;

&lt;p&gt;Most legacy systems were built to catch credit and debit card fraud. Today's threats include deepfake identity verification (where criminals use AI-generated faces to pass ID checks), social engineering over UPI, corporate email scams, and fake loan applications using fabricated identities. These largely go undetected.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. They cannot adapt quickly.
&lt;/h3&gt;

&lt;p&gt;When a new fraud pattern emerges, traditional systems need weeks of work before they can recognize it: data collection, model retraining, testing, and deployment. Criminals exploit that window across thousands of transactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. They generate too many false alarms.
&lt;/h3&gt;

&lt;p&gt;False positive rates, meaning legitimate transactions wrongly flagged as fraud, hover around 40%. Analysts spend the majority of their time investigating genuine payments while actual fraud slips through in the background.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. They are expensive to implement.
&lt;/h3&gt;

&lt;p&gt;Connecting a new bank to a fraud system is typically a six-month custom project.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture: Five Specialists, One Pipeline
&lt;/h2&gt;

&lt;p&gt;Our &lt;a href="https://geekyants.com/industry-expertise/banking-finance-insurance/regtech-compliance-automation/fraud-detection-software-development" rel="noopener noreferrer"&gt;multi-agent fraud detection system&lt;/a&gt; replaces a single overloaded model with five agents (specialized AI programs), each responsible for one task. A transaction enters the system, passes through all five in order, and exits with a decision in under 200 milliseconds.&lt;/p&gt;

&lt;p&gt;A shared context object, think of it as a growing document, travels through the entire pipeline. Each agent adds its findings. By the end, this document contains the full record of how the decision was made, and it is stored as a permanent, tamper-proof audit log.&lt;/p&gt;

&lt;p&gt;Here is what each agent does:&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 1: Signal Processor
&lt;/h3&gt;

&lt;p&gt;Cleans and standardizes the raw transaction data. Banks send information in different formats, currencies, and time zones. This agent converts everything into a consistent form so the agents that follow can work reliably.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 2: Category Classifier
&lt;/h3&gt;

&lt;p&gt;Routes the transaction into one of nine fraud categories: account takeover, general transaction fraud, card-not-present fraud, mobile fraud, deepfake identity fraud, UPI fraud, loan fraud, wire/business email fraud, and insider fraud. Each category has its own specific rules. A social engineering scam over UPI looks nothing like a corporate wire fraud, and treating them the same wastes both computing resources and accuracy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 3: Risk Scorer
&lt;/h3&gt;

&lt;p&gt;The core of the system. This agent assigns a risk score using the three-tier process described in detail below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 4: Decision Agent
&lt;/h3&gt;

&lt;p&gt;Applies the risk score to a decision. Scores below 0.30 result in APPROVE. Scores between 0.30 and 0.70 trigger a CHALLENGE, a step-up verification request sent to the customer. Scores above 0.70 result in DECLINE. Each bank can configure its own thresholds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 5: Explanation Agent
&lt;/h3&gt;

&lt;p&gt;Produces a plain-language summary of why the decision was made: the top five contributing factors, the reasoning, and a confidence level. Indian and international financial regulations, including RBI, &lt;a href="https://geekyants.com/industry-expertise/banking-finance-insurance/regtech-compliance-automation/regulatory-reporting-compliance-development" rel="noopener noreferrer"&gt;PCI-DSS&lt;/a&gt;, and GDPR, require that automated decisions be explainable, so this step is not optional.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three-Tier Risk Engine
&lt;/h2&gt;

&lt;p&gt;Most &lt;a href="https://geekyants.com/blog/how-to-build-an-ai-powered-real-time-fraud-detection-system-in-the-usa" rel="noopener noreferrer"&gt;AI fraud systems&lt;/a&gt; send every transaction through the most powerful and most expensive model available. Our agent takes a different approach: start with the simplest tool, and only escalate when necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 1: Rules (10 milliseconds)
&lt;/h3&gt;

&lt;p&gt;Forty-eight configurable rules check things like transaction velocity (how many payments were made in quick succession), amount limits, device recognition, and time-of-day patterns. A routine ₹2,500 UPI payment from a recognized device to a known recipient resolves here in 10 milliseconds with no AI involved. Tier 1 handles 60% of all transactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 2: Machine Learning (25 milliseconds)
&lt;/h3&gt;

&lt;p&gt;When Tier 1's confidence falls below a threshold, the transaction escalates to an XGBoost model (a type of machine learning algorithm known for speed and accuracy on structured data). It evaluates 65 or more factors and produces a score alongside an explanation of which factors drove it, using a technique called SHAP. This tier runs on standard computer processors with no specialized hardware required. Tier 2 handles 30% of all transactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tier 3: AI with Memory (100 milliseconds)
&lt;/h3&gt;

&lt;p&gt;Only the genuinely ambiguous 5% reach here. A &lt;a href="https://geekyants.com/ai/large-language-model-development-services" rel="noopener noreferrer"&gt;large language model&lt;/a&gt; (an AI capable of reading and reasoning over text, similar to the technology behind chatbots) receives the transaction data, the factors from Tier 2, and the three most similar past cases retrieved from a database called ChromaDB. This grounds the AI's reasoning in real precedent rather than guesswork. Tier 3 handles 5% of all transactions.&lt;/p&gt;

&lt;p&gt;The end-to-end result is under 200 milliseconds. Because 95% of transactions never reach the large language model, the multi-agent costs 15 times less per transaction than systems that process everything through one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-Learning Without Retraining
&lt;/h2&gt;

&lt;p&gt;Traditional &lt;a href="https://geekyants.com/ai/machine-learning-development-services" rel="noopener noreferrer"&gt;machine learning&lt;/a&gt; operates on a fixed cycle: collect data, retrain the model, validate, and deploy. This can take weeks, but the agent closes that gap in seconds.&lt;/p&gt;

&lt;p&gt;When a human analyst overrides a system decision, for example, approving a transaction that was flagged because the customer was using a VPN while traveling abroad, three things happen at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The transaction details, the original decision, the override, and the analyst's note are converted into a vector embedding (a mathematical representation that captures meaning) and stored in ChromaDB.&lt;/li&gt;
&lt;li&gt;A permanent audit entry is created.&lt;/li&gt;
&lt;li&gt;The pattern library is updated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next time a similar transaction arrives from a different customer but matches the same pattern, the system retrieves the previous case and uses it as evidence. The AI now knows that a human verified this pattern as legitimate. No retraining. No data science work. The system learned in seconds.&lt;/p&gt;

&lt;p&gt;Over time, every analyst interaction adds to the system's institutional knowledge, and false positive rates fall continuously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment: One Configuration File
&lt;/h2&gt;

&lt;p&gt;The Agent deploys through a single configuration file written in YAML (a simple, human-readable format for settings). A bank provides its field mappings, data source, and preferred risk thresholds. One infrastructure command provisions the entire stack, including databases, data pipelines, and monitoring dashboards, in approximately 15 minutes.&lt;/p&gt;

&lt;p&gt;Rollout follows three phases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Days 1 to 2: Configuration and testing.&lt;/li&gt;
&lt;li&gt;Weeks 2 to 3: Shadow mode, where the Agent logs decisions without enforcing them, allowing the bank to validate accuracy.&lt;/li&gt;
&lt;li&gt;Go-live: Enabled with a single toggle, with no code changes required on the bank's side.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Technical Stack
&lt;/h2&gt;

&lt;p&gt;The system is built on &lt;a href="https://geekyants.com/hire-python-developers" rel="noopener noreferrer"&gt;Python&lt;/a&gt; for agent logic, &lt;a href="https://geekyants.com/hire-postgresql-developers" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt; for logs and configuration, Redis for caching, ChromaDB for vector storage, Apache Kafka for data ingestion, XGBoost for Tier 2 scoring, GPT-4o-mini for Tier 3 reasoning, Docker and &lt;a href="https://geekyants.com/engineering/devops/kubernetes-containerization-services" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt; for deployment, Terraform for infrastructure, and Prometheus with Grafana for monitoring.&lt;/p&gt;

&lt;p&gt;Here are the metrics from our system:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;P50 Latency&lt;/td&gt;
&lt;td&gt;18ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P95 Latency&lt;/td&gt;
&lt;td&gt;85ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P99 Latency&lt;/td&gt;
&lt;td&gt;145ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fraud Categories&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configurable Rules&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signals per Transaction&lt;/td&gt;
&lt;td&gt;87+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config to Shadow Mode&lt;/td&gt;
&lt;td&gt;~15 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production Cost (1M txn/day)&lt;/td&gt;
&lt;td&gt;~$68K+/year&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The cost figure reflects the tiered design. Because 60% of transactions resolve at ₹0.001 each and only 5% reach the large language model at ₹0.12 each, the weighted average cost is approximately ₹0.002 per transaction. For a bank processing 1 crore (10 million) transactions per day, that is ₹64 Lakh per year against the potential to prevent hundreds of crores in losses, representing a roughly 785x return on investment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Team Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Decompose before you model. Fraud detection is five distinct tasks. Splitting them across specialized agents produced better accuracy, lower latency, and lower cost than any single model could.&lt;/li&gt;
&lt;li&gt;Speed is not a performance metric. It is a product feature. For real-time payments, the difference between 200 milliseconds and 3 seconds is the difference between preventing fraud and documenting it.&lt;/li&gt;
&lt;li&gt;Human oversight is the learning mechanism. Analyst overrides were designed for error correction. They turned out to be the most powerful component of the system, each one a training signal that propagates in seconds.&lt;/li&gt;
&lt;li&gt;Technical depth requires clear communication. The team rehearsed seven times and prepared answers to 16 anticipated questions. When judges pressed on token consumption, caching, and data segregation, the team had precise answers ready.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;p&gt;The roadmap includes replacing the external AI API with a self-hosted &lt;a href="https://geekyants.com/open-source" rel="noopener noreferrer"&gt;open-source&lt;/a&gt; model to eliminate external dependency, an agent that automatically proposes new Tier 1 rules based on patterns identified in Tier 3, real-time testing between competing rule versions, and cross-bank federated learning where banks collectively benefit from shared fraud pattern knowledge without sharing individual customer data.&lt;/p&gt;

&lt;p&gt;The architecture is designed for production.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://geekyants.com/blog/building-an-autonomous-multi-agent-fraud-detection-system-in-under-200ms" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>fintech</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>A Real-Time AI Fraud Decision Engine Under 50ms</title>
      <dc:creator>GeekyAnts India Pvt Ltd</dc:creator>
      <pubDate>Mon, 20 Jul 2026 06:36:18 +0000</pubDate>
      <link>https://dev.to/geekyants/a-real-time-ai-fraud-decision-engine-under-50ms-3325</link>
      <guid>https://dev.to/geekyants/a-real-time-ai-fraud-decision-engine-under-50ms-3325</guid>
      <description>&lt;p&gt;Inside a high-performance Real-Time AI Fraud Decision Engine, a system that reviews a financial transaction and returns a decision in under 50 milliseconds.&lt;/p&gt;

&lt;p&gt;Every time you tap your phone to pay for something, a quiet competition is taking place. On one side are fraudsters looking to steal money. On the other side are detection systems trying to stop them in the time it takes to blink.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://geekyants.com/" rel="noopener noreferrer"&gt;GeekyAnts&lt;/a&gt;, a team of engineers set out to &lt;a href="https://geekyants.com/blog/how-to-build-an-ai-powered-real-time-fraud-detection-system-in-the-usa" rel="noopener noreferrer"&gt;build a fraud detection engine&lt;/a&gt; that could make that split-second call. The result is an Autonomous Multi-Agent Pipeline, a system capable of analyzing a financial transaction and deciding whether to approve, challenge, or block it in under 50 milliseconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With Fraud Today
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://geekyants.com/industry-expertise/banking-finance-insurance/payments-and-digital-wallets" rel="noopener noreferrer"&gt;Digital payments&lt;/a&gt; have grown at a pace that has outrun traditional fraud prevention. The scale alone is staggering: large financial platforms process tens of thousands of transactions every minute. No team of human analysts can review that volume in real time.&lt;/p&gt;

&lt;p&gt;Four problems sit at the heart of the challenge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volume.&lt;/strong&gt; Thousands of transactions arrive every minute, far beyond human review capacity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;False alarms.&lt;/strong&gt; Many older systems block payments from real customers. These false declines push people away from digital banking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed of attack.&lt;/strong&gt; Once a fraudster gains access to an account, funds can be moved within minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No clear explanations.&lt;/strong&gt; Legacy systems often return error codes with no reasoning behind them, making it hard to communicate decisions to customers or regulators.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Three Layers of Intelligence
&lt;/h2&gt;

&lt;p&gt;Rather than rely on a single tool, the team built a system that combines three distinct layers of decision-making:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;a href="https://geekyants.com/ai/machine-learning-development-services" rel="noopener noreferrer"&gt;machine learning model&lt;/a&gt; that scores the risk of each transaction based on behavioral patterns.&lt;/li&gt;
&lt;li&gt;A rules engine that checks transactions against known fraud patterns.&lt;/li&gt;
&lt;li&gt;AI reasoning agents that generate written explanations of why a transaction was flagged.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these layers handle what none could do alone: catch fraud at speed, explain decisions in plain language, and remain functional even when one component is unavailable.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a Transaction Gets Reviewed
&lt;/h2&gt;

&lt;p&gt;When a transaction arrives, it passes through a sequence of specialized processes, each one focused on a specific task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Signal Collection
&lt;/h3&gt;

&lt;p&gt;The system gathers and organizes the raw data attached to the transaction: device information, location, transaction amount, and account history. These are converted into a standard format the system can work with.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Fraud Category Identification
&lt;/h3&gt;

&lt;p&gt;Not all fraud looks the same. The system checks which of nine fraud categories the transaction might belong to, such as account takeover, card misuse, or wire transfer fraud. Identifying the category helps apply the right detection logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Risk Scoring
&lt;/h3&gt;

&lt;p&gt;A machine learning model evaluates fifteen risk signals to produce a fraud probability score. These signals include device risk, transaction speed, geographic location, and whether a VPN or proxy is in use, among others.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: The Decision
&lt;/h3&gt;

&lt;p&gt;Using the risk score and pattern matching against 27 known fraud scenarios, the system decides one of three outcomes: approve the transaction, challenge it (for example, by requesting additional verification), or decline it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: The Explanation
&lt;/h3&gt;

&lt;p&gt;In the background, an &lt;a href="https://geekyants.com/ai" rel="noopener noreferrer"&gt;AI&lt;/a&gt; reasoning process generates a written summary of why the decision was made. This explanation is stored for compliance teams, auditors, and customer support — anyone who needs to understand the reasoning later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two Paths, One Decision
&lt;/h3&gt;

&lt;p&gt;The architecture separates speed from depth. The fast path handles the core decision in 5 to 15 milliseconds using the machine learning model and the rules engine. This is what keeps the payment experience smooth for the end user.&lt;/p&gt;

&lt;p&gt;The enrichment path runs in the background and completes within 200 milliseconds. It produces a fuller picture: threat severity, attack patterns, and recommended actions, all written in plain language rather than code.&lt;/p&gt;

&lt;p&gt;Splitting the two paths means the payment does not have to wait for deep analysis. Both can happen without slowing each other down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why A Single Method Is Not Enough
&lt;/h2&gt;

&lt;p&gt;Machine learning is good at identifying unusual behavior — transactions that deviate from a user's normal patterns in ways that are hard to put into words. Rules, on the other hand, are good at catching specific, well-documented attack patterns with high confidence.&lt;/p&gt;

&lt;p&gt;This decision engine uses both. The rules catch what is known. The machine learning model catches what is unusual. The AI reasoning layer explains what was found. Each method covers the gaps of the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Nine Fraud Types the System Covers
&lt;/h2&gt;

&lt;p&gt;The system is built to recognize a wide range of fraud types common in digital finance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Account Takeover.&lt;/strong&gt; When a fraudster gains access to someone else's account, often through stolen credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaction Fraud.&lt;/strong&gt; Unauthorized payments made from a legitimate account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Card-Not-Present Fraud.&lt;/strong&gt; Fraud that occurs when a physical card is not required, common in online purchases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile Banking Fraud.&lt;/strong&gt; Attacks that target users through &lt;a href="https://geekyants.com/service/hire-mobile-app-development-services" rel="noopener noreferrer"&gt;mobile apps&lt;/a&gt; or devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding and Identity Fraud.&lt;/strong&gt; False identities used to open new accounts or pass verification checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Digital Wallet Fraud.&lt;/strong&gt; Unauthorized use of payment apps and wallet services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loan and Credit Fraud.&lt;/strong&gt; Applications for credit or loans using false information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wire Transfer and Business Email Fraud.&lt;/strong&gt; Attackers impersonating executives or vendors to redirect payments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal Employee Fraud.&lt;/strong&gt; Misuse of system access by people within an organization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Across these nine categories, the system models 27 distinct fraud scenarios — specific attack patterns that the decision engine checks for during each review.&lt;/p&gt;

&lt;p&gt;The performance targets were set with real payment flows in mind. A decision that takes several seconds is too slow; customers expect near-instant responses.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core decision time: 5–15 milliseconds&lt;/li&gt;
&lt;li&gt;Full analysis with explanation: under 200 milliseconds&lt;/li&gt;
&lt;li&gt;Fraud categories covered: 9&lt;/li&gt;
&lt;li&gt;Fraud scenarios modeled: 27&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Building This System Taught Us
&lt;/h2&gt;

&lt;p&gt;The project produced five practical conclusions about &lt;a href="https://geekyants.com/industry-expertise/banking-finance-insurance/regtech-compliance-automation/fraud-detection-software-development" rel="noopener noreferrer"&gt;fraud detection systems&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Speed is not optional. In payment flows, a slow decision is as disruptive as a wrong one.&lt;/li&gt;
&lt;li&gt;Explainability matters as much as accuracy. A system that cannot explain its decisions is a liability for compliance and customer communication.&lt;/li&gt;
&lt;li&gt;Hybrid systems outperform single-method systems. Rules and machine learning cover different failure modes.&lt;/li&gt;
&lt;li&gt;Observability is essential. Being able to trace each decision through the pipeline makes debugging complex systems possible.&lt;/li&gt;
&lt;li&gt;Rules remain necessary for critical decisions. AI reasoning is a valuable layer, but deterministic logic still provides the reliability that high-stakes decisions require.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;This multi-agent architecture reflects the direction that real-world fraud prevention is taking. Financial institutions increasingly depend on layered systems that combine structured rules, statistical models, and AI-generated reasoning to keep pace with attackers.&lt;/p&gt;

&lt;p&gt;As digital payments accelerate, systems built for the intersection of speed, accuracy, and transparency are no longer just a technical aspiration — they are a necessity. This project is a prime example of what that looks like in practice.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://geekyants.com/blog/a-real-time-ai-fraud-decision-engine-under-50ms" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
