<?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: utkarsh sonawane</title>
    <description>The latest articles on DEV Community by utkarsh sonawane (@utkarshsonawane67).</description>
    <link>https://dev.to/utkarshsonawane67</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: utkarsh sonawane</title>
      <link>https://dev.to/utkarshsonawane67</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/utkarshsonawane67"/>
    <language>en</language>
    <item>
      <title>I built a hiking guide that runs on a laptop with no internet — meet trailbrief</title>
      <dc:creator>utkarsh sonawane</dc:creator>
      <pubDate>Sat, 10 Oct 2026 20:25:55 +0000</pubDate>
      <link>https://dev.to/utkarshsonawane67/i-built-a-hiking-guide-that-runs-on-a-laptop-with-no-internet-meet-trailbrief-12e7</link>
      <guid>https://dev.to/utkarshsonawane67/i-built-a-hiking-guide-that-runs-on-a-laptop-with-no-internet-meet-trailbrief-12e7</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;trailbrief&lt;/strong&gt; is a small Python CLI that writes you a personalized hiking briefing. You tell it the trail — name, distance, elevation gain, location, season, your experience level — and it hands back a practical plan: an overview, a pacing plan, a season-aware pack list, watch-outs, and a Leave No Trace reminder.&lt;/p&gt;

&lt;p&gt;The twist: the briefing is written by &lt;strong&gt;Gemma, running locally through Ollama&lt;/strong&gt;. No accounts, no API keys, no data leaving your machine. And because the whole point is getting &lt;em&gt;outside&lt;/em&gt;, there's a proper offline fallback — when no model is reachable (read: you're already on the trail with zero bars), a built-in template engine still produces a genuinely useful briefing instead of an error message.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/sonawaneutkarsh/trailbrief" rel="noopener noreferrer"&gt;https://github.com/sonawaneutkarsh/trailbrief&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Here's a real run — offline mode, since I don't have a GPU farm in my dorm:&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="nv"&gt;$ &lt;/span&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; trailbrief &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Ricketts Glen Falls Trail"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--distance&lt;/span&gt; 7.2 &lt;span class="nt"&gt;--elevation&lt;/span&gt; 1200 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s2"&gt;"Benton, PA"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--season&lt;/span&gt; fall &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--experience&lt;/span&gt; intermediate &lt;span class="nt"&gt;--offline&lt;/span&gt;

&lt;span class="c"&gt;# Trail Briefing: Ricketts Glen Falls Trail&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;Benton, PA · 7.2 mi · 1,200 ft gain · Fall · Moderate&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;## Overview&lt;/span&gt;
A moderate day out: 7.2 miles and 1,200 ft of gain asks &lt;span class="k"&gt;for &lt;/span&gt;steady pacing and a real lunch stop. Expect about 4.2 hours of moving &lt;span class="nb"&gt;time&lt;/span&gt;, plus stops.

&lt;span class="c"&gt;## Pacing plan&lt;/span&gt;
Start no later than 8 AM — with 4.2 hours of moving &lt;span class="nb"&gt;time &lt;/span&gt;plus breaks, you want a buffer before dark.

&lt;span class="c"&gt;## Pack list&lt;/span&gt;
- Insulating mid-layer — temps swing 20°F+ through the day
- Headlamp with fresh batteries &lt;span class="o"&gt;(&lt;/span&gt;shorter days sneak up on you&lt;span class="o"&gt;)&lt;/span&gt;
- Bright colors — it&lt;span class="s1"&gt;'s hunting season in many areas

## Watch-outs
Daylight is the constraint: sunset comes early and temperatures drop fast once the sun dips. Leaf-covered rocks are slippery.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Ollama running (&lt;code&gt;ollama pull gemma3&lt;/code&gt;, then drop the &lt;code&gt;--offline&lt;/code&gt; flag), the same inputs go to the model instead — with a twist I'll get to below.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The architecture is deliberately boring, in the good way:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic core.&lt;/strong&gt; Difficulty and moving time are computed from your numbers with a Naismith-style rule (2 mph + 30 min per 1,000 ft of gain). No vibes, just arithmetic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grounded prompt.&lt;/strong&gt; Those computed numbers are baked into the prompt, and the model is explicitly told to use them and &lt;em&gt;not invent trail features, facilities, or water sources&lt;/em&gt;. This is the part most "AI hiking apps" get wrong — a chatbot happily hallucinating a water fountain at mile 6 is how people get hurt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local inference.&lt;/strong&gt; The prompt goes to &lt;code&gt;localhost:11434&lt;/code&gt; — Ollama, plain HTTP, stdlib only. Default model is &lt;code&gt;gemma3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest fallback.&lt;/strong&gt; Model unreachable? The template engine takes over with season-aware packing (fall gets headlamp + hunter-orange reminders, winter gets microspikes), elevation-aware safety notes, and experience-level tips.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The full test suite (12 tests, &lt;code&gt;python -m unittest discover -s tests&lt;/code&gt;) covers the difficulty bands, prompt grounding, fallback content, and the Ollama HTTP layer with mocks — no server needed to verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open innovation matters for this build
&lt;/h2&gt;

&lt;p&gt;This project only makes sense &lt;em&gt;because&lt;/em&gt; the AI is open:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It works where the internet doesn't.&lt;/strong&gt; A cloud API can't brief you on a ridgeline with no signal. A 3–9B open-weight model on your laptop can. The "touch grass" theme isn't decoration here — offline capability is the entire point, and only open weights make it possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your location stays yours.&lt;/strong&gt; Where you hike is personal data. With local inference, your trail plans never touch a server you don't control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No per-token billing for a hobby tool you use twice a month. The economics of a closed API would kill this project; open weights make it free forever.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Models are swappable, not load-bearing.&lt;/strong&gt; Don't like Gemma's briefing style? &lt;code&gt;--model llama3.2&lt;/code&gt; and you're done — no code changes, no renegotiating with a vendor. The deterministic core (difficulty math, grounding, fallback) stays identical no matter which weights you plug in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed model could write a prettier paragraph. It couldn't do any of the four things above. That's the whole argument.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do next
&lt;/h2&gt;

&lt;p&gt;Trailhead weather overlays, GPX import so distance/elevation come from the file instead of your memory, and a &lt;code&gt;--compare&lt;/code&gt; mode that briefs the same trail with two models side by side. All doable without touching the core.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Overall&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma (via Ollama) is the default briefing engine; the prompt, grounding strategy, and model-swap design are built around it.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built October 10, 2026 for the Hacktoberfest Week 1 DEV Challenge ("Touch Grass"). Tags: #devchallenge #hf26challenge&lt;/em&gt;&lt;/p&gt;

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