<?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: Dinuka Ekanayake</title>
    <description>The latest articles on DEV Community by Dinuka Ekanayake (@dinukaek).</description>
    <link>https://dev.to/dinukaek</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%2F747970%2Fa8af2356-309b-4560-98cc-da31d906afd4.jpeg</url>
      <title>DEV Community: Dinuka Ekanayake</title>
      <link>https://dev.to/dinukaek</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dinukaek"/>
    <language>en</language>
    <item>
      <title>I Built a Sloth That Organizes My Files While I Do Nothing 🦥 (With Local Open-Source AI)</title>
      <dc:creator>Dinuka Ekanayake</dc:creator>
      <pubDate>Thu, 22 Oct 2026 20:47:14 +0000</pubDate>
      <link>https://dev.to/dinukaek/i-built-a-sloth-that-organizes-my-files-while-i-do-nothing-with-local-open-source-ai-576i</link>
      <guid>https://dev.to/dinukaek/i-built-a-sloth-that-organizes-my-files-while-i-do-nothing-with-local-open-source-ai-576i</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Every few weeks, my Downloads folder tells the same story: an invoice named &lt;code&gt;document-final-2.pdf&lt;/code&gt;, meeting notes named &lt;code&gt;notes.txt&lt;/code&gt;, an appointment reminder saved among work files, and a hundred small decisions I keep postponing.&lt;/p&gt;

&lt;p&gt;I didn't need a smarter to-do list. I needed something that quietly finished one of those chores.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;SlothSort&lt;/strong&gt;, a &lt;em&gt;local-first AI file organizer&lt;/em&gt;. Drop supported files into an inbox and let a small open-weight model read what they're about. It suggests folders such as Finance, Work, Health, Learning and Personal—even when the filename gives away almost nothing.&lt;/p&gt;

&lt;p&gt;But the interesting part isn't deciding which folder sounds right. It's knowing when &lt;strong&gt;not to decide&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;SlothSort compares the similarity of each file against descriptions of my folders. If the best match is sufficiently strong &lt;em&gt;and&lt;/em&gt; clearly better than the next-best match, it's eligible for sorting. If it's ambiguous, it waits for me. In the Streamlit interface, I can approve or edit suggestions in a table, then move files as one batch. Each move is recorded, and I can undo the last batch if I change my mind.&lt;/p&gt;

&lt;p&gt;There's also an opt-in CLI watcher. With the model cached, it can sit on my laptop offline, wait for files to finish copying into the inbox, and file high-confidence documents as they arrive. It leaves uncertain files alone instead of guessing.&lt;/p&gt;

&lt;p&gt;The result isn't an agent that makes grand promises. It's a tiny, deliberately boring assistant that helps future-me avoid the same chore again.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Video:&lt;/strong&gt; &lt;a href="https://drive.google.com/file/d/1W0rryGEoDbMFSZlAUHhUX4KzWopTyPSZ/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1W0rryGEoDbMFSZlAUHhUX4KzWopTyPSZ/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the video I:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create 11 &lt;strong&gt;synthetic&lt;/strong&gt; files with unhelpful names like &lt;code&gt;note_005.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run semantic matching with the local model and inspect suggestions and top-two gaps.&lt;/li&gt;
&lt;li&gt;Show a low-confidence file that remains unchecked for review.&lt;/li&gt;
&lt;li&gt;Approve a batch, show the created category folders, then undo it safely.&lt;/li&gt;
&lt;li&gt;Restart in offline mode and show that the cached model still performs inference disconnected from the internet.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The exact outcome and evaluation numbers will be added after running the model on my PC.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/DinukaEk/slothsort-week3" rel="noopener noreferrer"&gt;https://github.com/DinukaEk/slothsort-week3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is MIT-licensed and includes the local UI, Python CLI, semantic engine, document readers, safe file-moving journal, synthetic dataset, an evaluation script, deterministic tests, and a GitHub Actions workflow.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;AI core:&lt;/strong&gt; &lt;a href="https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2" rel="noopener noreferrer"&gt;&lt;code&gt;sentence-transformers/all-MiniLM-L6-v2&lt;/code&gt;&lt;/a&gt;, an Apache-2.0 open-weight sentence embedding model, run locally through the open-source Sentence Transformers library.&lt;/p&gt;

