<?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: Nadun Jayaweera</title>
    <description>The latest articles on DEV Community by Nadun Jayaweera (@nadunjayaweera).</description>
    <link>https://dev.to/nadunjayaweera</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%2F971686%2Fdb81c529-3c53-4797-8a1e-993dad50adaf.jpeg</url>
      <title>DEV Community: Nadun Jayaweera</title>
      <link>https://dev.to/nadunjayaweera</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nadunjayaweera"/>
    <language>en</language>
    <item>
      <title>FriendFlow AI: Turning Messy Thoughts into Clear Tasks with Local AI</title>
      <dc:creator>Nadun Jayaweera</dc:creator>
      <pubDate>Fri, 02 Oct 2026 20:05:43 +0000</pubDate>
      <link>https://dev.to/nadunjayaweera/friendflow-ai-turning-messy-thoughts-into-clear-tasks-with-local-ai-2ecn</link>
      <guid>https://dev.to/nadunjayaweera/friendflow-ai-turning-messy-thoughts-into-clear-tasks-with-local-ai-2ecn</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;h1&gt;
  
  
  FriendFlow AI: Turning Messy Thoughts into Clear Tasks with Local AI
&lt;/h1&gt;

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

&lt;p&gt;I built &lt;strong&gt;FriendFlow AI&lt;/strong&gt;, a privacy-first local AI task organizer for my friend &lt;strong&gt;Sandaru&lt;/strong&gt;, who is a software engineer.&lt;/p&gt;

&lt;p&gt;Like many developers, Sandaru has a heavy daily workload. He has meetings, development tasks, code reviews, personal errands, reminders, and other responsibilities happening at the same time.&lt;/p&gt;

&lt;p&gt;Because of that workload, he sometimes forgets small daily tasks.&lt;/p&gt;

&lt;p&gt;The usual solution would be to use a task management application, but I noticed another problem: traditional task managers can actually create more friction for someone who is already busy.&lt;/p&gt;

&lt;p&gt;To create a single task, you may need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type the task title&lt;/li&gt;
&lt;li&gt;Choose a priority&lt;/li&gt;
&lt;li&gt;Select a date&lt;/li&gt;
&lt;li&gt;Add details&lt;/li&gt;
&lt;li&gt;Save the task&lt;/li&gt;
&lt;li&gt;Repeat the same process for every other task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When someone already has many things on their mind, organizing everything manually can become another task by itself.&lt;/p&gt;

&lt;p&gt;I wanted to make that process much simpler.&lt;/p&gt;

&lt;p&gt;That is where &lt;strong&gt;FriendFlow&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;Instead of manually creating tasks one by one, Sandaru can simply write or paste everything that is on his mind in one messy paragraph.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tomorrow I need to review the API PR, buy milk,
send the project report today, and call Kasun.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FriendFlow sends that unstructured text to a locally running open-weight AI model.&lt;/p&gt;

&lt;p&gt;The AI then turns the note into structured tasks such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review the API PR
Tomorrow
High Priority

Buy milk
No date
Medium Priority

Send the project report
Today
High Priority

Call Kasun
No date
Medium Priority
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user can then mark tasks as completed, and finished tasks are moved into a completed-task history.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dump your thoughts first. Organize them later with AI.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Here is a short video showing FriendFlow in action:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/4JgI4OzFFLs" rel="noopener noreferrer"&gt;https://youtu.be/4JgI4OzFFLs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entering an unstructured note&lt;/li&gt;
&lt;li&gt;Sending the note to the local AI model&lt;/li&gt;
&lt;li&gt;Automatically generating structured tasks&lt;/li&gt;
&lt;li&gt;Detecting priorities and deadlines&lt;/li&gt;
&lt;li&gt;Marking a task as completed&lt;/li&gt;
&lt;li&gt;Saving completed tasks in local history&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The complete project is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nadunjayaweera/friendflow-ai" rel="noopener noreferrer"&gt;https://github.com/nadunjayaweera/friendflow-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FriendFlow is built as a small full-stack application with a React frontend and a Node.js/Express backend.&lt;/p&gt;

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

&lt;p&gt;FriendFlow uses the following stack:&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Express&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;Gemma 3 1B&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Storage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Local JSON storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The basic architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Note
    ↓
React Frontend
    ↓
Node.js / Express Backend
    ↓
Ollama
    ↓
Gemma 3 1B
    ↓
Structured JSON Tasks
    ↓
React Task List
    ↓
Local JSON Storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The React frontend sends the user's note to an Express API endpoint.&lt;/p&gt;

&lt;p&gt;The backend creates a prompt asking Gemma to extract actionable tasks from the note.&lt;/p&gt;

&lt;p&gt;Gemma returns structured task information including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task title&lt;/li&gt;
&lt;li&gt;Due date&lt;/li&gt;
&lt;li&gt;Priority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The backend validates and normalizes the AI response before saving the tasks locally.&lt;/p&gt;

&lt;p&gt;The generated tasks are then returned to the frontend and displayed to the user.&lt;/p&gt;

&lt;p&gt;When a task is completed, it is removed from the active task list and moved into completed-task history.&lt;/p&gt;

&lt;p&gt;One of the interesting parts of this project was making the AI output reliable enough for the frontend.&lt;/p&gt;

&lt;p&gt;Instead of allowing the model to return free-form text, I instructed it to return structured JSON.&lt;/p&gt;

&lt;p&gt;For example:&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;"tasks"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Send project report"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"dueDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Today"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"High"&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;span class="p"&gt;]&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 also handles different possible response structures and normalizes them before sending the final task data to React.&lt;/p&gt;

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

&lt;p&gt;Open innovation is not just something I added to FriendFlow to meet the challenge requirement.&lt;/p&gt;

