<?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: Soham Maity</title>
    <description>The latest articles on DEV Community by Soham Maity (@spreadsheets600).</description>
    <link>https://dev.to/spreadsheets600</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%2F1215249%2Fd2326133-d247-473a-bdb0-5fcaf9efbb5c.png</url>
      <title>DEV Community: Soham Maity</title>
      <link>https://dev.to/spreadsheets600</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spreadsheets600"/>
    <language>en</language>
    <item>
      <title>Moss: A Local-First Assistant That Grows on You While You Sleep 🦥</title>
      <dc:creator>Soham Maity</dc:creator>
      <pubDate>Sun, 25 Oct 2026 07:30:54 +0000</pubDate>
      <link>https://dev.to/spreadsheets600/moss-a-local-first-assistant-that-grows-on-you-while-you-sleep-29i6</link>
      <guid>https://dev.to/spreadsheets600/moss-a-local-first-assistant-that-grows-on-you-while-you-sleep-29i6</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;Moss is a local-first assistant that does the chores you put off — while you sleep. It runs entirely on your own machine using open-weight models (via Ollama), and leaves a single &lt;strong&gt;Morning Brief&lt;/strong&gt; each day summarizing what it did.&lt;/p&gt;

&lt;p&gt;Three "sloth" skills, one CLI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;moss tidy ~/Downloads&lt;/code&gt;&lt;/strong&gt; — sort, rename, archive clutter (dry-run by default)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;moss digest whatsapp.txt&lt;/code&gt;&lt;/strong&gt; — two-line summary, who you owe, dates, ignore verdict&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;moss fridge fridge.jpg&lt;/code&gt;&lt;/strong&gt; — grocery list from a fridge photo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;moss nap&lt;/code&gt;&lt;/strong&gt; — run everything configured overnight, write the Morning Brief&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;moss undo&lt;/code&gt;&lt;/strong&gt; — restore the last tidy run exactly, byte for byte&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Morning Brief is a single self-contained HTML file (inline CSS, inline SVG sloth, no JS, no CDN) plus a Markdown twin. It works offline, is dark-mode ready, and mobile-friendly.&lt;/p&gt;

&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ moss nap --demo --paranoid
Morning. Moss finished while you slept.
Brief: /home/soham/Moss/morning/2026-10-23.html
       /home/soham/Moss/morning/2026-10-23.md
Cloud API cost: $0.00
Paranoid proof: 0 outbound connections attempted. Model ran on localhost only.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;p&gt;Moss is local-first by design, so there's nothing to deploy — it runs on your laptop. Try the full pipeline with no model installed:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
ollama pull qwen3:4b
&lt;span class="nb"&gt;cp &lt;/span&gt;moss.example.yaml ~/Moss/moss.yaml
&lt;span class="c"&gt;# edit ~/Moss/moss.yaml to taste&lt;/span&gt;
moss nap &lt;span class="nt"&gt;--demo&lt;/span&gt; &lt;span class="nt"&gt;--paranoid&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;--demo&lt;/code&gt; flag uses a mock backend, so no model download is required. Add &lt;code&gt;--paranoid&lt;/code&gt; to prove zero outbound connections.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;Moss is MIT-licensed, written in Python 3.11+, and structured around a backend-agnostic LLM interface (&lt;code&gt;BaseBackend&lt;/code&gt; with &lt;code&gt;generate&lt;/code&gt; and &lt;code&gt;generate_json&lt;/code&gt;) so you can swap Ollama, llama.cpp/LM Studio, or a deterministic mock in one line.&lt;/p&gt;

&lt;p&gt;Install and run:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
moss nap &lt;span class="nt"&gt;--demo&lt;/span&gt; &lt;span class="nt"&gt;--paranoid&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Skills live in &lt;code&gt;src/moss/skills/&lt;/code&gt; (tidy, digest, fridge), extraction in &lt;code&gt;src/moss/extract/&lt;/code&gt; (PDF, DOCX, mbox, WhatsApp, Telegram, plain text), and storage is SQLite with an append-only undo journal for byte-for-byte restoration.&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/SpreadSheets600" rel="noopener noreferrer"&gt;
        SpreadSheets600
      &lt;/a&gt; / &lt;a href="https://github.com/SpreadSheets600/Moss" rel="noopener noreferrer"&gt;
        Moss
      &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;Moss&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Does the work while you hang around.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A local-first assistant that grows on you while you sleep. Built for the "Slow and Steady"