&lt;p&gt;The model does not generate prose. It maps the file text and each folder's natural-language description into a shared vector space. SlothSort measures cosine similarity and ranks candidate folders. The top score and its margin over second place determine whether to mark a suggestion as ready or needing review.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Simplified from slothsort/engine.py
&lt;/span&gt;&lt;span class="n"&gt;vectors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category_prompts&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;document_texts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ranked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;cosine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc_vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category_vector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
     &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category_vector&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;category_vectors&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ready&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ranked&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;min_similarity&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ranked&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ranked&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;min_margin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is easy to confuse these similarities with confidence percentages. &lt;strong&gt;They aren't calibrated probabilities.&lt;/strong&gt; That's why manual review and undo are essential to the design.&lt;/p&gt;

&lt;p&gt;The files are handled by a deliberately narrow pipeline: extract limited plain text, embed locally, preview suggestions, move only selected files, write a SHA-256-backed audit entry, and provide a verified undo. File collisions get numbered names instead of overwriting other data. Watch mode checks stability between scans so it doesn't immediately move half-written files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test evidence:&lt;/strong&gt; 32 deterministic unit tests passed in the initial build environment. These exercise the scoring logic, supported/unsafe file types, path validation, no-overwrite behavior, tamper detection, and undo. The unit tests mock embedding vectors; they &lt;strong&gt;do not&lt;/strong&gt; prove production AI classification quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-model evaluation:&lt;/strong&gt; [PASTE ACTUAL &lt;code&gt;python scripts/evaluate.py --offline&lt;/code&gt; RESULT HERE]. The evaluator uses a small synthetic dataset, including one intentionally vague note. It also reports a transparent keyword baseline. It is a toy comparison, not a scientific or production benchmark.&lt;/p&gt;

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

&lt;p&gt;I didn't want to build an automatic organizer that demands a subscription to decide where &lt;code&gt;notes.txt&lt;/code&gt; belongs.&lt;/p&gt;

&lt;p&gt;With an open-weight model, the user controls the entire inference loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; the content is processed on the user's own machine. Local file contents aren't sent to a third-party AI endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline usefulness:&lt;/strong&gt; after downloading the model once, sorting still works without Wi-Fi. I can demonstrate that by disconnecting my laptop during a scan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom behavior:&lt;/strong&gt; the five default folders are plain-text descriptions, not categories baked into an inaccessible hosted model. I can replace descriptions, adjust thresholds, or swap the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable economics:&lt;/strong&gt; there are no per-document or per-token API charges; running the model still has local CPU, memory, and electricity costs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I haven't proved this small model is more accurate than every closed API. A larger hosted LLM might interpret unusual documents better. For this specific low-stakes, repetitive chore, however, keeping private content local and making every decision reversible matter more than buying maximum model intelligence.&lt;/p&gt;

&lt;p&gt;Open innovation makes the &lt;em&gt;shape of the product&lt;/em&gt; possible: an assistant I can inspect, modify, run without a provider account, and keep using when a service's pricing changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;The payoff isn't “AI productivity” measured in vibes. It is &lt;strong&gt;fewer manual moves&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The project includes 11 synthetic demo files. [AFTER RUNNING: ADD NUMBER OF FILES AUTO-ELIGIBLE, NUMBER ACTUALLY MOVED, NUMBER SENT TO REVIEW, AND ANY REAL TIMING YOU RECORDED.]&lt;/p&gt;

