<?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: Plant Finder</title>
    <description>The latest articles on DEV Community by Plant Finder (@plantfinder).</description>
    <link>https://dev.to/plantfinder</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4182506%2F268cc73b-9a32-4b22-a189-8e2a334f898d.jpeg</url>
      <title>DEV Community: Plant Finder</title>
      <link>https://dev.to/plantfinder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/plantfinder"/>
    <language>en</language>
    <item>
      <title>Rejecting Shoes and Selfies: How We Stop Users from Burning Our AI Vision Tokens</title>
      <dc:creator>Plant Finder</dc:creator>
      <pubDate>Thu, 29 Oct 2026 15:59:17 +0000</pubDate>
      <link>https://dev.to/plantfinder/rejecting-shoes-and-selfies-how-we-stop-users-from-burning-our-ai-vision-tokens-57pg</link>
      <guid>https://dev.to/plantfinder/rejecting-shoes-and-selfies-how-we-stop-users-from-burning-our-ai-vision-tokens-57pg</guid>
      <description>&lt;p&gt;Within 48 hours of launching &lt;a href="https://play.google.com/store/apps/details?id=com.plantfinder&amp;amp;listing=plant-identifier" rel="noopener noreferrer"&gt;Plant Finder on Google Play&lt;/a&gt;, we checked our backend telemetry to see what users were scanning.&lt;/p&gt;

&lt;p&gt;We expected to see monsteras, tomatoes, rose bushes, and succulents.&lt;br&gt;
Instead, we saw:&lt;br&gt;
A worn-out leather sneaker.&lt;br&gt;
A user’s sleeping cat.&lt;br&gt;
A slice of pepperoni pizza.&lt;br&gt;
A car dashboard.&lt;br&gt;
Dozens of dark, blurry selfies.&lt;/p&gt;

&lt;p&gt;When you hand people an app that uses multimodal AI vision to diagnose leaves, human nature takes over: people immediately try to break it.&lt;br&gt;
While this curiosity is completely natural, it creates two major headaches for any mobile developer:&lt;/p&gt;

&lt;p&gt;The Hallucination Problem: The AI tries way too hard to find a plant where none exists.&lt;/p&gt;

&lt;p&gt;The Financial Drain: Every photo of a coffee mug or a carpet burns real money in visual AI tokens.&lt;/p&gt;

&lt;p&gt;Here is how we tackled adversarial non-plant uploads, protected our bills, and stopped our app from diagnosing shoes.&lt;br&gt;
The Sneaker That Had "Severe Root Rot"&lt;br&gt;
General-purpose vision models are trained to be helpful and answer prompts directly.&lt;/p&gt;

&lt;p&gt;Early on, if our mobile app sent a photo of a brown leather shoe with the prompt "Identify this plant and its health issues," the AI would genuinely attempt to fulfill the request.&lt;/p&gt;

&lt;p&gt;The result? The model returned:&lt;br&gt;
"Species: Ficus elastica (Rubber Tree). Health: 24%. Severe black spot and dehydration on the lower stem."&lt;/p&gt;

&lt;p&gt;This was disastrous. If a user tested the app on an everyday object as a joke, seeing the AI confidently hallucinate an entire botanical diagnosis destroyed their trust in the product. If it can't tell the difference between a shoe and a ficus, why would a farmer trust it to identify tomato early blight?&lt;/p&gt;

&lt;p&gt;The Token Cost of Human Curiosity&lt;br&gt;
Running high-resolution multimodal vision calls through frontier models like Gemini 2.5 Flash is remarkably fast and capable, but it is not free.&lt;br&gt;
In our first release, roughly 18% of all camera uploads were non-plant objects.&lt;/p&gt;

&lt;p&gt;If you have thousands of active users, paying for 18% wasted API calls every single day quickly eats through your operating margins. We were essentially subsidizing people scanning their living room furniture with expensive AI inferences that delivered zero actual value.&lt;br&gt;
We needed a strict gatekeeper.&lt;/p&gt;

&lt;p&gt;Step 1: Giving the Model Permission to Say "No"&lt;br&gt;
The first mistake we made was assuming the model knew it was dealing with a plant.&lt;br&gt;
We updated our backend proxy instructions to introduce a strict two-stage verification process inside the prompt:&lt;br&gt;
Stage 1 (The Guardrail): Examine the image purely to verify whether botanical tissue (leaves, stems, flowers, bark, or roots) is clearly present. If the image is not a plant, abort all diagnostic processing immediately and return a strict flag: NOT_A_PLANT.&lt;/p&gt;

