<?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: Biprayan Choudhuri</title>
    <description>The latest articles on DEV Community by Biprayan Choudhuri (@code_neuron58).</description>
    <link>https://dev.to/code_neuron58</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%2F3971945%2F7bad2bc5-e9d9-400f-b61d-799469fb706f.jpeg</url>
      <title>DEV Community: Biprayan Choudhuri</title>
      <link>https://dev.to/code_neuron58</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/code_neuron58"/>
    <language>en</language>
    <item>
      <title>Turnaround: an open-source hiking buddy that knows when you should turn back, and tells someone if you don't come home</title>
      <dc:creator>Biprayan Choudhuri</dc:creator>
      <pubDate>Mon, 12 Oct 2026 03:12:09 +0000</pubDate>
      <link>https://dev.to/code_neuron58/turnaround-an-open-source-hiking-buddy-that-knows-when-you-should-turn-back-and-tells-someone-if-1pha</link>
      <guid>https://dev.to/code_neuron58/turnaround-an-open-source-hiking-buddy-that-knows-when-you-should-turn-back-and-tells-someone-if-1pha</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;p&gt;Most hiking trouble isn't dramatic. Nobody falls off a cliff. Someone simply keeps going a little too long because the summit is "just around the corner", the sun sets earlier than they thought, and the only person who knows where they went is themselves.&lt;/p&gt;

&lt;p&gt;Two things would fix most of that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Knowing, before you leave, the time you should turn around&lt;/strong&gt;, based on how fast &lt;em&gt;you&lt;/em&gt; actually walk rather than a sign at the trailhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Someone you trust finding out automatically if you don't come back&lt;/strong&gt;, without you having to remember to tell them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I built &lt;strong&gt;Turnaround&lt;/strong&gt;. You spend about two minutes with it before a hike, then put your phone in your pocket.&lt;/p&gt;

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

&lt;p&gt;Turnaround is a hiking companion that runs entirely on your own laptop. Before a hike it gives you three times:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Turn around by:&lt;/strong&gt; not at the top or the far end by this time? Head back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Back by:&lt;/strong&gt; 9 in 10 hikes like yours finish before this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sunset margin:&lt;/strong&gt; how much daylight you have to spare.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then it does four things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Predicts&lt;/strong&gt; how long &lt;em&gt;you&lt;/em&gt; will take, as a range rather than a single guess. An open tabular foundation model (TabPFN) learns from 7,186 real recorded hikes and adjusts to your pace after every hike you finish.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Briefs&lt;/strong&gt; you out loud. Gemma 4, running locally, turns the numbers into a short spoken briefing that sounds like a friend who hikes. It's saved to your phone before you leave, so it plays with no signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watches.&lt;/strong&gt; When you tap Start, a durable safety timer begins waiting for your check-in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tells someone.&lt;/strong&gt; If you're well past your back-by time and still haven't checked in, your emergency contact gets an email with your plan, your route and a map link to where you set off. If you then check in late, they get a second email saying you're safe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No GPX file? You just enter the three numbers every trail page lists (distance, elevation gain and trailhead), and Turnaround plans from those.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; anyone who hikes alone or is new to it, and anyone with a parent, partner or friend who worries when they head out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it gets you off the screen:&lt;/strong&gt; the screen part is the beginning and the end of the trip. Plan, listen, pocket the phone, walk. The next time you look at it is to tap &lt;em&gt;Hike complete&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&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%2F4158exc2ygmupx8hbvn0.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%2F4158exc2ygmupx8hbvn0.png" alt="How it works: plan, go, check in" width="800" height="642"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;p&gt;The video walks through the whole flow: planning a hike, the spoken briefing, starting the trip and the safety timer, and checking in.&lt;/p&gt;