&lt;p&gt;For a transparent illustrative estimate, if a manual file decision takes &lt;strong&gt;20 seconds&lt;/strong&gt;, organizing 50 eligible files avoids up to &lt;strong&gt;16 minutes 40 seconds&lt;/strong&gt; of repetitive decisions &lt;em&gt;before review time&lt;/em&gt;. That's a scenario, not a measured user study. A more honest success metric is the number of correct moves requiring no correction, which I'll track with the audit journal.&lt;/p&gt;

&lt;p&gt;My favorite design choice is the boring one: &lt;strong&gt;uncertain files aren't silently moved&lt;/strong&gt;. The sloth can work slowly, but it mustn't break anything while I'm not looking.&lt;/p&gt;




&lt;p&gt;Thanks for participating in Hacktoberfest! 🦥&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>RemitMatch: The AI Bookkeeper That Never Sees Your Cloud</title>
      <dc:creator>Dinuka Ekanayake</dc:creator>
      <pubDate>Thu, 15 Oct 2026 14:20:18 +0000</pubDate>
      <link>https://dev.to/dinukaek/remitmatch-the-ai-bookkeeper-that-never-sees-your-cloud-26e5</link>
      <guid>https://dev.to/dinukaek/remitmatch-the-ai-bookkeeper-that-never-sees-your-cloud-26e5</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;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A bank statement tells you that money arrived. It doesn't always tell you which invoice was paid.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine you run a small bakery-supply business. Your accounting software has an unpaid invoice for &lt;strong&gt;Nimali Grocery Stores&lt;/strong&gt;. Your bank CSV says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BNK-002 | 2026-10-04 | LKR 42,750 | NIMALI STORES ONLINE TRANSFER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another payment says &lt;code&gt;CEFT SUNRISE BAKERY PAYMENT&lt;/code&gt;. Another includes an invoice number, but not the customer's full name. Two rows appear to be the &lt;strong&gt;same payment&lt;/strong&gt;. One payment could belong to either of two hardware stores charging the same amount.&lt;/p&gt;

&lt;p&gt;Each of these is simple for a human to check individually. Together they make reconciliation an irritating, repetitive job. And when the business is small, the person doing it is often the same person trying to sell, deliver, and support the product.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;RemitMatch&lt;/strong&gt;: a local-first AI reconciliation desk for freelancers, small businesses, and bookkeepers.&lt;/p&gt;

&lt;p&gt;You upload an open-invoice CSV and a bank-payment CSV. An open-weight model compares the &lt;em&gt;meaning&lt;/em&gt; of payer references with business names, even when the strings are not identical. Deterministic rules verify amounts, invoice IDs, and dates. The interface ranks potential matches, explains why they were suggested, and flags duplicates or conflicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importantly, the software never decides that money has paid an invoice on its own.&lt;/strong&gt; The human must approve each candidate. Only explicitly approved, exact-amount, one-to-one matches appear in the export.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who would pay?
&lt;/h3&gt;

&lt;p&gt;My initial target customer is a small shop or accountant processing many direct bank transfers but not using an expensive enterprise reconciliation tool. The potential product is not “AI accounting.” It is a narrowly scoped time-saver that can be installed on the customer's own laptop, with revenue from setup, configuration, and support. &lt;strong&gt;This is a business hypothesis, not a claim that someone has paid me.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Local demo:&lt;/strong&gt; &lt;a href="https://drive.google.com/file/d/1NvHNomwMgcdKh6FW0Ptya9ztoc3iv1Sq/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1NvHNomwMgcdKh6FW0Ptya9ztoc3iv1Sq/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also reproduce the flow yourself using the synthetic files in the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python scripts/download_model.py     &lt;span class="c"&gt;# only needed once&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; streamlit run app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:8501&lt;/code&gt; and select &lt;strong&gt;Run local AI matching&lt;/strong&gt;. Examine the suggestions for &lt;code&gt;BNK-002&lt;/code&gt;, the intentionally repeated &lt;code&gt;BNK-008&lt;/code&gt; and &lt;code&gt;BNK-011&lt;/code&gt;, and the deliberately ambiguous hardware transfer &lt;code&gt;BNK-009&lt;/code&gt;. Approve a valid exact-amount candidate, then export the reviewed CSV.&lt;/p&gt;

