Glowworm
A clone of the Fireflies.ai meeting assistant, built as an SDE Fullstack take-home. It has:
- a library of past meetings;
- a transcript synced with a simulated media player;
- AI-style notes;
- full create, edit and delete.
On top of that come all six bonus features, three extras (CI, speaker analytics, background processing), a responsive layout and an optional intro tour.
The API runs on Render's free tier, which sleeps when idle. The first request after a quiet spell can take up to a minute; the app shows a "waking up the server" note while it waits. A restart also resets the database to the six demo meetings.
Features
Core
- Meetings library (
/meetings):
- meetings grouped by day, each with its title, date, time, duration, participant avatars and tags;
- search by title from the top bar; filter by participant, tag and date range; sort newest or oldest first;
- filters live in the URL, so a filtered view survives a reload and can be shared;
- loading skeletons, empty and no-results states, and a clear error with "Try again".
- Meeting page (
/meetings/{id}):
- Transcript: speaker avatars, names and clickable timestamps.
- Simulated player: play/pause, seek bar, current and total time, speed (1× / 1.5× / 2× / 0.5×), skip ±15 s. There's no audio; it's an accurate clock.
- Two-way sync: clicking a line, a chapter or an action item's time seeks. While playing, the current line is highlighted and kept in view. Scrolling by hand pauses that until you press "Sync with player".
- Transcript search: highlights every match, shows "n of m", with previous/next (also Enter and Shift+Enter).
- AI notes:
- overview, keywords, chapters with time ranges (click to seek), and action items grouped by assignee;
- the demo meetings have hand-written notes; new meetings get notes from a rule-based generator (below).
- Create, edit, delete:
- New meeting: a title, a date and time, and participants, plus a transcript uploaded as a
.txt, .vtt or .json file (picked or dragged in) or pasted.
- Edit and delete: edit a meeting's title, participants and tags. Delete asks for confirmation first.
- Action items: add them, edit the text and assignee, mark them complete, delete them.
- Feedback: every change is saved in SQLite and confirmed with a toast; failures show the server's error message.
- Fireflies-style shell:
- a slim icon rail that opens into the full sidebar;
- a top bar with search, New meeting, dark mode, the tour, settings and profile;
- "Coming soon" pages for Record, Integrations, Team and Settings.
Bonus features (all six)
- Dark mode: a top-bar toggle that follows the system setting until you pick a theme, and remembers your choice.
- Tags: coloured tags on meetings, managed in the Edit dialog; filter the library by tag.
- Export: the transcript or the summary as TXT, Markdown or PDF, from the player bar's download button.
- Global search: full-text search over every transcript (SQLite FTS5) with highlighted snippets. A result opens the meeting at that moment.
- Highlights, comments and soundbites: colour a transcript line, discuss it in a comment thread, or save a titled clip that plays only its range.
- "Ask about this meeting": a chat that answers from the transcript (Groq,
openai/gpt-oss-120b) and cites timestamps you can click. Without an API key, it answers from search instead.
Extras
- CI: GitHub Actions checks the backend and the frontend on every push and pull request (details below).
- Speaker talk time: one bar per speaker in their avatar colour, with talk time, words per minute, questions asked and longest monologue, computed from the transcript on every request.
- Background processing: a new meeting appears in the library straight away as Processing. The backend parses the transcript and writes the notes in a background job. A toast says when it's ready, or the row turns Failed with the reason and a Delete button.
Also
- Works on phones and tablets:
- from 768 px up, the sidebar is an icon rail; on phones, the top bar's menu button opens it;
- below 1024 px, the meeting page switches between Notes and Transcript with tabs;
- no page scrolls sideways.
- Intro tour:
- an optional walkthrough of the features above, offered on a first visit to the library and restarted from the compass button;
- each step dims the page except one feature and says what it does;
- at one step, you open a demo meeting yourself.
Tech stack
| Layer | Choice |
|---|
| Frontend | Next.js 16 (App Router), TypeScript (strict), Tailwind CSS v4, lucide-react, sonner (toasts), next-themes |
| Backend | Python 3.12, FastAPI, SQLAlchemy 2.0 (sync), Pydantic v2, fpdf2 (PDF export) |
| Database | SQLite (own schema) with FTS5 full-text search |
| AI chat | Groq (openai/gpt-oss-120b) through the official openai SDK, called from the backend only |
| Hosting | Vercel (frontend) · Render (backend, render.yaml Blueprint) |
| Quality | pytest, ruff, ESLint, Prettier; GitHub Actions CI on every push and pull request |
This is the beginning of the README. Read the rest at the original. Read the full README ↗