S
Back to portfolio
Project · 2025

Let's Note AI.

AI study companion

Role
Full-stack engineer · solo build
Year
2025
Stack
Rust · Axum · Next.js 15
image placeholder
Let's Note AI — product hero
public/lets-note/hero.png

Let's Note AI is an AI-powered study platform that ingests almost anything a student has — PDFs, DOCX, PPTX, MP3/AAC, recorded lectures, YouTube links — and turns it into structured summaries, flashcards, quizzes, an AI-generated podcast, and a chatbot grounded in the user's own material. I built it solo: Rust + Axum backend, Next.js 15 frontend, Supabase, with Google Gemini 2.0 and AssemblyAI doing the heavy AI lifting.

3 min read·2025·by Shada Daab·
Ch. 01The problem

Study tools handle one piece. Students need the whole pipeline.

Students juggle a dozen tabs: one app transcribes audio, another summarizes, a third makes flashcards, a fourth turns them into quizzes. Each one re-uploads the same source. Each one forgets context the moment you switch. I wanted a single workspace where uploading once unlocks everything — summary, flashcards, quiz, podcast, chat — all grounded in the same material.

  • Lectures (MP3/AAC/ALAC) → transcript via AssemblyAI, then summary.
  • Documents (PDF, DOCX, PPTX) → text extraction → study artifacts.
  • YouTube links → captions → searchable knowledge base.
image placeholder
The pipeline — many sources, one workspace
public/lets-note/01-pipeline.png
Fig 1The pipeline — many sources, one workspace
Ch. 02Why Rust for the API

Picking the language that wouldn't fight me at scale.

Most edtech AI tools are built on Python or Node. I picked Rust + Axum because the workload is mostly file ingest, LLM streaming, and concurrent background jobs — exactly where Rust's typed-channels, ownership rules, and predictable latency pay off. SeaORM gives me Postgres without a runtime overhead. The whole API runs on a 5–10 connection pool and Tokio's full async runtime.

Most edtech AI tools are built on Python or Node.
  • Axum 0.7 + Tower middleware for routing and JWT auth.
  • SeaORM 1.1 over Supabase Postgres — entities for users, lectures, materials, decks, flashcards, quizzes, usage.
  • tiktoken-rs to count tokens before sending — usage limits enforced server-side per user.
  • Sentry + structured tracing for production observability.
image placeholder
Service architecture — Rust API + Next.js client
public/lets-note/02-architecture.png
Fig 2Service architecture — Rust API + Next.js client
Ch. 03The hard part

Six input formats, one consistent contract.

Every format is its own world. DOCX is XML in a zip. PPTX is XML in a different zip. PDFs are pretending to be documents. Audio files are bytes. YouTube transcripts come via a sidecar Python script. I built a single Rust file-processing layer (`utils/files_processing.rs`) that normalizes all of them into a clean text stream before anything AI-related runs — so the prompt logic downstream never has to care about the source.

  • DOCX via `docx-rs`, PPTX via `quick-xml`, PDF via `lopdf`.
  • Audio decoded with `symphonia` (MP3/AAC/ALAC), transcribed via AssemblyAI.
  • YouTube transcripts fetched via a small Python helper, called from Rust.
  • All sources funneled into the same `LectureMaterial` table — chat, flashcards, quiz all read from the same store.
image placeholder
File ingest layer — one path, many formats
public/lets-note/03-ingest.png
Fig 3File ingest layer — one path, many formats
Ch. 04AI without breaking the bank

Quota-aware prompt design.

LLM cost is the silent killer in edtech. I made every prompt template explicit (stored in `/prompts/`), counted every outgoing token with tiktoken-rs, and enforced per-user quotas in the `UsageService` before the model was even called. Members get unlimited; free users get a budget. Failed generations refund the quota.

LLM cost is the silent killer in edtech.
image placeholder
Quota + prompt templates
public/lets-note/04-quotas.png
Fig 4Quota + prompt templates
Ch. 05Frontend that earns the trust

Next.js 15 + BlockNote + Tiptap, designed in-house.

The frontend is Next.js 15 / React 19 with BlockNote and Tiptap for rich editing, a PDF viewer for source-of-truth, and audio recording/playback so students can capture lectures in-app. I designed every screen myself — the empty states, the streaming chat, the flashcard reveal animation. The product had to feel like a calm study desk, not another AI demo.

  • BlockNote + Tiptap-markdown for the note editor.
  • Streaming chat replies (Vercel AI SDK, Google Gemini provider).
  • Stripe + Paddle for billing, Supabase SSR for auth.
  • PostHog for product analytics, Sentry for error tracking on both ends.
image placeholder
Editor, flashcards & chat UI
public/lets-note/05-ui.png
Fig 5Editor, flashcards & chat UI
— fin —

built by one person · case study written by the same person