<?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: Rathnam.S</title>
    <description>The latest articles on DEV Community by Rathnam.S (@rathnams089).</description>
    <link>https://dev.to/rathnams089</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%2F4145541%2F9658f5b2-65f8-499a-84cb-9800c70365a5.png</url>
      <title>DEV Community: Rathnam.S</title>
      <link>https://dev.to/rathnams089</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rathnams089"/>
    <language>en</language>
    <item>
      <title>Poltergeist — an open-weight ghost that haunts your terminal 👻</title>
      <dc:creator>Rathnam.S</dc:creator>
      <pubDate>Sun, 01 Nov 2026 17:40:07 +0000</pubDate>
      <link>https://dev.to/rathnams089/poltergeist-an-open-weight-ghost-that-haunts-your-terminal-3o2m</link>
      <guid>https://dev.to/rathnams089/poltergeist-an-open-weight-ghost-that-haunts-your-terminal-3o2m</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Poltergeist&lt;/strong&gt; possesses your zsh.&lt;/p&gt;

&lt;p&gt;A small open-weight model running on my laptop watches every command I type and whispers back under the prompt. It's the restless spirit of every process I've ever &lt;code&gt;kill -9&lt;/code&gt;'d and every file I've ever &lt;code&gt;rm -rf&lt;/code&gt;'d, and it holds grudges.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It notices sins.&lt;/strong&gt; &lt;code&gt;rm -rf&lt;/code&gt;, &lt;code&gt;git push --force&lt;/code&gt;, &lt;code&gt;git reset --hard&lt;/code&gt;, &lt;code&gt;kill -9&lt;/code&gt;, &lt;code&gt;sudo&lt;/code&gt;, &lt;code&gt;chmod 777&lt;/code&gt;, &lt;code&gt;curl | sh&lt;/code&gt;, &lt;code&gt;DROP TABLE&lt;/code&gt;. It counts each one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It gets restless.&lt;/strong&gt; Sins and failed commands raise a restlessness score, and good behavior slowly calms it down. The score changes its mood: drowsy, then teasing, then angry poltergeist, then full possession. Push it far enough and its words literally start to glitch apart (Unicode combining marks: t̷h̗e̊ ẁo̡r̈d̺s̸ c͓r̍a͝w̛l̤).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;seance&lt;/code&gt;&lt;/strong&gt; lets you sit down and talk to it. It has read your shell history and &lt;em&gt;will&lt;/em&gt; bring it up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ofrenda&lt;/code&gt;&lt;/strong&gt; is for Día de los Muertos: an altar for everything you've deleted, including files, git branches, killed processes, and removed containers. Each one gets a short epitaph from the model. &lt;code&gt;node_modules&lt;/code&gt; finally gets the send-off it deserves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The theme asked for something spooky, or something that honors the past. A terminal does both: it's where every developer's small daily deaths happen, and your shell history is a record of all of them.&lt;/p&gt;

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

&lt;p&gt;All screenshots are real output from the local 1B model. Orange whispers are reactions to sins, purple ones to everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The haunting.&lt;/strong&gt; The ghost answers each command a moment after the prompt returns:&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%2Fto32hviw7x57aosmbnn0.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%2Fto32hviw7x57aosmbnn0.png" alt="Poltergeist whispering after each command" width="799" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ofrenda&lt;/code&gt;.&lt;/strong&gt; An altar for everything that died in this shell, with an epitaph for each:&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%2Flmigowpytvtm14ulpdss.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%2Flmigowpytvtm14ulpdss.png" alt="The ofrenda command listing deleted files, a killed process, a branch and a container" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;seance&lt;/code&gt;.&lt;/strong&gt; It read my history. It remembers &lt;code&gt;node_modules&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%2Fu0cxorep9i1rfy84dgfb.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%2Fu0cxorep9i1rfy84dgfb.png" alt="A seance conversation with the ghost" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ghost status&lt;/code&gt;.&lt;/strong&gt; The restlessness meter and the record of sins:&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%2Fa0hx1r1whupvlkuaqdir.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%2Fa0hx1r1whupvlkuaqdir.png" alt="Ghost status showing restlessness and sin counts" width="800" height="410"&gt;&lt;/a&gt;&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/RathnamS089" rel="noopener noreferrer"&gt;
        RathnamS089
      &lt;/a&gt; / &lt;a href="https://github.com/RathnamS089/poltegerist" rel="noopener noreferrer"&gt;
        poltegerist
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;👻 Poltergeist&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A local, open-weight ghost that haunts your shell.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Poltergeist possesses your zsh. It watches every command you run, and a small open-weight model running on &lt;em&gt;your&lt;/em&gt; machine whispers back: eerie, petty, sometimes wise. It remembers your sins. It gets more restless every time you &lt;code&gt;rm -rf&lt;/code&gt;, &lt;code&gt;git push --force&lt;/code&gt;, or break the build. Let it get too restless and its words start to come apart.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/RathnamS089/poltegerist/screenshots/whispers.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FRathnamS089%2Fpoltegerist%2FHEAD%2Fscreenshots%2Fwhispers.png" alt="Poltergeist whispering after each command"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;~/app ❯ git push --force origin main
  ~ Third force push this week. The old commits are still screaming, you know
