<?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: Abisoye O</title>
    <description>The latest articles on DEV Community by Abisoye O (@abisoye).</description>
    <link>https://dev.to/abisoye</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Abisoye O</title>
      <link>https://dev.to/abisoye</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abisoye"/>
    <language>en</language>
    <item>
      <title>Find the right price to sell your items online with a title and description ready-to-post!</title>
      <dc:creator>Abisoye O</dc:creator>
      <pubDate>Fri, 16 Oct 2026 04:42:52 +0000</pubDate>
      <link>https://dev.to/abisoye/price-wire-price-your-used-electronics-and-paste-a-listing-in-minutes-hf26-week-2-3fii</link>
      <guid>https://dev.to/abisoye/price-wire-price-your-used-electronics-and-paste-a-listing-in-minutes-hf26-week-2-3fii</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge: Week 2 — Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You know the item. You are not sure what your starting price should be, and you do not want an hour of search and tab switching before you list.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Price Wire&lt;/strong&gt; is a small web app for people who sell phones, consoles, headphones, and other electronics on eBay-style sites. You describe what you are selling and the condition. It shows what similar listings look like, suggests a &lt;strong&gt;starting price&lt;/strong&gt; and a &lt;strong&gt;quick sale / hold firm&lt;/strong&gt; range, and gives you &lt;strong&gt;title and description text&lt;/strong&gt; you can paste into the marketplace form.&lt;/p&gt;

&lt;p&gt;The page is meant to feel like a price notebook, not a dashboard. Light and dark themes, a short form, and a clear &lt;strong&gt;Get price&lt;/strong&gt; button.&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%2F7lm3if5dy6m371mg2mkh.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%2F7lm3if5dy6m371mg2mkh.png" alt="Price Wire home screen: notebook layout, demo card, and links to the project repo" width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You enter the item you want to research, the way you would look the item up with as accurate a name you can provide, and pick a condition. Small labels along the top show which helpers are online (listing text, live shopping results, and the rest).&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%2F61fl1smq56bs8n1ll2dm.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%2F61fl1smq56bs8n1ll2dm.png" alt="The listing form with condition choices and service status along the top" width="800" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tap &lt;strong&gt;Get price&lt;/strong&gt;. The app pulls recent similar listings where it can, blends in sample sales when the demo is offline, and answers with three numbers: a suggested ask, a quicker-sale price, and a patient price.&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%2Fm31q9ktxkkocu0gr4if2.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%2Fm31q9ktxkkocu0gr4if2.png" alt="Suggested, quick sale, and hold firm prices after a search" width="800" height="859"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Below that, a table of &lt;strong&gt;similar listings&lt;/strong&gt; with thumbnail-photos when available, sanitized names, and links out so you can price-compare before you decide on the listing.&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%2F4hh0ihd2ktbdxbqbtkp5.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%2F4hh0ihd2ktbdxbqbtkp5.png" alt="Similar listings with thumbnails, marketplace names, and links" width="800" height="716"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;five-minute listing draft&lt;/strong&gt; is the other half of the product. Title and description blocks per platform (eBay, Etsy, StockX, Facebook Marketplace). Tap the copy icon beside a field; the full celebration animation stays on &lt;strong&gt;Get price&lt;/strong&gt;, not on copy.&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%2F64k4260prdhpq459og7h.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%2F64k4260prdhpq459og7h.png" alt="Listing draft with title, description, and icon copy buttons" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dark mode uses the same layout with negative contrast elements like punch holes, horizontal rules, readable borders - so night listing sessions do not feel like a different Interface.&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%2F1zfwg78zgh8r59egnyy4.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%2F1zfwg78zgh8r59egnyy4.png" alt="Price Wire in dark theme" width="799" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://price-wire.onrender.com" rel="noopener noreferrer"&gt;price-wire.onrender.com&lt;/a&gt; — with some daily usage limits on this free demo so it can serve a good chunk of testers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example to type in:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Title: &lt;code&gt;Sony WH-1000XM5 Wireless Headphones Black&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Condition: &lt;strong&gt;Used&lt;/strong&gt; — e.g. light wear on the pads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then open the listing draft and copy the title and description into your marketplace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run it yourself:&lt;/strong&gt; &lt;a href="https://github.com/AbisoyeOnanuga/price-wire" rel="noopener noreferrer"&gt;github.com/AbisoyeOnanuga/price-wire&lt;/a&gt; — &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt;, open &lt;code&gt;http://localhost:8787&lt;/code&gt;. No API keys required for the offline sample path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the live demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://price-wire.onrender.com" rel="noopener noreferrer"&gt;price-wire.onrender.com&lt;/a&gt; is a working prototype: you can run a full price lookup, review similar listings, and copy listing text. Some features depend on optional services (live shopping results, smarter title parsing, saved sale history). If a status chip shows offline, the app still returns sample data and pricing so you can have a minimal flow of the experience.&lt;/p&gt;

