<?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: P SRIKAR NAIDU</title>
    <description>The latest articles on DEV Community by P SRIKAR NAIDU (@srikar_naidu).</description>
    <link>https://dev.to/srikar_naidu</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%2F4151356%2F1d7006c3-5854-4ae7-a077-576b6a7e7b5e.png</url>
      <title>DEV Community: P SRIKAR NAIDU</title>
      <link>https://dev.to/srikar_naidu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/srikar_naidu"/>
    <language>en</language>
    <item>
      <title>Jarvis Control Center: Local Browser Agent Powered by Gemma 4</title>
      <dc:creator>P SRIKAR NAIDU</dc:creator>
      <pubDate>Sun, 25 Oct 2026 17:09:03 +0000</pubDate>
      <link>https://dev.to/srikar_naidu/jarvis-control-center-local-browser-agent-powered-by-gemma-4-n2g</link>
      <guid>https://dev.to/srikar_naidu/jarvis-control-center-local-browser-agent-powered-by-gemma-4-n2g</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built Jarvis Control Center, a local-first browser agent that lets users control their computer with natural language.&lt;/p&gt;

&lt;p&gt;You can ask it to open websites, search the web, play YouTube videos, manage tasks, and use connected tools. For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Open YouTube and play 11K by Seedhemaut.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jarvis uses Gemma locally to understand the request, decide whether a tool is needed, and execute the browser action through Playwright.&lt;/p&gt;

&lt;p&gt;It saves users from repeatedly opening tabs, searching manually, and performing routine browser workflows.&lt;/p&gt;

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

&lt;p&gt;The launch demo is available in the repository README:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/srikar-naidu/gemma-browser-agent" rel="noopener noreferrer"&gt;View the Jarvis Control Center repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo shows Jarvis receiving a YouTube request, opening the browser, searching for “11K — Seedhemaut,” and playing the result.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/srikar-naidu/gemma-browser-agent" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Jarvis is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js and TypeScript for the application&lt;/li&gt;
&lt;li&gt;Gemma 4 E2B running locally through Ollama&lt;/li&gt;
&lt;li&gt;Playwright for browser automation&lt;/li&gt;
&lt;li&gt;Convex for the database, authentication, realtime synchronization, and server-side functions&lt;/li&gt;
&lt;li&gt;ElevenLabs as an optional text-to-speech provider&lt;/li&gt;
&lt;li&gt;Browser speech APIs for voice input&lt;/li&gt;
&lt;li&gt;Composio for connecting external tools and services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is designed to work locally by default. Users can run Gemma through Ollama without sending their conversations to a hosted AI API. Optional cloud services can be enabled through environment variables when voice output or external integrations are needed.&lt;/p&gt;

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

&lt;p&gt;Open innovation made it possible to build an AI assistant that users can run and customize on their own machines.&lt;/p&gt;

&lt;p&gt;Using an open-weight model through Ollama means the core assistant can work locally, with more privacy and control than a closed hosted API. Developers can inspect the system, change the agent logic, add new tools, and adapt the model to their own workflows.&lt;/p&gt;

&lt;p&gt;The project also combines multiple open technologies instead of locking the entire experience to one provider.&lt;/p&gt;

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

&lt;p&gt;Jarvis turns multi-step browser workflows into a single natural-language request.&lt;/p&gt;

&lt;p&gt;Instead of opening YouTube, searching for a song, checking the result, and pressing play manually, the user can give one instruction and let the browser agent handle it.&lt;/p&gt;

&lt;p&gt;The same pattern can be extended to web research, task management, calendar actions, email workflows, and other repetitive browser tasks.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma 4&lt;/li&gt;
&lt;li&gt;Best Use of GitHub Copilot&lt;/li&gt;
&lt;li&gt;Best Use of ElevenLabs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub Copilot helped bootstrap and accelerate the initial implementation. The project was then cloned into this repository and further developed with a local-first Gemma architecture, browser automation, Convex, and optional ElevenLabs voice output.&lt;/p&gt;

&lt;p&gt;Gemma 4 is the core reasoning model used by Jarvis through Ollama, while ElevenLabs provides optional natural-sounding text-to-speech when cloud services are enabled.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Resume-Scorer!!!</title>
      <dc:creator>P SRIKAR NAIDU</dc:creator>
      <pubDate>Sun, 18 Oct 2026 13:47:44 +0000</pubDate>
      <link>https://dev.to/srikar_naidu/resume-scorer-4c6g</link>
      <guid>https://dev.to/srikar_naidu/resume-scorer-4c6g</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Resume Scorer&lt;/strong&gt; — a local-first, open-source resume screening pipeline that turns a PDF into a structured, evidence-backed score in under two minutes.&lt;/p&gt;

&lt;p&gt;Drop in a resume PDF, point it at a role, and get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Category scores with evidence&lt;/strong&gt; — open source contributions, self projects, production experience, technical skills, AI fluency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bonus points&lt;/strong&gt; — GSoC, portfolio site, startup founder history, LinkedIn presence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deductions&lt;/strong&gt; — no project links, tutorial-only projects, unverifiable claims&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key strengths and areas for improvement&lt;/strong&gt; in plain English&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who would pay for this:&lt;/strong&gt; any small company or startup drowning in junior applications. A 10-person startup posting a junior engineering role on LinkedIn can easily get 300–500 applicants in a week. Nobody has time to read all of those carefully. Resume Scorer runs the first pass locally, ranks the pile, and surfaces the top candidates for a human to actually read.&lt;/p&gt;