&lt;p&gt;Turnaround runs on my laptop, by design (more on that below), so there's no public link. The repo has one-command-per-terminal setup if you want to run it yourself.&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/CodeNeuron58" rel="noopener noreferrer"&gt;
        CodeNeuron58
      &lt;/a&gt; / &lt;a href="https://github.com/CodeNeuron58/Turnaround" rel="noopener noreferrer"&gt;
        Turnaround
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An open-source hiking companion
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT-licensed. CI runs typechecks, the app build and two unit-test suites on every push. Everything I claim below has a file in the repo backing it.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Everything runs on one laptop:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phone or browser&lt;/strong&gt; → the &lt;strong&gt;app&lt;/strong&gt; (React + Vite), reached over Wi-Fi or Tailscale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App&lt;/strong&gt; → the &lt;strong&gt;prediction service&lt;/strong&gt; (FastAPI + TabPFN + SQLite)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prediction service&lt;/strong&gt; → &lt;strong&gt;Gemma 4&lt;/strong&gt; (via Ollama) for the briefing, &lt;strong&gt;Kokoro&lt;/strong&gt; for the voice, and the &lt;strong&gt;Temporal server&lt;/strong&gt; to arm the timer and send check-ins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal worker&lt;/strong&gt; → the alert and all-clear &lt;strong&gt;emails&lt;/strong&gt; to your contact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only things that leave it are an anonymous weather lookup (coordinates only) and, if you're overdue, the alert email.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Predicting &lt;em&gt;your&lt;/em&gt; hike time: TabPFN
&lt;/h3&gt;

&lt;p&gt;The classic hiking-time rule is &lt;strong&gt;Naismith's rule&lt;/strong&gt;: roughly 12 minutes per kilometre plus 1 minute per 10 m of climbing. It's on half the trail signs in the world, and it gives the same answer for everyone.&lt;/p&gt;

&lt;p&gt;I wanted a range, and I wanted it to fit the person. &lt;a href="https://github.com/PriorLabs/TabPFN" rel="noopener noreferrer"&gt;TabPFN&lt;/a&gt; is an open tabular foundation model: you give it a table of examples and it predicts new rows &lt;em&gt;in context&lt;/em&gt;, with no training loop. Crucially for a safety tool, it returns a full predictive distribution rather than one number.&lt;/p&gt;

&lt;p&gt;The data is &lt;strong&gt;7,186 GPS-recorded hikes from hikr.org&lt;/strong&gt; (a public Kaggle dataset, CC0). The features are distance, climb, descent, highest point and the SAC difficulty grade (T1–T6). I held out &lt;strong&gt;1,438 hikes the model never saw&lt;/strong&gt; and compared it with Naismith:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;On 1,438 unseen hikes&lt;/th&gt;
&lt;th&gt;Naismith's rule&lt;/th&gt;
&lt;th&gt;TabPFN v3.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Average error&lt;/td&gt;
&lt;td&gt;44.1 min&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34.8 min&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RMSE&lt;/td&gt;
&lt;td&gt;69.1 min&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;54.5 min&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real times inside the predicted 90% band&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hikers back before the "back by" time (P90)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row is the one I care about most. A safety tool has to be &lt;strong&gt;honest about its uncertainty&lt;/strong&gt;, not just accurate on average. When Turnaround says "9 in 10 hikes like this are done by 4:40", that turns out to be true for 90.4% of hikes. Average error being 21% lower is a nice bonus.&lt;/p&gt;

&lt;p&gt;On a laptop CPU I serve TabPFN v2 by default. It's about 3x faster with nearly identical calibration (89.7%). The v3.5 checkpoint is one environment variable away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How the prediction becomes decisions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Back by&lt;/strong&gt; = the 90th percentile + your planned breaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turn around by&lt;/strong&gt; = the share of that time you should spend heading &lt;em&gt;out&lt;/em&gt;, assuming you retrace your steps. Climbing happens on the way out, so steep routes front-load it (Naismith's split, clamped between 50% and 70%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alert&lt;/strong&gt; = the 95th percentile + breaks + 30 minutes of grace. I deliberately didn't make it the back-by time: your contact should only be emailed when you're &lt;em&gt;genuinely&lt;/em&gt; late, not five minutes slow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Learning your pace.&lt;/strong&gt; The crowd isn't you. Every hike you finish compares your actual moving time with the model's median for the same route, and the ratios combine into a &lt;strong&gt;personal pace factor&lt;/strong&gt;. It's shrunk toward 1.0 on purpose, so one bad day can't swing the safety timer. A hike that was 40% slower than predicted moves your next estimate up about 12%, not 40%. Hikes where you tapped &lt;em&gt;I turned back early&lt;/em&gt; don't count, because a turned-back time says nothing fair about the whole route. All of these rules are in a small, unit-tested module.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A promise that survives a crash: Temporal
&lt;/h3&gt;

