<?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: Sahil Singh</title>
    <description>The latest articles on DEV Community by Sahil Singh (@sahil_singh_2dcbae504a59d).</description>
    <link>https://dev.to/sahil_singh_2dcbae504a59d</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%2F3645697%2F973a61d5-842a-4a93-9ac5-5c354717225b.png</url>
      <title>DEV Community: Sahil Singh</title>
      <link>https://dev.to/sahil_singh_2dcbae504a59d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sahil_singh_2dcbae504a59d"/>
    <language>en</language>
    <item>
      <title>Wallko: walk to water your garden, scan real plants to grow it (all on-device, open models)</title>
      <dc:creator>Sahil Singh</dc:creator>
      <pubDate>Sun, 11 Oct 2026 14:36:33 +0000</pubDate>
      <link>https://dev.to/sahil_singh_2dcbae504a59d/wallko-walk-to-water-your-garden-scan-real-plants-to-grow-it-all-on-device-open-models-383j</link>
      <guid>https://dev.to/sahil_singh_2dcbae504a59d/wallko-walk-to-water-your-garden-scan-real-plants-to-grow-it-all-on-device-open-models-383j</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Wallko is a cosy Android game that only works if you go outside.&lt;/p&gt;

&lt;p&gt;You go for a walk. Walking fills a water tank, measured in drops. On the way you point the camera at a real plant, and Wallko names it, turns it into a collectable card and plants it in your little garden as a hand-painted potted sprite. Your plants drink from the tank on their own every day. Stop walking and the tank runs dry: after 3 days without water a plant wilts, after 7 it withers.&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%2Fbjf0flt4u01mn25z1sfn.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%2Fbjf0flt4u01mn25z1sfn.png" alt=" " width="800" height="789"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Illustration built from real on-device results on my phone: a confident answer (left) and an unsure one where you pick (right).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The numbers that drive it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Steps:&lt;/strong&gt; 1 drop per 100 steps from Health Connect, capped at 15,000 steps a day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPS walks:&lt;/strong&gt; 2 drops per 100 m. Points faster than 12 km/h don't count, so driving doesn't pay.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exploring:&lt;/strong&gt; the map is split into 100 m cells under a fog of war. Every cell you enter for the first time clears the fog and gives 3 drops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elixir:&lt;/strong&gt; every 500 m walked inside never-visited cells gives 1 elixir, and elixir is the only way to bring a withered plant back. So the game pushes you down streets you haven't walked yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dawn bonus:&lt;/strong&gt; walk drops count double between 4:00 and 7:00.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rarity:&lt;/strong&gt; cards are Common to Legendary based on how often the species is observed worldwide (iNaturalist and GBIF counts).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The screen part is short on purpose: open the camera, tap a guess, put the phone away. The garden and the map are things you check after the walk, not during it.&lt;/p&gt;

&lt;p&gt;Everything runs on the phone. There is no account and no backend. Walks, photos, plants and explored cells never leave the device.&lt;/p&gt;
&lt;h3&gt;
  
  
  Taking it outside
&lt;/h3&gt;

&lt;p&gt;My father and I go for a walk every day, and we often talk about the wild flowers we pass. I've always found them beautiful, and I think knowing more about them makes it easier to enjoy them. That's where Wallko came from. I didn't plan it: one day on a walk I saw a wild flower and thought, "let's find out what this is." So far I've only taken Wallko outside once, so this is just the start.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/GPJSu5oyzt0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video:&lt;/strong&gt; &lt;a href="https://youtube.com/shorts/GPJSu5oyzt0" rel="noopener noreferrer"&gt;youtube.com/shorts/GPJSu5oyzt0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APK:&lt;/strong&gt; &lt;a href="https://github.com/25sahilsingh/wallko/releases/download/v0.1.0/wallko-v0.1.0.apk" rel="noopener noreferrer"&gt;wallko-v0.1.0.apk&lt;/a&gt; (187 MB, Android 10+, ARM phones). Open it on your phone and allow installing from unknown sources; it's a debug-signed preview build.&lt;/p&gt;

