<?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>OpenClaw.ai — Your Personal AI That Actually Does Things</title>
      <dc:creator>GeekyAnts Inc</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 Inc</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 Inc</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 Inc</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 Inc</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>
    <item>
      <title>AI Code Healer for Fixing Broken CI/CD Builds Fast</title>
      <dc:creator>GeekyAnts Inc</dc:creator>
      <pubDate>Fri, 17 Jul 2026 13:16:12 +0000</pubDate>
      <link>https://dev.to/geekyants/ai-code-healer-for-fixing-broken-cicd-builds-fast-cdi</link>
      <guid>https://dev.to/geekyants/ai-code-healer-for-fixing-broken-cicd-builds-fast-cdi</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Every Developer Knows
&lt;/h2&gt;

&lt;p&gt;You are on vacation. Your phone buzzes. A build has failed.&lt;/p&gt;

&lt;p&gt;You have no laptop, but the expectation is clear: find the problem and fix it. For developers who work with &lt;a href="https://geekyants.com/engineering/devops" rel="noopener noreferrer"&gt;CI/CD pipelines&lt;/a&gt;, this scenario is routine. Pipelines fail at the worst moments, blocking releases and forcing engineers to sift through thousands of lines of diagnostic logs from wherever they happen to be.&lt;/p&gt;

&lt;p&gt;Our internal engineering teams built a specialized Code Healer to address exactly this.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the System Works
&lt;/h2&gt;

&lt;p&gt;The solution is a centralized dashboard that connects to your GitHub or GitLab repositories. From this dashboard, developers can monitor their build pipelines, tracking progress, successes, and failures from any device, including a mobile phone.&lt;/p&gt;

&lt;p&gt;The platform goes beyond simple monitoring. When a pipeline fails, the system analyzes the failure and guides developers toward a resolution, without requiring them to manually read through massive log files. It delivers AI-powered analysis and specific suggestions for fixing the problem at the code level.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two-Agent Architecture
&lt;/h2&gt;

&lt;p&gt;At the heart of the Code Healer is a two-agent AI architecture — meaning two distinct &lt;a href="https://geekyants.com/ai" rel="noopener noreferrer"&gt;AI systems&lt;/a&gt; that work in sequence to diagnose and solve build failures.&lt;/p&gt;

&lt;p&gt;The two agents are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Local AI Agent:&lt;/strong&gt; A lighter &lt;a href="https://geekyants.com/blog/ai-in-business-custom-models-for-scalable-innovation" rel="noopener noreferrer"&gt;AI model&lt;/a&gt; that runs close to (or within) the developer's own infrastructure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An Advanced AI Agent:&lt;/strong&gt; A more powerful AI model capable of deeper reasoning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a developer clicks Analyze Failure, the full log from the failed build is sent to the &lt;a href="https://geekyants.com/engineering/backend" rel="noopener noreferrer"&gt;backend&lt;/a&gt;. The first task is to strip out the "noise" — CI logs frequently run to thousands of lines, but only a fraction of that content is relevant to understanding what went wrong.&lt;/p&gt;

&lt;p&gt;Once the log is cleaned and structured, it is passed to the Local AI Agent, which produces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A failure summary: A plain description of what went wrong.&lt;/li&gt;
&lt;li&gt;Impacted files: The specific files likely connected to the failure.&lt;/li&gt;
&lt;li&gt;Possible solutions: Initial recommendations for fixing the issue.&lt;/li&gt;
&lt;li&gt;A semantic prompt: A compressed, structured description of the problem context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That semantic prompt is then forwarded to the Advanced AI Agent, which performs deeper analysis and returns refined failure summaries and detailed solution suggestions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code-Level Fixes
&lt;/h2&gt;

&lt;p&gt;Once the initial diagnosis is complete, the developer can click Advanced Assist. At this stage, a specialized &lt;a href="https://geekyants.com/ai/ai-agent-development-services" rel="noopener noreferrer"&gt;AI agent&lt;/a&gt; creates a code patch — a specific set of code modifications intended to fix the identified issue.&lt;/p&gt;

&lt;p&gt;The same layered methodology is used in this patch generation process: the request goes via the Local Agent before arriving at the Advanced Agent. This ensures that the input the advanced model receives is well-structured, which in turn produces more precise and useful code fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use a Local Agent at All?
&lt;/h2&gt;

&lt;p&gt;Our team implemented the Local Agent for two concrete reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost and Speed:&lt;/strong&gt; Build logs are massive. Sending them in their entirety to a sophisticated AI model results in high latency and costs. The Local Agent serves as a compression layer, extracting only the pertinent context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Privacy:&lt;/strong&gt; Many organizations are cautious about sending source code to external systems. The Local Agent can be deployed entirely within the client's own cloud environment, ensuring sensitive data never leaves the organization's infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Continuous Improvement
&lt;/h2&gt;

&lt;p&gt;The Local Agent is designed to operate independently, but the system also has a mechanism to improve its quality over time. When the Local Agent cannot resolve a problem with confidence, the system escalates to the Advanced Agent. The solution produced is then used as a training signal — feedback that gradually makes the Local Agent more capable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Broader Goal
&lt;/h2&gt;

&lt;p&gt;The vision our team holds is that developers should build products, not spend their time diagnosing broken pipelines. By combining pipeline monitoring, AI-driven failure analysis, and code-level suggestions, we are moving toward a future where build systems can identify and resolve their own problems with minimal intervention.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://geekyants.com/blog/ai-code-healer-for-fixing-broken-cicd-builds-fast" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>How We Built an AI System That Automates Senior Solution Architect Workflows</title>
      <dc:creator>GeekyAnts Inc</dc:creator>
      <pubDate>Thu, 16 Jul 2026 11:21:17 +0000</pubDate>
      <link>https://dev.to/geekyants/how-we-built-an-ai-system-that-automates-senior-solution-architect-workflows-5cl5</link>
      <guid>https://dev.to/geekyants/how-we-built-an-ai-system-that-automates-senior-solution-architect-workflows-5cl5</guid>
      <description>&lt;p&gt;30% of a senior architect's time goes into reading RFPs and writing proposals rather than designing systems or solving engineering problems.&lt;/p&gt;

&lt;p&gt;A 50-page enterprise RFP lands in an inbox. Two hours later, the architect has concluded what they suspected on page three: &lt;a href="https://geekyants.com/hire-react-native-developers" rel="noopener noreferrer"&gt;React Native&lt;/a&gt; frontend, &lt;a href="https://geekyants.com/hire-nodejs-developers" rel="noopener noreferrer"&gt;Node backend&lt;/a&gt;, &lt;a href="https://geekyants.com/hire-postgresql-developers" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;, and Stripe for payments. The decision was predictable, but the process was manual and time-consuming.&lt;/p&gt;

&lt;p&gt;This manual work of extracting requirements, spotting contradictions, and drafting a coherent proposal repeats for each RFP. Our teams built an &lt;a href="https://geekyants.com/ai/ai-agent-development-services" rel="noopener noreferrer"&gt;AI-powered co-pilot&lt;/a&gt; to change that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the AI Presales Co-Pilot Does
&lt;/h2&gt;

&lt;p&gt;This system assists with the presales cycle. You upload a client's documents — PDFs, Word docs, Excel sheets, or emails — and the system produces a draft technical proposal that an architect can review and refine in 15 minutes instead of writing from scratch for 3 hours.&lt;/p&gt;

&lt;p&gt;The value extends beyond document generation to reasoning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Detects Contradictions:&lt;/strong&gt; It flags tensions, such as a request for Native Mobile only paired with Critical SEO.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surfaces Assumptions:&lt;/strong&gt; It states the assumptions it is making (e.g., assuming Stripe for payments) so an architect can confirm or override them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidence Scoring:&lt;/strong&gt; It scores its own decisions, indicating where reviewers should focus attention.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Works: Four Specialized Agents
&lt;/h2&gt;

&lt;p&gt;The system runs &lt;a href="https://geekyants.com/consulting-services/artificial-intelligence-consulting/ai-pods" rel="noopener noreferrer"&gt;four specialized AI agents&lt;/a&gt; in sequence. The entire pipeline runs over a WebSocket connection, streaming progress to the dashboard in real time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 1: Requirement Interpreter
&lt;/h3&gt;

&lt;p&gt;This agent parses raw, unstructured documents using format-specific tools (PyMuPDF, pandas, etc.). It extracts features, technical constraints, and non-functional requirements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pattern Enrichment:&lt;/strong&gt; If a two-sided marketplace is mentioned, the system suggests features like ratings and booking based on a built-in knowledge base.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conflict Detection:&lt;/strong&gt; A rule engine identifies over-engineering or technical mismatches during initial analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent 2: Solution Engine
&lt;/h3&gt;

&lt;p&gt;This agent produces tech stack recommendations and effort estimates. It uses a hybrid approach: deterministic rules suggest the baseline stack (e.g., &lt;a href="https://geekyants.com/hire-nest-js-developers" rel="noopener noreferrer"&gt;NestJS&lt;/a&gt;/PostgreSQL), while the &lt;a href="https://geekyants.com/ai/large-language-model-development-services" rel="noopener noreferrer"&gt;LLM&lt;/a&gt; validates that choice against the specific client context. Effort estimation provides optimistic-to-pessimistic ranges (e.g., "120–210 hours") to reflect real-world uncertainty.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 3: Self-Critique
&lt;/h3&gt;

&lt;p&gt;Before a proposal is written, a critique agent reviews the solution for consistency. If an assumption contradicts a user input, the system sends a clarifying question back to the architect via WebSockets. Only when the critique approves does the pipeline proceed to generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 4: Proposal Composer
&lt;/h3&gt;

&lt;p&gt;The final agent selects a template (&lt;a href="https://geekyants.com/service/mvp-development-service" rel="noopener noreferrer"&gt;MVP&lt;/a&gt;, Enterprise, or Standard) and generates a Markdown proposal. The output covers Problem Understanding, Tech Stack, Architecture Overview, and Risk Mitigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pipeline at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Parse&lt;/td&gt;
&lt;td&gt;Ingestion of any file type&lt;/td&gt;
&lt;td&gt;Combined raw text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Extract&lt;/td&gt;
&lt;td&gt;Conflict &amp;amp; pattern detection&lt;/td&gt;
&lt;td&gt;Structured requirements JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Design&lt;/td&gt;
&lt;td&gt;Rule-based stack matching&lt;/td&gt;
&lt;td&gt;Solution + effort mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Review&lt;/td&gt;
&lt;td&gt;Validation &amp;amp; User Clarification&lt;/td&gt;
&lt;td&gt;Approved technical solution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Write&lt;/td&gt;
&lt;td&gt;Template-based generation&lt;/td&gt;
&lt;td&gt;Polished Markdown/PDF proposal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Engineering Insights
&lt;/h2&gt;

&lt;p&gt;Rule-based systems and LLMs complement each other: Conflict detection and effort mapping do not need an LLM — they need deterministic rules. LLMs handle ambiguity and prose generation.&lt;/p&gt;

