DEV Community

kareemblessed
kareemblessed

Posted on

Your Notes, Your Voice, Your Study Group. One App. How I Finally Finished It.

GitHub β€œFinish-Up-A-Thon” Challenge Submission

This is a submission for the GitHub Finish-Up-A-Thon Challenge

What I Built

The average student opens their notes 3 days before the exam.

The above average student opens them the night before.

Either way, they both end up on YouTube at 3am watching a guy explain thermodynamics with a whiteboard and too much energy. I built something better.

I built Forge AI β€” a collaborative AI study platform that turns your lecture notes, PDFs, and YouTube links into a full study session with an AI tutor that actually talks back.

Here is what it does:
πŸ“„ Upload your notes or paste a YouTube link β€” Forge AI reads everything and builds you a prioritised study plan in seconds.

🧠 Deep Dive into any topic β€” get full AI generated study notes, a mnemonic memory trick, and a built-in quiz.

πŸŽ™οΈ Talk to your AI tutor live β€” it listens, speaks back, and you can see the transcript building in real time as it talks.

πŸ‘₯ Create a Forge Room β€” invite your study group, ask the AI questions together, battle each other in a live quiz, and everyone sees everything at the same time.

It started as CrammAI. A solo study tool I built under exam pressure.

Well, it could generate a study plan from your uploaded files and quiz you on topics.

That was it. No voice. No collaboration. No rooms. No Finesse. Just you, alone, cramming at 2am.

Five months later I came back to finish it. The result is Forge AI.

Demo

Live app

GitHub
Here is what Forge AI can do:

1. Upload your materials and pick your mode

Three modes based on how much time you have:

🧘 Cruise Control β€” 1+ week until exam
πŸš€ Turbo Mode β€” 2 days left
⚑ Zoom Mode β€” due tonight

2. Paste a YouTube link β€” it transcribes automatically

ts
export const apiFetchYoutubeTranscript = async (url: string): Promise<string> => {
  const videoId = extractYoutubeId(url);
  const response = await fetch(`/api/transcript?videoId=${videoId}`);
  const data = await response.json();
  return data.transcript;
};
Enter fullscreen mode Exit fullscreen mode

No manual transcription.
Paste the link, Forge AI pulls the transcript and includes it in your study plan generation.

3. Deep Dive β€” AI Study Notes

Every topic gets a full structured study guide generated by Gemini. Markdown rendered with headers, bullet points, bold key terms, and Unicode equations (no LaTeX chaos).

4. Live AI Voice Tutor

This is the big one. Click "Start live session" and the AI tutor speaks to you. You speak back. It listens, responds, and you can see the transcript building in real time as it talks.

ts
export const apiConnectLiveTutor = (topic: Topic, callbacks: LiveCallbacks) => {
  return ai.live.connect({
    model: 'gemini-3.1-flash-live-preview',
    callbacks,
    config: {
      responseModalities: [Modality.AUDIO],
      speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: 'Zephyr' } } },
      inputAudioTranscription: {},
      outputAudioTranscription: {},
    },
  });
};
Enter fullscreen mode Exit fullscreen mode

The orb turns red when it's listening. Tap it to pause mid-sentence. Tap again to resume.

5. Forge Room β€” Study Together

Create a room, share the link, and your whole study group joins. Everyone sees the same AI answers in real time. You can quiz each other in a live battle. The notes are right there on the left. Mic and camera work natively in the browser.

6. Quiz Battle

Host starts a quiz on any topic. Everyone answers simultaneously. Live leaderboard updates as answers come in via Supabase Realtime.

The Comeback Story

CrammAI was built in one night. Upload a PDF, get a study plan, take a quiz. That was it. No voice. No friends. Just you and your anxiety at 2am.

I left it for months. Coming back felt weird. The code was messier than I remembered. But the idea was still good so I kept going.

First thing I added was a Live AI Voice Tutor. Click a button, the AI talks, you talk back, it responds. Like a private tutor at midnight who never gets tired of you.

Except it was broken. Every audio chunk played at the exact same time. Imagine 30 people all saying "hello" at once. That was my tutor. Terrifying.

The fix was a sequential audio queue, each chunk waits for the previous one to finish before playing:

ts
const enqueueChunk = (b64: string) => {
  audioQueue.current = audioQueue.current.then(async () => {
    const buf = await decodeAudioData(decode(b64), ctx, 24000, 1);
    const src = ctx.createBufferSource();
    src.connect(ctx.destination);
    const start = Math.max(ctx.currentTime, nextStart.current);
    src.start(start);
    nextStart.current = start + buf.duration;
    await new Promise<void>(resolve => { src.onended = () => resolve(); });
  });
};
Enter fullscreen mode Exit fullscreen mode

Then I built the Forge Room. The idea was simple β€” what if your whole study group could join one room, ask the AI questions together, and everyone sees the answers at the same time?

Plus a live quiz battle to see who actually studied.
The AI chat in the room kept getting stuck on "Generating answer..." forever. The bug was embarrassing once I found it.

I also added YouTube link support. Paste a video URL and Forge AI pulls the transcript automatically and uses it to build your study plan.

No manual copy pasting. Just the link.
By the end I had something I was actually proud of.

A full study platform with AI notes, a voice tutor that doesn't sound like a broken radio, collaborative rooms, quiz battles, and YouTube ingestion.

Built on top of a one night project I almost deleted.

My Experience with GitHub Copilot

Copilot was open the whole time. I want to be honest about how I actually used it because people always exaggerate this part.

It did not write the architecture. I decided how Gemini Live connects, how Supabase Realtime syncs the room state, and how the audio queue works. Those decisions were mine.

What Copilot actually did was handle the stuff I would have had to look up anyway. Supabase query syntax. TypeScript interface completions.

The repetitive JSX patterns in the participant strip. When I started a .channel().on().subscribe() block it would finish the whole thing correctly including the filter I always forget.

The most useful moment was the audio queue. I was writing the src.onended callback and Copilot suggested wrapping it in a Promise resolve pattern.

That was exactly what I needed to make the chain work. I would have gotten there eventually but it saved me twenty minutes of thinking.

Honestly it felt less like a co-pilot and more like a very fast autocomplete that occasionally says something smart. I will take it.

Conclusion

Forge AI started as one night of panic. It ended as something I am actually proud of.

It is not perfect. There are still things to fix, features to add, and edge cases that will probably break at the worst possible moment.

But it works. The tutor talks. The rooms are live. The quiz battles are real.

Five months ago I had a half finished app and a list of excuses.

Today I have a deployed product that actually helps students study smarter.

Your notes deserve better than a highlighter.
Go try it πŸ”—.

Top comments (0)