&lt;p&gt;The demo data is fictional. The app doesn't send it to a hosted AI inference API.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/DinukaEk/remitmatch" rel="noopener noreferrer"&gt;https://github.com/DinukaEk/remitmatch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project includes a Streamlit interface, auditable reconciliation code, one-time local model setup, synthetic sample CSVs, a baseline-evaluation script, and a core unit-test suite. The code is MIT-licensed; the embedding model is Apache-2.0 licensed.&lt;/p&gt;

&lt;p&gt;For reviewers who want to see where the AI matters, start with &lt;code&gt;matcher.py&lt;/code&gt; in the repository: its &lt;code&gt;reconcile()&lt;/code&gt; function calls the embedding encoder, combines meaning-aware name similarity with finance-specific rules, and returns inspectable candidate evidence.&lt;/p&gt;

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

&lt;p&gt;I intentionally didn't ask a language model to “act as an accountant.” In a money-related workflow, fluent language is not the same thing as a valid payment match.&lt;/p&gt;

&lt;p&gt;Instead, RemitMatch has &lt;strong&gt;two distinct responsibilities&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Open-weight AI does the messy-text work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I use &lt;a href="https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2" rel="noopener noreferrer"&gt;&lt;code&gt;sentence-transformers/all-MiniLM-L6-v2&lt;/code&gt;&lt;/a&gt;, an Apache-2.0-licensed embedding model, through the open-source Sentence Transformers library. It runs in the Python process on the user's machine. Payment references and customer names are turned into local sentence vectors, allowing semantic similarity to contribute to the candidate ranking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Explicit code handles financial constraints.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each candidate has an inspectable ranking formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;38%  Local AI name similarity
22%  Lexical business-name similarity
23%  Amount similarity
12%  Exact invoice ID present in bank reference
 5%  Payment/invoice date proximity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those weights are &lt;strong&gt;engineering heuristics, not statistical confidence percentages&lt;/strong&gt;. Additional rules detect repeated bank rows, multiple deposits targeting one invoice, ambiguous candidates, and amount differences. Amounts use Python &lt;code&gt;Decimal&lt;/code&gt;, not floating-point arithmetic. The user must manually approve; the export enforces an exact-amount, one-to-one link and is not connected to a live bank or ERP.&lt;/p&gt;

&lt;p&gt;The included tests use an injectable deterministic test encoder so they can run without downloading model weights. A separate &lt;code&gt;scripts/evaluate.py&lt;/code&gt; lets anyone compare &lt;strong&gt;real-model + rules&lt;/strong&gt; with &lt;strong&gt;rules only&lt;/strong&gt; on a small labeled &lt;em&gt;synthetic&lt;/em&gt; dataset. I am deliberately not claiming real-world accuracy from a handful of invented rows.&lt;/p&gt;

&lt;h3&gt;
  
  
  The hardest design choice
&lt;/h3&gt;

&lt;p&gt;It wasn't choosing the model. It was deciding &lt;strong&gt;what not to automate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A semantic model can confidently associate a transfer with the wrong customer if two firms have similar names. A matching amount can also be a coincidence. So I chose a reviewer-first interface instead of automatically changing invoice states. The best side-hustle software isn't necessarily software that does everything. Sometimes the sellable feature is turning ten minutes of detective work into a short, inspectable checklist.&lt;/p&gt;

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

&lt;p&gt;For this product, &lt;strong&gt;local execution is the feature, not an implementation detail&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Consider the alternatives. A hosted AI service could absolutely help interpret the names — and might perform better on some difficult references. But using it may mean transmitting bank references and customer details to an external processor, budgeting for usage-based pricing, and accepting whatever model behavior and terms that provider chooses.&lt;/p&gt;