&lt;p&gt;The scariest bug a safety app can have is a timer that silently dies. If the alert depends on a Node process staying alive for six hours on a laptop, it's not a safety feature, it's a hope.&lt;/p&gt;

&lt;p&gt;So the safety timer is a &lt;a href="https://temporal.io" rel="noopener noreferrer"&gt;Temporal&lt;/a&gt; workflow. One &lt;code&gt;tripWorkflow&lt;/code&gt; per hike races a &lt;strong&gt;check-in signal&lt;/strong&gt; against a &lt;strong&gt;durable timer&lt;/strong&gt; set to the alert moment. Sending the email is an activity with retries. A late check-in after the alert triggers the all-clear. I run Temporal's free local dev server with an on-disk database, so timers survive a restart of the server itself, not just the worker.&lt;/p&gt;

&lt;p&gt;Then I tried to break it. Each scenario has its workflow history or logs committed in &lt;code&gt;docs/evidence/&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;What I did&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Checked in on time&lt;/td&gt;
&lt;td&gt;Timer closed, nobody emailed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Missed the check-in while the mail server failed&lt;/td&gt;
&lt;td&gt;Activity retried; alert went out on attempt 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Killed the worker mid-trip&lt;/strong&gt;, restarted it 25 s later&lt;/td&gt;
&lt;td&gt;Alert still fired &lt;strong&gt;exactly on the deadline&lt;/strong&gt;: 90.5 s after start, despite the worker being dead from second 20 to 45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Drill: missed check-in, then a late check-in&lt;/td&gt;
&lt;td&gt;Alert on the deadline, then an all-clear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Killed the Temporal server mid-trip&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Timer survived on disk; a check-in sent during the outage reported the failure honestly and landed when re-sent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Scenario 3 is the whole reason Temporal is here. The promise didn't notice the outage.&lt;/p&gt;