theme (International Sloth Day): open-weight models at its core, runs entirely on your own
machine, and rewards laziness by doing the chores you put off.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does (15 seconds)&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Moss runs overnight and leaves a single &lt;strong&gt;Morning Brief&lt;/strong&gt; (&lt;code&gt;~/Moss/morning/YYYY-MM-DD.html&lt;/code&gt; +
a &lt;code&gt;.md&lt;/code&gt; twin). It has three sloths ("skills"), one CLI:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ moss tidy ~/Downloads          # sort, rename, archive clutter (dry-run by default)
$ moss digest whatsapp.txt        # two-line summary, owes, dates, ignore verdict
$ moss fridge fridge.jpg          # grocery list from a fridge photo
$ moss nap                        # run everything configured, write the Morning Brief
$ moss undo                       # restore the last tidy run exactly
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Example terminal transcript:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;$ moss nap --demo --paranoid
Morning. Moss finished while you slept
Brief: /home/soham/Moss/morning/2026-10-23.html
       /home/soham/Moss/morning/2026-10-23.md
Cloud API&lt;/code&gt;&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/SpreadSheets600/Moss" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;Moss is built around &lt;strong&gt;open-weight models running locally&lt;/strong&gt;, not closed cloud APIs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Ollama (&lt;code&gt;localhost:11434&lt;/code&gt;) with &lt;code&gt;qwen3:4b&lt;/code&gt; for text tasks (tidy, digest) and &lt;code&gt;qwen2.5vl:7b&lt;/code&gt; for vision (fridge photo). Verified end-to-end with &lt;code&gt;gemma4:31b-cloud&lt;/code&gt; (32.7B on CPU) via Ollama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend abstraction&lt;/strong&gt;: A common &lt;code&gt;BaseBackend&lt;/code&gt; interface keeps skills backend-agnostic. A &lt;code&gt;MockBackend&lt;/code&gt; powers &lt;code&gt;--demo&lt;/code&gt; mode, so the full pipeline runs with no model installed — essential for hackathon sandboxes without Ollama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack&lt;/strong&gt;: Python 3.11, Typer (CLI), Rich (terminal output), Pydantic v2 (config), PyYAML, psutil (battery/idle detection), pypdf + python-docx + Pillow (extraction), Jinja2 (brief HTML), httpx (Ollama client), SQLite (cache + undo journal), pytest + ruff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paranoid mode&lt;/strong&gt;: &lt;code&gt;--paranoid&lt;/code&gt; monkeypatches &lt;code&gt;socket.socket&lt;/code&gt; so any non-loopback connection raises &lt;code&gt;OfflineError&lt;/code&gt;. Proof: &lt;strong&gt;0 outbound connections&lt;/strong&gt; — nothing phones home.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow and steady&lt;/strong&gt;: Runs at &lt;code&gt;nice -n 19&lt;/code&gt;, skips runs on battery below 40%, caches decisions by content hash so nothing repeats, and schedules at 2:00 AM by default.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Open innovation made Moss possible in ways a closed API never could:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Airplane mode works.&lt;/strong&gt; &lt;code&gt;moss paranoid&lt;/code&gt; proves 0 outbound connections. Your model runs on &lt;code&gt;localhost&lt;/code&gt;; nothing leaves the machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your data stays put.&lt;/strong&gt; Downloads, WhatsApp exports, email, fridge photos — all processed locally. No uploads to third-party servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero cost.&lt;/strong&gt; Cloud API cost: &lt;code&gt;$0.00&lt;/code&gt;. No subscription, no per-call fees, no model deprecation risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You own the behavior.&lt;/strong&gt; Swap models with &lt;code&gt;moss use gemma3:4b&lt;/code&gt;. Edit prompts and config in &lt;code&gt;moss.yaml&lt;/code&gt;. Hosted assistants don't let you do this.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A hosted assistant would need your personal chats and file contents sent to a third party, wouldn't work without internet, would charge recurring fees for a nightly job, and could deprecate the model you depend on overnight. Moss avoids all of that.&lt;/p&gt;

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

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