&lt;p&gt;An open-weight embedding model changes the economics and the privacy boundary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Private by design:&lt;/strong&gt; after a one-time model download, inference can run with the internet disconnected. Sensitive CSV content stays within the user's local application rather than being submitted to a hosted AI model API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low marginal inference cost:&lt;/strong&gt; there is no per-request model API charge; customers still pay for their computer, setup, and maintenance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A modifiable system:&lt;/strong&gt; the model can be exchanged for a domain-adapted alternative, and the scoring rules can be tuned for local bank-transfer vocabulary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A stronger trust story:&lt;/strong&gt; technical users can inspect the code, run the ablation, and see where both the model and accounting rules contributed. They can change or remove the system without depending on an external AI provider's pricing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where open innovation worked better &lt;strong&gt;for the specific business constraints&lt;/strong&gt;: not necessarily higher model accuracy, but local control over data and predictable infrastructure costs. I wouldn't promise that any open model always beats a closed one. I would promise that the user gets to decide where their sensitive data goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Validate Next
&lt;/h2&gt;

&lt;p&gt;The prototype handles one-to-one, exact-amount deposits in LKR. It does not yet resolve partial payments, multiple-invoice transfers, refunds, or native Sinhala/Tamil bank references. Those are important limitations, not features to hide.&lt;/p&gt;

&lt;p&gt;Next, I'd sit with a real business owner, use a consented or anonymized sample of their transfer descriptions, and measure three things: minutes spent matching deposits, how often the correct invoice appears among the top three candidates, and whether their preference for private local software is strong enough to justify a setup or support fee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That would turn a hackathon prototype into a side hustle.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built for Hacktoberfest 2026. The story here is a working MVP and a commercial hypothesis - not a fabricated customer testimonial or a claimed production deployment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Gave a Local AI One Job: Get Me Off the Screen 🌿</title>
      <dc:creator>Dinuka Ekanayake</dc:creator>
      <pubDate>Sat, 10 Oct 2026 16:51:16 +0000</pubDate>
      <link>https://dev.to/dinukaek/i-gave-a-local-ai-one-job-get-me-off-the-screen-4i5h</link>
      <guid>https://dev.to/dinukaek/i-gave-a-local-ai-one-job-get-me-off-the-screen-4i5h</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;&lt;strong&gt;What if the most useful AI app was one that helped you spend less time using apps?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As developers, students, and people who work in front of screens all day, we know the feeling: we need a break, so we reach for our phones. Then a few minutes of scrolling becomes half an hour.&lt;/p&gt;

&lt;p&gt;I wanted to try something different.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;GrassQuest Local&lt;/strong&gt; — a local-AI-powered outdoor adventure companion that turns a short break into a small mission worth stepping outside for.&lt;/p&gt;

&lt;p&gt;Instead of recommending another feed to scroll through, it gives you something to do in the real world.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Choose your break.&lt;/strong&gt; Pick how much time you have, your outdoor environment, what you want from the break, and whether you're going solo or with someone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate your quest.&lt;/strong&gt; Gemma 3 4B creates a personalized outdoor mission with five tasks and a 3×3 Outside Bingo board.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch to Pocket Mode.&lt;/strong&gt; Take your mission outside, use the timer, and check off tasks as you complete them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finish the adventure.&lt;/strong&gt; Track your progress without needing a complicated account, social feed, or cloud AI service.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The app also saves your mission and progress in the browser, so refreshing the page doesn't mean losing your adventure. Its offline-friendly design keeps the interface and an already-generated mission useful even when the backend isn't available, provided the app has been cached.&lt;/p&gt;

&lt;p&gt;GrassQuest Local is for anyone who spends too much time at a desk and wants a simple, low-friction reason to take a walk, notice their surroundings, or enjoy a short break outdoors.&lt;/p&gt;

