<?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: Hammad Bin Sajjad</title>
    <description>The latest articles on DEV Community by Hammad Bin Sajjad (@hammad_binsajjad_7a6599d).</description>
    <link>https://dev.to/hammad_binsajjad_7a6599d</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%2F1495149%2Ffaa9ba70-d260-4f21-9f2d-93191285f8fd.jpg</url>
      <title>DEV Community: Hammad Bin Sajjad</title>
      <link>https://dev.to/hammad_binsajjad_7a6599d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hammad_binsajjad_7a6599d"/>
    <language>en</language>
    <item>
      <title>Roll-Call — The AI Teammate That Writes Your Standups From GitHub &amp; Linear</title>
      <dc:creator>Hammad Bin Sajjad</dc:creator>
      <pubDate>Mon, 19 Oct 2026 00:47:23 +0000</pubDate>
      <link>https://dev.to/hammad_binsajjad_7a6599d/roll-call-the-ai-teammate-that-writes-your-standups-from-github-linear-5fkg</link>
      <guid>https://dev.to/hammad_binsajjad_7a6599d/roll-call-the-ai-teammate-that-writes-your-standups-from-github-linear-5fkg</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;Picture the daily standup. The whole team gathers — remote folks dial in — and each person recites what they did yesterday from memory. Nobody likes these meetings. The updates get fudged, the quiet work goes unmentioned, and thirty minutes of everyone's day is spent talking about work instead of doing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roll-Call is the AI teammate that sits in the meeting so nobody has to.&lt;/strong&gt; Every night, automatically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It reads the team's real activity&lt;/strong&gt; — pull requests, commits and pushes from GitHub, issues and comments from Linear. PRs touched today are separated from ongoing work, and every issue is cross-linked to the PR that implements it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An open-weight Gemma model writes a plain-English standup&lt;/strong&gt; for each team member.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything is stored in MongoDB Atlas&lt;/strong&gt; — and every report is uploaded to &lt;strong&gt;Backboard&lt;/strong&gt; as a document, so the chat agent is grounded in the team's real history through RAG. Ask &lt;em&gt;"who touched the auth service this week?"&lt;/em&gt; and it answers from ingested data — with a tool that pulls live reports straight from MongoDB when it needs fresh facts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;That's the whole standup.&lt;/strong&gt; One dashboard card per person, ready when you wake up. No meeting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And this is a real, unedited output — Roll-Call tracking its own development:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hammad Bin Sajjad&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Completed Work&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ingestion of Linear issues and Github PRs (ROL-5):&lt;/strong&gt; Implemented the ingestion layer, including GitHub PR and Linear issue data retrieval, LLM processing with Gemma, and MongoDB storage. This was completed via PR #2 (branch ROL-5) with commits covering LiteLLM/DB boilerplate and final database integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate Ingestion using Github Actions Workflow (ROL-6):&lt;/strong&gt; Set up a GitHub Actions workflow to automate data ingestion at 1 AM UTC. This was implemented in PR #3 (branch ROL-6).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roll Call Frontend (ROL-8):&lt;/strong&gt; Implemented the frontend using HTML, CSS, and JS. This work was captured in PR #4 (branch ROL-8), which included updates to system architecture design diagrams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roll Call Backend (ROL-7):&lt;/strong&gt; Implemented the backend APIs, including Backboard Chat integration. This was completed via PR #5 (branch ROL-7), with commits addressing backend implementation, model settings, and error fixes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool output in message bug fix (ROL-10):&lt;/strong&gt; Fixed a bug regarding tool output in messages via PR #6 (branch ROL-10).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry Agent Tracing (ROL-9):&lt;/strong&gt; Integrated Sentry error and agent tracing for both ingestion (LiteLLM) and chat (Backboard). This was handled in PR #7 (branch ROL-9), which included fixing Sentry sample-rate crashes and workflow changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ongoing Work&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FE and BE Bug Fixes (ROL-10):&lt;/strong&gt; Ongoing work to address bugs identified during production testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Direct Pushes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pushed a fix for commit duplication to the Roll-Call repository.&lt;/li&gt;