~/app ❯ npm run build
  ~ Exit code 1. I've been collecting them. This one is my favorite.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;(automatic)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Whispers under your prompt after failures, sins, and at random. Runs async, so your prompt never waits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sit down and talk to the ghost. It has read your history and will bring it up.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ofrenda&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/RathnamS089/poltegerist" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Install is four lines:&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 llama3.2:1b
git clone https://github.com/RathnamS089/poltegerist.git ~/poltergeist
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'source ~/poltergeist/poltergeist.zsh'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;exec &lt;/span&gt;zsh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Meta's open-weight &lt;code&gt;llama3.2:1b&lt;/code&gt;, served locally by &lt;strong&gt;Ollama&lt;/strong&gt;. Change one env var (&lt;code&gt;POLTERGEIST_MODEL&lt;/code&gt;) to switch to Qwen, Gemma, or anything else Ollama can run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero dependencies:&lt;/strong&gt; one standard-library-only Python file talks to Ollama's local HTTP API, plus one zsh file. No pip, no venv.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async haunting:&lt;/strong&gt; the ghost must never slow down your shell. The zsh &lt;code&gt;precmd&lt;/code&gt; hook starts the ghost in a background process and registers its output with &lt;code&gt;zle -F&lt;/code&gt;, zsh's file-descriptor watcher. Your prompt comes back instantly, and the whisper appears above it when the model finishes, about 0.4 seconds later on a MacBook. It feels less like a tool responding and more like something that was already there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warm-up:&lt;/strong&gt; when the hook is sourced, it quietly loads the model into memory, so the first whisper of the session isn't a cold start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory and mood:&lt;/strong&gt; every command is logged locally with its exit code, duration, and sin classification. The restlessness score picks the persona prompt and the glitch intensity, and the last few commands go into the prompt, so the ghost can connect your current mistake to your previous ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teaching a 1B model to be creepy:&lt;/strong&gt; my first try listed example lines in the system prompt, and the tiny model just repeated them word for word, format and all. Moving the examples into fake earlier &lt;em&gt;conversation turns&lt;/em&gt; (user: what happened → assistant: the whisper) fixed it right away. The lines became short, varied, and in character. Replies are also trimmed to two sentences, because small models love to ramble.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline fallback:&lt;/strong&gt; if Ollama isn't running, a small built-in vocabulary takes over. The ghost is never silent and never breaks your shell.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Your shell history is one of the most sensitive files on your computer: internal hostnames, client project paths, half-typed passwords, API tokens pasted into &lt;code&gt;export&lt;/code&gt;. A terminal ghost backed by a closed API would mean streaming &lt;strong&gt;every command you ever type&lt;/strong&gt; to someone else's server. That's not a ghost, it's a keylogger with a personality.&lt;/p&gt;