&lt;p&gt;It also works for &lt;strong&gt;freelance recruiters&lt;/strong&gt; who handle screening for multiple clients — they can define a custom role config per client, run it on their own machine, and deliver faster, more consistent results.&lt;/p&gt;

&lt;p&gt;The scoring rubric lives entirely in a &lt;code&gt;role.json&lt;/code&gt; file. Adding a new role requires zero Python — just run &lt;code&gt;python score.py --init-role &amp;lt;name&amp;gt;&lt;/code&gt; and edit the scaffolded config.&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/srikar-naidu" rel="noopener noreferrer"&gt;
        srikar-naidu
      &lt;/a&gt; / &lt;a href="https://github.com/srikar-naidu/resume-scorer" rel="noopener noreferrer"&gt;
        resume-scorer
      &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;Resume Scorer&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A local-first, open-source resume screening tool. Drop in a PDF, point it at a role, get a structured score with evidence — no cloud account required.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extract&lt;/strong&gt; — PyMuPDF converts the PDF to Markdown text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parse&lt;/strong&gt; — an LLM reads each resume section (basics, work, education, skills, projects, awards) and returns structured JSON&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enrich&lt;/strong&gt; — if the resume has a GitHub link, the tool fetches repository data and classifies projects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score&lt;/strong&gt; — the LLM evaluates the enriched resume against the role's rubric and returns category scores, bonus points, deductions, and evidence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output&lt;/strong&gt; — a human-readable report is printed to stdout; in dev mode a CSV row is appended for batch analysis&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The scoring rubric lives entirely in &lt;code&gt;roles/&amp;lt;role_name&amp;gt;/role.json&lt;/code&gt;. No Python edits are needed to add, modify, or remove a role.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why open source models&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Running locally on Ollama means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No data leaves your machine.&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/srikar-naidu/resume-scorer" 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;The entire pipeline runs on open-weight models via &lt;strong&gt;Ollama&lt;/strong&gt; or any OpenAI-compatible endpoint. No closed API is required.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&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;strong&gt;Ollama + Gemma&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local inference. &lt;code&gt;gemma4:latest&lt;/code&gt; is the default and runs on a laptop with 16 GB RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PyMuPDF / pymupdf4llm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Converts PDF pages to clean Markdown before any LLM call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jinja2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All prompts are templates rendered from &lt;code&gt;role.json&lt;/code&gt; at runtime — no hardcoded rubric text anywhere in the codebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pydantic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The LLM response is validated against a dynamically-built schema derived from the role config. Invalid point values are rejected before they reach the output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enriches the resume with real contributor data, classifying repos as &lt;code&gt;open_source&lt;/code&gt; (multiple contributors) vs &lt;code&gt;self_project&lt;/code&gt; (single contributor)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;score.py&lt;/code&gt; is the CLI entrypoint. It calls:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;core/pdf.py&lt;/code&gt; — extracts a structured &lt;code&gt;JSONResume&lt;/code&gt; object section-by-section, each section getting its own LLM call with a Jinja template and a Pydantic schema for structured output&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;core/github.py&lt;/code&gt; — fetches and classifies repositories if the resume has a GitHub link&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;core/evaluator.py&lt;/code&gt; — assembles everything into a single text block and calls the LLM with the role's evaluation prompt, fully generated from &lt;code&gt;role.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The scoring schema is built dynamically with &lt;code&gt;pydantic.create_model&lt;/code&gt; at runtime, so it reflects whatever categories the role defines. Adding a new role is a JSON edit — no Python required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project layout
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resume-scorer/
├── score.py                  # CLI entrypoint
├── roles.py                  # Role dataclass, load_role(), scaffold_role()
├── core/                     # All processing logic
│   ├── models.py             # Pydantic schemas + dynamic scoring models
│   ├── evaluator.py          # LLM evaluation pipeline
│   ├── pdf.py                # PDF → structured JSON extraction
│   ├── github.py             # GitHub enrichment
│   ├── transform.py          # JSON normalisation + text serialisation
│   └── llm_utils.py          # Provider init + JSON extraction helpers
├── app_config/               # Configuration
│   ├── config.py             # Provider resolution
│   └── providers.json        # LLM provider registry
├── prompts/                  # Jinja templates
│   └── templates/
├── roles/                    # One subdirectory per role
│   └── software_engineering_intern/
│       ├── role.json         # Rubric lives here
│       ├── criteria.jinja    # Data-driven — loops over role.json
│       └── system_message.jinja
└── resumes/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Three concrete reasons this couldn't work the same way with a closed API:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Candidate data stays on your machine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Resumes contain names, phone numbers, addresses, education history, and employment records. Many candidates have no idea their PDF might be forwarded to a third-party model provider. Running locally means none of that data leaves the recruiter's machine. This matters legally (GDPR Article 22 has explicit requirements around automated decision-making) and practically — a small company can't afford a data breach from a screening tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The unit economics only work locally.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Screening 500 applicants with a paid API at typical pricing costs $20–60 per batch in tokens alone, before GitHub enrichment calls. At volume, that's a real line item that makes the service unviable for small teams. On Ollama with a local model, the marginal cost per run is zero. The only cost is the hardware you already own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The rubric is yours to inspect and own.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A closed screening API is a black box. You can't see why a candidate scored 62 vs 71, can't tune the weights, can't add a bonus for a skill that matters to your specific team. Because both the model and the prompt are open and local, every scoring decision is fully auditable — the &lt;code&gt;evidence&lt;/code&gt; field in the output tells you exactly what the model saw and why it scored what it scored. When a candidate disputes a result, you can answer them with specifics.&lt;/p&gt;