&lt;p&gt;Moss saves you from the chores you keep postponing: sorting a messy Downloads folder, summarizing long WhatsApp threads, checking what's missing from the fridge. It runs overnight at low priority (&lt;code&gt;nice -n 19&lt;/code&gt;), so you wake up to a done list instead of a to-do list. The undo journal means you can restore any tidy run byte-for-byte if you change your mind.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;tags - #devchallenge #hacktoberfest #ai #opensource #python&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>WildQuest: Offline Nature Quests with On-Device Qwen AI</title>
      <dc:creator>Soham Maity</dc:creator>
      <pubDate>Sat, 10 Oct 2026 07:43:02 +0000</pubDate>
      <link>https://dev.to/spreadsheets600/wildquest-offline-nature-quests-with-on-device-qwen-ai-21e3</link>
      <guid>https://dev.to/spreadsheets600/wildquest-offline-nature-quests-with-on-device-qwen-ai-21e3</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;WildQuest&lt;/strong&gt; is a mobile-only, offline-first nature exploration game. You pick a 15-, 30-, or 60-minute walk and a theme (plants, birds, textures, general nature), and the app generates 3–5 short missions from an on-device open-weight LLM — with a bundled curated mission library as fallback, so it works with zero connectivity.&lt;/p&gt;

&lt;p&gt;The point is the screen stays secondary: you read one mission, put the phone away, and go outside. When you come back you photograph what you found, describe it in a sentence or two, and the same on-device model structures it into an ID suggestion (label, confidence, key features). Everything — quests, photos, notes, AI text — lives in on-device SQLite, including half-typed drafts that survive app restarts. The walk ends with a field journal: completions, observations grouped per mission, and questions for the next walk.&lt;/p&gt;

&lt;p&gt;It is for anyone who walks past nature without noticing it: beginners who want structure, parents, run-club regulars who want a reason to look up.&lt;/p&gt;

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

&lt;p&gt;There is no deployed link — it is a native Android app, not a website. Install the release APK (arm64, 128 MB) directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; app/build/app/outputs/flutter-apk/app-release.apk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Offline proof you can repeat: turn on airplane mode, generate a 15-minute plants quest (it arrives with a "Curated" chip), complete a mission, save a note, kill the app, reopen — quest, drafts, and history are intact. With the model downloaded once (~1 GB, Settings tab), the same flow runs fully offline with the chip reading "On-device AI". A field-test video is still TODO before the deadline.&lt;/p&gt;

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

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

&lt;blockquote&gt;
&lt;p&gt;Note: the code push is in flight (local commits verified, remote push pending) — the repo will hold the full history: Flutter app, Python dev backend, docs with architecture diagrams.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;The open-source AI is the core, in three places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quest generation — Qwen2.5-1.5B-Instruct Q4_K_M&lt;/strong&gt; (official Qwen GGUF on Hugging Face, ungated, Apache-2.0), run on-device through &lt;strong&gt;llamadart 0.11&lt;/strong&gt; (llama.cpp), CPU, 2048 context. The prompt demands strict JSON (missions with time, difficulty, safety notes); every output is re-validated by a rules engine (timebox fit, difficulty cap, banned-phrase safety check with negation handling). Any failure falls back to the curated library — and the UI chip always names the true source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photo suggestions — the same Qwen model&lt;/strong&gt;, describe-then-structure: no vision model on purpose (multimodal GGUFs are ~2 GB+ and experimental on low-end phones). You describe what you saw; the model returns structured JSON offline. Without a model the box honestly says "No model — not AI".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why this model:&lt;/strong&gt; an earlier build used Gemma 3n + MediaPipe and thrashed on real phones. Q4_K_M is the community-default quant (~1% perplexity cost), ~1 GB weights with a small KV cache — the phone bottleneck is memory, not speed, so the app runs CPU with a short context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No server, no account, no API keys. A Python/FastAPI + Ollama backend exists in the repo purely as a dev reference with the same prompt shapes and rules.&lt;/p&gt;

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