&lt;p&gt;This is what your contact actually receives. Both emails below were delivered to my own phone through Brevo, using the same templates and code path the worker uses (sent with the preview command, which is why they're marked &lt;code&gt;[PREVIEW]&lt;/code&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%2Fuggzden7hzwcpt9138x2.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%2Fuggzden7hzwcpt9138x2.png" alt="The alert email and the all-clear email, as they arrived on my phone" width="800" height="803"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The alert says who, which route, when they set off and when they should have been back, with a one-tap map link to the starting point. The all-clear tells your contact they can stand down. Nobody has to decode a log file at 4 a.m.&lt;/p&gt;

&lt;p&gt;The app is equally honest when something is wrong. If the timer fails to arm, the trail screen shows a red "safety timer NOT armed" banner with a retry button rather than pretending you're covered. If you check in with no signal, the check-in is saved on the phone and sent the moment it can reach the laptop, and re-sending is idempotent, so a flaky connection can't double anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A briefing that sounds like a friend: Gemma 4 + Kokoro
&lt;/h3&gt;

&lt;p&gt;Numbers on a screen are easy to ignore. A voice in your ear saying &lt;em&gt;"If you're not at the top by 1:40, turn around. The view will still be there next weekend"&lt;/em&gt; is not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 (E4B)&lt;/strong&gt; runs locally through Ollama's OpenAI-compatible endpoint. The service hands it the trip's facts (distance, climb, turn-around and back-by times, sunset, rain chance, trailhead) and asks for 4 to 6 short sentences "like a friend who hikes, not a robot", always including the turn-around rule. &lt;strong&gt;Kokoro&lt;/strong&gt;, an open 82M-parameter text-to-speech model, reads it aloud on the same machine. The text and audio are generated once, stored, and saved to your phone while you still have signal.&lt;/p&gt;

&lt;p&gt;Gemma is the voice, never the source of truth: every number it speaks comes from the prediction service, and if the sunset time is unknown, the prompt tells it to say so rather than invent one.&lt;/p&gt;

&lt;h3&gt;
  
  
  The app
&lt;/h3&gt;

&lt;p&gt;React + Vite, three screens: &lt;strong&gt;Plan&lt;/strong&gt;, &lt;strong&gt;On trail&lt;/strong&gt; and &lt;strong&gt;Summary&lt;/strong&gt;. Your phone reaches the laptop over the same Wi-Fi, or over &lt;a href="https://tailscale.com" rel="noopener noreferrer"&gt;Tailscale&lt;/a&gt; on mobile data, so nothing is exposed to the public internet. Weather and sunset come from Open-Meteo, with no API key and coordinates only. Alert emails go through a free Brevo account, and every email is also written to a local outbox as a record.&lt;/p&gt;

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

&lt;p&gt;Think about what a hiking plan reveals: &lt;strong&gt;where you'll be, that you'll be alone, and until when.&lt;/strong&gt; I don't think that belongs on someone else's server, and with open models it doesn't have to.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your location stays on your machine.&lt;/strong&gt; Gemma 4, TabPFN and Kokoro all run on my laptop. A closed AI API would see every trailhead I start from and every hour I'm out alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No subscription, no per-request bill, no key that expires mid-hike. A hiking club could host it for its members on one old laptop or a Raspberry Pi-class box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The uncertainty is mine to inspect.&lt;/strong&gt; With TabPFN's weights and a public dataset, I could measure calibration on 1,438 unseen hikes myself. A closed "estimated time" API gives you a number and asks for trust. For a feature that decides when your family gets an alarming email, I wanted the evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything is swappable.&lt;/strong&gt; The checkpoint is one environment variable (v2 for speed, v3.5 for accuracy), Gemma could be any model behind an OpenAI-compatible endpoint, and Piper is a drop-in fallback for Kokoro. Nothing in the stack can be deprecated out from under it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The data is a commons.&lt;/strong&gt; The model learns from thousands of hikers who shared their tracks publicly, and gives each new hiker something back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where open was genuinely &lt;em&gt;better&lt;/em&gt; for me, not just cheaper: calibration. I needed to know that "back by" means 90%, and I could only know that because I could run the model myself on data I could see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest limits.&lt;/strong&gt; So far I've tested Turnaround at home, with sample routes and missed-check-in drills; taking it on a real trail is next. It's a prototype, not a replacement for telling someone your plan or carrying a satellite messenger in real backcountry. The laptop has to stay awake and online for the alert to send. The model knows hikr.org's mostly Alpine hikers best, and the pace factor exists precisely because you are not them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN&lt;/strong&gt;: TabPFN predicts each hike's moving time as a calibrated distribution. Its P90 becomes the back-by time, its P95 sets when your contact is alerted, and its median feeds your personal pace factor. On 1,438 unseen hikes it beat Naismith's rule (34.8 vs 44.1 min average error) with 90.4% of hikers back before P90.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Temporal&lt;/strong&gt;: the safety timer is a durable Temporal workflow that races a check-in signal against the alert deadline, retries the alert email, and sends an all-clear on a late check-in. Tested by killing the worker and the Temporal server mid-trip, with evidence in the repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Gemma 4 runs locally via Ollama and turns each trip's numbers into a short spoken briefing (voiced by Kokoro) that's saved to your phone before you lose signal.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thanks for reading. If you hike alone, I'd love to hear what would make you actually use something like this, and what time &lt;em&gt;you'd&lt;/em&gt; want to be told to turn around. 🥾&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>He asked for "fully secure" note sharing. Here's what I built instead.</title>
      <dc:creator>Biprayan Choudhuri</dc:creator>
      <pubDate>Sun, 04 Oct 2026 23:23:42 +0000</pubDate>
      <link>https://dev.to/code_neuron58/he-asked-for-fully-secure-note-sharing-heres-what-i-built-instead-4fdi</link>
      <guid>https://dev.to/code_neuron58/he-asked-for-fully-secure-note-sharing-heres-what-i-built-instead-4fdi</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;He asked for "fully secure" note sharing. He wouldn't stop asking, honestly. So before writing a single line of code, I had to be honest with him about what that sentence actually means.&lt;/p&gt;

&lt;p&gt;Fully secure note sharing is not possible. Not on the web, not anywhere. No website can stop someone from taking a screenshot, pointing a phone camera at the monitor, or retyping what they see. Anyone who promises otherwise is selling something.&lt;/p&gt;

&lt;p&gt;But "fully secure" being impossible doesn't mean "secure" is. So I built the most controlled version of the idea I could, and named it SecureNote.&lt;/p&gt;

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

&lt;p&gt;SecureNote is end-to-end encrypted note and file sharing, and I built it for my friend. His notes aren't text, by the way: they're PDFs, scanned documents, photos of whiteboards. So files are first-class citizens here, and they're encrypted exactly like everything else.&lt;/p&gt;

&lt;p&gt;What it actually gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notes and files (PDFs, docs, images, up to 10 MB) are encrypted in your browser with AES-256-GCM before upload. The database stores ciphertext: it cannot read your content, your titles, or even your filenames.&lt;/li&gt;
&lt;li&gt;You share with a person, not a link. Pick someone by their account, set an expiry and a view limit. The note's key gets wrapped for their public key alone.&lt;/li&gt;
&lt;li&gt;Revocation is instant. One click and their key stops working, even if they already read the note. Their open tab locks itself the next time it gets focus.&lt;/li&gt;
&lt;li&gt;Every read is on the record. Each view is watermarked with the reader's email and written to an audit log: who, when, from which IP, on what device. Even pressing the PrintScreen key is logged as an attempt.&lt;/li&gt;
&lt;li&gt;The AI never leaves your machine. Semantic search and "chat with your notes" powered by Gemma 3 (Google's open-weight model) running in the browser via WebGPU. Open the network tab while using it: nothing goes out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So what about screenshots? Like I said: I can't stop them. Nobody can. What I can do is make sure a screenshot isn't anonymous. Every page a reader opens is tiled with their identity and a timestamp. If they leak it, they leaked a page with their own name on it, at a logged time, from a logged IP. You can also cap the views or expire the share in an hour.&lt;/p&gt;

&lt;p&gt;My friend's response was something like "okay, fair."&lt;/p&gt;

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

&lt;p&gt;Live app: &lt;a href="https://securenote-j8b0.onrender.com" rel="noopener noreferrer"&gt;https://securenote-j8b0.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's hosted on Render's free tier, so the very first load can take about 50 seconds to wake up. Every load after that is instant. Sign up with two accounts: write a note as A, share it to B with a 2-view limit, open it as B, then check A's audit log. Press PrintScreen as B and watch it land there too.&lt;/p&gt;

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

&lt;p&gt;The full source is on GitHub, MIT licensed: &lt;a href="https://github.com/CodeNeuron58/SecureNote" rel="noopener noreferrer"&gt;https://github.com/CodeNeuron58/SecureNote&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The README covers the whole security model, including the threat model and the things no website can honestly promise.&lt;/p&gt;

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

&lt;p&gt;No crypto libraries, just the browser's built-in WebCrypto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signup generates an ECDH P-256 keypair in your browser. The private key is encrypted with a key derived from your password (PBKDF2-SHA-256, 310,000 iterations) before it's ever uploaded. The server stores a bcrypt hash, a salt, your public key, and your sealed private key. It never sees your password.&lt;/li&gt;
&lt;li&gt;Every note gets a random content key. Title, body, and uploaded files are encrypted client-side; the content key is wrapped to your own public key.&lt;/li&gt;
&lt;li&gt;Sharing unwraps that key in your browser and wraps it for the reader's public key (ephemeral ECDH + HKDF). The server relays sealed blobs it cannot open, while still enforcing expiry and view limits.&lt;/li&gt;
&lt;li&gt;The AI is the part I'm proudest of. Private notes plus a cloud AI API is a contradiction, so the AI runs in the browser: MiniLM embeddings and Gemma 3 1B (open weight) via transformers.js on WebGPU, with the vector store in IndexedDB. After the one-time model download, searching and chatting make zero network calls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stack: Next.js 15, TypeScript, Tailwind, MongoDB Atlas, hosted on Render.&lt;/p&gt;

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

&lt;p&gt;My friend's whole point was "my notes stay mine." Sending that data to a closed cloud AI would betray the entire premise, so an open-weight model running on-device wasn't a nice-to-have. It was the only architecture that made sense.&lt;/p&gt;

&lt;p&gt;It also cost exactly nothing to run, it works with pluggable models (swap Gemma for any ONNX model without asking anyone's permission), and he can clone the repo and host the whole thing himself if he ever stops trusting me. The open approach didn't just work better than a closed one here. It was the difference between using software and owning it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Gemma 3 1B (open weight) powers the in-browser "chat with your notes" and semantic search, running locally via WebGPU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt;: the whole app is hosted on Render's free tier&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of MongoDB Atlas&lt;/strong&gt;: Atlas is the data layer, deliberately storing only ciphertext, grants and audit events&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;It's built for one friend, but if you've ever needed to send something sensitive without losing control of it, it's for you too. Roast it, break it, tell me what you'd add.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Built Yumii — An Open-Source AI Companion</title>
      <dc:creator>Biprayan Choudhuri</dc:creator>
      <pubDate>Sun, 07 Jun 2026 14:45:43 +0000</pubDate>
      <link>https://dev.to/code_neuron58/i-built-yumii-an-open-source-ai-companion-3692</link>
      <guid>https://dev.to/code_neuron58/i-built-yumii-an-open-source-ai-companion-3692</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Yumii&lt;/strong&gt; is an open-source, locally-run AI companion with a Live2D avatar, real-time voice, and six distinct personalities — and she now actually &lt;em&gt;remembers you&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;She listens to your voice. She responds through an animated avatar. Her face reacts to what you say. And as of this sprint, she builds a long-term memory of who you are — across every conversation, every session, every restart.&lt;/p&gt;

&lt;p&gt;Beyond the core AI experience, Yumii focuses heavily on accessibility and ease of use. The project features a dedicated website, comprehensive documentation, a one-line installation command, and a streamlined CLI onboarding process that helps users get started quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/CodeNeuron58/Yumi" rel="noopener noreferrer"&gt;https://github.com/CodeNeuron58/Yumi&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&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.amazonaws.com%2Fuploads%2Farticles%2F64y3pl78k3qh8yx1g9z9.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.amazonaws.com%2Fuploads%2Farticles%2F64y3pl78k3qh8yx1g9z9.png" alt=" " width="799" height="274"&gt;&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F02n328xahu8w5gl8a9ky.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.amazonaws.com%2Fuploads%2Farticles%2F02n328xahu8w5gl8a9ky.png" alt=" " width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before vs After — at a glance:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Forgot you on every restart&lt;/td&gt;
&lt;td&gt;Persistent memory across sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One shared conversation, no history&lt;/td&gt;
&lt;td&gt;Full session management — create, resume, rename&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No user facts&lt;/td&gt;
&lt;td&gt;Auto-extracts facts from every conversation turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No CLI beyond launch&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/memory&lt;/code&gt;, &lt;code&gt;/sessions&lt;/code&gt;, &lt;code&gt;/resume&lt;/code&gt;, &lt;code&gt;/forget&lt;/code&gt; commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wiped on exit&lt;/td&gt;
&lt;td&gt;Survives restarts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No dedicated website&lt;/td&gt;
&lt;td&gt;Full documentation website&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic audio capture&lt;/td&gt;
&lt;td&gt;Active VAD — only speaks when you actually do&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual setup&lt;/td&gt;
&lt;td&gt;One-line installation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;I saw Project Ava and a few other AI companion demos and thought — I could build that.&lt;/p&gt;

&lt;p&gt;I enjoy anime. The idea of an anime-style AI that actually talks and reacts to you genuinely excited me. So I built a scrappy version that barely held together, it worked, I was happy, and I dropped it. I mean i just build it for fun so i didn't care that much . &lt;/p&gt;

&lt;p&gt;Months later I saw the same concept being sold as a subscription product. That bothered me. I'd already built this, yeah a scrappy one , but still i built it. And i thought to myself that I could build it properly — and make it free or opensource . &lt;/p&gt;

&lt;p&gt;So I restarted. Proper CLI. Web interface. Clean architecture. VAD, STT, LLM, TTS — the full real-time voice loop. And one hard rule: it has to run on a CPU. I don't have a GPU. Most people don't. If it needs one, it's not really for everyone.&lt;/p&gt;

&lt;p&gt;That's what you're looking at now. Still alpha, still rough in places, not yet user-tested beyond myself. But it works, it's free, and it runs locally on your machine.&lt;/p&gt;

&lt;p&gt;Note on the demo: I'm skipping a video walkthrough — the Live2D model I use locally has redistribution restrictions, so I can't share footage with it publicly. Voice, memory, and everything else works fine as much as i can tell , it works without an avatar if you want to try it yourself.  &lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Making her actually do things.&lt;/p&gt;

&lt;p&gt;Right now Yumii talks. What I want is for her to act — search the web, read your emails, help you shop, browse on your behalf. A real assistant, not just a companion. &lt;/p&gt;

&lt;p&gt;It would be done by giving her tool access via mcp. &lt;/p&gt;

&lt;h2&gt;
  
  
  Contribute
&lt;/h2&gt;

&lt;p&gt;Yumii is fully open source — MIT license. If you're a developer who builds with LangGraph, vector databases, voice pipelines, or just finds this kind of project interesting — contributions are genuinely welcome.&lt;/p&gt;

&lt;p&gt;I'd love to hear what other developers think of the architecture, the approach, or what they'd build on top of it. Open an issue, start a discussion, or just drop a comment here. Every perspective helps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small Note
&lt;/h2&gt;

&lt;p&gt;Yumii is still in a very early stage and actively being developed, so expect rough edges here and there.&lt;/p&gt;

&lt;p&gt;This is my first time properly sharing the project outside LinkedIn, and I’d genuinely love feedback, ideas, or contributions from fellow developers while building it &lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;Copilot was running throughout this sprint mostly through tab completion — and that's where it genuinely helped.&lt;/p&gt;

&lt;p&gt;The repetitive async patterns across the session and memory modules are where it earned its place. Once it saw the structure of the first method, it completed the rest almost entirely — correct SQL, correct await placement, correct error handling. What would've taken an hour took fifteen minutes.&lt;/p&gt;

&lt;p&gt;The SQLite schema was another moment. I typed CREATE TABLE sessions ( and it suggested the full schema, including columns I hadn't thought of yet but ended up needing.&lt;/p&gt;

&lt;p&gt;It didn't make any decisions. The architecture, the three-database design, the fire-and-forget fact extraction, the async queue pipeline — all of that was thought through manually. But for translating decisions into correct boilerplate fast, it was genuinely useful.&lt;/p&gt;

&lt;p&gt;I also used Claude for cross-checking integration points — particularly verifying the LangChain tool interface when I added web search. Both tools, different jobs.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