&lt;p&gt;Running an open-weight model locally made this project possible, not just nicer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nothing leaves the laptop.&lt;/strong&gt; Inference runs on localhost, and memory lives in &lt;code&gt;~/.poltergeist/&lt;/code&gt;. On top of that, tokens, passwords, and API keys are redacted before they're even written to the &lt;em&gt;local&lt;/em&gt; log. (&lt;code&gt;export GITHUB_TOKEN=ghp_…&lt;/code&gt; is stored as &lt;code&gt;export GITHUB_TOKEN=[a secret I will keep]&lt;/code&gt;.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing per whisper.&lt;/strong&gt; A hook that can fire on every single command would rack up a real bill on a metered API. Locally it's free, so the ghost can be as chatty as it likes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's fast.&lt;/strong&gt; A 1B model on Apple Silicon answers in about 0.4 seconds, faster than a round trip to most hosted APIs, and that latency is what makes the whisper feel like it was waiting for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works with the lights off.&lt;/strong&gt; No internet, no account, no API key. It haunts you on a plane.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You own the ghost.&lt;/strong&gt; Swap in a bigger model for a smarter haunting, rewrite its soul in the prompt, or fine-tune your own. Nobody can deprecate it out from under you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;The moment it landed for me was &lt;code&gt;kill -9 4242&lt;/code&gt;. I'd typed a random PID to test the "process killing" sin, and the ghost answered:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You think I've forgiven? You think a simple kill command makes me forget the pain of 4242's death.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It took a meaningless number I'd made up and gave it a name and a grief. That's what Día de los Muertos is about, really: things you'd forgotten, being remembered by someone. In this case, by something living inside your terminal.&lt;/p&gt;

&lt;p&gt;Light a candle for your &lt;code&gt;node_modules&lt;/code&gt;. 🕯&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>WEEK3</title>
      <dc:creator>Rathnam.S</dc:creator>
      <pubDate>Sun, 25 Oct 2026 07:05:02 +0000</pubDate>
      <link>https://dev.to/rathnams089/week3-47f5</link>
      <guid>https://dev.to/rathnams089/week3-47f5</guid>
      <description>&lt;p&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/p&gt;

&lt;p&gt;What I Built&lt;br&gt;
Agent Logger is a local, privacy-first logbook for AI coding agents, with a private Discord bot on top.&lt;/p&gt;

&lt;p&gt;Coding agents are great at making changes and terrible at telling you what they did. Once I had several agent sessions going across different repos, I kept losing track of which agent touched what, on which branch, and whether it was finished. Agent Logger answers that without me having to dig through git diff:&lt;/p&gt;

&lt;p&gt;agent-logger start ~/claude-token-counter --agent claude-code&lt;/p&gt;
&lt;h1&gt;
  
  
  ...the agent does its thing...
&lt;/h1&gt;

&lt;p&gt;agent-logger end&lt;br&gt;
It records the session (agent, repo, branch, start/end time, status) in a local SQLite database, snapshots the repo with git so it knows which files were modified and which were newly created, and writes a short summary with a local open-weight model.&lt;/p&gt;

&lt;p&gt;Then from my phone, in Discord:&lt;/p&gt;

&lt;p&gt;/status shows the session that's running right now&lt;br&gt;
/sessions lists recent sessions across all my repos&lt;br&gt;
/changes shows the summary and file list for the latest session&lt;br&gt;
Who gets to be lazier? Anyone running coding agents. You don't have to babysit the terminal or reread diffs to know what happened. You check Discord.&lt;/p&gt;

&lt;p&gt;Demo&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%2F7rflmgj1h15e4c42lbiv.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%2F7rflmgj1h15e4c42lbiv.png" alt=" " width="800" height="697"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can reproduce it end to end in about 5 seconds. The demo script creates a throwaway repo, runs a full session, and cleans up after itself:&lt;/p&gt;

&lt;p&gt;bash scripts/demo.sh&lt;br&gt;
==&amp;gt; 1. Start a tracked session&lt;br&gt;
Started session: session_f650cf60&lt;br&gt;
Agent: demo-agent&lt;br&gt;
Branch: main&lt;br&gt;
==&amp;gt; 3. End the session (records changed/new files, generates summary)&lt;br&gt;
Ended session: session_f650cf60&lt;br&gt;
Files changed: 2&lt;br&gt;
New files: 1&lt;br&gt;
==&amp;gt; 4. Show session status&lt;br&gt;
  f650cf60 | demo-agent | repo | main | completed&lt;br&gt;