&lt;p&gt;Stage 2 (The Diagnosis): Only if Stage 1 passes should the model extract foliar pathology, soil pH symptoms, and care recommendations.&lt;br&gt;
By explicitly instructing the model to reject non-plant images on the very first token, we stopped the hallucination loop in its tracks. A picture of a sneaker now simply returns an honest refusal instead of a fake plant name.&lt;/p&gt;

&lt;p&gt;Step 2: Designing a Graceful Rejection UI&lt;br&gt;
Catching non-plant images on the server is only half the battle. You also have to handle the user experience on the phone.&lt;br&gt;
If an app abruptly crashes or throws a cold, generic error like "500 Internal Server Error," users assume the app is broken and leave a 1-star review.&lt;/p&gt;

&lt;p&gt;Instead, we built an explicit rejection handler in our Flutter camera preview screen:&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%2F3lbwv38x7d1x9uzfhenj.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%2F3lbwv38x7d1x9uzfhenj.png" alt=" " width="800" height="391"&gt;&lt;/a&gt;&lt;br&gt;
Clear Feedback: When the server returns NOT_A_PLANT, the app displays a clear, friendly card: "No botanical tissue detected. Please point your camera directly at leaves, stems, or flowers."&lt;br&gt;
Credit Protection: In our virtual token economy ("Leaves"), a scan costs credits. If the system flags an image as a non-plant, we do not deduct their tokens. This prevents honest users who took a blurry or poorly lit photo from feeling cheated.&lt;/p&gt;

&lt;p&gt;Step 3: Preventing Deliberate Token Spam&lt;br&gt;
While protecting honest users is essential, you also have to protect your backend against malicious flooding or automated spam scripts.&lt;br&gt;
To prevent bad actors from repeatedly uploading junk images and burning compute:&lt;/p&gt;

&lt;p&gt;Server-Side IP Rate Limiting: Our cloud gateway tracks upload frequencies per IP address. If an IP exceeds 15 rapid-fire uploads in a 60-second window, requests are temporarily throttled at the network level.&lt;br&gt;
Progressive Strike Lockout: If a single account or device repeatedly triggers consecutive NOT_A_PLANT rejections in a short period, the app introduces a cool-down timer. This eliminates automated script abuse while leaving normal gardeners unaffected.&lt;/p&gt;

&lt;p&gt;What Other Mobile AI Developers Should Take Away&lt;br&gt;
If you are building an AI camera app for food tracking, skin analysis, receipt scanning, or plant care, remember these three rules:&lt;br&gt;
Users will test your limits: Always design your system assuming people will photograph their pets, faces, and surroundings first before testing your actual feature.&lt;/p&gt;

&lt;p&gt;Teach your AI to say "I don't know": Models will confidently fabricate answers if your prompt doesn't give them a clear, graceful exit path.&lt;br&gt;
Fail as early as possible: The faster your pipeline rejects an invalid image, the less money you spend on wasted cloud compute.&lt;/p&gt;

&lt;p&gt;Project: &lt;a href="https://plantfinder.store/" rel="noopener noreferrer"&gt;Plant Finder&lt;/a&gt;&lt;br&gt;
Platform: Android (Google Play)&lt;br&gt;
Attribution: Designed by Code vairagi&lt;/p&gt;

</description>
      <category>ai</category>
      <category>android</category>
      <category>flutter</category>
      <category>dart</category>
    </item>
    <item>
      <title>Why We Stopped Building Just Another Plant Identifier (And What We Learned)</title>
      <dc:creator>Plant Finder</dc:creator>
      <pubDate>Thu, 29 Oct 2026 15:37:17 +0000</pubDate>
      <link>https://dev.to/plantfinder/why-we-stopped-building-just-another-plant-identifier-and-what-we-learned-23ig</link>
      <guid>https://dev.to/plantfinder/why-we-stopped-building-just-another-plant-identifier-and-what-we-learned-23ig</guid>
      <description>&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%2Fhez0gcrd7b6ojmozg974.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%2Fhez0gcrd7b6ojmozg974.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
