<?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: Aryan Gupta</title>
    <description>The latest articles on DEV Community by Aryan Gupta (@aryan_gupta_1).</description>
    <link>https://dev.to/aryan_gupta_1</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%2F4156330%2Ff091676f-4eb6-43b0-8063-9c3b603442f8.png</url>
      <title>DEV Community: Aryan Gupta</title>
      <link>https://dev.to/aryan_gupta_1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aryan_gupta_1"/>
    <language>en</language>
    <item>
      <title>Promise Keeper: Never Forget What You Promised, Even in Hinglish</title>
      <dc:creator>Aryan Gupta</dc:creator>
      <pubDate>Sat, 03 Oct 2026 07:22:12 +0000</pubDate>
      <link>https://dev.to/aryan_gupta_1/promise-keeper-never-forget-what-you-promised-even-in-hinglish-3pki</link>
      <guid>https://dev.to/aryan_gupta_1/promise-keeper-never-forget-what-you-promised-even-in-hinglish-3pki</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;Promise Keeper&lt;/strong&gt; is a small app that remembers what you promised people.&lt;/p&gt;

&lt;p&gt;I built it for my friend Amit, who makes a lot of promises in a lot of chats and has forgotten most of them by the end of the day.&lt;/p&gt;

&lt;p&gt;The problem isn't making promises. It's that they get buried in messages. A to-do app doesn't help, because nobody stops mid-conversation to write down "told Rahul I'd call tomorrow."&lt;/p&gt;

&lt;p&gt;So Promise Keeper works from the message itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paste something you said&lt;/strong&gt;, in English or Hinglish ("Kal subah main tumhe call karunga"). It extracts the promise, who it's owed to, and the deadline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import a WhatsApp chat export.&lt;/strong&gt; It reads only &lt;em&gt;your&lt;/em&gt; lines and finds promises you probably forgot. "Tomorrow" is resolved relative to when you &lt;em&gt;said&lt;/em&gt; it, so a promise from last week correctly shows up as overdue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You confirm everything&lt;/strong&gt; with date and time pickers before anything is saved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"What am I forgetting?"&lt;/strong&gt; gives an honest list: overdue first, then coming up, then no deadline. You can also group by person ("what do I owe Rahul?").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Draft a nudge&lt;/strong&gt; for an overdue promise: a short, honest "still on it" message you can edit and send.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;🎥 &lt;a href="https://github.com/aryanguptacsvtu/Promise-Keeper/blob/main/docs/demo-video.mp4" rel="noopener noreferrer"&gt;Watch the demo video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I didn't deploy a hosted version on purpose. The app reads private chats, so hosting it would defeat the point. It runs on your own machine in about five minutes (setup is in the README).&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/aryanguptacsvtu" rel="noopener noreferrer"&gt;
        aryanguptacsvtu
      &lt;/a&gt; / &lt;a href="https://github.com/aryanguptacsvtu/Promise-Keeper" rel="noopener noreferrer"&gt;
        Promise-Keeper
      &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;📝 Promise Keeper&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Built for a friend for the Hacktoberfest Weekend Challenge: &lt;em&gt;Build for a Friend&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A local-first assistant that remembers what you promised people. Paste a message
("I'll send you the report tonight" or "Kal subah main tumhe call karunga"), confirm what it found
and later ask &lt;strong&gt;"What am I forgetting?"&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/aryanguptacsvtu/Promise-Keeper/docs/image.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%2Faryanguptacsvtu%2FPromise-Keeper%2FHEAD%2Fdocs%2Fimage.png" alt="Promise Keeper"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open-source core:&lt;/strong&gt; an open-weight model (&lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;Gemma 3&lt;/a&gt;) running locally through
&lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;, with storage in SQLite. No API keys, no accounts, works with Wi-Fi off.
Your messages and relationships never leave your machine.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Requires &lt;strong&gt;Python 3.10+&lt;/strong&gt; and &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 1. Pull a small open-weight model&lt;/span&gt;
ollama pull gemma3:4b

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 2. Install and configure&lt;/span&gt;
python -m venv .venv &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="pl-c1"&gt;source&lt;/span&gt; .venv/bin/activate      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Windows: .venv\Scripts\activate&lt;/span&gt;
pip install -r requirements.txt
cp .env.example .env                                   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Windows: copy .env.example .env&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 3. Start the app&lt;/span&gt;
streamlit run app.py&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Settings live in &lt;code&gt;.env&lt;/code&gt; (git-ignored). No API keys are…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/aryanguptacsvtu/Promise-Keeper" 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 AI is &lt;strong&gt;Gemma 3 (4B)&lt;/strong&gt;, an open-weight model from Google, running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. The app itself is Streamlit and SQLite. There are no API keys, accounts or remote servers.&lt;/p&gt;