&lt;p&gt;You can also build the APK yourself from the repo: &lt;code&gt;./gradlew assembleDebug&lt;/code&gt; (JDK 21, Android SDK 37, no API keys needed). The README has the full steps.&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%2Fab7svmzrujbfyrswpsl3.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%2Fab7svmzrujbfyrswpsl3.png" alt=" " width="800" height="1617"&gt;&lt;/a&gt;&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%2Fet3z20rwnwx2u9btqelj.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%2Fet3z20rwnwx2u9btqelj.png" alt=" " width="720" height="1828"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;My Tulsi card: rarity, family, thirst, sun and growth, and the photo I took (place name blurred).&lt;/em&gt;&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%2Fob5k4s8cj6m0bewevp53.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%2Fob5k4s8cj6m0bewevp53.png" alt=" " width="800" height="1617"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/25sahilsingh" rel="noopener noreferrer"&gt;
        25sahilsingh
      &lt;/a&gt; / &lt;a href="https://github.com/25sahilsingh/wallko" rel="noopener noreferrer"&gt;
        wallko
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Wallko&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A cosy Android game that gets you outside. Go for a walk, scan real plants with the camera, collect
them as cards and grow them in a little virtual garden. Walking fills your water tank and the plants
drink from it on their own. Stop walking and they wilt, then wither. Walking into places you have
never been earns elixir, the only thing that can bring a withered plant back.&lt;/p&gt;
&lt;p&gt;Everything runs on the phone. There is no account and no backend. Walks, plants and explored areas
never leave the device. The only network use is map tiles (OpenFreeMap), the ML Kit segmentation
model (fetched by Google Play services).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scan:&lt;/strong&gt; live camera, then pick from the top three guesses. The plant is cut out (ML Kit subject
segmentation) and repainted in one of three styles (Magenta style transfer) as a potted sprite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Garden, Collection:&lt;/strong&gt; a meadow with snap-to-grid plots…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/25sahilsingh/wallko" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The BioCLIP model files are in the &lt;a href="https://github.com/25sahilsingh/wallko/releases/tag/bioclip-v1" rel="noopener noreferrer"&gt;&lt;code&gt;bioclip-v1&lt;/code&gt; release&lt;/a&gt;. The scripts I used to test, export and quantise the models are in &lt;code&gt;tools/ml-research/&lt;/code&gt;, and the results are written up in &lt;code&gt;docs/ml-research.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Wallko is Kotlin and Jetpack Compose, with Room for the garden and walks, CameraX for the scanner, and WorkManager for the slow jobs. The interesting part is how a photo becomes a named plant and a sprite:&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%2Fuxnqtjqkjiou3pj87mps.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%2Fuxnqtjqkjiou3pj87mps.png" alt=" " width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: my plants weren't in the model
&lt;/h3&gt;

&lt;p&gt;I started with Google's &lt;strong&gt;AIY Plants V1&lt;/strong&gt; classifier (Apache 2.0, 5 MB LiteRT model, 2,101 species). It's small and fast, and it was right about wild plants: a red campion scored 0.96. Then I tried it on the plants in my own home, and it failed on almost all of them. AIY knows mostly wild North American species, and my plants are Indian and house plants:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;My plant&lt;/th&gt;
&lt;th&gt;AIY said&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lucky bamboo&lt;/td&gt;
&lt;td&gt;top guess at 0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tulsi&lt;/td&gt;
&lt;td&gt;Chickweed, 0.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Areca palm&lt;/td&gt;
&lt;td&gt;Nikau palm, 0.58 (wrong, and confident)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A threshold can't fix a confident wrong answer, so I needed a different model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: looking for a better namer
&lt;/h3&gt;