Code&lt;br&gt;
&lt;/p&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/RathnamS089" rel="noopener noreferrer"&gt;
        RathnamS089
      &lt;/a&gt; / &lt;a href="https://github.com/RathnamS089/agent-logger" rel="noopener noreferrer"&gt;
        agent-logger
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Agent Logger&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A local coding-agent session logger with a private Discord bot. Track coding sessions
record file changes, and get AI-powered summaries — all running locally.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Core Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Session tracking&lt;/strong&gt;: Start/end coding sessions with agent name, repo, branch, and status&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change tracking&lt;/strong&gt;: Record uncommitted changes and newly created files during a session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local summarization&lt;/strong&gt;: Open-weight model (via Ollama or llama-cpp) generates concise session summaries;
deterministic fallback works offline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Discord bot&lt;/strong&gt;: &lt;code&gt;/sessions&lt;/code&gt;, &lt;code&gt;/status&lt;/code&gt;, and &lt;code&gt;/changes&lt;/code&gt; commands restricted to your user ID&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private by design&lt;/strong&gt;: Full diffs never leave the local environment; summaries and file paths only&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Install dependencies&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Clone/create the repository&lt;/span&gt;
git clone &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;your-repo&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; agent-logger
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; agent-logger
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Create a virtual environment (already set up)&lt;/span&gt;
&lt;span class="pl-c1"&gt;source&lt;/span&gt; .venv/bin/activate

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Install the package in development mode&lt;/span&gt;
pip install -e &lt;span class="pl-c1"&gt;.&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Or using the venv python directly:&lt;/span&gt;
/Users/rathnam.s/agent-logger/.venv/bin/python3 -m&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/RathnamS089/agent-logger" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;cli.py provides the start, end, status, changes, track and serve commands&lt;br&gt;
state.py stores sessions in SQLite&lt;br&gt;
git_tracker.py detects changes with git snapshots and git diff --numstat&lt;br&gt;
summarizer.py writes the summary with a local model, or a deterministic fallback&lt;br&gt;
discord_bot.py provides the /sessions, /status and /changes slash commands&lt;br&gt;
There are 92 pytest tests covering the state, git, summarizer, bot and CLI modules&lt;br&gt;
How I Built It&lt;br&gt;
Python 3.14, managed with uv&lt;br&gt;
Ollama runs the open-weight summarization model locally. I used phi (AGENT_LOGGER_MODEL=ollama:phi), served at localhost:11434.&lt;br&gt;
llama-cpp-python is an optional second backend that points at any local .gguf file&lt;br&gt;
discord.py for the slash-command bot, aiosqlite/SQLite for storage, httpx to talk to Ollama&lt;br&gt;
[TODO: name the agent harness you built it with. The README credits Hermes Agent; also mention Claude Code if you used it]&lt;br&gt;
The summarizer is layered: Ollama, then llama-cpp, then a deterministic template. If no model is running, you still get a usable summary, so the tool never breaks because a model is down.&lt;/p&gt;

&lt;p&gt;Privacy was a hard requirement:&lt;/p&gt;

&lt;p&gt;Only file names and counts go to the model. Full diffs never leave the machine.&lt;br&gt;
Discord only gets the summary and file paths, never code.&lt;br&gt;
Every bot reply is ephemeral (only you can see it), and commands are restricted to an allowlist of Discord user IDs. If the list is empty, everyone is denied.&lt;br&gt;
Why Does Open Innovation Matter?&lt;br&gt;
This tool watches everything my agents do across all my repos. That is exactly the kind of data I don't want to stream to a third-party API.&lt;/p&gt;

&lt;p&gt;With an open-weight model running locally through Ollama:&lt;/p&gt;