&lt;p&gt;Transparency is the primary feature. The reasoning trace provides more value than the document itself. By showing why assumptions were made, the system enables architects to review proposals 5–10x faster.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; &lt;a href="https://geekyants.com/hire-python-developers" rel="noopener noreferrer"&gt;Python&lt;/a&gt; with FastAPI for async orchestration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Layer:&lt;/strong&gt; OpenRouter (Claude, GPT-4, and Gemini) for multi-model reasoning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication:&lt;/strong&gt; WebSockets for real-time streaming to a React-based frontend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Base:&lt;/strong&gt; JSON-based datasets for requirement patterns and stack decision rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Presales reasoning is repeatable. &lt;a href="https://geekyants.com/ai" rel="noopener noreferrer"&gt;AI systems&lt;/a&gt; that make reasoning transparent and reviewable accelerate the path from RFP to proposal.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://geekyants.com/blog/how-we-built-an-ai-system-that-automates-senior-solution-architect-workflows" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>From RFPs to Revenue: How We Built an AI Agent Team That Writes Technical Proposals in 60 Seconds</title>
      <dc:creator>GeekyAnts Inc</dc:creator>
      <pubDate>Wed, 15 Jul 2026 11:30:29 +0000</pubDate>
      <link>https://dev.to/geekyants/from-rfps-to-revenue-how-we-built-an-ai-agent-team-that-writes-technical-proposals-in-60-seconds-3oen</link>
      <guid>https://dev.to/geekyants/from-rfps-to-revenue-how-we-built-an-ai-agent-team-that-writes-technical-proposals-in-60-seconds-3oen</guid>
      <description>&lt;p&gt;The presales proposal process costs &lt;a href="https://geekyants.com/service/enterprise-software-development-services" rel="noopener noreferrer"&gt;software services companies&lt;/a&gt; 3 to 5 days per deal. DealRoom.ai reduces that to under 60 seconds using a pipeline of four coordinated &lt;a href="https://geekyants.com/ai/ai-agent-development-services" rel="noopener noreferrer"&gt;AI agents&lt;/a&gt; without compromising estimation accuracy or proposal quality.&lt;/p&gt;

&lt;p&gt;A technical proposal is the first deliverable a software company produces for a prospective client. It sets scope, cost expectations, and credibility. The process of producing one has not changed in years.&lt;/p&gt;

&lt;p&gt;An RFP arrives. A discovery call follows. Requirements are distributed across a PDF brief, a Word document, follow-up emails, and meeting notes. A solutions architect spends 3-5 days synthesizing these inputs into a proposal. The output is a static document that can be outdated by client review.&lt;/p&gt;

&lt;p&gt;This is where deals are won or lost, and the process is a bottleneck that companies accept as fixed. DealRoom.ai was built on the premise that it is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where does the time go
&lt;/h2&gt;

&lt;p&gt;The time cost of presales is distributed unevenly. Analysis of the process across software services teams shows a consistent breakdown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;40% — Reading and reviewing source documents&lt;/li&gt;
&lt;li&gt;25% — Feature estimation&lt;/li&gt;
&lt;li&gt;20% — Formatting and assembly&lt;/li&gt;
&lt;li&gt;15% — Review and revision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estimation carries the highest risk. Review of actual project sheets from delivered engagements found the same feature assigned 40 hours by one architect and 120 hours by another. Not because of error, but because there was no shared knowledge base, no institutional memory, and no standard method.&lt;/p&gt;

&lt;p&gt;For organizations running 20 or more active deals per month, that variance affects more than proposal quality. It limits revenue capacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap lies in execution
&lt;/h2&gt;

&lt;p&gt;Every presales team has a list of use cases. Delivery pipelines break down. The AI use case gets handed to an existing engineering team. Generalist developers spend months learning new toolchains. The result is a prototype that works in a demo and breaks in production. The initiative stalls. The use case gets deprioritized.&lt;/p&gt;

&lt;p&gt;DealRoom.ai closes that gap at the presales stage, producing proposals that are accurate, structured, and ready to send.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four agents. One coordinated pipeline.
&lt;/h2&gt;

&lt;p&gt;DealRoom is not a single model that reads a document and returns a summary. It is four specialized agents, each with a defined role, passing structured output through a coordinated pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;01 — The Analyst&lt;/strong&gt; ingests source materials — PDFs, Word documents, and follow-up emails — and extracts structured data: features, user roles, priorities, technical constraints, and integration requirements. It interprets intent. A reference to a map-based tracking feature is translated into its technical components: real-time data requirements, relevant APIs, and &lt;a href="https://geekyants.com/engineering/backend" rel="noopener noreferrer"&gt;backend service&lt;/a&gt; dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;02 — The Architect&lt;/strong&gt; maps the Analyst's structured output into systems, modules, and a recommended &lt;a href="https://geekyants.com/en-in/blog/how-to-choose-the-right-tech-stack-to-build-a-mobile-app" rel="noopener noreferrer"&gt;technology stack&lt;/a&gt;. Each feature is enriched with hours and complexity data from a knowledge base built on historical actuals from delivered projects. Estimates reference what similar features took in production, not inference from a language model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;03 — The Estimator&lt;/strong&gt; produces three delivery strategies. Conservative defines a minimum viable scope with a lean team. Balanced covers the full scope with a right-sized team and standard timeline. Aggressive deploys a larger parallel team to compress delivery at a higher cost. Each strategy includes a cost breakdown, timeline, team composition, and risk profile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;04 — The Devil's Advocate&lt;/strong&gt; reviews the output of the preceding agents and challenges assumptions. It identifies timelines that do not account for third-party API stabilization, flags compliance requirements present in the brief that are absent from the feature set, and surfaces integration dependencies that were not addressed during architecture. The proposal survives internal challenges before it reaches the client.&lt;/p&gt;

&lt;h2&gt;
  
  
  The output is a working interface, not a static document
&lt;/h2&gt;

&lt;p&gt;Most proposals are PDFs. Clients open them, scroll through, and send questions that take 48 hours to answer. That exchange delays decisions and adds friction to the close.&lt;/p&gt;

&lt;p&gt;DealRoom produces a web-based proposal that clients can explore. A scope map presents project structure as an expandable hierarchy. A feature toggle table allows stakeholders to include or exclude individual features; each change updates cost, timeline, and team size in real time — no revised estimates, no back-and-forth.&lt;/p&gt;

&lt;p&gt;The analytics section gives budget owners and technical decision-makers what they need to evaluate the proposal internally: cost distribution by system, effort by development phase, and team utilization across the delivery period. That data is part of the proposal itself, not a follow-up request.&lt;/p&gt;

&lt;p&gt;Every estimate carries a confidence score. A high score indicates grounding in historical project actuals. A lower score flags features estimated without historical precedent — the areas a presales lead should review before submission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical implementation
&lt;/h2&gt;

&lt;p&gt;The frontend is built with &lt;a href="https://geekyants.com/hire-next-js-developers" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;, deployed on Vercel. The backend runs on &lt;a href="https://geekyants.com/hire-python-developers" rel="noopener noreferrer"&gt;Python&lt;/a&gt; with FastAPI, deployed on Railway, orchestrating agents through an asynchronous pipeline with Server-Sent Events streaming updates to the interface as work proceeds.&lt;/p&gt;

&lt;p&gt;The architecture separates language model reasoning from deterministic computation. The Analyst and Architect use GPT-4.1 for document interpretation and system reasoning. The Estimator builds strategies through knowledge-base-driven computation. The Devil's Advocate runs on GPT-4.1-mini. Post-estimator agents execute in parallel via asyncio to maintain pipeline throughput.&lt;/p&gt;

&lt;p&gt;The knowledge base underpins every estimate: feature libraries with historical hour ranges from delivered projects, pricing benchmarks by role and seniority, team composition templates, and overhead formulas covering &lt;a href="https://geekyants.com/service/hire-quality-assurance-developers" rel="noopener noreferrer"&gt;QA&lt;/a&gt;, &lt;a href="https://geekyants.com/service/business-analysis-services" rel="noopener noreferrer"&gt;business analysis&lt;/a&gt;, tech lead, documentation, and deployment. When the system assigns 52 hours to a feature, that figure has a source in actual project data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three conclusions from development
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pure language model pipelines are not sufficient for production estimation.
&lt;/h3&gt;

&lt;p&gt;Document interpretation and system reasoning require language model capabilities. Cost calculation and structured data assembly do not. Separating these concerns produces outputs that are analytic and contextually accurate. Conflating them produces outputs that are neither.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Internal challenge before client delivery is a quality mechanism, not an overhead.
&lt;/h3&gt;

&lt;p&gt;Proposals processed through the Devil's Advocate review carried timelines 15 to 20 percent longer — and were more defensible. The review identified integration dependencies and compliance gaps that the Architect had not addressed. The cost of that review is low. The cost of a client finding those gaps after submission is not.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Presentation format determines how the analysis is acted upon.
&lt;/h3&gt;

&lt;p&gt;An accurate proposal in a static document loses stakeholder attention before the scope is reviewed. The same content in an interactive format held attention through review and generated substantive questions from decision-makers. The format through which analysis is delivered shapes the quality of the decisions it produces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current scope and roadmap
&lt;/h2&gt;

&lt;p&gt;DealRoom supports &lt;a href="https://geekyants.com/industry/healthcare-app-development-services" rel="noopener noreferrer"&gt;healthcare&lt;/a&gt;, &lt;a href="https://geekyants.com/industry/ecommerce-app-development-services" rel="noopener noreferrer"&gt;e-commerce&lt;/a&gt;, and &lt;a href="https://geekyants.com/industry/education-software-development-services" rel="noopener noreferrer"&gt;edtech domains&lt;/a&gt;, each with domain-specific knowledge bases and feature libraries. &lt;a href="https://geekyants.com/industry/fintech-app-development-services" rel="noopener noreferrer"&gt;Fintech&lt;/a&gt;, logistics, and SaaS are next.&lt;/p&gt;

&lt;p&gt;A feedback mechanism is in development to route accepted proposals back into the knowledge base. Each completed engagement would refine the estimation data available to future proposals. The objective is a system whose accuracy improves with use, not one that remains static after deployment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://geekyants.com/en-us" rel="noopener noreferrer"&gt;GeekyAnts&lt;/a&gt; developed DealRoom.ai as part of the Age of Agents track. It applies multi-agent coordination to a high-frequency, high-stakes business process, demonstrating that &lt;a href="https://geekyants.com/blog/the-missing-link-in-autonomous-ai--agent-to-human-protocol-a2h" rel="noopener noreferrer"&gt;autonomous agent&lt;/a&gt; pipelines can deliver production-quality outputs in commercial workflows where accuracy and consistency are non-negotiable.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://geekyants.com/blog/from-rfps-to-revenue-how-we-built-an-ai-agent-team-that-writes-technical-proposals-in-60-seconds" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>technology</category>
    </item>
    <item>
      <title>How Playwright Agents Are Changing the Way We Write and Maintain Tests</title>
      <dc:creator>GeekyAnts Inc</dc:creator>
      <pubDate>Fri, 10 Jul 2026 08:10:24 +0000</pubDate>
      <link>https://dev.to/geekyants/how-playwright-agents-are-changing-the-way-we-write-and-maintain-tests-3abg</link>
      <guid>https://dev.to/geekyants/how-playwright-agents-are-changing-the-way-we-write-and-maintain-tests-3abg</guid>
      <description>&lt;p&gt;&lt;em&gt;Adapted from the original post on the &lt;a href="https://geekyants.com/blog/from-manual-testing-to-ai-assisted-automation-with-playwright-agents" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ask any &lt;a href="https://geekyants.com/engineering/quality-assurance/qa-automation-testing" rel="noopener noreferrer"&gt;automation engineer&lt;/a&gt; what their week looks like and you'll hear some version of the same story: read the requirements, write the test cases, script the automation, watch a locator break, chase down why, fix it, run it again. That loop hasn't really gone anywhere — it just moved frameworks, from Selenium to Cypress to Playwright.&lt;/p&gt;

&lt;p&gt;So here's a question worth sitting with: what if the framework didn't just run your tests, but actually helped plan them, write them, and repair them when they broke? That's the pitch behind &lt;a href="https://geekyants.com/en-in/blog/how-ai-ml-are-transforming-quality-assurance-in-software-testing-with-playwright-examples" rel="noopener noreferrer"&gt;Playwright's Test Agents&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Shipped in Playwright 1.56, these agents bring &lt;a href="https://geekyants.com/ai/ai-agent-development-services" rel="noopener noreferrer"&gt;AI&lt;/a&gt; into three specific stages of the testing lifecycle — planning, writing, and healing — by looping against your actual running application rather than guessing from a prompt alone.&lt;/p&gt;

