<?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: Shreyashi Gupta</title>
    <description>The latest articles on DEV Community by Shreyashi Gupta (@shreyashigupta2310).</description>
    <link>https://dev.to/shreyashigupta2310</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%2F4155747%2Fc697d043-532a-4cb1-a025-ee4d8fee2304.jpg</url>
      <title>DEV Community: Shreyashi Gupta</title>
      <link>https://dev.to/shreyashigupta2310</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shreyashigupta2310"/>
    <language>en</language>
    <item>
      <title>I Built PrepBuddy So My Sister Wouldn’t Have to Call Me at 3 AM Before Every Presentation</title>
      <dc:creator>Shreyashi Gupta</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:28:10 +0000</pubDate>
      <link>https://dev.to/shreyashigupta2310/i-built-prepbuddy-so-my-sister-wouldnt-have-to-call-me-at-3-am-before-every-presentation-3e7e</link>
      <guid>https://dev.to/shreyashigupta2310/i-built-prepbuddy-so-my-sister-wouldnt-have-to-call-me-at-3-am-before-every-presentation-3e7e</guid>
      <description>&lt;h2&gt;
  
  
  This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;## The 3 AM call&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My younger sibling had just started architecture college when she called me at 3 AM. She had a presentation and didn't know how to give it.&lt;/p&gt;

&lt;p&gt;I got to work right away. I wrote her a script and gave her tips: open with a hook, pause after the important points, ask the audience a question, change your voice when the idea changes. I marked where to pause and how to say each part.&lt;/p&gt;

&lt;p&gt;Afterwards, two things stayed with me. She keeps forgetting the tips, every single time. And I wondered: what if next time I'm busy, or not around?&lt;/p&gt;

&lt;p&gt;PrepBuddy is my answer. It's me, sitting next to her, as a tool.&lt;/p&gt;

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

&lt;p&gt;You upload your slides as a PDF. PrepBuddy writes a script you can say out loud, one slide at a time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an opening line (a hook on slide 1, a bridge on the others) and short spoken lines&lt;/li&gt;
&lt;li&gt;pauses drawn as blue lines, like dimension lines on an architecture drawing: the longer the pause, the longer the line&lt;/li&gt;
&lt;li&gt;how to say each line: highlighted means stress it, bold means more energy, italic means slow down&lt;/li&gt;
&lt;li&gt;a question for the audience on every second slide&lt;/li&gt;
&lt;li&gt;a delivery tip for each slide&lt;/li&gt;
&lt;li&gt;an "Add this yourself" note for facts the model couldn't know, so it doesn't invent them&lt;/li&gt;
&lt;li&gt;a voice that reads the script back, and a Download PDF button&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Repo: &lt;a href="https://github.com/ShreyashiGupta2310/PrepBuddy" rel="noopener noreferrer"&gt;https://github.com/ShreyashiGupta2310/PrepBuddy&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The browser reads the PDF with pdf.js, so the file stays in the browser. Only the text of each slide is sent on.&lt;/li&gt;
&lt;li&gt;A small Express server sends one slide at a time to Gemma 3 (4B), which runs on my laptop through Ollama.&lt;/li&gt;
&lt;li&gt;Gemma returns JSON: an opening, spoken lines with a tone, a pause length and a speed, an audience question, a delivery tip, and notes on what it couldn't know.&lt;/li&gt;
&lt;li&gt;The server never trusts that JSON. It limits pauses and speeds, replaces unknown tones, strips leftover junk, and retries once if the answer is broken. I needed this: at one point Gemma copied a line of my own instructions into the text of its answer.&lt;/li&gt;
&lt;li&gt;React draws the script, with each pause as a blue line whose length matches the pause.&lt;/li&gt;
&lt;li&gt;When you press Play, the browser's built-in voice speaks one sentence, my code stays silent for exactly the pause in the script, then the next sentence follows. Browser voices can't be told "pause here" reliably, so I make the silence myself.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why one slide at a time: a small model on a laptop can't do many at once. This way the first slide shows up early, and one failure doesn't ruin the whole deck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open innovation mattered
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The model runs on my laptop.&lt;/strong&gt; Gemma 3 through Ollama needs no API key and has no per-use fee. In my setup, slide text goes only to a server and a model on the same machine (localhost). I did not audit network traffic, so I'm not claiming more than that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can change how it behaves.&lt;/strong&gt; The coaching rules are plain text in one file, and I rewrote them several times while testing, for example to make lines shorter and to stop the model inventing facts. The model name is one line in a settings file. I only ran &lt;code&gt;gemma3:4b&lt;/code&gt;, so I haven't compared other models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A student's slides stay in a tool she controls&lt;/strong&gt;, instead of going to a service she doesn't. That is how I designed it. It's a design choice, not a measured guarantee.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did not run a closed model for comparison, so I can't say the open one wrote better scripts. It's slower and smaller than a hosted model: an 11-slide deck took so long on my laptop that I stopped it after two slides. For this project, I chose privacy, no cost per use and control over speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I tested, and what I didn't
&lt;/h2&gt;

&lt;p&gt;Tested on one Windows laptop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemma 3 (4B) through Ollama wrote a script for every slide of a real 4-slide deck.&lt;/li&gt;
&lt;li&gt;Press Play and the browser's built-in voice reads the script, with the line being spoken highlighted. &lt;/li&gt;
&lt;li&gt;Download PDF opens the browser's print dialog with the pause lines kept. I checked the preview.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not tested:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Running with the network turned off.&lt;/strong&gt; The app is built to run on one laptop, but I didn't test it in airplane mode, so I'm not claiming it works offline.&lt;/li&gt;
&lt;li&gt;The voice picker. I only checked that it lists the English voices installed on my laptop.&lt;/li&gt;
&lt;li&gt;Other browsers, macOS or Linux, and long decks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What my sibling said
&lt;/h2&gt;

&lt;p&gt;I told her about it and she's excited to use it. She hasn't used it yet, so I don't have her feedback on the scripts. I ran out of time to put it in her hands before the deadline. It runs on my laptop and isn't deployed. I plan to get it to her in the next few days. A hosted version would need somewhere to run the model, which changes the privacy trade-offs, so I'll think that through first. Any commits after the deadline will be listed in the repo's README.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits and what's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text only.&lt;/strong&gt; The model can't see pictures in this version, so any line that describes an image needs checking against the slide. This matters for architecture slides, which are mostly drawings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow&lt;/strong&gt; on a laptop (see above).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The voice is robotic.&lt;/strong&gt; The browser only lets me change speed, pitch and volume, so the pauses are exact but the expression is limited.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model can be wrong.&lt;/strong&gt; Read every script before presenting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing is saved&lt;/strong&gt; between sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next: send slide images to Gemma, try a more natural local voice, and get it to her.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 3 (4B), run locally through Ollama, writes every script in the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;p&gt;I built PrepBuddy with the help of Claude (Anthropic) as a development assistant. I used it to work through implementation questions, debug issues, and explore approaches, then ran, tested, and adapted the code myself.&lt;/p&gt;

&lt;p&gt;The problem, product idea, engineering decisions, testing, and final implementation are mine.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;&lt;a href="https://dev.tourl"&gt;I can't be next to her at 3 AM every time. This is my attempt to be there anyway.&lt;/a&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

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