&lt;p&gt;Open-weight models made the privacy and cost arguments viable. The open-source tooling around them — Ollama's API compatibility, Pydantic's schema enforcement, Jinja's prompt templating — made the config-driven rubric design possible. A closed API can't give you either.&lt;/p&gt;




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

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

&lt;p&gt;&lt;code&gt;gemma4:latest&lt;/code&gt; is the default model shipped in &lt;code&gt;app_config/providers.json&lt;/code&gt;. The entire PDF extraction pipeline (six separate structured-output LLM calls per resume) and the final evaluation call all run against Gemma by default through Ollama. Switching to a different model is a one-line change in &lt;code&gt;.env&lt;/code&gt; — no code changes required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub — Best Use of GitHub Copilot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This project was built using Kiro, an AI-powered IDE built on VS Code with GitHub Copilot at its core. The agentic coding workflow — design, implement, verify in a loop — drove the entire build: the config-driven rubric refactor (making all scoring data-driven from &lt;code&gt;role.json&lt;/code&gt;), the folder restructure into &lt;code&gt;core/&lt;/code&gt; and &lt;code&gt;app_config/&lt;/code&gt; packages, import rewrites across the whole codebase, and automated verification runs after every change.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>GRASSROOTS!!!!</title>
      <dc:creator>P SRIKAR NAIDU</dc:creator>
      <pubDate>Fri, 09 Oct 2026 13:43:48 +0000</pubDate>
      <link>https://dev.to/srikar_naidu/grassroots-gbb</link>
      <guid>https://dev.to/srikar_naidu/grassroots-gbb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass]&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Touch Grass&lt;/strong&gt; is a daily real-world challenge agent. Every morning it gives you exactly one challenge, then asks you to put the phone away and go do it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Touch actual grass for two minutes."&lt;/li&gt;
&lt;li&gt;"Do a fit check on a basketball court."&lt;/li&gt;
&lt;li&gt;"Collect five different kinds of flowers."&lt;/li&gt;
&lt;li&gt;"Run for ten minutes and show your Strava screenshot."&lt;/li&gt;
&lt;li&gt;"Give a stranger a genuine compliment on their outfit."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you're back, you give one-tap proof (a photo, a screenshot, or a short voice note). A model checks it, and the app learns which challenges you actually finish so tomorrow's is a better stretch. It is for people who know they should get outside more but don't want yet another app that keeps them scrolling.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it keeps the screen the shortest part
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audio-first.&lt;/strong&gt; The challenge is spoken, so the Today screen takes seconds to read, not minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pocket mode.&lt;/strong&gt; One big "Done" button, with an optional photo or voice note. No feeds, no infinite scroll.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works with poor signal.&lt;/strong&gt; The day's challenge is cached, and proof is captured offline and queued until signal returns.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why every challenge is different
&lt;/h3&gt;

&lt;p&gt;LLMs left alone converge on the same ten challenges, so I don't let the model pick. Code samples a seed from a taxonomy (category, place type, constraint, difficulty, social level, proof type), and the model only expands the seed into a challenge. New challenges are checked against the user's history and rejected if they're too similar, then regenerated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Safety
&lt;/h3&gt;

&lt;p&gt;A rule-based validator (plus a model check) rejects challenges involving trespassing, traffic or heights, being alone outdoors at night, or photographing strangers without consent. Social challenges are consent-first, and there is always a "Skip safely" button. Raw photos, screenshots, and audio are deleted after verification, and only the verdict is kept.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Field test: I took it outside
&lt;/h3&gt;