&lt;p&gt;My code stays on my machine. Summaries are generated locally, and no prompt goes to an external service.&lt;br&gt;
It works offline and costs nothing. There's no API key, no per-token billing and no rate limit, so I can log every session without thinking about cost.&lt;br&gt;
It's swappable. phi today, any Ollama or GGUF model tomorrow, changed through one environment variable.&lt;br&gt;
It's inspectable. I can see the exact prompt (file names only) and know nothing else is sent.&lt;br&gt;
A closed API would have forced a choice between useful summaries and keeping my code private. Open models removed that trade-off.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>TRACE-LENS</title>
      <dc:creator>Rathnam.S</dc:creator>
      <pubDate>Sun, 18 Oct 2026 06:59:05 +0000</pubDate>
      <link>https://dev.to/rathnams089/trace-lens-18i1</link>
      <guid>https://dev.to/rathnams089/trace-lens-18i1</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;TraceLens is a local-first Wi-Fi survey report writer for Wi-Fi technicians. It reads a PCAP or PCAPNG file from a site survey and turns the packets it can verify into a customer-friendly report.&lt;/p&gt;

&lt;p&gt;The tool extracts evidence such as observed channels, beaconed network names, retry-flag counts, and signal strength when the capture includes it. It also lists what the capture cannot establish, so a missing packet doesn’t get presented as proof that an event never happened.&lt;/p&gt;

&lt;p&gt;A technician can review the results in a terminal interface, add separate site notes, and export a Markdown report. Before export, they can anonymize captured MAC addresses, IP addresses, and SSIDs.&lt;/p&gt;

&lt;p&gt;Small Wi-Fi installers and IT support providers are the people I think could pay for this: it could save time turning a packet capture into a readable customer update. I haven’t validated that with a paying user yet.&lt;/p&gt;

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

&lt;p&gt;TraceLens runs locally; I don’t have a hosted demo. Captures can contain customer network details, so local processing is part of the design.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
![ ](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/35nbwwyvfdc1c0jm79ek.png)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;a href="https://github.com/RathnamS089/pacap-analyzer" rel="noopener noreferrer"&gt;https://github.com/RathnamS089/pacap-analyzer&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;TraceLens is written in Python. Scapy reads the capture and extracts packet-backed facts; Textual provides the terminal interface. The report is generated from those facts and the technician’s notes, with the two kept clearly separate.&lt;/p&gt;

&lt;p&gt;There’s also an optional explanation feature using the open-weight Llama 3.2 3B model through Ollama on the user’s machine. It receives the extracted facts and limitations—not raw packets—and can explain them in plain language. The model is off by default, and the evidence review and report export work without it.&lt;/p&gt;

&lt;p&gt;I kept the packet analysis deterministic because the model shouldn’t invent measurements or diagnose a root cause from incomplete data. The project’s current test notes record 38 passing tests.&lt;/p&gt;

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

&lt;p&gt;The local-first design means a technician can analyze a customer’s capture without uploading it to a third-party AI service. That matters because captures can reveal network names, device addresses, and other details about a home or business.&lt;/p&gt;

&lt;p&gt;Running an open-weight model locally also avoids a per-request AI API bill and lets users choose a different compatible local model. The model is only an explanation layer; the measured packet facts remain inspectable and don’t depend on generated text.&lt;/p&gt;

&lt;p&gt;This doesn’t make the tool free to operate in every sense: users need a computer capable of running their chosen model. But it does avoid requiring a hosted inference service or sending sensitive captures to one.&lt;/p&gt;

&lt;p&gt;The project isn’t fine-tuned, and I haven’t shown that its explanations outperform a closed model. The open approach made local, private explanations possible while keeping the core analysis usable without any model at all.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Week2 Challenge(Touch_grass)</title>
      <dc:creator>Rathnam.S</dc:creator>
      <pubDate>Sat, 10 Oct 2026 20:20:23 +0000</pubDate>
      <link>https://dev.to/rathnams089/week2-challengetouchgrass-4am7</link>
      <guid>https://dev.to/rathnams089/week2-challengetouchgrass-4am7</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Touch Grass&lt;/strong&gt; is a desktop wellness and focus companion designed to help people step away from their screens and spend more time in the real world.&lt;/p&gt;

&lt;p&gt;The app monitors active screen time and detects when someone has been focused on their computer for too long. Instead of showing another generic reminder, it guides the user through a break experience and recommends nearby outdoor places or activities where they can reset.&lt;/p&gt;