When we first started building Plant Finder, we assumed the goal was simple: train an AI model to recognize as many plant species as possible from a single photo.&lt;/p&gt;

&lt;p&gt;We thought that if a user points their phone at a leaf and the app returns “Monstera deliciosa” with 99% accuracy, the job was done.&lt;br&gt;
We were completely wrong.&lt;/p&gt;

&lt;p&gt;After months of real-world testing with thousands of gardeners, students, and plant owners, we realized something critical about how people actually interact with plant apps.&lt;/p&gt;

&lt;p&gt;The Reality Check: Nobody Just Wants a Name&lt;br&gt;
Very few people download a plant app just to collect botanical names like trading cards.&lt;/p&gt;

&lt;p&gt;In the real world, someone pulls out their phone because something is going wrong:&lt;/p&gt;

&lt;p&gt;“Why are the bottom leaves turning yellow while the top looks fine?”&lt;br&gt;
“Are these brown spots caused by a fungus or by overwatering?”&lt;br&gt;
“Do I need to repot this, or is the soil too acidic?”&lt;/p&gt;

&lt;p&gt;A botanical name doesn't save a dying plant. A user doesn't just need an identifier—they need a doctor.&lt;/p&gt;

&lt;p&gt;Challenge 1: The Yellow Leaf Problem&lt;br&gt;
One of the hardest things in agronomy is that completely different problems look almost identical on camera:&lt;br&gt;
Overwatering causes yellow leaves.&lt;br&gt;
Underwatering causes yellow leaves.&lt;br&gt;
Low nitrogen causes yellow leaves.&lt;br&gt;
High soil pH (nutrient lockout) causes yellow leaves.&lt;/p&gt;

&lt;p&gt;If your app simply guesses based on color, you end up giving bad advice that kills the plant.&lt;/p&gt;

&lt;p&gt;To fix this, we had to look at how the plant turns yellow. In botany, nutrients move differently through a plant:&lt;/p&gt;

&lt;p&gt;Mobile nutrients (like Nitrogen and Magnesium) move upward to protect new growth. If the bottom leaves are yellow but the top is green, the soil is often lacking nutrients or is too acidic.&lt;/p&gt;

&lt;p&gt;Immobile nutrients (like Iron and Calcium) cannot move once set. If the newest top leaves are turning pale yellow between the veins, the soil pH is usually too alkaline, locking up iron at the roots.&lt;/p&gt;

&lt;p&gt;By asking users to look at both the top and bottom of their plants, we could estimate soil health and pH issues without forcing them to buy expensive soil testing kits.&lt;/p&gt;

&lt;p&gt;Challenge 2: The Cost and Speed of AI&lt;br&gt;
Running visual AI on high-resolution leaf photos is computationally expensive. If thousands of users upload photos every day, two things happen very quickly:&lt;/p&gt;

&lt;p&gt;Your server bills skyrocket.&lt;br&gt;
Users on slow mobile connections wait 10 seconds for a result and abandon the app.&lt;/p&gt;

&lt;p&gt;To solve this, we stopped sending every single photo directly to large language models. Instead, we built a fast visual matching filter directly on our backend.&lt;/p&gt;

&lt;p&gt;If someone uploads a common leaf or a plant already verified in our botanical database, the system recognizes the visual pattern instantly. It delivers the answer in less than a second at virtually zero compute cost. The heavy AI models are only called when an unfamiliar or complex problem appears.&lt;/p&gt;

&lt;p&gt;Challenge 3: Keeping the App Safe&lt;br&gt;
In the early stages of development, many mobile apps make the mistake of calling AI services directly from the phone.&lt;/p&gt;

&lt;p&gt;The problem? Anyone can decompile an Android APK in under two minutes and extract the private API keys stored inside. Once exposed, third parties can abuse your keys and leave you with massive bills.&lt;/p&gt;

&lt;p&gt;We migrated all AI interactions completely off the phone and placed them behind our own secure server gateway. The mobile app never touches the AI credentials directly. It simply sends the photo, verifies the request, and receives the diagnostic advice back safely.&lt;/p&gt;

&lt;p&gt;What We Learned&lt;br&gt;
Building a successful utility app isn't about using the newest buzzwords or cramming in complex features for the sake of it.&lt;br&gt;
Solve the real pain point: Users care about keeping their plants alive, not just reading Latin names.&lt;/p&gt;