&lt;p&gt;I took Touch Grass out for an evening walk to a nearby park, where signal was weak in parts of the route. The cached challenge opened without a connection, and I captured my proof offline. The verdict arrived once the signal came back. Local-mode verification was slower than hosted, so I put the phone away while it ran, which is exactly the behavior I wanted. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Place&lt;/th&gt;
&lt;th&gt;Signal?&lt;/th&gt;
&lt;th&gt;Challenge&lt;/th&gt;
&lt;th&gt;Proof&lt;/th&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Screen seconds&lt;/th&gt;
&lt;th&gt;What broke / what worked&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Oct 09&lt;/td&gt;
&lt;td&gt;Neighborhood park&lt;/td&gt;
&lt;td&gt;Weak&lt;/td&gt;
&lt;td&gt;Touch grass&lt;/td&gt;
&lt;td&gt;Photo&lt;/td&gt;
&lt;td&gt;local&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;Worked: Offline cache loaded instantly in the trees; photo saved to IndexedDB without a connection. Broke / delayed: Verdict took 1 min 14 s after signal returned (local model inference on-device); eventually passed 0.82 confidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 09&lt;/td&gt;
&lt;td&gt;Basketball court&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Fit check photo&lt;/td&gt;
&lt;td&gt;Photo&lt;/td&gt;
&lt;td&gt;hosted&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;Worked: Hosted verification returned in 2.1 s on first try — confidence 0.91 ("outdoors, daytime, full body visible"). Minor: Portrait crop needed a second attempt — first selfie was too close to camera, needs_retake=true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 09&lt;/td&gt;
&lt;td&gt;Street&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Run 10 minutes&lt;/td&gt;
&lt;td&gt;Strava screenshot&lt;/td&gt;
&lt;td&gt;hosted&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;Worked: OCR extracted 1.27 km, 8:42 min/mile, timestamp matching today. Minor: Activity type came back as "Walk" instead of "Run" — one tap on the manual override confirmed it and challenge completed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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/srikar-naidu" rel="noopener noreferrer"&gt;
        srikar-naidu
      &lt;/a&gt; / &lt;a href="https://github.com/srikar-naidu/Touch-the-Grass" rel="noopener noreferrer"&gt;
        Touch-the-Grass
      &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;🌿 Touch Grass&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A daily real-world challenge agent powered by open-source AI.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Each day, Touch Grass generates ONE unique challenge that pushes you off your phone and into the world. It verifies your proof, learns what you complete, and adapts difficulty over time — all with open-weight models you can run on your own machine.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The screen should be the shortest part of the experience."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Open Matters&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;Concern&lt;/th&gt;
&lt;th&gt;How Open Solves It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Offline / laptop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local mode runs a single quantized Gemma via Ollama. Full loop (challenge → verify → reflect) works with no internet on an 8 GB machine.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Your data stays with you&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;In local mode, raw photos never leave the device. No tracking, no analytics you can't see.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fine-tune &amp;amp; swap models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One env var (&lt;code&gt;PROVIDER_MODE&lt;/code&gt;) switches the entire stack. Tinker fine-tune produces downloadable LoRA weights you own.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Costs nothing to run&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local mode&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/srikar-naidu/Touch-the-Grass" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repo is public under an open-source license. Layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apps/web        React + Vite PWA (offline cache, queued proof uploads)
apps/api        TypeScript backend: Mastra agents, workflows, tools, providers, safety
services/tabpfn Python service for completion-probability scoring
ml/             Tinker fine-tune scripts, model comparison, local benchmark, synthetic data
docs/           Architecture, data models, workflows, safety, testing notes
render.yaml     Render Blueprint (web service, TabPFN service, cron job)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  The open pieces
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma&lt;/strong&gt; (open-weight) is the eyes of the app. It verifies challenge photos, reads Strava screenshots, summarizes voice reflections, and writes the weekly report. It is prompted with schema-constrained JSON and a retry loop, not fine-tuned. Hosted mode uses Gemma 4 through a hosted endpoint; local mode uses a small quantized E2B variant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A small Qwen model fine-tuned with Tinker&lt;/strong&gt; (Qwen3.5-4B, non-thinking mode) is the specialist challenge writer, trained with LoRA on these filtered examples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An open-weight embedding model&lt;/strong&gt; (EmbeddingGemma) powers deduplication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mastra&lt;/strong&gt;, an open-source agent framework, orchestrates the workflows, tools, and memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; runs a single quantized Gemma on my 8 GB, no-GPU laptop in local mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Three runtime modes, one codebase
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;ModelProvider&lt;/code&gt; interface lets me switch with one environment variable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hosted&lt;/code&gt;: open-weight models served from the cloud (this is what the Render demo uses; Render has no GPU, so it hosts only the app).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;local&lt;/code&gt;: one small quantized Gemma on my own machine handles text and vision. Verification runs in the background so you can pocket your phone and get the verdict later.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mock&lt;/code&gt;: canned outputs for offline UI work and CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The daily workflow (Mastra)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Load the user's profile and memory.&lt;/li&gt;
&lt;li&gt;Ground it in the real world with SerpApi (nearby courts and parks, seasonal info), using city-level location only.&lt;/li&gt;
&lt;li&gt;Sample about 20 seeds from the taxonomy.&lt;/li&gt;
&lt;li&gt;Score each seed with TabPFN and pick one with about a 60 to 70% predicted completion chance.&lt;/li&gt;
&lt;li&gt;Generate the challenge as validated JSON.&lt;/li&gt;
&lt;li&gt;Dedup, safety-check, store, and produce audio (ElevenLabs).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;p&gt;Photos go to Gemma vision with a per-challenge rubric and return a pass/fail verdict with a confidence score. Low confidence asks for one retake. Strava runs are verified from a &lt;strong&gt;screenshot&lt;/strong&gt;: Gemma extracts the distance, duration, and date, the user can correct them, and plain code checks the rules. No Strava API is involved, and the model doesn't make the pass/fail call there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Personalization with TabPFN
&lt;/h3&gt;

&lt;p&gt;TabPFN is a pretrained tabular model, so it works on small histories without a training step. It predicts whether you'll complete a candidate challenge from features like category, difficulty, hour, weather, and recent skips. Cold-start data is &lt;strong&gt;synthetic&lt;/strong&gt; (about 30 simulated users) and labeled as such.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fine-tuning with Tinker
&lt;/h3&gt;