&lt;p&gt;The idea is simple: &lt;strong&gt;AI should help you get into the world, not give you another reason to stare at a screen.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://drive.google.com/file/d/14d9VpWXjwM6R6zTMc26aftUtiTiOVq7Q/view" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/14d9VpWXjwM6R6zTMc26aftUtiTiOVq7Q/view&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The demo should show the actual workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selecting a duration, environment, and goal&lt;/li&gt;
&lt;li&gt;Generating a mission with local Gemma&lt;/li&gt;
&lt;li&gt;Entering Pocket Mode and using the timer&lt;/li&gt;
&lt;li&gt;Completing tasks and Outside Bingo squares&lt;/li&gt;
&lt;li&gt;Refreshing the page and restoring saved progress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A short screen recording is enough. The AI runs locally, so a &lt;code&gt;localhost&lt;/code&gt; URL alone isn't a publicly accessible demo.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/DinukaEk/grassquest-local" rel="noopener noreferrer"&gt;https://github.com/DinukaEk/grassquest-local&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GrassQuest Local is built as a local-first application rather than a cloud-AI wrapper.&lt;/p&gt;

&lt;p&gt;To run it locally, install the .NET 10 SDK and Ollama, pull the model, and start the application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma3:4b
dotnet restore
dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open the local URL printed in the terminal.&lt;/p&gt;

&lt;p&gt;The repository should include the source code, project setup instructions, and any configuration needed to run the app.&lt;/p&gt;

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

&lt;p&gt;I built GrassQuest Local with a deliberately lightweight stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI model:&lt;/strong&gt; Gemma 3 4B, an open-weight model served locally through Ollama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; ASP.NET Core on .NET 10, responsible for communicating with the model and generating quests through the &lt;code&gt;/api/quest&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; HTML, CSS, and vanilla JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pocket experience:&lt;/strong&gt; A responsive interface, mission timer, task tracking, and interactive 3×3 bingo board.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence and offline support:&lt;/strong&gt; Browser storage preserves the active mission and progress; a service worker caches the app interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The user provides a few preferences, and the backend asks Gemma to generate a structured mission. The frontend turns that response into a usable outdoor experience rather than exposing a raw chat conversation.&lt;/p&gt;

&lt;p&gt;I also included a local-AI status check, so the interface can distinguish a ready model from an unavailable backend.&lt;/p&gt;

&lt;p&gt;The most important design decision was to make the AI generate the mission and then let the person get on with it. The model isn't meant to be the activity; it's the starting point for the activity.&lt;/p&gt;

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

&lt;p&gt;For this project, running an open-weight model locally isn't just a technical preference. It changes how the application can be used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. AI without a cloud AI dependency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gemma runs through Ollama on my own computer. Quest generation doesn't require sending prompts to a third-party hosted AI API or obtaining a separate AI API key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. More control over the experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I can inspect and change the prompts, adjust how quests are generated, and experiment with compatible models. I'm not locked into a single hosted AI provider's interface or pricing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. A more private, local-first design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The application doesn't need a cloud AI account to generate missions. In this local setup, quest preferences are processed by the backend on the same computer rather than sent to a third-party AI inference service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. A practical offline boundary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once a mission is generated and saved, the cached interface and saved progress can continue to work offline. Generating a new AI mission still requires the backend and Ollama to be running, so I don't claim that model inference works offline on every device.&lt;/p&gt;

&lt;p&gt;That distinction matters. Local AI doesn't magically remove every connectivity requirement, but it makes a useful, more self-contained experience possible without depending on a remote AI API.&lt;/p&gt;

&lt;p&gt;Open innovation gives me the freedom to experiment with the model and architecture while keeping the project accessible to other developers who want to learn from it or extend it.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gemma 3 4B is the core mission-generation engine in GrassQuest Local. It transforms a user's available time and outdoor preferences into the tasks that drive the experience. The model isn't an optional add-on; without it, the personalized quest-generation feature wouldn't work as designed.&lt;/p&gt;




&lt;p&gt;The goal of GrassQuest Local isn't to keep you engaged with another app.&lt;/p&gt;