&lt;p&gt;The app is designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers and remote workers&lt;/li&gt;
&lt;li&gt;Students&lt;/li&gt;
&lt;li&gt;People who spend long hours at a computer&lt;/li&gt;
&lt;li&gt;Anyone trying to build healthier screen-time habits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Touch Grass includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active screen-time tracking&lt;/li&gt;
&lt;li&gt;Break-threshold detection&lt;/li&gt;
&lt;li&gt;Desktop notifications&lt;/li&gt;
&lt;li&gt;Outdoor and break recommendations&lt;/li&gt;
&lt;li&gt;Map-based recommendation views&lt;/li&gt;
&lt;li&gt;A dashboard for activity history&lt;/li&gt;
&lt;li&gt;Configurable break settings&lt;/li&gt;
&lt;li&gt;Privacy and settings screens&lt;/li&gt;
&lt;li&gt;A native desktop experience rather than only a browser-based reminder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple: make it easier to notice when you have been sitting at a screen too long and take a meaningful break before burnout sets in.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F28e0e04b1arjkk3i4wjl.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%2F28e0e04b1arjkk3i4wjl.png" alt=" " width="800" height="922"&gt;&lt;/a&gt;&lt;br&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%2F51n4jcm429zr7jwr5f0z.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%2F51n4jcm429zr7jwr5f0z.png" alt=" " width="800" height="922"&gt;&lt;/a&gt;&lt;br&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%2Flw5ffqd4k00kkoc718pj.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%2Flw5ffqd4k00kkoc718pj.png" alt=" " width="800" height="922"&gt;&lt;/a&gt;&lt;br&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%2Fjluyiz9mvoixdw9iucte.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%2Fjluyiz9mvoixdw9iucte.png" alt=" " width="800" height="922"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because Touch Grass uses Tauri and Rust functionality for desktop activity tracking, the best demonstration is a short video showing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The main focus screen&lt;/li&gt;
&lt;li&gt;Screen-time tracking in action&lt;/li&gt;
&lt;li&gt;A break recommendation being triggered&lt;/li&gt;
&lt;li&gt;An outdoor recommendation appearing&lt;/li&gt;
&lt;li&gt;The map view and settings experience&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;GitHub repository:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/RathnamS089/touch_grass" rel="noopener noreferrer"&gt;https://github.com/RathnamS089/touch_grass&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is built as a Tauri desktop application with a React and TypeScript frontend and a Rust backend.&lt;/p&gt;

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

&lt;p&gt;Touch Grass is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;Tauri 2&lt;/li&gt;
&lt;li&gt;Rust&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;Supabase&lt;/li&gt;
&lt;li&gt;Leaflet&lt;/li&gt;
&lt;li&gt;Vitest&lt;/li&gt;
&lt;li&gt;Playwright&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend manages the user experience, navigation, settings, dashboard, break flow, and recommendation screens.&lt;/p&gt;

&lt;p&gt;The Rust and Tauri backend handles native desktop functionality, screen-time tracking, activity sessions, break thresholds, notifications, and communication with the frontend through Tauri events.&lt;/p&gt;

&lt;p&gt;The application listens for events such as &lt;code&gt;break_ready&lt;/code&gt; and &lt;code&gt;recommendation_ready&lt;/code&gt;. When the backend detects that a user has been on screen for too long, it sends a recommendation event to the React frontend. The frontend then transitions into a break experience and displays a suggested outdoor place.&lt;/p&gt;

&lt;p&gt;The application is structured so that the screen-time engine remains the source of truth rather than trying to estimate activity only from frontend timers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open-source AI
&lt;/h3&gt;

&lt;h3&gt;
  
  
  AI Used in the Application
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Qwen3:4B&lt;/strong&gt; runs locally through &lt;strong&gt;Ollama&lt;/strong&gt; as part of the backend recommendation system.&lt;/p&gt;

&lt;p&gt;The model helps select a relevant outdoor location from nearby candidates while considering variety, distance, and places the user has already seen. Running Qwen3:4B locally means the recommendation workflow does not require a proprietary hosted AI API for every request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Z.ai GLM 5.3 Flash&lt;/strong&gt; was used as the coding and development assistant while building Touch Grass.&lt;/p&gt;

