<?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>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>