&lt;li&gt;Pushed an update to the API URL in the Roll-Call repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note what the model got right: every PR is tied to the Linear issue it implements, completed work is separated from ongoing work, and even the direct pushes (commits that never went through a PR) made it in — while only stating what the data shows. The system prompt forbids inventing activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who pays for this:&lt;/strong&gt; engineering leads and project managers of small remote teams (5–20 people), and agencies juggling client repos. Existing tools still make humans do the work — typing updates into a form, or sitting through the meeting. Roll-Call reads the sources of truth directly — so nobody has to remember anything, and nobody has to report anything.&lt;/p&gt;

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

&lt;p&gt;Live on Render: &lt;strong&gt;&lt;a href="https://roll-call-frontend-2xea.onrender.com" rel="noopener noreferrer"&gt;https://roll-call-frontend-2xea.onrender.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Registration is open — create an account and everything's live. One heads-up: if the backend has been idle, the first request can take 30–60 seconds to wake it up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summaries&lt;/strong&gt; — the standup, already written, one card per member:&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%2Fzp6ysr9q7cwpku5tffzn.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%2Fzp6ysr9q7cwpku5tffzn.png" alt="Summaries dashboard" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Config&lt;/strong&gt; — manage tracked repos and team members from the UI:&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%2F9xz7nsaadtqiyzgt8y1d.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%2F9xz7nsaadtqiyzgt8y1d.png" alt="Config page" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chat&lt;/strong&gt; — the agent answers from ingested history, citing the PRs and issues behind every answer:&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%2Fcbsdhgsfxraoi1ilk4py.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%2Fcbsdhgsfxraoi1ilk4py.png" alt="Chat page" width="800" height="475"&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/hammadbinsajjad" rel="noopener noreferrer"&gt;
        hammadbinsajjad
      &lt;/a&gt; / &lt;a href="https://github.com/hammadbinsajjad/Roll-Call" rel="noopener noreferrer"&gt;
        Roll-Call
      &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;Roll-Call&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Roll-Call is an AI team-reporting agent. It automatically ingests your team's daily