&lt;p&gt;The hosted demo shares a small search budget so one spike of traffic does not exhaust our lookup allowance before the deadline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8 price lookups per minute per visitor&lt;/li&gt;
&lt;li&gt;30 lookups per day across all visitors
If you hit a daily cap, wait until the next UTC day, or clone the repo and run locally (&lt;code&gt;npm run dev&lt;/code&gt;= tier-0 works without API keys). For a deep dive or many items, local is the better path; the public link is for a quick &lt;em&gt;light&lt;/em&gt; spin.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the pieces help
&lt;/h2&gt;

&lt;p&gt;Each integration does one job for the seller workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ai.google.dev/gemma" rel="noopener noreferrer"&gt;Gemma&lt;/a&gt;&lt;/strong&gt; reads messy titles and pulls out brand and model so the search and the draft say the right product, not a wall of keywords.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://serpapi.com/" rel="noopener noreferrer"&gt;SerpApi&lt;/a&gt;&lt;/strong&gt; fetches fresh shopping and eBay-style results so the similar-listings table reflects what buyers see this week, not only static sample rows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.tigerdata.com/" rel="noopener noreferrer"&gt;Tiger Data&lt;/a&gt;&lt;/strong&gt; (Postgres + vectors) is where saved sale history will live so repeat sellers can match against their own past deals—not in the public demo yet, but wired in the repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.priorlabs.ai/" rel="noopener noreferrer"&gt;TabPFN&lt;/a&gt;&lt;/strong&gt; can replace a simple median with a learned price band when enough examples exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://mastra.ai/" rel="noopener noreferrer"&gt;Mastra&lt;/a&gt;&lt;/strong&gt; groups those steps as tools so the open-AI challenge path stays inspectable; the UI still calls one clear “get a quote” flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://render.com" rel="noopener noreferrer"&gt;Render&lt;/a&gt;&lt;/strong&gt; hosts the accessible prototype.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://sentry.io" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;&lt;/strong&gt; (optional) traces slow quotes in production when you turn it on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://entire.io" rel="noopener noreferrer"&gt;Entire&lt;/a&gt;&lt;/strong&gt; checkpoints Cursor sessions in the repo for the “best use of Entire” track.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent session
&lt;/h2&gt;

&lt;p&gt;A short curated transcript of building the notebook UI and listing draft:&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="GitHub Copilot"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Price Wire HF26 Week 2 — consolidated build (Cursor)&lt;/span&gt;
      &lt;span class="agent-session-slice-label"&gt;Polish&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Polish UX: theme toggle, no Hacktoberfest header, human-readable pricing labels, listing draft (title/description/specs/shipping), 12 marketplace conditions + optional condition details.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Industrial resale UI with light/dark themes. Fixed Vite bundling main.ts (removed stale main.js) so condition dropdown populates. Added condition_detail field into listing descriptions. Sample sales panel labeled as demo data, not live ticker.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Light mode: results cards, table header, and price summary brief were unreadable (dark panels on light theme). Fix contrast. One consolidated DevRelay session for the post, not many fragments.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Moved stat/brief/table surfaces to CSS tokens (--surface, --surface-alt, --surface-featured) for both themes. Fixed duplicate brand in price summary (formatProductSummary). This session is the single canonical DevRelay embed — update this record as the project evolves before publish.&lt;/p&gt;

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

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        Slice: &lt;em&gt;Polish&lt;/em&gt; · 4 of 8 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="GitHub Copilot"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Price Wire HF26 Week 2 — consolidated build (Cursor)&lt;/span&gt;
      &lt;span class="agent-session-slice-label"&gt;Publishing draft&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-smoketest"&gt;smoke_test&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;Sony WH-1000XM5&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Sony WH-1000XM5&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Pipeline returns price band + listing_draft; comps from seed/Tiger; method_label human-readable.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Next for publish: Render deploy, screenshot of listing draft UI, embed {% agent_session %} below, first-user anecdote, GitHub repo URL.&lt;/p&gt;

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

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        Slice: &lt;em&gt;Publishing draft&lt;/em&gt; · 2 of 8 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Why open tools matter here
&lt;/h2&gt;