&lt;p&gt;It directly influenced how I designed the application.&lt;/p&gt;

&lt;p&gt;Personal notes can contain a lot of private information.&lt;/p&gt;

&lt;p&gt;A user may write about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work projects&lt;/li&gt;
&lt;li&gt;Client names&lt;/li&gt;
&lt;li&gt;Personal plans&lt;/li&gt;
&lt;li&gt;Family matters&lt;/li&gt;
&lt;li&gt;Deadlines&lt;/li&gt;
&lt;li&gt;Private reminders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For FriendFlow, I did not want every personal note to automatically be sent to an external AI provider.&lt;/p&gt;

&lt;p&gt;Instead, I used &lt;strong&gt;Gemma 3 1B running locally through Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This means the AI inference can happen directly on the user's machine.&lt;/p&gt;

&lt;p&gt;The note does not need to be sent to a third-party AI API.&lt;/p&gt;

&lt;p&gt;That gives FriendFlow several advantages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Privacy
&lt;/h3&gt;

&lt;p&gt;The user's notes can remain on their own machine.&lt;/p&gt;

&lt;p&gt;This is especially important for work-related or personal information.&lt;/p&gt;

&lt;h3&gt;
  
  
  No AI API Cost
&lt;/h3&gt;

&lt;p&gt;There is no per-request cost for organizing tasks.&lt;/p&gt;

&lt;p&gt;Once the model is installed locally, FriendFlow can use it without paying for every prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model Flexibility
&lt;/h3&gt;

&lt;p&gt;The application is not permanently tied to a single AI provider.&lt;/p&gt;

&lt;p&gt;Because Ollama supports multiple models, I can experiment with or replace the model later without rebuilding the entire application.&lt;/p&gt;

&lt;h3&gt;
  
  
  User Control
&lt;/h3&gt;

&lt;p&gt;The user controls both the AI runtime and the task data.&lt;/p&gt;

&lt;p&gt;FriendFlow stores task information locally instead of depending on an external cloud database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Inference
&lt;/h3&gt;

&lt;p&gt;The most interesting part for me was seeing that a small open-weight model could perform a useful everyday task directly from my own computer.&lt;/p&gt;

&lt;p&gt;Before this challenge, I had very little experience working with AI models.&lt;/p&gt;

&lt;p&gt;Building FriendFlow helped me understand that integrating an open-weight model does not always require training a model or having deep machine-learning knowledge.&lt;/p&gt;

&lt;p&gt;Sometimes, the most useful approach is simply giving a model a clear responsibility inside an application.&lt;/p&gt;

&lt;p&gt;In FriendFlow, that responsibility is turning messy human thoughts into structured tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building for Sandaru
&lt;/h2&gt;

&lt;p&gt;The theme of this challenge was &lt;strong&gt;Build for a Friend&lt;/strong&gt;, and that changed how I approached the project.&lt;/p&gt;

&lt;p&gt;Instead of trying to build a large general-purpose AI application, I focused on one small problem that someone I know actually experiences.&lt;/p&gt;

&lt;p&gt;Sandaru does not need another complicated productivity platform.&lt;/p&gt;

&lt;p&gt;He needs a faster way to capture what is already in his head.&lt;/p&gt;

&lt;p&gt;That is why FriendFlow intentionally keeps the interaction simple:&lt;/p&gt;

&lt;p&gt;Sandaru said the most useful part was being able to dump several thoughts at once instead of creating tasks one by one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write everything
        ↓
Click Organize with AI
        ↓
Get clear tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;That was one of my favorite parts of this challenge.&lt;/p&gt;

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

&lt;p&gt;This was also my first real experience building an application around an open-weight AI model.&lt;/p&gt;

&lt;p&gt;I learned how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run Gemma locally using Ollama&lt;/li&gt;
&lt;li&gt;Send prompts to a local model from Node.js&lt;/li&gt;
&lt;li&gt;Request structured JSON output from an AI model&lt;/li&gt;
&lt;li&gt;Validate AI-generated responses&lt;/li&gt;
&lt;li&gt;Connect local AI inference to a React application&lt;/li&gt;
&lt;li&gt;Persist AI-generated task data locally&lt;/li&gt;
&lt;li&gt;Design an application where AI performs a specific useful function&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest lesson for me was that I did not need to understand model training before I could start building useful applications with open models.&lt;/p&gt;

&lt;p&gt;As a web developer, I could treat the model as another service inside my application and gradually learn how it behaves.&lt;/p&gt;

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

&lt;p&gt;I did not use an agent session for this submission.&lt;/p&gt;

&lt;p&gt;The project was built using a simple local AI architecture with Gemma running through Ollama.&lt;/p&gt;

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

&lt;p&gt;I am entering FriendFlow in:&lt;/p&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;Gemma 3 1B is the core AI model responsible for converting unstructured user notes into structured tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest 2026 pushed me into an area I had not explored much before: open-weight AI.&lt;/p&gt;

&lt;p&gt;I started this challenge without much knowledge about AI models.&lt;/p&gt;

&lt;p&gt;By the end, I had a working application where a locally running Gemma model was solving a real problem for someone I know.&lt;/p&gt;

&lt;p&gt;FriendFlow may be a small project, but that is also what I like about it.&lt;/p&gt;

&lt;p&gt;It takes one repetitive part of task management and removes it.&lt;/p&gt;

&lt;p&gt;Instead of carefully organizing every thought before saving it, the user can simply write naturally and let the AI handle the structure.&lt;/p&gt;

&lt;p&gt;Sometimes the most useful tools are not the biggest ones.&lt;/p&gt;

&lt;p&gt;They are the ones that remove a little bit of friction from someone's day.&lt;/p&gt;

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