activity from &lt;strong&gt;GitHub&lt;/strong&gt; (pull requests, commits, direct pushes) and &lt;strong&gt;Linear&lt;/strong&gt; (issues
comments), generates a plain-English standup summary per member with an open-weight
&lt;strong&gt;Gemma&lt;/strong&gt; model, stores everything in &lt;strong&gt;MongoDB Atlas&lt;/strong&gt;, and exposes it through a chat
interface where an agent — grounded in the ingested data via RAG — answers questions
about who worked on what, and when.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/hammadbinsajjad/Roll-Call/architecture/system-data-flow-design.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%2Fhammadbinsajjad%2FRoll-Call%2FHEAD%2Farchitecture%2Fsystem-data-flow-design.png" alt="System data flow design"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Source: &lt;code&gt;architecture/system-data-flow-design.png&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Summaries&lt;/strong&gt; — daily standup dashboard, one card per team member:&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/hammadbinsajjad/Roll-Call/screenshots/summaries.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%2Fhammadbinsajjad%2FRoll-Call%2FHEAD%2Fscreenshots%2Fsummaries.png" alt="Summaries page"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Config&lt;/strong&gt; — manage the tracked repos and team members:&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/hammadbinsajjad/Roll-Call/screenshots/config.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%2Fhammadbinsajjad%2FRoll-Call%2FHEAD%2Fscreenshots%2Fconfig.png" alt="Config page"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chat&lt;/strong&gt; — ask the agent about the team's work, grounded in the ingested data:&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/hammadbinsajjad/Roll-Call/screenshots/chat.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%2Fhammadbinsajjad%2FRoll-Call%2FHEAD%2Fscreenshots%2Fchat.png" alt="Chat page"&gt;&lt;/a&gt;&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;Ingestion&lt;/strong&gt; (&lt;code&gt;ingestion/&lt;/code&gt;) — a scheduled GitHub Actions workflow runs nightly at
01:00 UTC (reporting the completed previous day)
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;github.py&lt;/code&gt; walks open PRs per repo, marking the ones touched today (commits
reviews, merges) vs. ongoing; direct pushes…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hammadbinsajjad/Roll-Call" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ingestion/      Nightly pipeline — GitHub + Linear → Gemma → MongoDB → Backboard
backend/        FastAPI app — auth, summaries, config, chats, /embed
frontend/       Static UI, no build step
.github/        Workflows — nightly ingestion + deploy pipelines
render.yaml     Render Blueprint — both services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;One loop: &lt;strong&gt;collect → summarize → store → ground → answer.&lt;/strong&gt; The whole data flow:&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%2Fogdccfh2vv5dkbdpz523.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%2Fogdccfh2vv5dkbdpz523.png" alt="System data flow design" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nightly ingestion (GitHub Actions, 01:00 UTC).&lt;/strong&gt; Collectors pull GitHub PRs/commits/pushes and Linear issues/comments, cross-link issues to the PRs implementing them, and build one payload per member. Then &lt;strong&gt;Gemma&lt;/strong&gt; writes each standup through &lt;code&gt;litellm&lt;/code&gt;. This is the only AI part that can work fully locally — the chat can't run locally, because it depends on Backboard. During development I tested the ingestion with &lt;strong&gt;Gemma 4 E4B&lt;/strong&gt; on my own machine; the hosted pipeline runs &lt;strong&gt;Gemma 4 26B A4B via OpenRouter&lt;/strong&gt;. Members with no activity skip the LLM call entirely — quiet days cost nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage (MongoDB Atlas).&lt;/strong&gt; One &lt;code&gt;roll_call&lt;/code&gt; database shared by the pipeline (writer) and the API (reader). Each report is also POSTed to the backend's &lt;code&gt;/embed&lt;/code&gt; endpoint — machine-to-machine, secret-token guarded — which uploads it to Backboard, replacing (not duplicating) the old document on re-runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat agent (Backboard).&lt;/strong&gt; Chats map 1:1 to Backboard threads; history lives there, grounded in the uploaded reports. The assistant has one tool — &lt;code&gt;get_daily_summaries&lt;/code&gt; — querying live reports from MongoDB. The chat runs on &lt;strong&gt;Gemma 4 26B A4B via OpenRouter&lt;/strong&gt;, the only model this assistant runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend (FastAPI).&lt;/strong&gt; The only thing the browser talks to: JWT auth, per-user quotas checked in MongoDB &lt;em&gt;before&lt;/em&gt; any AI call (rejected users cost nothing), and rate-limited chat endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend.&lt;/strong&gt; Plain HTML/CSS/vanilla JS, no build step — deploys to static hosting as-is, with a "Terminal Green" dark theme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting &amp;amp; deploys (Render + GitHub Actions).&lt;/strong&gt; &lt;code&gt;render.yaml&lt;/code&gt; defines both services. Auto-deploys are off — pushes to &lt;code&gt;main&lt;/code&gt; trigger Actions workflows that fire each service's deploy hook, so the same automation runs the data pipeline and the releases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry Agent Tracing on both AI paths.&lt;/strong&gt; The ingestion Gemma calls flow through the &lt;code&gt;litellm&lt;/code&gt; integration; the Backboard client (no Sentry integration of its own) got custom &lt;code&gt;gen_ai&lt;/code&gt; span instrumentation with conversation IDs. Both AI paths show up as first-class traces in one dashboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A small footnote I enjoy: even the tooling behind the project is open — the local Gemma test ran on &lt;strong&gt;llama.cpp&lt;/strong&gt;, the architecture diagram above was drawn in &lt;strong&gt;Drawy&lt;/strong&gt; (open source, from KDE), and the code was written primarily with &lt;strong&gt;GLM 5.3, GLM 5.3 Flash, and Mimo V2.6 Pro&lt;/strong&gt; — all open-weight models too.&lt;/p&gt;

&lt;p&gt;Both sides, running live — the nightly ingestion runs, the deployments to Render, and both AI paths traced in Sentry:&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%2Fpnu429x4f6cg6g2jn15w.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%2Fpnu429x4f6cg6g2jn15w.png" alt="GitHub Actions nightly ingestion run" width="800" height="475"&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%2Fgumbqgsnvbkegb89cmr4.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%2Fgumbqgsnvbkegb89cmr4.png" alt="Sentry Agent Tracing — both AI paths in one dashboard" width="800" height="475"&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%2Foy3a17swavo2nyuowenk.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%2Foy3a17swavo2nyuowenk.png" alt="Sentry Agent Tracing — the ingestion Gemma runs" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1. Private data stays on hardware you control.&lt;/strong&gt; Teams can have private data they don't want to send to a closed service — or to any server they don't control. Because Gemma is an open model, they don't have to: they can run it on their own computers, or self-host on their own servers. In my project, the ingestion part — the step that reads private GitHub and Linear activity — can be run fully locally. I tested it during development with &lt;strong&gt;Gemma 4 E4B&lt;/strong&gt; on my own machine, with nothing leaving it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. One model, many providers — and cost goes where it matters.&lt;/strong&gt; Open models work across providers, and not every provider is the same — so you never get stuck with one provider and their pricing. Roll-Call has two uses of AI: the ingestion and the chat. The ingestion happens overnight, when nobody's watching — so it can use a cheaper model or tier — while the faster, more capable models are kept for the customer-facing chat agent. That puts the cost where it matters. This flexibility isn't as extensive with closed providers. &lt;strong&gt;OpenRouter&lt;/strong&gt;, the provider I used, has tiers made for exactly this.&lt;/p&gt;

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