&lt;p&gt;This piece walks through what the agents do, how a project gets wired up to use them, what a seed test is for, what comes out the other end, and where this genuinely differs from just asking &lt;a href="https://geekyants.com/blog/top-8-ai-coding-tools-for-developers-in-the-usa-2025-edition" rel="noopener noreferrer"&gt;ChatGPT or Cursor&lt;/a&gt; to write you a test script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Playwright Alone Wasn't Enough
&lt;/h2&gt;

&lt;p&gt;Playwright earned its popularity by killing off a lot of the pain that made older frameworks miserable — flaky waits, brittle timing, locators that broke for no obvious reason. Auto-waiting, role-based selectors, and built-in tracing meant engineers spent less time fighting the tool and more time actually testing.&lt;/p&gt;

&lt;p&gt;But none of that touched the manual work upstream and downstream of running the tests: translating a requirement doc into concrete scenarios, turning those scenarios into actual code, rewriting tests every time the UI shifts, and chasing broken selectors after every release. Agents are Playwright's attempt to close that gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Three Agents Actually Do
&lt;/h2&gt;

&lt;p&gt;Playwright Test Agents are &lt;a href="https://geekyants.com/blog/revolutionizing-business-process-automation-with-ai-agents" rel="noopener noreferrer"&gt;AI workflows&lt;/a&gt; that live inside a project and split the job into three roles.&lt;/p&gt;

&lt;p&gt;The Planner takes a plain-language description of what needs testing, then uses a "seed test" as its entry point into the app to explore flows and edge cases. It comes back with a structured written test plan — not code, but the kind of scenario breakdown a &lt;a href="https://geekyants.com/service/hire-quality-assurance-developers" rel="noopener noreferrer"&gt;QA engineer&lt;/a&gt; would write by hand.&lt;/p&gt;

&lt;p&gt;The Generator takes that plan and turns it into runnable Playwright code. Crucially, it does this while poking at the live app — checking that selectors actually resolve, that assertions match real UI state — rather than hallucinating locators from memory. Told to, it'll follow a Page Object Model layout too.&lt;/p&gt;

&lt;p&gt;The Healer steps in when a test fails. It re-runs the failing scenario, looks at the current DOM, works out what changed, and tries to patch the selector, wait, or interaction logic itself, instead of leaving that job to whoever's on call.&lt;/p&gt;

&lt;p&gt;Chain the three together and the loop becomes Planner, then Generator, then Healer — turning a sentence of intent into a working, self-repairing test suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up a Project
&lt;/h2&gt;

&lt;p&gt;Getting started involves scaffolding a standard Node and Playwright project first, exactly as any engineer already familiar with Playwright would expect. From there, Playwright's own agent tooling can be initialized, which adds a new folder of agent definitions into the project alongside the usual test folders.&lt;/p&gt;

&lt;p&gt;That new folder holds three files, one for each agent: the planner, the generator, and the healer, each written as a Markdown definition. Whatever AI assistant is driving the workflow, whether that's Claude Code, VS Code's Copilot, or another agentic coding tool, reads these definitions to understand how to behave in each role.&lt;/p&gt;

&lt;p&gt;Alongside the agent definitions, a typical project ends up with a folder for the Markdown plans the Planner produces, a folder for the actual generated Playwright test files, and a single seed test that acts as the Planner's starting point into the application. This layout is the convention Playwright's own tooling expects, so sticking to it keeps things predictable.&lt;/p&gt;

&lt;p&gt;The seed test matters more than it sounds like it should. It's the Planner's foothold: where to navigate first, what login step to run, what "home base" looks like for the application before any exploration begins. Alongside it, a small file of sample data (a couple of test user credentials, say — one valid, one intentionally invalid) gives the Planner enough grounding to write scenarios that are actually relevant to the app rather than generic boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Planner Agent in Practice
&lt;/h2&gt;

&lt;p&gt;Think of the Planner less like a code generator and more like a QA analyst that happens to run on AI. Instead of jumping straight to code, it produces a Markdown test plan: scenarios, steps, expected outcomes, and the data each one needs.&lt;/p&gt;

&lt;p&gt;A prompt as simple as asking for a test plan covering login with both valid and invalid credentials, using the seed test as context, is enough to get it moving. The Planner explores the app through that seed test and writes out a plan as a readable document, not a script, meant to be read and approved before any code gets written. This is the step where a bad assumption gets caught early, before it turns into a bad test.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Generator Agent: Plan to Code
&lt;/h2&gt;

&lt;p&gt;Once a plan looks right, the same assistant can be switched into Generator mode and asked to turn that Markdown plan into actual TypeScript tests, following a Page Object Model structure if that's the preference.&lt;/p&gt;

&lt;p&gt;The Generator reads the plan, checks selectors and assertions against the live app as it writes, and produces test files — typically one for a straightforward happy path, one covering an edge case, and others built around shared helper functions. Each generated file maps back to a scenario from the plan. Because it's validating against the running app rather than guessing, the output tends to be noticeably more stable than what comes out of a plain prompt-to-code tool with no live context.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Healer Agent: Fixing What Breaks
&lt;/h2&gt;

&lt;p&gt;Tests fail. A button gets relabeled, a locator moves, and something that passed yesterday doesn't today. Normally that means opening the inspector, finding the new selector, and patching it by hand.&lt;/p&gt;

&lt;p&gt;The Healer automates that chase. Pointed at a specific failing test, it re-runs it in debug mode, inspects the current DOM for an equivalent element or flow, proposes a fix such as a new selector or an adjusted wait, and re-runs until it either passes or the agent concludes the failure actually reflects a real product change rather than a stale test. That second outcome matters: the goal isn't to force a green checkmark at any cost, it's to cut down the routine busywork of chasing UI churn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood: What's Actually Happening
&lt;/h2&gt;

&lt;p&gt;From the outside, all of this looks deceptively simple: type a sentence, get back a test plan or a fix. Underneath, the agents run a loop that reads project files, executes real test runs, drives the browser, and inspects the live DOM at every stage. The Planner explores through the seed test, the Generator checks selectors as it writes, the Healer replays failures to diagnose them. That complexity stays hidden — a prompt goes in, a plan, script, or fix comes out, and the orchestration in between isn't something anyone has to manage by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the Output Organized with Page Object Model
&lt;/h2&gt;

&lt;p&gt;If the generated code needs to stay maintainable long-term, and it should, it's worth being explicit about that in the prompt: asking for a Page Object Model structure with locators kept in separate page files. That nudges the Generator toward splitting locator definitions and reusable actions into their own files, separate from the test logic itself, which saves a lot of refactoring down the line.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Full Loop, End to End
&lt;/h2&gt;

&lt;p&gt;Run all three agents together and the shape of the workflow is: a seed test plus a prompt goes to the Planner, which writes a Markdown plan; that plan goes to the Generator, which writes the tests; those tests run, and any failures go to the Healer, which fixes what it can. What comes out the other side is a test suite that largely maintains itself. It's the same lifecycle a human QA team already runs, just with AI doing the first draft at every stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Differs From Generic AI Coding Tools
&lt;/h2&gt;

&lt;p&gt;It's tempting to lump this in with Cursor, ChatGPT, or any other "AI writes my code" tool, but the comparison doesn't hold up well. Generic AI code generation can write code from a prompt, but it doesn't run the tests it writes, doesn't fix failures on its own, and doesn't check the live DOM while generating. Playwright Agents do all three, and they do it wired directly into Playwright's own tooling through MCP (Model Context Protocol), staying in the loop with the running application throughout rather than generating code from a prompt in isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Few Things That Make This Work Better
&lt;/h2&gt;

&lt;p&gt;Giving the agents real context matters more than clever prompting — a well-built seed test and structured seed data make a bigger difference than a cleverly worded instruction. Prompts should be specific about architecture preferences, data sources, and expected outputs rather than left open-ended. Generated tests are still worth a human read-through; good scaffolding isn't the same as a finished, reviewed test. And in CI, healed or freshly generated tests are best treated as drafts until someone's actually looked at them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Between the Planner, Generator, and Healer, Playwright's agents take a real bite out of the manual overhead in test automation, turning a plain-language description into scenarios, code, and self-repair without cutting humans out of the review loop.&lt;/p&gt;

&lt;p&gt;Anyone with basic Playwright experience already has most of what they need to try this. It's the same lifecycle, with AI doing more of the first draft. Worth trying on a small project first: set up the agents, write a decent seed test, and see how far a simple prompt actually gets.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Adapted from the original article on the &lt;a href="https://geekyants.com/blog/from-manual-testing-to-ai-assisted-automation-with-playwright-agents" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>playwright</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building a Production-Ready Image Cropper in React Native</title>
      <dc:creator>GeekyAnts Inc</dc:creator>
      <pubDate>Thu, 09 Jul 2026 07:13:15 +0000</pubDate>
      <link>https://dev.to/geekyants/building-a-production-ready-image-cropper-in-react-native-5ckm</link>
      <guid>https://dev.to/geekyants/building-a-production-ready-image-cropper-in-react-native-5ckm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published on the &lt;a href="https://geekyants.com/blog/building-a-production-ready-image-cropper-in-react-native" rel="noopener noreferrer"&gt;GeekyAnts Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Build a production-ready, gesture-driven image cropper from scratch — supporting circular profile crops, rectangular cover crops, draggable windows, resizable corners, and pixel-perfect coordinate mapping back to the original image.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://geekyants.com/service/hire-mobile-app-development-services" rel="noopener noreferrer"&gt;modern mobile applications&lt;/a&gt;, image handling is a core experience. Whether uploading a profile picture or setting a cover image, users expect precision, control, and real-time feedback.&lt;/p&gt;

&lt;p&gt;While third-party libraries exist, they often introduce heavy dependencies or limit customization. In this article, we'll build a fully custom, gesture-driven image cropper using &lt;a href="https://geekyants.com/hire-react-native-developers" rel="noopener noreferrer"&gt;React Native&lt;/a&gt; and expo-image-manipulator — supporting both circular profile crops and rectangular cover crops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why expo-image-manipulator?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;expo-image-manipulator&lt;/strong&gt; provides a native bridge for performing image transformations efficiently. All operations — crop, resize, rotate, flip — execute on the native thread, which means they don't block the JS runtime and scale well even on lower-end Android devices.&lt;/p&gt;

&lt;p&gt;Compared to pure JS image-processing approaches, the native execution path avoids decoding the full bitmap into a JS array buffer, which can easily exhaust memory on high-resolution photos. The library also handles format conversion (JPEG, PNG, WEBP) and compression in a single pass, so you aren't writing a cropped image to disk and then re-encoding it for upload — the final &lt;strong&gt;manipulateAsync&lt;/strong&gt; call produces the upload-ready file directly.&lt;/p&gt;

&lt;p&gt;The package ships two API styles. The legacy imperative API (&lt;strong&gt;manipulateAsync&lt;/strong&gt;) applies a list of transforms in a single async call — ideal for a one-shot crop like ours. The newer context-based API (&lt;strong&gt;useImageManipulator / ImageManipulator.manipulate&lt;/strong&gt;) enables chainable, background-threaded transforms and shines when you need to compose many operations interactively without writing intermediate files to disk. We'll use the imperative API throughout this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation &amp;amp; Setup
&lt;/h2&gt;

&lt;p&gt;Install via the Expo CLI so the correct native version is automatically matched to your SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx expo install expo-image-manipulator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a bare React Native project (without Expo Go), also run the iOS pod install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx pod-install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No additional permissions are required. The manipulator operates entirely on local file URIs produced by your image picker — it never touches the camera roll or network directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  expo-image-manipulator API Overview
&lt;/h2&gt;