&lt;p&gt;Four things a closed API could not do here:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Airplane-mode nature walks.&lt;/strong&gt; A birding trail with no signal is the whole use case — a cloud API makes the app a brick exactly where it matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location privacy by construction.&lt;/strong&gt; Photos, notes, and implicitly where-you-walked never leave the device. There is no server to trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable, inspectable behavior.&lt;/strong&gt; The model URL is a setting, not a vendor lock-in — the rules engine, prompts, and validation are all in the repo to read and change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero marginal cost.&lt;/strong&gt; A free app for beginners cannot pay per-token for every quest and every photo description.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Session transcript available on request — happy to embed it via DevRelay before the deadline.&lt;/p&gt;

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

&lt;p&gt;None — the build uses no partner technology (the earlier Gemma integration was removed for on-device performance reasons). Entering for the overall prize only.&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>flutter</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Recall: A Local-First AI Memory for Everything You’ve Saved</title>
      <dc:creator>Soham Maity</dc:creator>
      <pubDate>Sun, 04 Oct 2026 18:38:17 +0000</pubDate>
      <link>https://dev.to/spreadsheets600/recall-a-local-first-ai-memory-for-everything-youve-saved-2o9a</link>
      <guid>https://dev.to/spreadsheets600/recall-a-local-first-ai-memory-for-everything-youve-saved-2o9a</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;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;Recall&lt;/strong&gt;, a local-first personal memory system for a friend who has a habit of saving everything: screenshots, useful webpages, PDFs, notes, images, and random files that might be useful someday.&lt;/p&gt;

&lt;p&gt;The problem was not storing those things. It was finding them again.&lt;/p&gt;

&lt;p&gt;A normal keyword search works when you remember the exact words. But memory usually does not work that way. You remember &lt;em&gt;“that screenshot about the GitHub DNS problem”&lt;/em&gt;, &lt;em&gt;“the article about FAISS”&lt;/em&gt;, or &lt;em&gt;“the image with the terminal error”&lt;/em&gt;. You remember the idea, not necessarily the exact filename or sentence.&lt;/p&gt;

&lt;p&gt;Recall turns those scattered files into searchable memories.&lt;/p&gt;

&lt;p&gt;You can ingest text, webpages, images, screenshots, PDFs, and other files, then search the collection using natural language. Images are processed with OCR and image captioning so that the information inside them can become searchable too.&lt;/p&gt;

&lt;p&gt;For example, instead of remembering a filename, you can search:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“the screenshot where GitHub could not resolve the host”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and retrieve the relevant memory.&lt;/p&gt;

&lt;p&gt;The important part is that this is &lt;strong&gt;local-first&lt;/strong&gt;. The data stays on the machine, there are no accounts or cloud APIs required, and once a memory has been processed, searching does not need a generative AI model running in the background.&lt;/p&gt;

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

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

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

&lt;p&gt;&lt;a href="https://github.com/SpreadSheets600/Recall" rel="noopener noreferrer"&gt;Recall on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository is open source and contains the backend, frontend, ingestion pipeline, search system, tests, and technical documentation.&lt;/p&gt;

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

&lt;p&gt;The core idea was to use AI where it provides the most value, rather than making an LLM responsible for every query.&lt;/p&gt;

&lt;p&gt;Recall processes content during ingestion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;content
   ↓
metadata + content extraction
   ↓
OCR / image captioning
   ↓
searchable text
   ↓
embeddings
   ↓
SQLite + FTS5 + FAISS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For image understanding, Recall uses &lt;strong&gt;BLIP-base&lt;/strong&gt; for image captioning and &lt;strong&gt;RapidOCR&lt;/strong&gt; for OCR. For semantic retrieval, the default embedding model is &lt;strong&gt;Google's EmbeddingGemma 300M&lt;/strong&gt;, with automatic fallbacks to &lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt; and finally deterministic hash vectors when model availability is limited.&lt;/p&gt;