&lt;p&gt;Entering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma powers both AI paths: the standup ingestion — which I tested fully locally with &lt;strong&gt;Gemma 4 E4B&lt;/strong&gt; through &lt;code&gt;litellm&lt;/code&gt;, and which runs hosted on &lt;strong&gt;Gemma 4 26B A4B via OpenRouter&lt;/strong&gt; — and the chat agent on Backboard, running &lt;strong&gt;Gemma 4 26B A4B via OpenRouter&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — the whole product runs on two Render services defined in one &lt;code&gt;render.yaml&lt;/code&gt; Blueprint (FastAPI web service + static site), with GitHub Actions deploy hooks for deliberate releases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot&lt;/strong&gt; — GitHub runs the automation: Actions powers the nightly data-ingestion pipeline (collect GitHub + Linear → Gemma summary → MongoDB → RAG upload) and the deploy pipelines for both services. One cron, one push to &lt;code&gt;main&lt;/code&gt;, and the system works while you sleep.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Backboard&lt;/strong&gt; — the agent's memory and RAG: every ingested GitHub/Linear report is uploaded as a Backboard document, chats run on Backboard threads with a &lt;code&gt;get_daily_summaries&lt;/code&gt; tool&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of MongoDB Atlas&lt;/strong&gt; — the primary database: one &lt;code&gt;roll_call&lt;/code&gt; DB written by the ingestion pipeline and read by the API (repos, team members, daily reports, users, chats), plus the assistant's live tool queries straight from the summaries collection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing&lt;/strong&gt; — both AI paths are traced: the ingestion Gemma calls through the &lt;code&gt;litellm&lt;/code&gt; integration, and the Backboard chat client through custom &lt;code&gt;gen_ai&lt;/code&gt; span instrumentation with conversation IDs and error typing.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Kitchen Companion</title>
      <dc:creator>Hammad Bin Sajjad</dc:creator>
      <pubDate>Mon, 05 Oct 2026 00:01:33 +0000</pubDate>
      <link>https://dev.to/hammad_binsajjad_7a6599d/kitchen-companion-146k</link>
      <guid>https://dev.to/hammad_binsajjad_7a6599d/kitchen-companion-146k</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;&lt;strong&gt;Kitchen Companion&lt;/strong&gt; — a kitchen assistant for my mother, who kept asking me the same question over WhatsApp: &lt;em&gt;"Mere paas aloo, tamatar aur thora chawal bacha hai — kya banaun?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Her fridge is a moving target: leftovers, half-used things, whatever she bought that week. So I built her an app where she photographs her fridge, &lt;strong&gt;fixes the detected ingredient list on screen&lt;/strong&gt; (the vision model sometimes "sees" things that aren't there — she removes those with one tap), and then chats with a warm kitchen companion that suggests meals in &lt;strong&gt;Roman Urdu&lt;/strong&gt; — Urdu written in Latin letters, the way Pakistanis actually text. She can follow up by typing &lt;em&gt;or speaking&lt;/em&gt; ("steps chahiye", "tamatar nahi hai", "guests aa rahe hain"), and the ingredient list and suggestions stay in sync as the conversation evolves.&lt;/p&gt;

&lt;p&gt;It solves the actual problem: "what can I cook with THIS, right now" — not a generic recipe search engine.&lt;/p&gt;

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

&lt;p&gt;Video Recording: &lt;a href="https://drive.google.com/file/d/1CaxfYjIUAkL_-7jGiiiQ0QuF2bavQP8z/view?usp=drive_link" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1CaxfYjIUAkL_-7jGiiiQ0QuF2bavQP8z/view?usp=drive_link&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/hammadbinsajjad" rel="noopener noreferrer"&gt;
        hammadbinsajjad
      &lt;/a&gt; / &lt;a href="https://github.com/hammadbinsajjad/Kitchen-Companion" rel="noopener noreferrer"&gt;
        Kitchen-Companion
      &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;Kitchen Companion&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Photograph your fridge, fix the detected ingredient list on screen, and get meal