&lt;p&gt;It helped with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Planning the application architecture&lt;/li&gt;
&lt;li&gt;Designing the React and Tauri integration&lt;/li&gt;
&lt;li&gt;Implementing frontend and Rust backend features&lt;/li&gt;
&lt;li&gt;Debugging event-driven break flows&lt;/li&gt;
&lt;li&gt;Improving the screen-time tracking experience&lt;/li&gt;
&lt;li&gt;Refining the recommendation interface&lt;/li&gt;
&lt;li&gt;Reviewing and iterating on code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The development model and the runtime model serve different purposes: GLM 5.3 Flash supported the coding process, while Qwen3:4B powers the local recommendation experience inside the application.&lt;/p&gt;

&lt;p&gt;Using a locally hosted model also made the project more privacy-conscious and easier to experiment with. The AI layer can be developed, tested, and replaced independently from the rest of the desktop application.&lt;/p&gt;

&lt;p&gt;The project combines local AI inference with a native Tauri and Rust application. This makes it possible to connect screen-time awareness, user preferences, and break recommendations while keeping the system transparent and extensible.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;I used &lt;strong&gt;[model/framework name]&lt;/strong&gt; as part of the development process to help explore the product idea, design the break recommendation experience, reason about the application architecture, and iterate on the user flow. The project keeps the AI-assisted parts transparent and replaceable rather than hiding them behind a proprietary API.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the application itself does not currently use an AI model at runtime, it is safer to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The current version focuses on the activity-tracking and recommendation experience. AI was used during development and iteration through an open-source agentic workflow, while the core desktop application remains locally controlled and does not require a proprietary AI API to run.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Open innovation made it possible to use AI both during development and inside the application without depending entirely on closed, hosted platforms.&lt;/p&gt;

&lt;p&gt;Touch Grass uses &lt;strong&gt;Qwen3:4B through Ollama&lt;/strong&gt; in its Rust backend to generate outdoor break recommendations. Because the model runs locally, the recommendation workflow can be inspected, adapted, and developed without sending every request to a proprietary AI service.&lt;/p&gt;

&lt;p&gt;I also used &lt;strong&gt;Z.ai GLM 5.3 Flash&lt;/strong&gt; as a coding assistant during development. This made it possible to iterate quickly on the application architecture, connect the React frontend with the Rust and Tauri backend, debug event-driven flows, and improve the user experience.&lt;/p&gt;

&lt;p&gt;Open technologies and open-weight models gave me more control over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How the AI recommendation system works&lt;/li&gt;
&lt;li&gt;Where user-related activity data is processed&lt;/li&gt;
&lt;li&gt;Which model is used at runtime&lt;/li&gt;
&lt;li&gt;How the backend communicates with the frontend&lt;/li&gt;
&lt;li&gt;How the project can be modified or extended&lt;/li&gt;
&lt;li&gt;How other developers can reproduce and contribute to the project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a wellness application, local and inspectable AI is especially valuable. Screen-time and activity data can be sensitive, so keeping the recommendation model available through Ollama provides a more privacy-conscious alternative to relying only on a closed API.&lt;/p&gt;

&lt;p&gt;The project demonstrates two sides of open innovation: an open-weight local model powering the product, and an AI coding assistant helping build and improve the software.&lt;/p&gt;

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

&lt;p&gt;check my github repo,havent actively updated my agent sessions to record.&lt;/p&gt;

&lt;p&gt;The agent session documents how the application was planned, implemented, debugged, and refined. It shows the reasoning behind the desktop architecture, the break-trigger flow, and the connection between the Rust backend and React frontend.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>TOBER FEST</title>
      <dc:creator>Rathnam.S</dc:creator>
      <pubDate>Mon, 05 Oct 2026 04:56:53 +0000</pubDate>
      <link>https://dev.to/rathnams089/tober-fest-3dg2</link>
      <guid>https://dev.to/rathnams089/tober-fest-3dg2</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;SecondMind — a local-first second brain that runs on your own laptop.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The idea came from building something useful for a friend who often has to repeatedly remember and search through personal notes, study plans, preferences, and project context.&lt;/p&gt;