&lt;p&gt;I checked several open options before settling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;dima806 houseplant ViT&lt;/strong&gt; (Apache 2.0): picked the right plant but only at 6–8 %. Rejected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MobileViT houseplants:&lt;/strong&gt; no licence, and confidently wrong. Rejected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PlantNet-300K:&lt;/strong&gt; has none of my plants. Rejected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iNaturalist's full model:&lt;/strong&gt; not public.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BioCLIP&lt;/strong&gt; (&lt;a href="https://huggingface.co/imageomics/bioclip" rel="noopener noreferrer"&gt;imageomics/bioclip&lt;/a&gt;, ViT-B/16, MIT licence, trained on TreeOfLife-10M): the best by far.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: BioCLIP, zero-shot, on the phone
&lt;/h3&gt;

&lt;p&gt;BioCLIP is a CLIP model for the tree of life. I use it zero-shot: the app never trains anything.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On my PC, every species name becomes a 512-number text embedding, stored in a table. The prompt &lt;code&gt;a photo of {latin}.&lt;/code&gt; worked best. Adding common names made it worse.&lt;/li&gt;
&lt;li&gt;On the phone, the photo becomes a 512-number image embedding, and the best match is the row with the highest dot product.&lt;/li&gt;
&lt;li&gt;So &lt;strong&gt;adding a species means adding a row to the table&lt;/strong&gt;. No retraining. My list has 2,162 rows: AIY's 2,101 species plus 60 houseplants and Indian plants I added.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I exported the image encoder to ONNX and quantised it to int8 with ONNX Runtime, which took it from 345 MB to 87 MB. On the phone it runs with ONNX Runtime Android (I gave up on a LiteRT conversion because the converter pulled gigabytes of CUDA libraries).&lt;/p&gt;

&lt;p&gt;On my Redmi phone (8 cores, 4 threads) the model loads in about 0.8 s and takes about 620–720 ms per photo. Results on the phone:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;My plant&lt;/th&gt;
&lt;th&gt;BioCLIP said&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lucky bamboo&lt;/td&gt;
&lt;td&gt;correct, 0.98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tulsi&lt;/td&gt;
&lt;td&gt;correct, 1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Red campion&lt;/td&gt;
&lt;td&gt;correct, 0.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elephant bush (&lt;em&gt;Portulacaria afra&lt;/em&gt;)&lt;/td&gt;
&lt;td&gt;correct (1.00 on PC, named correctly in the app)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It's not perfect, and I'd rather say so:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Areca palm&lt;/strong&gt; is borderline. In the full app scan it comes out first at 0.40 with Nikau palm right behind at 0.37, so the app shows both as "could be" instead of picking one.&lt;/li&gt;
&lt;li&gt;A tight crop of my &lt;strong&gt;money plant&lt;/strong&gt; came out as Butcher's-broom; money plant was second.&lt;/li&gt;
&lt;li&gt;My &lt;strong&gt;bean plant&lt;/strong&gt; came out as Kudzu, because beans aren't in my list yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: AIY as the gate, BioCLIP as the namer
&lt;/h3&gt;

&lt;p&gt;BioCLIP always picks &lt;em&gt;some&lt;/em&gt; species, even for a photo of my room. AIY has a background class, and rooms and walls score 0.66–0.79 on it. So AIY stayed, with a new job:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AIY looks first. If the background score is 0.30 or more, it's not a plant: no guesses, just "retake".&lt;/li&gt;
&lt;li&gt;If it is a plant, BioCLIP names it from my 2,162-row list.&lt;/li&gt;
&lt;li&gt;Only guesses scoring at least 0.30 are shown. The top one counts as confident at 0.35+ with a 0.10 lead; otherwise the guesses are shown as "could be".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the BioCLIP files aren't on the phone, the app falls back to AIY alone.&lt;/p&gt;

&lt;p&gt;I tested the whole chain on the phone with 4 room photos and 6 plant photos. All 4 rooms were stopped at the gate (background 0.44–0.89), in about 0.1 s each. All 6 plants got through (background 0.00) and were named in about 0.9 s.&lt;/p&gt;

&lt;h3&gt;
  
  
  A lesson: a bigger list made it worse
&lt;/h3&gt;