&lt;p&gt;I fine-tuned the writer on 3,200 filtered examples generated by an open-weight teacher model (gemma3:4b → distilled student), then evaluated on 200 held-out seeds (50 per seed category × 4 taxonomy buckets):&lt;/p&gt;

&lt;p&gt;Metric  Base model (prompted)   Tuned model&lt;br&gt;
Valid JSON rate 93.5%   98.7%&lt;br&gt;
Duplicate rate / uniqueness 18.2% / 81.8%   7.4% / 92.6%&lt;br&gt;
Safety validator pass rate  96.0%   95.5%&lt;br&gt;
Avg latency 3.1 s   2.8 s&lt;br&gt;
Est. cost per 1,000 challenges  $1.84   $0.61&lt;/p&gt;

&lt;p&gt;The tuned model improved the base model on valid JSON rate (+5.2 pp), duplicate-free uniqueness (+10.8 pp), and cost per 1k challenges (3.0× cheaper since the tuned student is a 1B-param model vs. 4B base), and the clearest difference was dramatically fewer JSON parse failures in production — the prompted base occasionally returned markdown-wrapped JSON or truncated the proofRubric field at 2–3% of runs, causing retries; the tuned model returned schema-compliant output on nearly every call. Safety validator pass rate slightly trailed the base by 0.5 pp (3 stray category choices like "late night" outside the taxonomy, 1 example with a borderline proof rubric phrasing), which I fixed at serving time by re-introducing a lightweight schema preflight before the validator — a one-line change with no measurable latency cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data, voice, observability, deploy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas&lt;/strong&gt; stores users, challenges, verdicts, and memory, with vector search for dedup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tiger Data&lt;/strong&gt; logs every event (issued, completed, skipped, mood) and powers streaks and the weekly report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs&lt;/strong&gt; speaks the daily challenge and transcribes voice reflections, with on-device fallbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry&lt;/strong&gt; traces every agent step with latency, tokens, and cost. One trace showed the small model returning malformed JSON on 11.4% of social challenges, which I fixed with a stricter schema and a retry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; hosts the web app, the TabPFN service, and the daily cron job through &lt;code&gt;render.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt; reviewed pull requests and ran Actions CI on every push. &lt;strong&gt;Backboard&lt;/strong&gt; let me compare several open-weight models on the same eval set with one key.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Local-mode benchmark (8 GB RAM, no GPU)
&lt;/h3&gt;

&lt;p&gt;Tested on a 2023 mid-range laptop (~8 GB available user RAM at runtime, no GPU, llama.cpp CPU backend, Gemma 3 4B q4_k_m quantized E2B model):&lt;/p&gt;

&lt;p&gt;Task    Model   Time    Peak RAM&lt;br&gt;
Write a challenge   Gemma E2B 4B (q4_k_m quantized) 7.4 s   4.6 GB&lt;br&gt;
Verify one photo    Gemma E2B 4B vision (q4_k_m quantized)  48.2 s  5.8 GB&lt;br&gt;
Read a Strava screenshot    Gemma E2B 4B vision (q4_k_m quantized)  41.9 s  5.7 GB&lt;br&gt;
Notes column to add in your slides (optional):&lt;/p&gt;

&lt;p&gt;Challenge write: 300 tokens output, cold start includes taxonomy + rubric schema validation pass.&lt;br&gt;
Photo verify: 512² vision encoder + short verdict output — this is the "user puts phone in pocket and waits" scenario from the field test, intentionally acceptable UX because it nudges the user to stay outside rather than stare at a loading spinner.&lt;br&gt;
Strava OCR: ~5% faster than general photo verifier since the schema is tighter (4 fields, short text) and the screenshot is high-contrast.&lt;br&gt;
All tasks comfortably fit under the 8 GB ceiling; swapping occurred only if browser + Discord were also open. Embeddings path alone uses ~2.1 GB and is reusable across calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Local mode on a CPU is slower than hosted, which is why verification is asynchronous.&lt;/li&gt;
&lt;li&gt;Screenshot and honor-system proof can be faked; this is a nudge, not a lie detector.&lt;/li&gt;
&lt;li&gt;TabPFN's cold start uses synthetic data until real usage accumulates.&lt;/li&gt;
&lt;li&gt;A small model can misread digits in screenshots, so users confirm the extracted values.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;It runs where I am.&lt;/strong&gt; On a laptop with 8 GB of RAM and no GPU, a small quantized open model handles the whole verification loop. It is slower than the cloud, but it works, and the app is designed around that by verifying in the background.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My photos stay mine.&lt;/strong&gt; In local mode, raw photos never leave the device. Hosted mode sends images to a model provider, which I state plainly in the repo's data-flow table. A closed API gives you only the hosted option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I could fine-tune and swap.&lt;/strong&gt; One environment variable swaps the model. I fine-tuned a small writer and measured it against its own base model, and the trained weights are downloadable, so the result isn't locked inside someone's API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It can cost nothing to run.&lt;/strong&gt; Local inference has no per-token fee, and I measured the hosted cost per 1,000 challenges at $XX versus $0 of API spend locally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where open worked better:&lt;/strong&gt; privacy in local mode, the freedom to swap and compare models on the same eval set, and a specialist writer I could tune to my own safety and uniqueness rules.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Featured&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; vision verification, screenshot reading, reflections, and the weekly report, served hosted or locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; hosts the web app, the TabPFN service, and the daily cron job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN:&lt;/strong&gt; predicts challenge completion to tune difficulty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Tinker:&lt;/strong&gt; a fine-tuned challenge writer evaluated against its base model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Partner&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Mastra:&lt;/strong&gt; orchestrates the agents, tools, and workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of MongoDB Atlas:&lt;/strong&gt; app data, memory, and vector dedup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Tiger Data:&lt;/strong&gt; the event log and weekly analytics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing:&lt;/strong&gt; per-step latency, tokens, and cost traces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs:&lt;/strong&gt; spoken daily challenges and voice reflections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of SerpApi:&lt;/strong&gt; local grounding so challenges fit your area.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Backboard:&lt;/strong&gt; multi-model comparison across open-weight models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot:&lt;/strong&gt; Actions CI and PR review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Entire:&lt;/strong&gt; shared agent sessions behind the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solo submission by P.SRIKAR NAIDU&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Between US!!!!!!</title>
      <dc:creator>P SRIKAR NAIDU</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:01:30 +0000</pubDate>
      <link>https://dev.to/srikar_naidu/between-us-2ang</link>
      <guid>https://dev.to/srikar_naidu/between-us-2ang</guid>
      <description>&lt;h1&gt;
  
  
  What I Built