suggestions in Roman Urdu from a kitchen companion chatbot that answers typed
&lt;strong&gt;and spoken&lt;/strong&gt; follow-ups.&lt;/p&gt;
&lt;p&gt;All AI runs &lt;strong&gt;locally&lt;/strong&gt; on your laptop via llama.cpp — zero cloud calls at runtime.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Start the model server (first run downloads the model from Hugging Face):&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;./run_model.sh&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start the app (separate terminal):&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/uvicorn server:app --host 0.0.0.0 --port 8000&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On your phone (same Wi-Fi): open &lt;code&gt;http://&amp;lt;laptop-ip&amp;gt;:8000&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;One AI endpoint, &lt;code&gt;POST /api/chat&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;images attached&lt;/strong&gt; → vision turn: returns the detected ingredient list&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;text / audio clip&lt;/strong&gt; → conversation turn: Roman Urdu reply + the full current
ingredient list (so spoken or typed corrections like &lt;em&gt;"tamatar nahi hai"&lt;/em&gt; update
the chips; manual chip ✕ / + add work too)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;images + text/audio&lt;/strong&gt; → vision turn that also…&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/hammadbinsajjad/Kitchen-Companion" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Zero build tooling: plain HTML/JS frontend served by a small FastAPI backend that talks to llama.cpp. One command starts the model, one starts the app.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model&lt;/strong&gt;: Gemma 4 E4B (QAT GGUF) running via &lt;strong&gt;llama.cpp's &lt;code&gt;llama serve&lt;/code&gt;&lt;/strong&gt; on my laptop — chosen because it's natively &lt;strong&gt;multimodal&lt;/strong&gt;: the same model handles vision (fridge photos) &lt;em&gt;and&lt;/em&gt; audio (spoken follow-ups). No speech-to-text layer anywhere — her voice goes straight into the model as &lt;code&gt;input_audio&lt;/code&gt;, and the browser records/re-encodes it to WAV with vanilla JS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One endpoint&lt;/strong&gt;: the whole app is a single &lt;code&gt;POST /api/chat&lt;/code&gt;. The request shape decides the turn — images attached = vision turn, text/audio = conversation turn, both = a vision turn that also acknowledges the note. No intent classifier, no agent framework — routing that can be read off the request metadata should never be inferred.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured output&lt;/strong&gt;: every response is schema-constrained JSON &lt;code&gt;{reply, dishes, ingredients}&lt;/code&gt;. Dish suggestions are separate objects rendered as tappable cards (tap = "steps chahiye"), and the ingredient list rides along in every turn so conversational corrections ("chawal nahi hai") update the chips. Plus defensive parsing for the real world: brace-residue stripping, truncation salvage, case-insensitive dedupe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-in-the-loop by design&lt;/strong&gt;: the edited chip list — not the raw model output — feeds the suggestion pass. The model proposes; my mother disposes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stateless backend&lt;/strong&gt;: conversation history lives in the frontend and is re-sent every turn. Config lives in exactly two files (&lt;code&gt;config.py&lt;/code&gt; / &lt;code&gt;config.js&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Tested mobile-first in DevTools responsive mode for Pixel 8/9 (412 x 915); my mother's phone is the real target.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Because the model is open and runs locally, every photo she takes — her kitchen, her cupboards, the inside of her fridge — &lt;strong&gt;never leaves her home network&lt;/strong&gt;. No cloud, no uploads, no server somewhere holding her family's life in a data center. What's in her fridge is nobody's business but her own, and open weights are the only way that's possible.&lt;/p&gt;

&lt;p&gt;And it just keeps working. No internet? No problem — the laptop on her Wi-Fi is the entire system. The app doesn't care if the connection drops, if a service is down for maintenance, or if a provider changes its pricing overnight. For a tool that lives in the busiest room of a house and gets used daily by my mother, that reliability isn't a nice-to-have; it's the whole point.&lt;/p&gt;

&lt;p&gt;A closed API would have meant mailing her kitchen photos to someone else's server on every single use — and a companion that dies the moment the connection does. Open innovation made this &lt;em&gt;private&lt;/em&gt; and &lt;em&gt;hers&lt;/em&gt; — which was the entire point of building for a friend.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;

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