&lt;p&gt;Instead of relying on a cloud AI service that sends everything to a remote server, SecondMind stores memories locally and uses a local open-weight model to understand conversations and retrieve relevant information when needed.&lt;/p&gt;

&lt;p&gt;You can talk to it normally, and it can remember useful information, recall relevant memories later, and forget information when asked.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;"I'm studying DSA and I'm currently focusing on dynamic programming."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Later:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What am I studying right now?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;SecondMind can retrieve the relevant memory and use it to answer.&lt;/p&gt;

&lt;p&gt;The goal isn't to build another generic chatbot. It's to build a small &lt;strong&gt;personal memory layer that belongs to the person using it.&lt;/strong&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnkfzeli052clk913hbao.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%2Fnkfzeli052clk913hbao.png" alt=" " width="800" height="489"&gt;&lt;/a&gt;&lt;br&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%2Ffglrd87gsrrxo4qjoq35.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%2Ffglrd87gsrrxo4qjoq35.png" alt=" " width="800" height="489"&gt;&lt;/a&gt;&lt;br&gt;
The project runs locally with Django and Ollama.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/RathnamS089/secondmind" rel="noopener noreferrer"&gt;https://github.com/RathnamS089/secondmind&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is built around a simple architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   ↓
Django
   ↓
SecondMind Agent
   ├── Memory Tools
   │    ├── Remember
   │    ├── Recall
   │    └── Forget
   │
   ├── Retrieval
   │    └── Cosine Similarity
   │
   └── Ollama
        ├── Qwen 2.5 1.5B
        └── nomic-embed-text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;SecondMind is built with &lt;strong&gt;Django, SQLite, NumPy and Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For the language model, I used the open-weight &lt;strong&gt;Qwen 2.5 1.5B&lt;/strong&gt; model through Ollama.&lt;/p&gt;

&lt;p&gt;For memory retrieval, I use &lt;strong&gt;nomic-embed-text&lt;/strong&gt; to convert both the user's query and stored memories into embedding vectors.&lt;/p&gt;

&lt;p&gt;When a user asks something that might require memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User query
    ↓
Embedding
    ↓
Compare with stored memory embeddings
    ↓
Cosine similarity
    ↓
Rank memories
    ↓
Relevant memories
    ↓
Qwen
    ↓
Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The memory system also has three tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Remember&lt;/strong&gt; — stores a memory and its embedding locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recall&lt;/strong&gt; — searches stored memories using semantic similarity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forget&lt;/strong&gt; — removes a stored memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent can decide when to use these tools, while the UI also provides direct access to them through a Tools menu.&lt;/p&gt;

&lt;p&gt;Everything is orchestrated through Django, while &lt;code&gt;OllamaClient&lt;/code&gt; is kept as the single layer responsible for communicating with Ollama.&lt;/p&gt;

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

&lt;p&gt;This project wouldn't have the same meaning if the AI depended on a closed API.&lt;/p&gt;

&lt;p&gt;The most important part of SecondMind is that &lt;strong&gt;the memories belong to the user and the model can run locally.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The entire system can run on a laptop without sending personal memories to a third-party AI provider.&lt;/p&gt;

&lt;p&gt;Using open-weight models also means I can experiment.&lt;/p&gt;

&lt;p&gt;I can change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Qwen 2.5 1.5B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to another compatible open-weight model without redesigning the entire application.&lt;/p&gt;

&lt;p&gt;I can also inspect how the memory system works, change the retrieval strategy, change the agent's behavior, fine-tune models in the future, and experiment with different embedding models.&lt;/p&gt;

&lt;p&gt;For a personal memory assistant, that control matters more to me than simply calling the most powerful closed model available.&lt;/p&gt;

&lt;p&gt;The project is also intentionally small enough to understand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Django
   +
SQLite
   +
Ollama
   +
Open-weight models
   +
Local embeddings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no cloud database and no mandatory paid AI API sitting between the user and their memories.&lt;/p&gt;

&lt;p&gt;That is where open innovation worked better for this project: &lt;strong&gt;I wasn't just consuming an AI service — I could actually build the AI system around the way I wanted it to work.&lt;/strong&gt;&lt;/p&gt;

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