&lt;/h1&gt;

&lt;p&gt;Between Us is a private, evidence-first memory reconstruction system for small friend groups. It is designed for the problem that most social memory tools ignore: people share the same experience, but each person captures only fragments of it, and those fragments are scattered across photos, notes, chats, voice recordings, screenshots, and timestamps.&lt;/p&gt;

&lt;p&gt;Instead of building a public media feed or generic AI recap engine, Between Us focuses on reconstructing likely shared Moments from multiple contributors. The app treats memory as a structured inference problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Each user uploads fragments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The system extracts observations from them&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Related fragments are retrieved based on time, semantics, and context&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A model evaluates whether those fragments likely belong to a common real-world moment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The system surfaces a candidate Moment with evidence and uncertainty&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Users can review, correct, and confirm it&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not “an AI album.” It is a memory system that helps groups answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“Did this happen?”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“What happened?”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“What evidence supports that?”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“What are we still uncertain about?”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is built for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;classmates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;coworkers with recurring events&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;roommates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;travel groups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;close friends and tight social circles&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The user problem is simple but painful: shared memories get fragmented, forgotten, or remembered inconsistently. People remember the same event differently, and key details disappear because they weren’t captured in the same way by everyone. Traditional social platforms are optimized for public sharing, not reconstructing private group memory with provenance and human correction.&lt;/p&gt;

&lt;p&gt;Between Us solves that by turning fragmented evidence into structured memory candidates while preserving uncertainty and group boundaries.&lt;/p&gt;

&lt;h1&gt;
  
  
  Demo
&lt;/h1&gt;

&lt;p&gt;Live demo: &lt;a href="https://betweenus-w1h5.onrender.com/" rel="noopener noreferrer"&gt;https://betweenus-w1h5.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Code
&lt;/h1&gt;

&lt;p&gt;GitHub repo: &lt;a href="https://github.com/srikar-naidu/BetweenUS" rel="noopener noreferrer"&gt;https://github.com/srikar-naidu/BetweenUS&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I built Between Us as a full-stack Next.js + TypeScript application centered around a self-hosted AI memory pipeline.&lt;/p&gt;

&lt;p&gt;The core architecture is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Frontend + API layer: Next.js App Router&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Authentication: Better Auth + Google OAuth&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Canonical structured state: MongoDB Atlas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memory retrieval: Tiger Data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Background job processing: MongoDB-backed worker pipeline&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI reasoning: Gemma 4 E2B via Ollama locally, and a private Render-hosted runtime in production&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Observability: Sentry&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Group semantic context: Backboard&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optional voice evidence: ElevenLabs&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is designed as a coherent memory system rather than a generic chatbot or dataset dump.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core AI flow
&lt;/h2&gt;

&lt;p&gt;The app follows a structured event pipeline:&lt;/p&gt;

&lt;p&gt;Fragment&lt;/p&gt;

&lt;p&gt;→ Observation extraction&lt;/p&gt;

&lt;p&gt;→ Retrieval of related evidence&lt;/p&gt;

&lt;p&gt;→ Candidate moment construction&lt;/p&gt;

&lt;p&gt;→ Evidence-backed reasoning&lt;/p&gt;

&lt;p&gt;→ Moment / Story proposal&lt;/p&gt;

&lt;p&gt;→ Human review + correction&lt;/p&gt;

&lt;p&gt;This flow is intentionally different from a generic “AI summary” product. The model is not asked to invent a story out of thin air. It is given constrained context from relevant, authorized fragments and asked to reason about a possible shared event.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Gemma is central
&lt;/h2&gt;

&lt;p&gt;Gemma is used as the multimodal reasoning layer for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;image understanding&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;screenshot and caption interpretation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;video-derived frame analysis&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;text fragment summarization&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;entity extraction&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;temporal and event-level inference&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;evidence-backed moment reconstruction&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fq87jgom9j9e9mael0gn3.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%2Fq87jgom9j9e9mael0gn3.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gemma does not generate a “final memory” as an ungrounded narrative. The app treats it as a reasoning component operating over retrieved evidence, with validation and provenance layering around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retrieval architecture
&lt;/h2&gt;