&lt;p&gt;Speed matters more than complexity: A fast answer that solves 90% of a problem is better than a slow answer that takes 15 seconds to load.&lt;br&gt;
Security must be built in early: Never leave private keys or sensitive logic inside the mobile client.&lt;/p&gt;

&lt;p&gt;Project: &lt;a href="https://plantfinder.store" rel="noopener noreferrer"&gt;Plant Finder&lt;/a&gt;&lt;br&gt;
Platform: Android (Google Play)&lt;br&gt;
Attribution: Designed by Code vairagi&lt;/p&gt;

</description>
      <category>android</category>
      <category>plant</category>
      <category>plantfinder</category>
      <category>plantidentifier</category>
    </item>
    <item>
      <title>Plant Finder: Stress-Testing an AI Plant Identifier App Across 8 Months with 5,000 Botany Students on Android with Flutter published</title>
      <dc:creator>Plant Finder</dc:creator>
      <pubDate>Tue, 13 Oct 2026 15:14:39 +0000</pubDate>
      <link>https://dev.to/plantfinder/plant-finder-stress-testing-an-ai-plant-identifier-app-across-8-months-with-5000-botany-students-38kp</link>
      <guid>https://dev.to/plantfinder/plant-finder-stress-testing-an-ai-plant-identifier-app-across-8-months-with-5000-botany-students-38kp</guid>
      <description>&lt;p&gt;The reality of testing Plant Finder, an AI plant identifier app built with Flutter on Android, through 8 months of field testing with 5,000 botany students.&lt;br&gt;
tags: flutter, ai, android, testing&lt;/p&gt;

&lt;h2&gt;
  
  
  canonical_url: &lt;a href="https://plantfinder.store" rel="noopener noreferrer"&gt;https://plantfinder.store&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Most machine learning models for botany perform well on curated benchmark datasets, then fail when deployed on commercial mobile cameras in variable field conditions. An algorithm trained on flat, evenly lit herbarium sheets often struggles when confronted with wind blur, partial insect damage, dew reflections, or juvenile leaf morphology.&lt;/p&gt;

&lt;p&gt;When developing &lt;strong&gt;Plant Finder&lt;/strong&gt;, a mobile application built with Flutter on Android, we chose not to rely purely on synthetic vision datasets. Instead, we spent 8 months coordinating with approximately 5,000 botany students to stress-test, ground-truth, and calibrate the engine against living specimens.&lt;/p&gt;

&lt;p&gt;Here is an objective look at the app’s functional features and the logistical realities of managing a massive, distributed botanical validation effort.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. What the Plant Finder Engine Does
&lt;/h2&gt;

&lt;p&gt;Plant Finder was designed to move beyond basic species labeling by combining botanical taxonomy with actionable foliar pathology:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Organ Species Identification:&lt;/strong&gt; Uses multimodal vision models to classify plants from multiple structures—leaf lamina, petiole attachments, flower anatomy, and bark textures—across houseplants, agricultural crops, and endemic wild flora.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foliar Pathology &amp;amp; Disease Diagnostics:&lt;/strong&gt; Analyzes leaf tissue to differentiate biotic attacks (fungal powdery mildew, bacterial spot, spider mites, thrips) from environmental damage, generating a calibrated 0–100% health score.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soil pH &amp;amp; Nutrient Lockout Inference:&lt;/strong&gt; Connects interveinal chlorosis patterns to rootzone chemistry, helping growers spot mineral lockouts and pH drift before crops suffer terminal damage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cultivation Reminders &amp;amp; Care Schedules:&lt;/strong&gt; Translates species requirements into automated watering intervals, light requirements, and customized growth diaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community Hub &amp;amp; Marketplace:&lt;/strong&gt; Provides an integrated forum and agricultural directory where growers and specialists exchange field diagnostics.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. The Logistics of Coordinating 5,000 Botany Students for 8 Months
&lt;/h2&gt;

&lt;p&gt;Organizing 5,000 botany students across diverse regional ecosystems sounded ideal in theory, but operational execution presented massive coordination hurdles:&lt;/p&gt;

&lt;h3&gt;
  
  
  A. The Challenge of Inconsistent Botanical Labeling