&lt;p&gt;The BioCLIP authors publish precomputed embeddings for the whole TreeOfLife set. I tried 109k plant names instead of my 2,162. Coverage went up (it found my bean), but accuracy didn't: 3 of 7 test photos right, against 4 of 7 with my curated list. With 109k names, a rare look-alike relative wins too often. For a game where people scan the plants around them, a curated list is better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: the potted sprite
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ML Kit subject segmentation&lt;/strong&gt; cuts the plant out of the photo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Magenta arbitrary style transfer&lt;/strong&gt; (Apache 2.0, LiteRT) repaints it in one of three styles (watercolour, flat pastel, crayon). The style images are my own, made from the app's palette.&lt;/li&gt;
&lt;li&gt;The cut-out goes into a pot and into the garden.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pure style transfer washed every plant in the style image's pink and blue blobs. The fix was to blend: 0.4 of the art style with 0.6 of the photo's own style vector. Plants now look painted but still green.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting the model onto the phone
&lt;/h3&gt;

&lt;p&gt;The 87 MB model is too big to put in the APK, so it lives in the &lt;a href="https://github.com/25sahilsingh/wallko/releases/tag/bioclip-v1" rel="noopener noreferrer"&gt;GitHub release&lt;/a&gt;. On first run, the app downloads the three BioCLIP files over Wi-Fi in the background, checks each one's size and SHA-256, and only then moves it into place. Until they arrive, scanning works with AIY alone. Building only for ARM phones also brought the APK down from 313 MB to 187 MB.&lt;/p&gt;

&lt;h3&gt;
  
  
  The other open pieces
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ONNX Runtime&lt;/strong&gt; and &lt;strong&gt;LiteRT&lt;/strong&gt; for on-device inference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MapLibre&lt;/strong&gt; with &lt;strong&gt;OpenFreeMap&lt;/strong&gt; tiles for the fog-of-war map (no API key). With no tiles, the app draws a plain map from the same cell data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Card data&lt;/strong&gt; (names, rarity) built once on my PC from iNaturalist, GBIF and Wikidata, and shipped inside the APK.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One piece is &lt;strong&gt;not&lt;/strong&gt; open: ML Kit subject segmentation comes from Google Play services. It's the one closed model in the pipeline, and it only makes the sprite, not the name. It could be swapped for an open segmentation model later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;For this app, open models weren't a nice extra. They're the reason it works at all.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It works on the trail with no signal.&lt;/strong&gt; Naming a plant happens entirely on the phone. Parks and hills are exactly where the mobile signal drops, and that's where people scan plants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photos and location stay on the phone.&lt;/strong&gt; A plant photo taken on a walk says where you were and when. With no server, I don't have to ask anyone to trust me with that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing per scan.&lt;/strong&gt; No API bill, no rate limit, no key in the app. If a thousand people walk with it, it costs me the same as one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could fix it myself.&lt;/strong&gt; This is where open beat closed for me. When AIY didn't know tulsi or lucky bamboo, I could test other models, export BioCLIP to ONNX, quantise it to a quarter of its size, measure it on my own phone, and add the plants of my region as rows in a table. A closed plant-ID API would have given me its own species list and its own answers, and no way to change either.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can ship it.&lt;/strong&gt; AIY and Magenta are Apache 2.0 and BioCLIP is MIT, so I can redistribute the models in the APK and in a GitHub release.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built Wallko with &lt;strong&gt;Claude Code&lt;/strong&gt; (Anthropic). To be clear, that's a closed agent harness, not an open one. The open parts of this project are the models and the runtimes on the phone.&lt;/p&gt;

&lt;p&gt;How I used it: I wrote the plan and game rules first (they're in &lt;code&gt;docs/&lt;/code&gt;), then worked through it in phases. I used subagents for separate jobs: one rebuilt the BioCLIP export and int8 model after a reboot wiped my working files, one ran the on-device benchmark on my phone, one wired BioCLIP into the scan flow behind the AIY gate, and one audited the repo before I published it. I tested every model result myself on my own plants.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