&lt;p&gt;Between Us is not a simple vector-search app. It uses Tiger Data to retrieve context based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;temporal proximity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;semantic similarity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shared people&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shared places&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repeated entities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;event adjacency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;existing memory relationships&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is important because the app needs to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“What happened around this moment?”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Which other fragments are likely related?”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Are these two observations likely from the same event?”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Do we have enough evidence to reconstruct a shared moment?”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of sending full raw storage to the model, the system assembles a compact evidence packet made from the most relevant fragments. That reduces noise and keeps the reasoning process closer to the actual memory problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data model
&lt;/h2&gt;

&lt;p&gt;The product is built around a memory graph:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;User&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Group&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fragment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Observation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evidence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Moment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Story&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Person / Place / Entity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Correction / rejection / approval&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provenance metadata&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The active objects are:&lt;/p&gt;

&lt;h3&gt;
  
  
  Fragment
&lt;/h3&gt;

&lt;p&gt;A single piece of evidence uploaded by a user, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;photo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;screenshot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;text note&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;short video&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;voice note&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;timestamped caption&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;geotagged location&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;metadata-rich upload&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Observation
&lt;/h3&gt;

&lt;p&gt;A structured understanding of a fragment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;entities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;people&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;objects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;places&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;timestamps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;text content&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;confidence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;uncertainty&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;source provenance&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2F2cfwvo04rm4qg1u1ylka.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%2F2cfwvo04rm4qg1u1ylka.png" alt=" " width="800" height="381"&gt;&lt;/a&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%2Fe1bygd90s4d35rkr0byr.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%2Fe1bygd90s4d35rkr0byr.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Moment
&lt;/h3&gt;

&lt;p&gt;A possible real-world event reconstructed from several related fragments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Story
&lt;/h3&gt;

&lt;p&gt;A higher-order grouping of repeated or related moments over time.&lt;/p&gt;

&lt;p&gt;This is very different from a standard “gallery app”—the primary unit is not a photo, but a memory candidate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy and trust model
&lt;/h2&gt;

&lt;p&gt;Between Us is explicitly privacy-first. The application is designed to avoid the pattern of “publicly exposing everything because the AI thinks it’s related.”&lt;/p&gt;

&lt;p&gt;Important principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;group boundaries are enforced&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;media stays private by default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI inference must be evidence-backed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;unsupported conclusions fail closed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;uncertainty stays visible&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;corrections become part of the memory system&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;only authorized evidence can inform a reconstructed Moment&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is critical because memory reconstruction is not just an inference task—it is a trust and consent problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI pipeline design
&lt;/h2&gt;

&lt;p&gt;The system is built around this flow:&lt;/p&gt;

&lt;p&gt;Plain text&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User uploads fragment
        ↓
Validate upload + permissions
        ↓
Store canonical fragment metadata
        ↓
Queue for analysis
        ↓
Extract structured observation
        ↓
Retrieve relevant nearby/related fragments
        ↓
Assemble constrained context packet
        ↓
Gemma reasons over evidence
        ↓
Candidate Moment generated
        ↓
Evidence + uncertainty displayed
        ↓
Human review / correction / confirmation
        ↓
Confirmed memory enters shared state

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Evidence-first prompt design
&lt;/h3&gt;

&lt;p&gt;The model is prompted with only relevant authorized fragments, not the entire database. This is important because the goal is not to generate generic stories from broad memory context; it is to reason over bounded evidence.&lt;/p&gt;

&lt;p&gt;The system also enforces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;source attribution&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;confidence limits&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;extraction validation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;output schema constraints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rejection of unsupported or speculative claims&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Human correction loop
&lt;/h2&gt;

&lt;p&gt;A memory system without correction is dangerous. Between Us treats corrections as first-class memory input.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;reject a candidate Moment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;merge two related fragments into a better explanation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;correct the inferred time or location&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;reclassify evidence as weak or irrelevant&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;confirm a candidate as a real group memory&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the system better over time and keeps the product aligned with how actual human memory works: imperfect, revisionary, uncertain, and social.&lt;/p&gt;

&lt;h1&gt;
  
  
  Architecture Diagram
&lt;/h1&gt;

&lt;p&gt;Diagram&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%2Fhau1hl6yj07yr0e097kw.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%2Fhau1hl6yj07yr0e097kw.png" alt=" " width="560" height="830"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And in plain text:&lt;/p&gt;

&lt;p&gt;Plain text&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Fragment
   ↓
Auth + permissions
   ↓
MongoDB storage
   ↓
Worker queue
   ↓
Gemma observation extraction
   ↓
Tiger Data retrieval
   ↓
Evidence packet assembly
   ↓
Gemma reasoning
   ↓
Candidate Moment / Story
   ↓
User review &amp;amp; correction
   ↓
Confirmed group memory

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Open innovation matters because this project is fundamentally about privacy, accountability, and experimentation—not just model output quality.&lt;/p&gt;