&lt;/h3&gt;

&lt;p&gt;Academic taxonomy is rarely uniform in practice. When testing identical specimens across different student cohorts, we routinely encountered conflicting classifications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Students frequently submitted regional vernacular names instead of formal binomial nomenclature, requiring manual verification against international plant databases.&lt;/li&gt;
&lt;li&gt;Subspecies and hybrid cultivars created constant classification disputes, especially within complex families like &lt;em&gt;Araceae&lt;/em&gt;, &lt;em&gt;Myrtaceae&lt;/em&gt;, and &lt;em&gt;Rosaceae&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;We had to implement strict verification thresholds where questionable classifications required confirmation from at least three independent reviewers before entering our evaluation sets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  B. Phenological Drift and Juvenile vs. Mature Tissue
&lt;/h3&gt;

&lt;p&gt;Leaves change dramatically as plants mature. A common problem encountered during the 8-month trial was juvenile foliar confusion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immature leaves on young specimens often lacked the definitive margin serration or venation depth of mature foliage.&lt;/li&gt;
&lt;li&gt;Cotyledons (seedling leaves) triggered high error rates across standard visual models.&lt;/li&gt;
&lt;li&gt;Students had to document plants across full growth cycles—from early seedling emergence to flowering and senescence—to ensure the vision models could handle multi-stage recognition.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  C. Camera Hardware and Environmental Inconsistencies
&lt;/h3&gt;

&lt;p&gt;Field conditions are inherently messy. The 5,000 students tested the app across hundreds of different Android device models, exposing hardware-level discrepancies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low-end camera sensors washed out subtle yellowing patterns (interveinal chlorosis), causing the model to miss early magnesium or iron deficiencies.&lt;/li&gt;
&lt;li&gt;Intense direct sunlight caused reflective glare on glossy waxy leaves (such as &lt;em&gt;Ficus&lt;/em&gt; species), which the algorithms initially misclassified as powdery mildew.&lt;/li&gt;
&lt;li&gt;We spent months building pre-processing rules to teach the system how to filter out glare, soil backgrounds, and blurred edges before running visual inference.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  D. Separating Disease from Physical Damage
&lt;/h3&gt;

&lt;p&gt;One of the hardest tasks for the student reviewers was distinguishing pathogen symptoms from abiotic stress:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A brown, dried leaf tip could indicate low humidity, root rot, chemical burn, or simple underwatering.&lt;/li&gt;
&lt;li&gt;Mechanical tearing from wind or handling looks remarkably similar to early bacterial blight on camera.&lt;/li&gt;
&lt;li&gt;Over the course of the 8 months, the students cataloged thousands of comparative side-by-side images to train the diagnostic pipeline on the subtle cellular differences between physical tears and infectious necrotic halos.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. What 8 Months in the Field Proved
&lt;/h2&gt;

&lt;p&gt;Field testing taught us that machine learning models cannot replace practical botanical observation; they require rigorous human-in-the-loop calibration:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Academic Ground-Truthing is Mandatory:&lt;/strong&gt; Real-world field testing with knowledgeable students eliminated hundreds of edge-case errors that static web datasets never would have caught.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Matters More Than Resolution:&lt;/strong&gt; High-resolution photos are useless if the system does not account for environmental variables like light, soil conditions, and canopy position.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful Failure is Essential:&lt;/strong&gt; The app needed clear guardrails to tell users when an image was unreadable, out of focus, or not a plant at all, rather than outputting a confident hallucination.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. Current Status
&lt;/h2&gt;

&lt;p&gt;Following those 8 months of collaborative testing and data refinement, &lt;strong&gt;Plant Finder&lt;/strong&gt; is running in production. The engine supports indoor container gardeners, commercial growers, and field researchers who need dependable botanical classification and foliar health diagnostics on their mobile devices.&lt;/p&gt;

&lt;p&gt;The application is available on Android via &lt;a href="https://play.google.com/store/apps/details?id=com.plantfinder" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;, and comprehensive web diagnostic guides and platform documentation are maintained at &lt;a href="https://plantfinder.store" rel="noopener noreferrer"&gt;plantfinder.store&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>plants</category>
      <category>plantfinder</category>
      <category>plantidentifier</category>
    </item>
  </channel>
</rss>