&lt;p&gt;Resale pricing is not generic chat. Electronics need the right model, storage, and lock state. Open-weight Gemma plus a database you control keeps the cost per lookup low enough for a side-hustle subscription, and finding price-history does not have to live inside one marketplace’s walled garden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/AbisoyeOnanuga/price-wire" rel="noopener noreferrer"&gt;https://github.com/AbisoyeOnanuga/price-wire&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;small&gt;&lt;br&gt;
&lt;strong&gt;AI disclosure:&lt;/strong&gt; I wrote and edited this post. Drafting and structure were assisted by AI coding agents while I built Price Wire.&lt;/small&gt;&lt;/p&gt;
&lt;small&gt;

&lt;/small&gt;&lt;p&gt;&lt;small&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; Price Wire is a &lt;strong&gt;prototype&lt;/strong&gt; for Hacktoberfest, not financial or legal advice. Prices are estimates from sample and third-party listing data. Verify fees, shipping, and marketplace rules before you list. Do not enter buyer names, addresses, or passwords in the form.&lt;/small&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Trail Sketch: a field-study guide for drawing and painting outdoors</title>
      <dc:creator>Abisoye O</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:57:11 +0000</pubDate>
      <link>https://dev.to/abisoye/trail-sketch-a-field-study-for-drawing-and-painting-outdoors-449c</link>
      <guid>https://dev.to/abisoye/trail-sketch-a-field-study-for-drawing-and-painting-outdoors-449c</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;Trail Sketch is a phone map for choosing a plein-air drawing or painting spot, then leaving with a short plan.&lt;/p&gt;

&lt;p&gt;Pick what you want to study. Nearby places line up as cards: a photo when Wikipedia has one, a feel word, and how far the walk is.&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%2F56sdxakixb63zicjrrek.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%2F56sdxakixb63zicjrrek.png" alt="Nearby places in Trail Sketch, with photos, feel words, and walking distance" width="390" height="844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use the map&lt;/strong&gt; button tucks that list away. &lt;strong&gt;Hide&lt;/strong&gt; leaves the pins.&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%2Fbt2m2b6ampmc8qz6odf5.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%2Fbt2m2b6ampmc8qz6odf5.png" alt="The map after the place list is tucked away, with scene pins for water and trees" width="390" height="844"&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%2Fnqwli8b94wzwonbe7ofv.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%2Fnqwli8b94wzwonbe7ofv.png" alt="The same map after Hide. The pins stay on the water and the trees" width="390" height="844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open a place and the photo stays beside the weather. Graphite and ink get a value plan. Watercolor and oil add three pigments. You decide what stays on the page. Accepting a place saves the date, medium, and weather on this phone, and marks the pin. A studied place can be deleted.&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%2F2l32qbpn41icr8u4d5mx.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%2F2l32qbpn41icr8u4d5mx.png" alt="The High Park watercolor sheet: photo beside the weather, a value plan, and three pigments" width="390" height="844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://trail-sketch.onrender.com" rel="noopener noreferrer"&gt;trail-sketch.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;visit the link to see the early prototype.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/AbisoyeOnanuga/trail-sketch" rel="noopener noreferrer"&gt;https://github.com/AbisoyeOnanuga/trail-sketch&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;One MapLibre map provides the opensource map library. OpenStreetMap lists what is nearby. Ranking stays on the phone. Open-Meteo describes the weather and lighting conditions. Gemma 4 writes the plan when you ask for one. ElevenLabs reads it aloud when an API key is present. A stored library of studied locations stays on the device.&lt;/p&gt;