&lt;p&gt;A few design decisions matter more than the model choice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model never does date maths.&lt;/strong&gt; Small models are bad at calendars. So the model only copies the phrase ("kal subah", "by Monday"), and plain Python turns it into a real date. That code has 30 test cases, including Hinglish like "5 baje" and "parso shaam".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "what am I forgetting?" list never comes from the model.&lt;/strong&gt; It's a database query. A language model asked "what did I promise?" can invent things, which is the worst thing a reminder app can do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured output.&lt;/strong&gt; The model is constrained to a JSON schema, so I get promises I can parse, not paragraphs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A human confirms everything.&lt;/strong&gt; Low-confidence guesses are dropped, and nothing is saved until you check it. Casual chat like "lol nice", "I won't be able to make it" and "if I get time I'll try" should produce nothing, and I wrote test cases for those.&lt;/p&gt;

&lt;p&gt;I compared models on 20 labelled messages (13 plain, 3 Hinglish, 4 tricky cases like negation and past tense):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Right # of promises&lt;/th&gt;
&lt;th&gt;Deadlines&lt;/th&gt;
&lt;th&gt;core&lt;/th&gt;
&lt;th&gt;edge&lt;/th&gt;
&lt;th&gt;hinglish&lt;/th&gt;
&lt;th&gt;Avg s/msg&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma3:4b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;17/20&lt;/td&gt;
&lt;td&gt;20/20&lt;/td&gt;
&lt;td&gt;11/13&lt;/td&gt;
&lt;td&gt;3/4&lt;/td&gt;
&lt;td&gt;3/3&lt;/td&gt;
&lt;td&gt;8.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen2.5:3b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;18/20&lt;/td&gt;
&lt;td&gt;20/20&lt;/td&gt;
&lt;td&gt;11/13&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;3/3&lt;/td&gt;
&lt;td&gt;3.6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two models are effectively tied. With 20 cases, a one-case gap isn't evidence that either is better. Both got every deadline and every Hinglish message right. Qwen was about twice as fast, which matters when importing a long chat.&lt;/p&gt;

&lt;p&gt;Both made the &lt;strong&gt;same two mistakes&lt;/strong&gt;: they treated a request ("Can you send me the notes by tonight?") and someone else's action ("Rahul will send the files tomorrow") as my own promises. Gemma also extracted a past-tense statement ("I sent you the report yesterday"). Since both models fail the same way, I read these as prompt weaknesses rather than model weaknesses, and they're the reason every extraction goes through human confirmation. The test set is small and the timings come from one machine, so treat the numbers as rough.&lt;/p&gt;

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

&lt;p&gt;A promise tracker reads your private conversations: who you talk to, what you owe them, what you've been avoiding. That's about as personal as data gets. Amit shouldn't have to send it to a company's servers to get a reminder.&lt;/p&gt;

&lt;p&gt;Open weights made three things possible that a closed API wouldn't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nothing leaves the machine.&lt;/strong&gt; The data stays on the device by design, not by a privacy policy I'm asking you to trust. The demo video shows it running with Wi-Fi off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; There's no per-message bill, so scanning a whole year of a chat export is fine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swapping models is a one-line change.&lt;/strong&gt; The same app runs Gemma, Qwen or Llama by changing a name in the sidebar. That let me measure the models against each other on my own cases instead of accepting what one vendor offers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also a language angle. Hinglish, meaning Hindi written in English letters, is how many people actually text. With open models I can test it directly, and eventually fine-tune for it. That's on my list for next steps.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma:&lt;/strong&gt; Gemma 3 4B is the core extraction model, running locally via Ollama. I benchmarked it against Qwen 2.5 on my own labelled cases, including Hinglish.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>INTRO</title>
      <dc:creator>Aryan Gupta</dc:creator>
      <pubDate>Fri, 02 Oct 2026 05:17:23 +0000</pubDate>
      <link>https://dev.to/aryan_gupta_1/intro-147c</link>
      <guid>https://dev.to/aryan_gupta_1/intro-147c</guid>
      <description>&lt;p&gt;I am new to the community, happy to be part of DEV.&lt;/p&gt;

&lt;p&gt;My Socials :&lt;br&gt;
&lt;a href="https://github.com/aryanguptacsvtu" rel="noopener noreferrer"&gt;https://github.com/aryanguptacsvtu&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/aryan-gupta-27814a306/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/aryan-gupta-27814a306/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