&lt;p&gt;It's to help you make a plan, put your phone away, and notice a little more of the world around you. 🌿&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>CareRelay Local: Private AI Care Handovers with Gemma 3</title>
      <dc:creator>Dinuka Ekanayake</dc:creator>
      <pubDate>Sun, 04 Oct 2026 20:51:31 +0000</pubDate>
      <link>https://dev.to/dinukaek/carerelay-local-private-ai-care-handovers-with-gemma-3-1550</link>
      <guid>https://dev.to/dinukaek/carerelay-local-private-ai-care-handovers-with-gemma-3-1550</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;CareRelay Local&lt;/strong&gt;, a private AI-powered tool that turns rough caregiving notes into clear handover reports.&lt;/p&gt;

&lt;p&gt;I built it for &lt;strong&gt;a friend who helps care for an older family member&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The problem is small, but very real.&lt;/p&gt;

&lt;p&gt;Care notes are often written quickly throughout the day:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Breakfast at 8. Ate about half. Medicine after breakfast. Went outside around 10. Said knee was hurting a little. Lunch at 12:30. Doctor appointment tomorrow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All of the information is there, but handing those notes to the next person means they still have to scan through everything and work out what matters.&lt;/p&gt;

&lt;p&gt;CareRelay converts those rough notes into a structured handover with sections for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;li&gt;Meals &amp;amp; Hydration&lt;/li&gt;
&lt;li&gt;Medication Mentioned&lt;/li&gt;
&lt;li&gt;Activities &amp;amp; Mobility&lt;/li&gt;
&lt;li&gt;Observations&lt;/li&gt;
&lt;li&gt;Rest&lt;/li&gt;
&lt;li&gt;Appointments &amp;amp; Reminders&lt;/li&gt;
&lt;li&gt;Information for the Next Caregiver&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are two output modes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next Caregiver&lt;/strong&gt; produces a concise and practical handover.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Family Member&lt;/strong&gt; communicates the same facts in warmer, simpler language.&lt;/p&gt;

&lt;p&gt;Most importantly, CareRelay is deliberately a &lt;strong&gt;note-organization tool, not a medical assistant&lt;/strong&gt;. It is instructed not to diagnose conditions, recommend treatments, invent medication names or dosages, or fill gaps with assumptions.&lt;/p&gt;

&lt;p&gt;The goal is simple: take information someone has already written and make it easier to pass to the next person.&lt;/p&gt;

&lt;p&gt;After building it, I gave it to a friend to try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“I like how I can just write the notes normally without worrying about a format. The handover is much easier to read, and knowing the notes stay on the computer makes me more comfortable using it.”&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://drive.google.com/file/d/1I1g-li0_KS-S0qEij_abUX7vczf-8wcd/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1I1g-li0_KS-S0qEij_abUX7vczf-8wcd/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo shows CareRelay taking unstructured notes, generating a caregiver handover, switching to the family-friendly version, and running through Gemma locally.&lt;/p&gt;

&lt;p&gt;One of my favorite parts of the demo is disconnecting from the internet and generating another report.&lt;/p&gt;

&lt;p&gt;It still works.&lt;/p&gt;

&lt;p&gt;That is not a workaround; it is one of the reasons I designed the project this way.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/DinukaEk/CareRelayLocal" rel="noopener noreferrer"&gt;https://github.com/DinukaEk/CareRelayLocal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is intentionally small.&lt;/p&gt;

&lt;p&gt;The stack is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ASP.NET Core / .NET 10&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;Vanilla JavaScript&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;Gemma 3 4B&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No cloud AI SDK is hidden behind the interface.&lt;/p&gt;

&lt;p&gt;The browser sends the notes to my local ASP.NET backend. The backend sends them to Ollama on &lt;code&gt;localhost&lt;/code&gt;, and Ollama runs Gemma 3 4B locally.&lt;/p&gt;

&lt;p&gt;The basic path is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   ↓
ASP.NET Core
   ↓
Ollama
   ↓
Gemma 3 4B
   ↓
Structured handover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;I started with the AI layer rather than the UI.&lt;/p&gt;