&lt;p&gt;Lenis scrolls the place list and the study sheet. The map keeps its own pan. The busy rings are recolored loaders from &lt;a href="https://github.com/uiverse-io/galaxy" rel="noopener noreferrer"&gt;Uiverse Galaxy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Two other Touch Grass projects inspire the focus of trail sketch to minimise screen dependency or use and encourage real-world interaction. &lt;a href="https://dev.to/esimuda/name-it-then-look-up-a-field-guide-where-the-phones-job-ends-after-one-photo-3bbi"&gt;Spotted&lt;/a&gt; names one thing and asks you to look up. &lt;a href="https://dev.to/darrenmakes/fieldmemo-keep-the-phone-in-your-pocket-talk-to-it-get-a-field-journal-at-home-32bo"&gt;fieldmemo&lt;/a&gt; leaves the phone in a pocket and writes the journal later, on your own machine. Trail Sketch uses that same restraint: the map does the choosing, and Gemma writes one plan when you ask, so you are ready to start studying the location with your pencil or paint.&lt;/p&gt;

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

&lt;p&gt;Trail Sketch is for choosing a place to draw, then leaving the screen. That choice should not depend on a closed map account or a model key. OpenStreetMap lists what is nearby. MapLibre and OpenFreeMap draw it. Wikimedia supplies a photo when one exists. Open-Meteo describes the light. The map and the search work with no keys, so the guide is usable before any paid service is connected.&lt;/p&gt;

&lt;p&gt;The plan is the part that uses a model. Gemma is open-weight, so the same request can go to Google's endpoint or to a local process by changing a base URL. The wording of a study is not locked to one hosted model. Places already studied stay on the phone, not inside a closed map's saved list. Open source is what makes the guide available, and what keeps the painter's places and the plan's model from belonging to a single service.&lt;/p&gt;

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

&lt;p&gt;Guiding map interactions, what data is kept for artists about their chosen locations, and improving some UI-scaling issues:&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Gemini CLI"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Trail Sketch mobile field explorer&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Trail Sketch should suggest study places from the artist's interests when the phone loads, with visual previews. A feel word or a short description should rank the nearest walkable place. Accepting a place catalogues the date, medium, and weather, and marks the pin as studied. Google sign-in can key that library later. The light, middle, and dark boxes are a suggested plan, not a finished palette.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Nearby places come from an OpenStreetMap Overpass bbox query, ranked on the phone by feel, interests, and walking distance. A named place farther than a short ride is replaced with the nearest listed study. Gemma writes the accepted study as JSON. ElevenLabs is ready to narrate when its key is on the server. Studies stay in local storage, keyed by a Google subject once sign-in is configured.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-fieldcard"&gt;field-card&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;watercolor study for a nearby pond&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;watercolor study for a nearby pond&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Gemma 4 returned a three-value plan and three pigment swatches. The key and the raw response stayed on the server.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;On a phone the place list disappears, buttons are too large, and the top of the results card is cropped. Wide layout and vertical scroll are fine. Map pins should be more visual. The selected study should keep its preview beside the written plan and the narration. Update the Entire session and the unpublished DEV draft.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;On a narrow screen the place sheet now starts below the search bar and the list scrolls inside it, one card per row. Wide screens keep a two-column list. Pins are small scene drawings for water, trees, viewpoints, buildings, and ridges. Medium, distance, near-me, and studied controls use the same kind of marks. The study sheet keeps the preview image next to the place name, the weather line, and the plan that can be read aloud.&lt;/p&gt;

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

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        4 of 4 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Process snapshot.&lt;/strong&gt; &lt;a href="https://entire.io/gh/AbisoyeOnanuga/trail-sketch/commit/b36b3d8df8e4058e8f7581c328118dd2dfa9ee11" rel="noopener noreferrer"&gt;The checkpoint on the screenshot commit&lt;/a&gt; holds the session stored with that commit, so a viewer can read the project's process there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsor tools used
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ai.google.dev/gemma" rel="noopener noreferrer"&gt;Gemma&lt;/a&gt;&lt;/strong&gt; writes the study plan when you ask.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://render.com" rel="noopener noreferrer"&gt;&lt;strong&gt;Render&lt;/strong&gt;&lt;/a&gt; hosts the page and API access.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://elevenlabs.io" rel="noopener noreferrer"&gt;&lt;strong&gt;ElevenLabs&lt;/strong&gt;&lt;/a&gt; reads the plan aloud and starts the process of stepping away from your screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://entire.io/gh/AbisoyeOnanuga/trail-sketch/commit/b36b3d8df8e4058e8f7581c328118dd2dfa9ee11" rel="noopener noreferrer"&gt;Entire&lt;/a&gt;&lt;/strong&gt; stores the checkpoint of the agent session used to build this.&lt;/p&gt;

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