&lt;p&gt;We'll use the imperative API — it's perfectly suited to a one-shot crop operation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Function
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ImageManipulator.manipulateAsync(
  uri,        // local file URI or base64 data URI
  actions,    // array of transformation objects
  saveOptions // format, compress, base64
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returns a &lt;strong&gt;Promise&lt;/strong&gt; which resolves to:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;url&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Local URI to the new file (cached)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;width&lt;/td&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;Width of the output image in pixels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;height&lt;/td&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;Height of the output image in pixels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;base64&lt;/td&gt;
&lt;td&gt;string?&lt;/td&gt;
&lt;td&gt;Base64 payload if base64: true was passed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Available Actions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action key&lt;/th&gt;
&lt;th&gt;Parameters&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;crop&lt;/td&gt;
&lt;td&gt;originX, originY, width, height&lt;/td&gt;
&lt;td&gt;Crops a rectangular region (in original image pixels)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;resize&lt;/td&gt;
&lt;td&gt;width, height&lt;/td&gt;
&lt;td&gt;Scales the image; omit one dimension to keep ratio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rotate&lt;/td&gt;
&lt;td&gt;degrees&lt;/td&gt;
&lt;td&gt;Clockwise rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;flip&lt;/td&gt;
&lt;td&gt;"horizontal" | "vertical"&lt;/td&gt;
&lt;td&gt;Mirror along an axis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;extent&lt;/td&gt;
&lt;td&gt;originX, originY, width, height, backgroundColor&lt;/td&gt;
&lt;td&gt;Canvas resize with optional padding fill&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Save Options
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;format&lt;/td&gt;
&lt;td&gt;SaveFormat&lt;/td&gt;
&lt;td&gt;JPEG&lt;/td&gt;
&lt;td&gt;JPEG, PNG, or WEBP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;compress&lt;/td&gt;
&lt;td&gt;0.0 – 1.0&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1 = highest quality, 0 = maximum compression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;base64&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;Include raw base64 in the result&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Component Architecture
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;&lt;/strong&gt; component lives inside an action sheet and owns three pieces of state that together describe the current crop selection:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;containerSize&lt;/strong&gt; — measured width and height of the image container, captured via onLayout&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cropPosition&lt;/strong&gt; — the top-left corner of the crop window in container-space coordinates ({ x, y })&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;windowDimensions&lt;/strong&gt; — the current width and height of the crop window in container space&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All crop math operates in container space first, then gets converted to original image pixel space at the moment the user taps Crop. This separation keeps gesture handling fast and stateless — no expensive native calls happen during a drag.&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%2Fnyytw8vyz9w9qpmrj0jg.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%2Fnyytw8vyz9w9qpmrj0jg.png" alt="React Native image crop architecture with container sizing, crop position, and upload pipeline" width="800" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Props
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface ImageCropProps {
  showCropper:        boolean;
  handleClose:        () =&amp;gt; void;
  selectedUploadType: 'profile' | 'cover';
  uploadFunction:     (data: ImageManipulator.ImageResult) =&amp;gt; void;
  tempImage:          string;  // local URI from image picker
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On mount, two effects run in sequence: the first sets &lt;strong&gt;windowDimensions&lt;/strong&gt; based on the upload type (square for profile, wide rectangle for cover), and the second centers the crop window inside the container once both sizes are known.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Profile: square up to 200 px. Cover: full width × 150 px.
useEffect(() =&amp;gt; {
  if (containerSize.width &amp;gt; 0) {
    if (selectedUploadType === 'profile') {
      const size = Math.min(containerSize.width, 200);
      setWindowDimensions({ width: size, height: size });
    } else {
      setWindowDimensions({ width: containerSize.width, height: 150 });
    }
  }
}, [containerSize, selectedUploadType]);

// Center the window once both sizes are known
useEffect(() =&amp;gt; {
  if (containerSize.width &amp;gt; 0 &amp;amp;&amp;amp; windowDimensions.width &amp;gt; 0) {
    setCropPosition({
      x: (containerSize.width  - windowDimensions.width)  / 2,
      y: (containerSize.height - windowDimensions.height) / 2,
    });
  }
}, [containerSize, windowDimensions]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Building The Drag &amp;amp; Resize System
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dragging the crop window
&lt;/h3&gt;

&lt;p&gt;The crop window is a positioned &lt;strong&gt;View&lt;/strong&gt; sitting absolutely on top of the image. A &lt;strong&gt;PanResponder&lt;/strong&gt; attached to its inner area tracks the gesture delta (&lt;strong&gt;dx&lt;/strong&gt;, &lt;strong&gt;dy&lt;/strong&gt;) and updates &lt;strong&gt;cropPosition&lt;/strong&gt;, clamping it so the window never exits the container boundary.&lt;/p&gt;

&lt;p&gt;One subtle requirement: the pan responder must not activate when the touch originates inside one of the 20 px corner zones — otherwise the drag and resize responders fire simultaneously and produce jittery, conflicting movement. We check touch coordinates in &lt;strong&gt;onStartShouldSetPanResponder&lt;/strong&gt; and return &lt;strong&gt;false&lt;/strong&gt; for corner touches.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const panResponder = useMemo(() =&amp;gt;
  PanResponder.create({
    onStartShouldSetPanResponder: (evt) =&amp;gt; {
      const { locationX: x, locationY: y } = evt.nativeEvent;
      const cs = 20;
      const inCorner =
        (x &amp;lt;= cs || x &amp;gt;= windowDimensions.width  - cs) &amp;amp;&amp;amp;
        (y &amp;lt;= cs || y &amp;gt;= windowDimensions.height - cs);
      return !inCorner;
    },
    onMoveShouldSetPanResponder: (evt) =&amp;gt; {
      // Mirrors onStartShouldSetPanResponder — keeps both predicates in sync
      const { locationX: x, locationY: y } = evt.nativeEvent;
      const cs = 20;
      return !(
        (x &amp;lt;= cs || x &amp;gt;= windowDimensions.width  - cs) &amp;amp;&amp;amp;
        (y &amp;lt;= cs || y &amp;gt;= windowDimensions.height - cs)
      );
    },
    onPanResponderMove: (_, { dx, dy }) =&amp;gt; {
      setCropPosition({
        x: Math.max(0, Math.min(
          cropPosition.x + dx,
          containerSize.width - windowDimensions.width
        )),
        y: Math.max(0, Math.min(
          cropPosition.y + dy,
          containerSize.height - windowDimensions.height
        )),
      });
    },
  }),
  [containerSize, cropPosition, windowDimensions]
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why useMemo matters here
&lt;/h3&gt;

&lt;p&gt;The pan responder captures &lt;strong&gt;cropPosition&lt;/strong&gt; and &lt;strong&gt;windowDimensions&lt;/strong&gt; in its closure at creation time. Without &lt;strong&gt;useMemo&lt;/strong&gt;, a new responder is created on every render, but the gesture system holds a reference to the original — meaning your move handler reads stale state and the crop window drifts noticeably during a fast drag. Wrapping in &lt;strong&gt;useMemo&lt;/strong&gt; with the correct dependency array ensures the responder is always reading current values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resizing with corner handles
&lt;/h2&gt;

&lt;p&gt;Each of the four corner handles has its own &lt;strong&gt;PanResponder&lt;/strong&gt;, created by a factory function. The geometry differs per corner: dragging bottom-right simply extends width and height, while dragging top-left must simultaneously shrink the window and shift its origin so the opposite corner stays anchored in place.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const createCornerPanResponder = (
  corner: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'
) =&amp;gt; PanResponder.create({
  onStartShouldSetPanResponder: () =&amp;gt; true,
  onPanResponderMove: (_, { dx, dy }) =&amp;gt; {
    let newW = windowDimensions.width;
    let newH = windowDimensions.height;
    let newX = cropPosition.x;
    let newY = cropPosition.y;
    switch (corner) {
      case 'bottomRight':
        newW = Math.max(minDimensions.width,  windowDimensions.width  + dx);
        newH = isProfile ? newW : Math.max(minDimensions.height, windowDimensions.height + dy);
        break;
      case 'topLeft':
        newW = Math.max(minDimensions.width,  windowDimensions.width  - dx);
        newH = isProfile ? newW : Math.max(minDimensions.height, windowDimensions.height - dy);
        newX = cropPosition.x - (newW - windowDimensions.width);
        newY = cropPosition.y - (newH - windowDimensions.height);
        break;
      case 'topRight':
        newW = Math.max(minDimensions.width,  windowDimensions.width  + dx);
        newH = isProfile ? newW : Math.max(minDimensions.height, windowDimensions.height - dy);
        newY = cropPosition.y + (windowDimensions.height - newH);
        break;
      case 'bottomLeft':
        newW = Math.max(minDimensions.width,  windowDimensions.width  - dx);
        newH = isProfile ? newW : Math.max(minDimensions.height, windowDimensions.height + dy);
        newX = cropPosition.x - (newW - windowDimensions.width);
        break;
    }
    // Commit only if the new geometry fits entirely within the container
    if (
      newX &amp;gt;= 0 &amp;amp;&amp;amp; newY &amp;gt;= 0 &amp;amp;&amp;amp;
      newX + newW &amp;lt;= containerSize.width &amp;amp;&amp;amp;
      newY + newH &amp;lt;= containerSize.height
    ) {
      setWindowDimensions({ width: newW, height: newH });
      setCropPosition({ x: newX, y: newY });
    }
  },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For profile mode, height is always forced equal to width (&lt;strong&gt;newH = newW&lt;/strong&gt;) regardless of which corner is dragged, preserving a perfect 1:1 aspect ratio at every resize step. Cover mode allows independent width and height resizing, subject to configurable minimum dimensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coordinate Mapping: Display → Original Pixels
&lt;/h2&gt;

&lt;p&gt;This is the most critical — and most commonly misunderstood — part of building a &lt;a href="https://geekyants.com/blog/image-cropping-and-optimised-transfer-in-flutter" rel="noopener noreferrer"&gt;custom cropper&lt;/a&gt;. Your crop window lives in &lt;em&gt;container space&lt;/em&gt; (screen pixels inside the &lt;strong&gt;View&lt;/strong&gt;), but &lt;strong&gt;manipulateAsync&lt;/strong&gt; expects coordinates in &lt;em&gt;original image pixel space&lt;/em&gt;. The two are not the same.&lt;/p&gt;

&lt;p&gt;When an image is rendered with &lt;strong&gt;contentFit="cover"&lt;/strong&gt;, React Native scales it so the shorter dimension fills the container exactly — and the longer dimension overflows and is clipped. This means part of the image is hidden off-screen, and any crop coordinate you compute from container space will be offset by exactly that hidden amount unless you correct for it.&lt;/p&gt;

&lt;p&gt;The conversion has five steps:&lt;/p&gt;

&lt;p&gt;Step 1 — Get the original image dimensions. Call &lt;strong&gt;manipulateAsync&lt;/strong&gt; with an empty actions array. This is a lightweight metadata read with no transformation cost.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const imageInfo = await ImageManipulator.manipulateAsync(
  tempImage, [], { compress: 1 }
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2 — Determine the displayed dimensions. Compare aspect ratios to find which axis is the constraining one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const imgAR       = imageInfo.width / imageInfo.height;
const containerAR = containerSize.width / containerSize.height;
let displayedW, displayedH;
if (imgAR &amp;gt; containerAR) {
  // Image is wider than container — height fills, width overflows left/right
  displayedH = containerSize.height;
  displayedW = containerSize.height * imgAR;
} else {
  // Image is taller than container — width fills, height overflows top/bottom
  displayedW = containerSize.width;
  displayedH = containerSize.width / imgAR;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3 — Compute the overflow offset. The image is centered inside the container, so the hidden portion is split equally on both sides.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const offsetX = (displayedW - containerSize.width)  / 2;  // 0 when image is taller
const offsetY = (displayedH - containerSize.height) / 2;  // 0 when image is wider
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4 — Compute scale factors between the original image and the displayed image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const scaleX = imageInfo.width  / displayedW;
const scaleY = imageInfo.height / displayedH;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5 — Convert UI coordinates to image coordinates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const actualCropX = Math.round((cropPosition.x + offsetX) * scaleX);
const actualCropY = Math.round((cropPosition.y + offsetY) * scaleY);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Executing The Crop — Profile &amp;amp; Cover
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Profile Photo (square, resized to 200 x 200)
&lt;/h3&gt;

&lt;p&gt;For a profile photo, we want a square crop. We clamp the crop size so it never requests pixels beyond the image boundary, then chain a resize to normalise all uploads to 200 × 200 regardless of how large the user's original photo was.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const actualCropSize = Math.round(windowDimensions.width * scaleX);
const finalSize = Math.min(
  actualCropSize,
  imageInfo.width  - actualCropX,
  imageInfo.height - actualCropY,
);
const croppedImage = await ImageManipulator.manipulateAsync(
  tempImage,
  [
    { crop: {
        originX: actualCropX, originY: actualCropY,
        width:   finalSize,   height:  finalSize,
    }},
    { resize: { width: 200, height: 200 }},
  ],
  { compress: 1, format: ImageManipulator.SaveFormat.JPEG }
);
uploadFunction(croppedImage);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cover photo (rectangular)
&lt;/h3&gt;

&lt;p&gt;The cover crop uses independent width and height scale factors and clamps each dimension separately so neither ever exceeds the remaining pixels after the crop origin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const actualCropW = Math.min(
  Math.round(windowDimensions.width  * scaleX),
  imageInfo.width  - actualCropX,
);
const actualCropH = Math.min(
  Math.round(windowDimensions.height * scaleY),
  imageInfo.height - actualCropY,
);


const croppedImage = await ImageManipulator.manipulateAsync(
  tempImage,
  [{ crop: {
      originX: actualCropX, originY: actualCropY,
      width:   actualCropW,  height:  actualCropH,
  }}],
  { compress: 1, format: ImageManipulator.SaveFormat.JPEG }
);
uploadFunction(croppedImage);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Darkened Overlay Cutout
&lt;/h3&gt;

&lt;p&gt;Rather than a single semi-transparent layer with a punched-out hole (which requires SVG clip-paths or canvas rendering), we use four darkened Views — one for each side of the crop window. Their positions and sizes are derived directly from &lt;strong&gt;cropPosition&lt;/strong&gt; and &lt;strong&gt;windowDimensions&lt;/strong&gt;, so they update in real time as the user drags or resizes without any additional state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{/* Top — spans full width, height = distance from top to crop window */}
&amp;lt;View style={{ position: 'absolute', top: 0, left: 0, right: 0,
  height: cropPosition.y, backgroundColor: 'rgba(0,0,0,0.5)' }} /&amp;gt;
{/* Bottom — starts where the crop window ends */}
&amp;lt;View style={{ position: 'absolute', bottom: 0, left: 0, right: 0,
  height: containerSize.height - (cropPosition.y + windowDimensions.height),
  backgroundColor: 'rgba(0,0,0,0.5)' }} /&amp;gt;
{/* Left — only spans the crop window's row to avoid double-darkening corners */}
&amp;lt;View style={{ position: 'absolute', top: cropPosition.y, left: 0,
  width: cropPosition.x, height: windowDimensions.height,
  backgroundColor: 'rgba(0,0,0,0.5)' }} /&amp;gt;
{/* Right — mirrors left */}
&amp;lt;View style={{ position: 'absolute', top: cropPosition.y, right: 0,
  width: containerSize.width - (cropPosition.x + windowDimensions.width),
  height: windowDimensions.height,
  backgroundColor: 'rgba(0,0,0,0.5)' }} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the crop window, the border style switches between a full-radius dashed circle (borderRadius: 999, borderStyle: 'dashed') for profile mode and a plain solid rectangle for cover mode. A rule-of-thirds grid is drawn with four thin Views at 33% and 66% positions, giving users a professional alignment guide without any additional library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { ImageCrop } from './ImageCrop';


const MyScreen = () =&amp;gt; {
  const [showCropper, setShowCropper] = useState(false);
  const [pickedImage,  setPickedImage]  = useState&amp;lt;string | null&amp;gt;(null);
  const handleUpload = (result: ImageManipulator.ImageResult) =&amp;gt; {
    uploadToServer(result.uri);
    setShowCropper(false);
  };
  return (
    &amp;lt;&amp;gt;
      {/* ... rest of your screen ... */}
      {pickedImage &amp;amp;&amp;amp;
        &amp;lt;ImageCrop
          showCropper={showCropper}
          handleClose={() =&amp;gt; setShowCropper(false)}
          selectedUploadType="profile"
          tempImage={pickedImage}
          uploadFunction={handleUpload}
        /&amp;gt;
      }
    &amp;lt;/&amp;gt;
  );
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  UX Enhancements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Grid lines (rule of thirds)&lt;/li&gt;
&lt;li&gt;Corner handles for resizing&lt;/li&gt;
&lt;li&gt;Loading overlay during processing&lt;/li&gt;
&lt;li&gt;Auto-centered crop window&lt;/li&gt;
&lt;li&gt;Dynamic resizing based on container&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance Considerations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Avoid repeated &lt;strong&gt;manipulateAsync&lt;/strong&gt; calls&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;useMemo&lt;/strong&gt; for gesture handlers&lt;/li&gt;
&lt;li&gt;Perform crop only on user confirmation&lt;/li&gt;
&lt;li&gt;Use compression wisely (&lt;strong&gt;0.8–1&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advanced Extensions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pinch-to-zoom support&lt;/li&gt;
&lt;li&gt;Rotation &amp;amp; flipping controls&lt;/li&gt;
&lt;li&gt;Circular live preview&lt;/li&gt;
&lt;li&gt;Cloud upload integration (S3/Firebase)&lt;/li&gt;
&lt;li&gt;Combined zoom + crop gestures&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary &amp;amp; Key Takeaways
&lt;/h2&gt;

&lt;p&gt;Building a custom image cropper in React Native gives you &lt;strong&gt;full control over &lt;a href="https://geekyants.com/service/ui-ux-design-services" rel="noopener noreferrer"&gt;UX&lt;/a&gt;, performance, and flexibility&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Key learnings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;expo-image-manipulator&lt;/strong&gt; handles heavy image processing natively&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PanResponder&lt;/strong&gt; is sufficient for complex gesture interactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordinate mapping is the backbone&lt;/strong&gt; of accurate cropping&lt;/li&gt;
&lt;li&gt;Overlay-based masking provides a clean UI without extra dependencies&lt;/li&gt;
&lt;li&gt;Supporting multiple crop modes requires thoughtful architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach is particularly valuable for applications handling user-generated content, where performance, flexibility, and consistent media output directly impact user experience and scalability.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Special thanks to Deepanshu Goyal for architectural guidance and review.&lt;/em&gt;&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-production-ready-image-cropper-in-react-native" rel="noopener noreferrer"&gt;GeekyAnts Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Geeklego: The Open-Source Design System Built to Work With AI</title>
      <dc:creator>GeekyAnts Inc</dc:creator>
      <pubDate>Wed, 08 Jul 2026 11:02:49 +0000</pubDate>
      <link>https://dev.to/geekyants/geeklego-the-open-source-design-system-built-to-work-with-ai-2nmi</link>
      <guid>https://dev.to/geekyants/geeklego-the-open-source-design-system-built-to-work-with-ai-2nmi</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Fork it. Define your 3-tier design system. Let Claude Code, Codex, Gemini CLI — or any AI coding tool — generate a consistent, accessible UI that can never break your design rules.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Originally published on the &lt;a href="https://geekyants.com/blog/geeklego-the-open-source-design-system-built-to-work-with-ai" rel="noopener noreferrer"&gt;GeekyAnts Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem With Design Systems in the Age of AI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://geekyants.com/solution/design-system-development-service" rel="noopener noreferrer"&gt;Design systems&lt;/a&gt; are supposed to bring consistency. But in practice, they are a document that developers mean to follow, a Notion page that's three months out of date, and a set of tokens that might or might not match what's actually in the code.&lt;/p&gt;

&lt;p&gt;Now add &lt;a href="https://geekyants.com/blog/top-8-ai-coding-tools-for-developers-in-the-usa-2025-edition" rel="noopener noreferrer"&gt;AI coding tools&lt;/a&gt; to the picture. Claude Code, Codex, Gemini CLI, and Cursor — these tools generate components fast. Impressively fast. But fast without constraints is how you end up with hardcoded hex values, skipped token tiers, and five different ways to truncate text across a codebase that was supposed to be consistent.&lt;/p&gt;

&lt;p&gt;The problem is structural: design systems are defined separately from the rules that enforce them. &lt;a href="https://geekyants.com/blog/top-10-ai-tools-every-uiux-designer-should-master" rel="noopener noreferrer"&gt;AI tools&lt;/a&gt; have no way to know that &lt;code&gt;--color-brand-500&lt;/code&gt; should never appear directly in a component, or that every spacing value must come from a semantic token, or that dark mode only works if you respect the semantic tier. No one told the AI. So it guesses — and it guesses consistently wrong in different ways.&lt;/p&gt;

&lt;p&gt;Geeklego is our answer to this problem. And it's open source.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Geeklego?
&lt;/h2&gt;

&lt;p&gt;Geeklego is an open-source, &lt;a href="https://geekyants.com/blog/reimagining-the-future-of-design-systems-with-ai" rel="noopener noreferrer"&gt;AI-native design system&lt;/a&gt; built on Tailwind CSS v4. It ships three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A 3-tier design system — a single CSS file (&lt;code&gt;geeklego.css&lt;/code&gt;) that defines every visual value across three strict tiers: raw primitives, purpose-driven semantics, and component-specific tokens. It is the authoritative, machine-readable source of truth for the entire project.&lt;/li&gt;
&lt;li&gt;A skill layer — six AI skills (for Claude Code, Codex, Gemini CLI, or any agent-capable tool) that generate components, sync with Figma, audit for accessibility and security, and add internationalization — all while enforcing the 3-tier architecture automatically.&lt;/li&gt;
&lt;li&gt;81 production-ready components — atoms, molecules, and organisms that are expressions of the design system, each generated by the skill layer and proven to follow the rules.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Geeklego is not a component library you install and override. It's a design system you own and extend — with an AI layer that makes extension fast, consistent, and safe.&lt;/p&gt;

&lt;p&gt;The philosophy is simple: define the system first. Let AI build from it, not around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Vision: A Design System That Teaches Itself to AI
&lt;/h2&gt;

&lt;p&gt;Every AI coding tool — Claude Code, Codex, Gemini CLI, Cursor — is only as good as the context it has. Give it no context, and it invents conventions. Give it a good context, and it follows yours.&lt;/p&gt;

&lt;p&gt;Geeklego's vision is to make the design system itself that context. Not a README that someone has to remember to reference. Not a Storybook that AI can't read. The actual architecture — the 3-tier token chain, the 5-file component structure, the 45 explicit rules — is encoded in a machine-readable spec (&lt;code&gt;CLAUDE.md&lt;/code&gt;) that any AI coding tool can consume before it writes a single line.&lt;/p&gt;

&lt;p&gt;AI that is constrained by your design system, not set loose on your codebase.&lt;/p&gt;

&lt;p&gt;When any AI tool generates a component in Geeklego, it can't hardcode &lt;code&gt;#6366f1&lt;/code&gt;. It can't use &lt;code&gt;h-[40px]&lt;/code&gt;. It can't reference a Tier 1 primitive directly from a component. The architecture makes inconsistency structurally impossible — not a guideline someone has to remember, not a lint rule someone can suppress.&lt;/p&gt;

&lt;p&gt;The long-term vision: you define the system once. Every &lt;a href="https://geekyants.com/ai" rel="noopener noreferrer"&gt;AI&lt;/a&gt; that ever touches your codebase — today's tools, next year's tools, tools that don't exist yet — generates components that follow it perfectly. Hundreds of components, zero design drift. That's what Geeklego is building toward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design-System-First: The 3-Tier Architecture That Changes Everything
&lt;/h2&gt;

&lt;p&gt;In every component library you've used, the design system emerges from component code. You build a Button, extract its colors into variables, build a Card, extract its spacing, and over time something resembling a design system appears.&lt;/p&gt;

&lt;p&gt;Geeklego inverts this completely.&lt;/p&gt;

&lt;p&gt;Before a single component is written, the design system is defined and published across three distinct tiers. Components are built as expressions of the system, constrained to use only what the system provides — and only in the order the system prescribes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The 3-Tier Token Chain
&lt;/h3&gt;

&lt;p&gt;This is the central idea in Geeklego. Everything else flows from it.&lt;/p&gt;

&lt;p&gt;Tier 1 — Primitives are raw values: &lt;code&gt;--color-brand-500: #6366f1&lt;/code&gt;, &lt;code&gt;--spacing-4: 1rem&lt;/code&gt;. They are the foundation of the entire system. No component ever references a primitive directly. That's the rule.&lt;/p&gt;

&lt;p&gt;Tier 2 — Semantics give purpose to primitives: &lt;code&gt;--color-action-primary: var(--color-brand-500)&lt;/code&gt;. This is where theming happens. When you switch to dark mode, semantic tokens update. Primitives stay unchanged. The semantic tier is the single mechanism that makes theme switching work correctly across every component in the library simultaneously.&lt;/p&gt;

&lt;p&gt;Tier 3 — Component tokens bind individual components to semantics: &lt;code&gt;--button-bg: var(--color-action-primary)&lt;/code&gt;. A component token must always reference a Tier 2 semantic. Referencing a primitive directly — skipping Tier 2 — is forbidden. This is non-negotiable, encoded in the architecture, and enforced by the Claude Code skill before it writes a single line of component code.&lt;/p&gt;

&lt;p&gt;Here's the full chain for a Button's background color:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Tier 1 — Primitives*/&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;--color-brand-500&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;#6366&lt;/span&gt;&lt;span class="nt"&gt;f1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;/* Tier 2 — Semantics*/&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;--color-action-primary&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;var&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;--color-brand-500&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nt"&gt;Tier&lt;/span&gt; &lt;span class="err"&gt;3&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nt"&gt;Component&lt;/span&gt; &lt;span class="nt"&gt;tokens&lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;--button-bg&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;var&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;--color-action-primary&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in a component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-[var(--button-bg)] ..."&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's why all three tiers are necessary. When you toggle dark mode, you update one Tier 2 semantic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"dark"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="py"&gt;--color-action-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-brand-400&lt;/span&gt;&lt;span class="p"&gt;);}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the only change. Every component that reads &lt;code&gt;--button-bg&lt;/code&gt; picks up the new value through the chain — automatically, correctly, everywhere. No per-component dark mode overrides. No &lt;code&gt;!important&lt;/code&gt; patches. No missing cases discovered in production.&lt;/p&gt;

&lt;p&gt;If a component token had skipped Tier 2 and referenced a Tier 1 primitive directly, that component would be invisible to theme switches. It would render the same color in light and dark mode, and you'd never know why until a designer filed a bug report.&lt;/p&gt;

&lt;p&gt;The 3-tier chain is not a bureaucracy. It's the mechanism that makes the entire system coherent.&lt;/p&gt;

&lt;h3&gt;
  
  
  No Arbitrary Values. Ever.
&lt;/h3&gt;

&lt;p&gt;The 3-tier chain only works if it's airtight. So Geeklego forbids Tailwind arbitrary values like &lt;code&gt;bg-[#6366f1]&lt;/code&gt; or &lt;code&gt;h-[40px]&lt;/code&gt;. Every value — every color, every size, every spacing unit — must flow through all three tiers and arrive as a Tier 3 component token.&lt;/p&gt;

&lt;p&gt;The only permitted syntax is &lt;code&gt;bg-[var(--button-bg)]&lt;/code&gt;, wrapping a Tier 3 CSS variable in Tailwind v4's arbitrary value syntax.&lt;/p&gt;

&lt;p&gt;This constraint has a profound side effect: AI can only generate valid, chain-compliant code. When Claude Code generates a component, there's nowhere to put a hardcoded value. The language doesn't permit it. Design integrity is enforced by architecture, not code review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Ships With Geeklego Today
&lt;/h2&gt;

&lt;h3&gt;
  
  
  81 Production-Ready Components
&lt;/h3&gt;

&lt;p&gt;Geeklego currently ships three levels of the component hierarchy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L1 Atoms (38 components)&lt;/strong&gt; — the building blocks: Avatar, Badge, Button, Checkbox, Input, Select, Spinner, Switch, Tooltip, and 29 more. Atoms import nothing — they're pure expressions of the design system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L2 Molecules (27 components)&lt;/strong&gt; — combinations of atoms: AlertBanner, Breadcrumb, ButtonGroup, Calendar, Card, Combobox, DateInput, DropdownMenu, Fieldset, FormField, InputGroup, Navbar, NumberInput, Pagination, Popover, RadioGroup, SearchBar, StatCard, Stepper, Toast, Tooltip, TreeView, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L3 Organisms (16 components)&lt;/strong&gt; — full UI sections: Accordion, AreaChart, BarChart, Carousel, Chat, ColorPicker, DataTable, Datepicker, Drawer, Footer, Form, Header, Modal, PieChart, Sidebar, Tabs, and more in active development.&lt;/p&gt;

&lt;p&gt;L4 Templates and L5 Pages are in active development. DashboardLayout, AuthLayout, and LandingLayout are coming next.&lt;/p&gt;

&lt;p&gt;Every component in the fork ships with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full TypeScript types and JSDoc-annotated props&lt;/li&gt;
&lt;li&gt;Light and dark mode support out of the box, via the 3-tier token chain&lt;/li&gt;
&lt;li&gt;WCAG 2.2 Level AA accessibility (keyboard nav, ARIA, focus management)&lt;/li&gt;
&lt;li&gt;Responsive design via Tailwind responsive prefixes&lt;/li&gt;
&lt;li&gt;8 Storybook stories per component (used as automated tests via Vitest)&lt;/li&gt;
&lt;li&gt;Optional Schema.org markup for SEO&lt;/li&gt;
&lt;li&gt;Optional i18n string support&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A Visual Token Editor
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;npm run dev&lt;/code&gt; opens a full React app at &lt;code&gt;localhost:5176&lt;/code&gt; for editing the design system without touching code.&lt;/p&gt;

&lt;p&gt;A three-panel layout: a left NavRail organizes tokens into three tiers (Foundations with 8 sub-categories like color, spacing, typography, and shadow; Semantic with purpose-driven alias groups; Components listed by level) with drill-down sub-categories, a center pane shows the selected category or component, and a right Inspector panel displays token details with value editing and alias chain visualization. Export is available from the header bar. Changes preview instantly across Storybook via WebSocket. Full undo/redo history. Automatic backup. Token validation. Export as CSS or JSON.&lt;/p&gt;

&lt;p&gt;This means designers can edit the design system directly. Not in a Notion doc that may or may not reflect the code. In the actual source of truth, with live preview.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storybook as Living Tests
&lt;/h3&gt;

&lt;p&gt;Geeklego treats Storybook stories as executable tests. Each &lt;code&gt;.stories.tsx&lt;/code&gt; file becomes a Vitest test running headless in Chromium via Playwright. No separate test infrastructure. Stories serve double duty as documentation and automated regression tests.&lt;/p&gt;

&lt;p&gt;Every component requires eight stories: default, variant A, variant B, size/scale, disabled state, loading state, dark mode, and an accessibility story tagged for WCAG audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Skill Layer: AI That Knows the Rules
&lt;/h2&gt;

&lt;p&gt;This is the part of Geeklego that has no equivalent in any other design system.&lt;/p&gt;

&lt;p&gt;Geeklego ships with six skills — self-contained, machine-readable workflow definitions that any capable AI coding tool can execute. They work today with Claude Code, and are designed to be portable to Codex, Gemini CLI, or any agent-capable environment that can read a prompt file and call tools.&lt;/p&gt;

&lt;p&gt;Each skill is not a prompt template. It's a disciplined workflow that reads the design system state first, validates the 3-tier chain, applies the change, then runs a verification pass. The AI doesn't guess. It follows a documented process.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Six Skills
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/component-builder&lt;/code&gt;&lt;/strong&gt; — The flagship skill. Invoke it with any component description and the AI reads &lt;code&gt;geeklego.css&lt;/code&gt;, verifies no token block already exists, writes Tier 3 component tokens (each correctly referencing a Tier 2 semantic), generates all five required files, then runs four sequential audits: accessibility, performance, SEO, and security. A component that takes a human two to three hours ships in two to three minutes — and is structurally guaranteed to follow the token chain.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/component-builder build a Tooltip atom/component-builder build a StatCard molecule/component-builder build a DataTable organism with sorting and pagination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/figma-sync&lt;/code&gt;&lt;/strong&gt; — Sync your Tier 1–3 token definitions to Figma variable collections and text styles automatically. The skill diffs the current Figma state against &lt;code&gt;geeklego.css&lt;/code&gt;, reports what's out of sync, then creates or updates variables to match. Design and code never drift apart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/i18n&lt;/code&gt;&lt;/strong&gt; — Add internationalization to any component without committing to a specific i18n library. Library-agnostic, prop-first architecture with RTL support via logical CSS properties. Reads the string inventory to know which system strings already have i18n coverage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/state-handling&lt;/code&gt;&lt;/strong&gt; — Audit and generate visual state patterns. Every interactive component needs correct loading, disabled, error, and selected states with proper ARIA attributes. This skill reads the state-handling reference, validates what exists, and generates what's missing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/security-review&lt;/code&gt;&lt;/strong&gt; — Audit components for XSS vulnerabilities, unsafe href handling, missing &lt;code&gt;rel="noopener"&lt;/code&gt; on external links, and unsanitized user input. Runs against the full component tree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/screenshot-workflow&lt;/code&gt;&lt;/strong&gt; — Generate component screenshots automatically for documentation, changelogs, or CI/CD visual regression pipelines.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  On-Demand Audit Commands
&lt;/h3&gt;

&lt;p&gt;Beyond the skills, natural-language audit commands run across the entire codebase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;do a refactor check     # Memoization, hooks compliance, performance utility usagedo a reuse audit        # Find inlined markup that should use existing atomsdo an SEO audit         # Schema.org coverage, semantic HTML, heading hierarchy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Machine-Readable Spec
&lt;/h3&gt;

&lt;p&gt;The skills work because the design system's rules are encoded in a machine-readable spec — &lt;code&gt;CLAUDE.md&lt;/code&gt; — that any AI coding tool reads before starting any task. It contains 45 explicit "never do" rules, 49 "always do" rules, naming conventions, the token chain hierarchy, component level definitions, and reference documents for worked examples, semantic HTML, ARIA patterns, and Schema.org mappings.&lt;/p&gt;

&lt;p&gt;This is not a README for humans. It's a contract for AI. Every tool that reads it gets the same constraints. Design integrity is preserved not by hoping the AI guesses right, but by telling it exactly what right means — before it generates a single token.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Geeklego Differs From Other Design Systems
&lt;/h2&gt;

&lt;p&gt;Most design systems are collections of decisions: here are the colors, here are the spacing values, here is a Figma file. Implementation is left to the team. Consistency depends on culture, code review, and people remembering the rules.&lt;/p&gt;

&lt;p&gt;Geeklego is a design system that enforces its own rules. Not through linting, not through code review, not through policy — through architecture. The 3-tier chain makes it structurally impossible to introduce a hardcoded value or skip a token tier, because the skill that generates components checks the chain before writing anything. And the machine-readable spec means any AI tool you bring to the project inherits those constraints immediately.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Typical design system&lt;/th&gt;
&lt;th&gt;Geeklego&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Token architecture&lt;/td&gt;
&lt;td&gt;Ad hoc or flat&lt;/td&gt;
&lt;td&gt;Strict 3-tier chain: primitives → semantics → component tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark mode&lt;/td&gt;
&lt;td&gt;Per-component overrides&lt;/td&gt;
&lt;td&gt;Automatic — update Tier 2 semantics, all components cascade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI compatibility&lt;/td&gt;
&lt;td&gt;Unstructured — AI must guess conventions&lt;/td&gt;
&lt;td&gt;Machine-readable spec — AI reads the rules before generating anything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Component generation&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Skill-driven with full 3-tier validation and audit pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Figma integration&lt;/td&gt;
&lt;td&gt;Manual, periodic sync&lt;/td&gt;
&lt;td&gt;Automated sync skill, diff-aware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token editor&lt;/td&gt;
&lt;td&gt;External tools or none&lt;/td&gt;
&lt;td&gt;Built-in visual editor with live preview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accessibility&lt;/td&gt;
&lt;td&gt;Depends on the team&lt;/td&gt;
&lt;td&gt;WCAG 2.2 AA baked into the component-builder skill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i18n&lt;/td&gt;
&lt;td&gt;Separate effort&lt;/td&gt;
&lt;td&gt;Library-agnostic pattern, built into the skill layer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-brand support&lt;/td&gt;
&lt;td&gt;Fork and diverge&lt;/td&gt;
&lt;td&gt;Fork and share component logic; only tokens differ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The shift is from "design system as document" to "design system as enforced architecture." One you reference. The other you can't break.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Rapid prototyping.&lt;/strong&gt; Edit the design system in the token editor. Use &lt;code&gt;/component-builder&lt;/code&gt; to generate components that match. Preview in Storybook. Sync tokens to Figma for designer feedback. When the design is locked, your production components are ready. Two days instead of two weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design system governance at scale.&lt;/strong&gt; Define your tokens. Every team generates components via &lt;code&gt;/component-builder&lt;/code&gt; — they can't deviate because the architecture prevents it. Run audits on PRs. The design system becomes enforceable by architecture, not by policy. Code reviews drop from 30 minutes to 5 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-brand products.&lt;/strong&gt; Fork Geeklego twice. Each fork has its own &lt;code&gt;geeklego.css&lt;/code&gt; with its own colors, fonts, and spacing. Both forks share identical component logic. Update the logic once, both brands benefit. Maintain one codebase, support multiple brands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessible component libraries.&lt;/strong&gt; Accessibility is built into the component-builder skill — not bolted on after. Every generated component includes the right ARIA attributes, keyboard navigation patterns, touch targets, and semantic HTML. WCAG 2.2 AA by default, not by accident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started: Fork and Make It Yours
&lt;/h2&gt;

&lt;p&gt;Geeklego is designed to be forked, not installed. Forking gives you the full 3-tier design system, the visual token editor, all 81 components, and every AI skill — everything you need to customize the system and build from it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Fork the repo on GitHub, then clone your fork&lt;/span&gt;
git clone https://github.com/YOUR-USERNAME/geeklego.git
&lt;span class="nb"&gt;cd &lt;/span&gt;geeklego

&lt;span class="c"&gt;# 2. Install dependenciesnpm install&lt;/span&gt;

&lt;span class="c"&gt;# 3. Start both the token editor and Storybooknpm run dev:all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two apps open:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;localhost:5176&lt;/code&gt; — the token editor: customize your Tier 1–3 tokens visually, no code required&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;localhost:6006&lt;/code&gt; — Storybook with all 81 components, live-connected to the token editor&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Open your AI tool and start building:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# With Claude Code&lt;/span&gt;

/help                                &lt;span class="c"&gt;# see all available skills&lt;/span&gt;
/component-builder build a &lt;span class="o"&gt;[&lt;/span&gt;ComponentName]  &lt;span class="c"&gt;# generate a new component end-to-end&lt;/span&gt;

&lt;span class="c"&gt;# With Gemini CLI or Codex&lt;/span&gt;

&lt;span class="c"&gt;# Point your agent at CLAUDE.md as system context,&lt;/span&gt;

&lt;span class="c"&gt;# then trigger the same skill workflows from the .claude/skills/ directory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The machine-readable spec in &lt;code&gt;CLAUDE.md&lt;/code&gt; is read automatically by Claude Code before every task. For Codex, Gemini CLI, or other agent-capable tools, pass &lt;code&gt;CLAUDE.md&lt;/code&gt; as your system context — it's plain markdown and works with any tool that accepts instruction files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Customize your design system:
&lt;/h3&gt;

&lt;p&gt;Open the token editor at &lt;code&gt;localhost:5176&lt;/code&gt;. Edit Tier 1 primitives (your brand colors, spacing scale, type sizes), Tier 2 semantics (what each primitive means in context), and watch every component in Storybook update in real time. When you're ready, export as CSS or JSON.&lt;/p&gt;

&lt;p&gt;That's it. The design system is yours. The components follow it automatically. The AI skill layer keeps new components consistent with it, forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Contribute
&lt;/h2&gt;

&lt;p&gt;Geeklego is &lt;a href="https://geekyants.com/open-source" rel="noopener noreferrer"&gt;open source&lt;/a&gt; and actively welcoming contributors. The remaining work on the roadmap includes HeroSection (L3), DashboardLayout, AuthLayout, and LandingLayout (L4 Templates).&lt;/p&gt;

&lt;p&gt;Every contribution follows the same pattern — 5 files, the 3-tier token chain, 8 Storybook stories. The machine-readable spec and the skill layer make it straightforward to use your AI tool of choice to generate a contribution that meets the bar from the first commit. You don't need to memorize the rules — the spec teaches the AI, and the AI generates compliant code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/GeekyAnts/geeklego" rel="noopener noreferrer"&gt;https://github.com/GeekyAnts/geeklego&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website: &lt;a href="https://geeklego.io/?utm_source=geekyants.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=geeklego_cross_promotion" rel="noopener noreferrer"&gt;https://geeklego.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Issues &amp;amp; discussions: open a thread on GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give it a star, open an issue, or fork it — use &lt;code&gt;/component-builder&lt;/code&gt; to generate your contribution and it'll follow the rules from the first commit. We'd love to see what you build.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Geeklego is open source under the MIT license. Built with React 19, Tailwind CSS v4, Vite 6, Storybook 10, and Vitest.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://geekyants.com/blog/geeklego-the-open-source-design-system-built-to-work-with-ai" rel="noopener noreferrer"&gt;geekyants.com/blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>designsystem</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Keyboard Bounce of Death: Handling Inputs on Complex React Native Screens</title>
      <dc:creator>GeekyAnts Inc</dc:creator>
      <pubDate>Fri, 03 Jul 2026 13:01:37 +0000</pubDate>
      <link>https://dev.to/geekyants/the-keyboard-bounce-of-death-handling-inputs-on-complex-react-native-screens-1682</link>
      <guid>https://dev.to/geekyants/the-keyboard-bounce-of-death-handling-inputs-on-complex-react-native-screens-1682</guid>
      <description>&lt;p&gt;Modern &lt;a href="https://geekyants.com/hire-react-native-developers" rel="noopener noreferrer"&gt;React Native&lt;/a&gt; has evolved significantly—Expo's new architecture is stable, Hermes is the default engine, layout rendering has improved, and libraries like Reanimated and React Native Screens are widely adopted. Yet one issue continues to frustrate even experienced engineers:&lt;/p&gt;

&lt;h2&gt;
  
  
  The Keyboard Bounce of Death
&lt;/h2&gt;

&lt;p&gt;Your inputs jump, shift, or completely hide behind the keyboard—a frustrating experience that makes your app feel buggy and cheap.&lt;/p&gt;

&lt;p&gt;If you are building login screens, onboarding flows, multi-step forms, or bottom-sheet-based UIs… you've likely seen this happen.&lt;/p&gt;

&lt;p&gt;This article explains why this problem still occurs in modern React Native setups and provides &lt;strong&gt;battle-tested solutions&lt;/strong&gt; you can confidently use in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version Context
&lt;/h2&gt;

&lt;p&gt;The examples and recommendations are written with &lt;strong&gt;current (2024–2025) React Native stacks in mind&lt;/strong&gt;, commonly seen in production apps today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React Native:&lt;/strong&gt; 0.74+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React:&lt;/strong&gt; 18&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expo SDK:&lt;/strong&gt; 50+ (New Architecture enabled)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hermes:&lt;/strong&gt; Enabled (default)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;react-native-keyboard-controller:&lt;/strong&gt; 1.20.x&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;react-native-reanimated:&lt;/strong&gt; 3.x&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;react-native-screens:&lt;/strong&gt; 3.x&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@shopify/flash-list:&lt;/strong&gt; 1.x&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These versions are provided &lt;strong&gt;for context rather than certification&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Exact behavior may vary depending on project configuration, &lt;a href="https://geekyants.com/solution/universal-and-cross-platform-app-development-services" rel="noopener noreferrer"&gt;cross-platform&lt;/a&gt; (iOS / Android), and library versions. Readers should validate keyboard behavior against their own application stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Problem: Keyboard Handling Breaks at the Architecture Level
&lt;/h2&gt;

&lt;p&gt;In modern &lt;a href="https://geekyants.com/blog/the-use-of-ai-for-development-and-debugging-of-react-native-apps" rel="noopener noreferrer"&gt;React Native applications&lt;/a&gt;, keyboard issues are no longer caused by misconfigured props or missing offsets. The failure is architectural.&lt;/p&gt;

&lt;p&gt;Classic solutions such as &lt;strong&gt;KeyboardAvoidingView&lt;/strong&gt; assume a synchronous, stable layout model. That assumption no longer holds in React Native's current execution environment, where rendering, layout, and native events operate on partially decoupled timelines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the breakdown happens
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Layout virtualization (React Native Screens ~3.30.x)
&lt;/h3&gt;

&lt;p&gt;Navigation stacks aggressively detach inactive screens to reduce memory and improve performance. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The active screen's layout is often unresolved during transitions&lt;/li&gt;
&lt;li&gt;Height measurements are stale at the moment keyboard events fire&lt;/li&gt;
&lt;li&gt;Offset calculations are applied against incomplete layout data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keyboard avoidance logic executes correctly—but against the wrong inputs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Concurrent Rendering Changes Layout Timing (RN 0.74+)
&lt;/h3&gt;

&lt;p&gt;With React 18 integration and the &lt;a href="https://geekyants.com/service/scalable-architecture-design-development-service" rel="noopener noreferrer"&gt;New Architecture&lt;/a&gt;, React Native now supports concurrent rendering. Unlike legacy synchronous rendering, concurrent rendering allows work to be interruptible and scheduled across frames.&lt;/p&gt;

&lt;p&gt;This changes long-standing assumptions about layout timing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Layout commits are no longer guaranteed to be synchronous.&lt;/li&gt;
&lt;li&gt;Native keyboard events can fire before the React tree has fully committed.&lt;/li&gt;
&lt;li&gt;Measurements taken during focus events may reflect intermediate layout states.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In complex screens (navigation stacks, bottom sheets, nested scroll views), this can produce visible misalignment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keyboard height is computed.&lt;/li&gt;
&lt;li&gt;Offset is applied.&lt;/li&gt;
&lt;li&gt;Layout commits afterward.&lt;/li&gt;
&lt;li&gt;The UI shifts again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result appears as a "bounce," but the underlying issue is timing desynchronization between native keyboard animations and React layout commits.&lt;/p&gt;

&lt;p&gt;This is not a bug in React Native — it is a natural consequence of concurrent rendering's scheduling model.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Android keyboard behavior is non-deterministic by design
&lt;/h3&gt;

&lt;p&gt;On Android 12–14, keyboard behavior varies significantly by OEM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Heights are percentage-based, not pixel-stable&lt;/li&gt;
&lt;li&gt;Gesture navigation dynamically alters safe areas&lt;/li&gt;
&lt;li&gt;Floating and split keyboards introduce transient viewports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React Native receives incomplete or rapidly changing inset information, making consistent keyboard avoidance mathematically unreliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Nested, stateful scroll containers amplify the problem
&lt;/h3&gt;

&lt;p&gt;Most production forms are embedded inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bottom sheets&lt;/li&gt;
&lt;li&gt;Modals&lt;/li&gt;
&lt;li&gt;Tab navigators&lt;/li&gt;
&lt;li&gt;Collapsible or animated headers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These containers continuously mutate their layout constraints. Auto-scroll and focus calculations depend on deterministic container heights—conditions that no longer exist in deeply composed UI trees.&lt;/p&gt;

&lt;p&gt;All this means classic keyboard handling methods break on multi-layered screens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Problem Scenario (What Actually Happens)
&lt;/h3&gt;

&lt;p&gt;You have a complex screen with a header, multi-section form inputs, a bottom CTA, all inside a ScrollView and wrapped inside a navigation stack.&lt;/p&gt;

&lt;p&gt;When the user taps the last input:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The input jumps upward suddenly, OR&lt;/li&gt;
&lt;li&gt;Gets partially hidden, OR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ScrollView&lt;/strong&gt; auto-scrolls too late, OR&lt;/li&gt;
&lt;li&gt;The keyboard overlaps your crucial bottom CTA button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the reality of real-world apps, especially those built on the modern Expo/new architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Modern Solution Stack (Production-Proven)
&lt;/h2&gt;

&lt;p&gt;These are the modern, recommended approaches that actually fix the issue in today's &lt;a href="https://geekyants.com/blog/rethinking-react-native-architecture-part-i" rel="noopener noreferrer"&gt;React Native architecture&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution 1 — Native Keyboard Synchronization with KeyboardProvider (react-native-keyboard-controller 1.20.x)
&lt;/h3&gt;

&lt;p&gt;Modern React Native apps fail at keyboard handling not because of incorrect offsets or missing props, but because keyboard animations and layout updates are not synchronized at the native level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;react-native-keyboard-controller&lt;/strong&gt; addresses this root cause by coordinating keyboard state, animation timing, and layout updates directly in native code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Recommended Integration: Root-Level KeyboardProvider
&lt;/h4&gt;

&lt;p&gt;The primary integration point is &lt;strong&gt;KeyboardProvider&lt;/strong&gt;, which enables native keyboard synchronization across the entire application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;KeyboardProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-native-keyboard-controller&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;KeyboardProvider&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;RootNavigator&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/KeyboardProvider&lt;/span&gt;&lt;span class="err"&gt;&amp;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;This enables native keyboard coordination for the entire app.&lt;/p&gt;

&lt;h4&gt;
  
  
  Scoped Keyboard Handling with KeyboardControllerView
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;KeyboardControllerView&lt;/strong&gt; is an internal building block used by KeyboardProvider.&lt;/p&gt;

&lt;p&gt;It should only be used when keyboard coordination must be explicitly scoped to a specific layout subtree.&lt;/p&gt;

&lt;p&gt;Typical use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forms inside modals or bottom sheets&lt;/li&gt;
&lt;li&gt;Screens where only a portion of the UI should respond to keyboard movement&lt;/li&gt;
&lt;li&gt;Preventing unnecessary re-layout of non-interactive UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Why is it better
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Computes keyboard height precisely&lt;/li&gt;
&lt;li&gt;Works flawlessly with bottom sheets, tabs, and modals.&lt;/li&gt;
&lt;li&gt;Better on Android 12–14&lt;/li&gt;
&lt;li&gt;No layout jumps&lt;/li&gt;
&lt;li&gt;Supports concurrent rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Runtime Control with useKeyboardController
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;useKeyboardController&lt;/strong&gt; is a hook that gives access to the state of the react-native-keyboard-controller library. It returns two values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enabled - a boolean value which indicates whether the library is enabled in the app;&lt;/li&gt;
&lt;li&gt;setEnabled - a function that changes the state of the enabled property.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This hook is used &lt;strong&gt;only&lt;/strong&gt; to enable or disable the native keyboard controller—primarily for gradual Android integration or fallback to &lt;strong&gt;adjustResize&lt;/strong&gt; behavior when required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution 2 — Native-Friendly Scroll Containers (Reanimated 3.10+, FlashList 1.7.x)
&lt;/h3&gt;

&lt;p&gt;Keyboard issues on complex screens often occur when scroll position and keyboard movement are driven by JavaScript.&lt;/p&gt;

&lt;p&gt;This causes delayed measurements and visible layout jumps during focus transitions.&lt;/p&gt;

&lt;p&gt;To remove JavaScript from the critical layout path, use scroll containers that integrate cleanly with native animation timing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Animated.ScrollView (Reanimated) for small, controlled layouts&lt;/li&gt;
&lt;li&gt;FlashList for long, dynamic, or virtualized content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both integrate better with native-driven keyboard animations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reanimated ScrollView Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Animated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ScrollView&lt;/span&gt;
  &lt;span class="nx"&gt;keyboardShouldPersistTaps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;handled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;contentContainerStyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;paddingBottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;keyboardHeight&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Animated.ScrollView&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;FlashList Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FlashList&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@shopify/flash-list&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FlashList&lt;/span&gt;
  &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;estimatedItemSize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;keyboardShouldPersistTaps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;handled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="nx"&gt;contentContainerStyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
    &lt;span class="na"&gt;paddingBottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;keyboardHeight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}}&lt;/span&gt;
  &lt;span class="nx"&gt;renderItem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;renderItem&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Solution 3 — If You Use Bottom Sheets (Reanimated / Gorhom)
&lt;/h3&gt;

&lt;p&gt;Bottom sheets introduce an additional animated layer that can conflict with keyboard transitions and scrolling.&lt;/p&gt;

&lt;p&gt;Without careful configuration, this often results in keyboard bounce, input focus jumps, or unstable drag behavior.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bottom Sheet Gesture Configuration
&lt;/h4&gt;

&lt;p&gt;Disable content panning only when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The bottom sheet contains multiple text inputs&lt;/li&gt;
&lt;li&gt;Nested scroll views compete with drag gestures&lt;/li&gt;
&lt;li&gt;Keyboard interaction feels jumpy or unstable
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enableContentPanningGesture={false}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Android Keyboard Mode
&lt;/h4&gt;

&lt;p&gt;Use this only as a fallback when relying on the default Android window resizing behavior.&lt;/p&gt;

&lt;p&gt;Forcing &lt;strong&gt;adjustResize&lt;/strong&gt; can reintroduce layout jumps if combined with native keyboard synchronization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;android_keyboardInputMode="adjustResize"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Solution 4 — Use useWindowDimensions() Instead of Static Screen Height
&lt;/h3&gt;

&lt;p&gt;Keyboard and screen size changes often break layouts that rely on static dimensions:&lt;/p&gt;

&lt;p&gt;The problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dimensions.get('window')&lt;/strong&gt; is &lt;strong&gt;static&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It does not update when the keyboard appears, the screen rotates, or the device enters split-screen&lt;/li&gt;
&lt;li&gt;Any layout based on this value may be clipped, overlapped by the keyboard, or cause scroll jumps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useWindowDimensions&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It adapts when the keyboard reduces available height dynamically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution 5 — Use KeyboardAwareScrollView for Automatic Input Scrolling
&lt;/h3&gt;

&lt;p&gt;When your form contains multiple inputs, simply preventing layout jumps is often not enough.&lt;/p&gt;

&lt;p&gt;You also want the focused input to scroll into view automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;react-native-keyboard-aware-scroll-view&lt;/strong&gt; handles this efficiently.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why This Works
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Automatically scrolls the focused input above the keyboard&lt;/li&gt;
&lt;li&gt;Works with nested forms and long lists&lt;/li&gt;
&lt;li&gt;Supports Android and iOS, including safe handling of bottom tabs&lt;/li&gt;
&lt;li&gt;Integrates well with native keyboard controllers (like &lt;strong&gt;react-native-keyboard-controller&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Minimal setup — reduces boilerplate scroll logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Practical Real-World Implementation (Full Code Example)
&lt;/h3&gt;

&lt;p&gt;This is a rock-solid implementation used in production onboarding flows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;KeyboardAwareScrollView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useKeyboardState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-native-keyboard-controller&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TextInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RegistrationForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;keyboardHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useKeyboardState&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;KeyboardAwareScrollView&lt;/span&gt;
      &lt;span class="nx"&gt;contentContainerStyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;paddingBottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;keyboardHeight&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
      &lt;span class="nx"&gt;bottomOffset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// optional offset for bottom CTA buttons&lt;/span&gt;
      &lt;span class="nx"&gt;keyboardShouldPersistTaps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;handled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputField&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputField&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputField&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/KeyboardAwareScrollView&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;InputField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextInput&lt;/span&gt;
      &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
        &lt;span class="na"&gt;borderWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;marginVertical&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}}&lt;/span&gt;
    &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;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;This handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iOS + Android&lt;/li&gt;
&lt;li&gt;Gesture navigation&lt;/li&gt;
&lt;li&gt;Variable keyboards&lt;/li&gt;
&lt;li&gt;Concurrent rendering&lt;/li&gt;
&lt;li&gt;ScrollView-based layouts&lt;/li&gt;
&lt;li&gt;Bottom CTA buttons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ALL without layout jumps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging Checklist (What To Test Before Shipping)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test split-screen mode on Android&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your input may be hidden due to reduced viewport height.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test floating keyboard mode&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TikTok/Samsung keyboards break height assumptions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test device rotation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keyboard height changes drastically in landscape.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Test inside modals &amp;amp; bottom sheets&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most keyboard bugs occur inside nested containers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Measure layout flicker using this:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb logcat | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"keyboard"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;adb logcat&lt;/strong&gt; → streams &lt;strong&gt;real-time Android system logs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;grep "keyboard" → filters logs related to keyboard / IME events&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you will see&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Logs like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keyboard show/hide events&lt;/li&gt;
&lt;li&gt;IME height changes&lt;/li&gt;
&lt;li&gt;Window resize calls&lt;/li&gt;
&lt;li&gt;Focus changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple keyboard show/hide events for &lt;strong&gt;one input focus&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Rapid resize → unresize cycles&lt;/li&gt;
&lt;li&gt;Keyboard height changing more than once&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the root &lt;strong&gt;cause of flicker/bounce&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;or for iOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xcrun simctl spawn booted log stream &lt;span class="nt"&gt;--level&lt;/span&gt; debug | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"keyboard"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streams &lt;strong&gt;iOS system logs&lt;/strong&gt; from the Simulator&lt;/li&gt;
&lt;li&gt;Filters keyboard-related notifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What you'll see&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UIKeyboardWillShow&lt;/li&gt;
&lt;li&gt;UIKeyboardDidShow&lt;/li&gt;
&lt;li&gt;Frame and height updates&lt;/li&gt;
&lt;li&gt;Animation duration mismatches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WillShow fires multiple times&lt;/li&gt;
&lt;li&gt;Keyboard frame changes mid-animation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your layout is reacting out of sync with the keyboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Keyboard Handling in Modern React Native Requires a New Approach
&lt;/h2&gt;

&lt;p&gt;The assumptions behind &lt;strong&gt;KeyboardAvoidingView&lt;/strong&gt; no longer hold up for modern React Native applications that rely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Concurrent rendering&lt;/li&gt;
&lt;li&gt;react-native-screens&lt;/li&gt;
&lt;li&gt;Bottom sheets and modals&lt;/li&gt;
&lt;li&gt;The new architecture and Hermes&lt;/li&gt;
&lt;li&gt;Deeply layered, animated UIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these environments, keyboard behavior becomes a cross-cutting concern, involving layout measurement, animation timing, gesture handling, and native window resizing.&lt;/p&gt;

&lt;p&gt;To build reliable, input-heavy screens, production apps increasingly rely on a combination of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native keyboard synchronization (&lt;strong&gt;react-native-keyboard-controller&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Reanimated or FlashList-based scrolling&lt;/li&gt;
&lt;li&gt;Dynamic keyboard height handling&lt;/li&gt;
&lt;li&gt;Scroll-to-focused-input utilities&lt;/li&gt;
&lt;li&gt;Intentional layout stabilization techniques&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This layered approach reflects how high-quality production apps—including financial, social, and AI-driven products—handle keyboard interactions today.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href="https://geekyants.com/blog/the-keyboard-bounce-of-death-handling-inputs-on-complex-react-native-screens" rel="noopener noreferrer"&gt;GeekyAnts blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
    </item>
  </channel>
</rss>