&lt;p&gt;The backend is built with &lt;strong&gt;FastAPI and Python&lt;/strong&gt;. Memories are stored in &lt;strong&gt;SQLite&lt;/strong&gt;, with SQLite FTS5 providing BM25 lexical search and &lt;strong&gt;FAISS&lt;/strong&gt; providing vector retrieval.&lt;/p&gt;

&lt;p&gt;The final search is hybrid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BM25 search ─────┐
                 ├── Reciprocal Rank Fusion ──→ ranking
Vector search ───┘
                       + metadata
                       + recency
                       + exact-match signals
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This solves a practical problem with relying on embeddings alone.&lt;/p&gt;

&lt;p&gt;Semantic search is good at understanding that “DNS failure” and “could not resolve host” may refer to the same thing, while lexical search is much better at exact strings such as error messages, filenames, or identifiers.&lt;/p&gt;

&lt;p&gt;AI therefore does the expensive work &lt;strong&gt;once at ingestion&lt;/strong&gt;, and retrieval stays deterministic and fast.&lt;/p&gt;

&lt;p&gt;The frontend is built with &lt;strong&gt;React and Vite&lt;/strong&gt;, with the production build served by the FastAPI application.&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%2Fll109iekvhn0trvvtl8t.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%2Fll109iekvhn0trvvtl8t.png" alt="proejct architecture" width="800" height="873"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also designed the system around a few constraints that mattered for this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The database is the source of truth; the FAISS index can always be rebuilt.&lt;/li&gt;
&lt;li&gt;Ingestion is idempotent, using content hashes to avoid processing the same file repeatedly.&lt;/li&gt;
&lt;li&gt;AI failures should not make the entire ingestion pipeline fail.&lt;/li&gt;
&lt;li&gt;Search should continue working even when the optional AI models are unavailable.&lt;/li&gt;
&lt;li&gt;The application should be usable on a normal laptop rather than requiring a dedicated GPU.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;For this project, open innovation is not just about avoiding an API bill.&lt;/p&gt;

&lt;p&gt;Memory is personal.&lt;/p&gt;

&lt;p&gt;A system that is indexing screenshots, documents, saved pages, and private notes should not require sending that collection to a remote service just to make it searchable.&lt;/p&gt;

&lt;p&gt;Open models made it possible to build the important parts of Recall locally: image captioning, OCR, and semantic embeddings can all happen on the user's machine.&lt;/p&gt;

&lt;p&gt;That changes the trade-off completely.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Upload my personal data to a service so an AI can understand it.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;the model becomes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Let the AI understand my data locally, store the useful representations, and search them without an online AI dependency.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It also makes the system easier to experiment with. Models can be swapped, compared, or removed without redesigning the entire application around one proprietary API.&lt;/p&gt;

&lt;p&gt;For a personal memory system, that control is as important as the model quality itself.&lt;/p&gt;

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

&lt;p&gt;Google Gemma&lt;/p&gt;

&lt;p&gt;Recall uses Google's EmbeddingGemma 300M as its primary semantic embedding model.&lt;/p&gt;

&lt;p&gt;EmbeddingGemma converts memories into vector representations that allow Recall to retrieve content based on meaning rather than exact keywords. This is particularly important for personal memories because users often remember the context of something without remembering the exact words contained in it.&lt;/p&gt;

&lt;p&gt;For example, a user can search for:&lt;/p&gt;

&lt;p&gt;“the screenshot where GitHub couldn't resolve the host”&lt;/p&gt;

&lt;p&gt;even if the original screenshot contains an error such as:&lt;/p&gt;

&lt;p&gt;“fatal: unable to access... Could not resolve host: github.com”&lt;/p&gt;

&lt;p&gt;EmbeddingGemma provides the semantic layer that makes this kind of retrieval possible.&lt;/p&gt;

&lt;p&gt;The model runs locally, so the user's personal memories do not need to be sent to a remote embedding API. Recall stores the generated embeddings locally and uses FAISS for vector retrieval.&lt;/p&gt;

&lt;p&gt;I chose EmbeddingGemma because it provides a strong semantic representation while remaining practical for a local-first application. It also supports longer input than the lightweight embedding models I initially considered, which is useful when memories contain documents or substantial extracted text.&lt;/p&gt;

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