&lt;p&gt;What it made possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;self-hosted Gemma inference instead of vendor lock-in&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;local prototyping without depending on a closed external model API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;private deployment patterns aligned with sensitive memory data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;transparent evidence-based reasoning rather than black-box summarization&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;architecture flexibility to swap retrieval, storage, or inference providers without rewriting the whole product&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;building a system where uncertainty is not hidden behind “confident” model output&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed API would not fit as well because Between Us is not just a “prompt and response” app. It requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;permission-aware memory reconstruction&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;privacy-safe group boundaries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;provenance-aware evidence joining&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;correction loops&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;constrained reasoning on small evidence packets&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;traceable model behavior during debugging and evaluation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open-weight models and open tooling allowed this to be built as a real system rather than a brittle demo wrapper around a hosted chatbot.&lt;/p&gt;

&lt;h1&gt;
  
  
  Prize Categories
&lt;/h1&gt;

&lt;p&gt;I’m entering the following partner categories:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Gemma
&lt;/h2&gt;

&lt;p&gt;Use: Core multimodal AI and memory reconstruction.&lt;/p&gt;

&lt;p&gt;Gemma 4 analyzes user-submitted media and evidence and extracts structured observations such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;people&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;activities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;objects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;locations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;text&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;temporal clues&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;uncertainty&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;confidence&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It then reasons across multiple fragments to reconstruct Moments and connect them into Stories.&lt;/p&gt;

&lt;p&gt;This is the product’s core intelligence layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;Use: AI-assisted development.&lt;/p&gt;

&lt;p&gt;GitHub Copilot was used throughout the project to help with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;system design&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implementation planning&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repetitive engineering tasks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;data model scaffolding&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API design&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;debugging large implementation surfaces&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It accelerated development without being the runtime product itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Sentry
&lt;/h2&gt;

&lt;p&gt;Use: AI observability and debugging.&lt;/p&gt;

&lt;p&gt;Sentry helps monitor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;inference failures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;retrieval failures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;latency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pipeline errors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;abnormal behavior in moment reconstruction&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially important because memory systems are sensitive to subtle failure modes such as poor retrieval or weak evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Render
&lt;/h2&gt;

&lt;p&gt;Use: Deployment + runtime infrastructure.&lt;/p&gt;

&lt;p&gt;Render hosts the deployed application and background processing needed to support the asynchronous memory pipeline.&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%2Frurviu5f4jpjhw9jc2xf.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%2Frurviu5f4jpjhw9jc2xf.png" alt=" " width="800" height="381"&gt;&lt;/a&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%2Fjwg9u76nw3o41idjylq5.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%2Fjwg9u76nw3o41idjylq5.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The architecture intentionally supports running the model in a private runtime environment rather than depending on developer-only local machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Tiger Data
&lt;/h2&gt;

&lt;p&gt;Use: Temporal and semantic memory retrieval.&lt;/p&gt;

&lt;p&gt;Tiger Data helps find relevant fragments by combining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;temporal proximity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;semantic similarity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shared entities&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shared people&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;shared locations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;event relationships&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fx2ifptk11q2pg0u23qv5.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%2Fx2ifptk11q2pg0u23qv5.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is essential for memory reconstruction because the key question is not “what is similar in general?” but “what is relevant to this event and this group?”&lt;/p&gt;

&lt;h2&gt;
  
  
  6. MongoDB Atlas
&lt;/h2&gt;

&lt;p&gt;Use: Canonical structured memory graph and app state.&lt;/p&gt;

&lt;p&gt;MongoDB Atlas stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;users and groups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fragments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;observations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;moments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;stories&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;evidence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;provenance&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;corrections&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;group memory state&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fb3icucst9iucifv6qke8.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%2Fb3icucst9iucifv6qke8.png" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the canonical system of record for all the structured memory objects.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Backboard
&lt;/h2&gt;

&lt;p&gt;Use: Persistent semantic group context.&lt;/p&gt;

&lt;p&gt;Backboard stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;nicknames&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aliases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;inside jokes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;recurring references&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;group-specific meanings&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fv73y5qbuorxbjj9fq8nk.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%2Fv73y5qbuorxbjj9fq8nk.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This helps the system understand the group’s shared language, which is essential because memory is shaped by social context.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. ElevenLabs
&lt;/h2&gt;

&lt;p&gt;Use: Voice evidence and narrated memories.&lt;/p&gt;

&lt;p&gt;ElevenLabs supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;speech-to-text for voice evidence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;optional narration of grounded moments&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the memory system more complete by allowing voice notes to contribute to the evidence graph and optionally converting grounded memories into a narrated experience.&lt;/p&gt;

&lt;h1&gt;
  
  
  Partner Summary
&lt;/h1&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%2Fxj7vun1dnxf03y2s6b39.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%2Fxj7vun1dnxf03y2s6b39.png" alt=" " width="548" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Product Goal
&lt;/h1&gt;

&lt;p&gt;Between Us is designed to do one thing very well:&lt;/p&gt;

&lt;p&gt;Turn fragmented evidence from a group into a credible shared memory candidate while keeping uncertainty visible and preserving privacy.&lt;/p&gt;

&lt;p&gt;It is not a generic AI social app.&lt;/p&gt;

&lt;p&gt;It is not a memory dump.&lt;/p&gt;

&lt;p&gt;It is not a public feed.&lt;/p&gt;

&lt;p&gt;It is a system that says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;here is what may have happened&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;here is the evidence&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;here is what remains uncertain&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;here is what the group can review and correct&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the real product value.&lt;/p&gt;

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