&lt;p&gt;First, I installed Ollama and downloaded &lt;code&gt;gemma3:4b&lt;/code&gt;. I tested Gemma directly and then tested Ollama's local chat API.&lt;/p&gt;

&lt;p&gt;Once local inference worked, I created a small ASP.NET Core API with a &lt;code&gt;/api/handover&lt;/code&gt; endpoint.&lt;/p&gt;

&lt;p&gt;The endpoint receives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"audience"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"caregiver"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gemma3:4b"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend constructs a carefully constrained system prompt and passes the request to Ollama.&lt;/p&gt;

&lt;p&gt;For this project, prompting was not mainly about making the model more creative. It was about making it &lt;strong&gt;less creative&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;CareRelay tells Gemma to use only information explicitly contained in the supplied notes. It must preserve uncertainty, avoid diagnoses and treatment recommendations, and say &lt;code&gt;Not mentioned.&lt;/code&gt; rather than filling in missing information.&lt;/p&gt;

&lt;p&gt;For example, if the original note says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Went outside around 10.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CareRelay should retain &lt;strong&gt;around 10&lt;/strong&gt;, rather than silently changing it to an invented exact time such as 10:00 AM.&lt;/p&gt;

&lt;p&gt;Likewise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Medicine after breakfast.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;must not suddenly become a medication name or dosage that the caregiver never wrote.&lt;/p&gt;

&lt;p&gt;I use a low generation temperature because consistency matters more here than imaginative output.&lt;/p&gt;

&lt;p&gt;I then added a small browser interface with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a large natural-language notes field&lt;/li&gt;
&lt;li&gt;Caregiver and Family output modes&lt;/li&gt;
&lt;li&gt;a live local-AI status indicator&lt;/li&gt;
&lt;li&gt;a character limit&lt;/li&gt;
&lt;li&gt;loading and error states&lt;/li&gt;
&lt;li&gt;Copy&lt;/li&gt;
&lt;li&gt;Download&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The status indicator calls a local backend endpoint which checks Ollama and verifies that Gemma is available.&lt;/p&gt;

&lt;p&gt;When everything is ready, the interface displays:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;100% Local AI - Gemma 3 4B is ready on this computer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I also tested failure cases such as empty notes, missing information, ambiguous medication references, Ollama being unavailable, and potentially medical observations.&lt;/p&gt;

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

&lt;p&gt;This is the part of the project I care about most.&lt;/p&gt;

&lt;p&gt;I could have built CareRelay around a closed cloud AI API. Technically, that might even have been easier.&lt;/p&gt;

&lt;p&gt;But it would have changed an important property of the product.&lt;/p&gt;

&lt;p&gt;Caregiving notes can contain information that people may not want sent to an external AI service.&lt;/p&gt;

&lt;p&gt;With CareRelay, the model runs through Ollama on the same computer as the application. After the model is installed, the core AI workflow does not require an internet connection.&lt;/p&gt;

&lt;p&gt;That gives this small project several useful properties.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy and control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The raw care notes do not need to be sent to a cloud AI provider for inference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offline use&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The application can generate handovers even when the laptop is disconnected from the internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No per-request AI bill&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generating another handover does not consume paid API credits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model freedom&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The application is not fundamentally coupled to a single hosted AI vendor. I can experiment with a smaller model for weaker hardware or another compatible local model without rebuilding the product around a new external service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Behavior I can control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because the model and inference layer are under my control, I can iterate on the guardrails, generation parameters, and eventually even specialized model behavior.&lt;/p&gt;

&lt;p&gt;For CareRelay, open-weight AI was not something I added to qualify for the challenge.&lt;/p&gt;

&lt;p&gt;It influenced the actual product design.&lt;/p&gt;

&lt;p&gt;The fact that it can run locally is one of the reasons the idea makes sense in the first place.&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;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CareRelay uses Gemma 3 4B as the AI at the core of the application, running locally through Ollama.&lt;/p&gt;

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