DEV Community

Cover image for I Built PrepBuddy So My Sister Wouldn’t Have to Call Me at 3 AM Before Every Presentation
Shreyashi Gupta
Shreyashi Gupta

Posted on

I Built PrepBuddy So My Sister Wouldn’t Have to Call Me at 3 AM Before Every Presentation

Hacktoberfest Weekend Challenge: Build for a Friend Submission 🤝

This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend.

## The 3 AM call

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.

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.

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?

PrepBuddy is my answer. It's me, sitting next to her, as a tool.

What I built

You upload your slides as a PDF. PrepBuddy writes a script you can say out loud, one slide at a time:

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

Demo

Repo: https://github.com/ShreyashiGupta2310/PrepBuddy

How it works

  1. The browser reads the PDF with pdf.js, so the file stays in the browser. Only the text of each slide is sent on.
  2. A small Express server sends one slide at a time to Gemma 3 (4B), which runs on my laptop through Ollama.
  3. 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.
  4. 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.
  5. React draws the script, with each pause as a blue line whose length matches the pause.
  6. 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.

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.

Why open innovation mattered

  • The model runs on my laptop. 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.
  • I can change how it behaves. 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 gemma3:4b, so I haven't compared other models.
  • A student's slides stay in a tool she controls, instead of going to a service she doesn't. That is how I designed it. It's a design choice, not a measured guarantee.

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.

What I tested, and what I didn't

Tested on one Windows laptop:

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

Not tested:

  • Running with the network turned off. 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.
  • The voice picker. I only checked that it lists the English voices installed on my laptop.
  • Other browsers, macOS or Linux, and long decks.

What my sibling said

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.

Limits and what's next

  • Text only. 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.
  • Slow on a laptop (see above).
  • The voice is robotic. The browser only lets me change speed, pitch and volume, so the pauses are exact but the expression is limited.
  • The model can be wrong. Read every script before presenting.
  • Nothing is saved between sessions.

Next: send slide images to Gemma, try a more natural local voice, and get it to her.

Prize categories

Best Use of Gemma: Gemma 3 (4B), run locally through Ollama, writes every script in the app.

How I built it

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.

The problem, product idea, engineering decisions, testing, and final implementation are mine.

I can't be next to her at 3 AM every time. This is my attempt to be there anyway.

Top comments (0)