Inspiration
Most study tools give you a fixed bank of questions that runs out fast, or they're generic flashcard apps with no real sense of whether you're actually improving. I wanted something that generates new questions every time, adapts to whatever subject or exam I'm studying for, and actually keeps a record I can look back on not just a score, but real insight into where I'm strong and where I'm not.
What it does
Aptly is an AI tutor that generates fresh practice questions on any subject on demand. It tracks your accuracy per concept and visualizes your progress with charts on a dashboard, so instead of a single vague score, you can see exactly what you've mastered and what still needs work.
When it detects a concept you're consistently weak on, it flags it and lets you generate a targeted quiz for just that area. If you get a question wrong, it doesn't just show the correct answer it analyzes the specific misconception behind your wrong choice and explains that, rather than giving a generic explanation. You can generate questions from a subject name, or paste your own study material directly if you don't have a document to upload. Every question is also tagged with its own difficulty (easy/medium/hard). Once you've generated a batch of questions, you can keep practicing offline with no internet connection. You can also turn any quiz into a task on a built-in to-do list.
How we built it
The frontend is React with Tailwind CSS. The backend is FastAPI (Python), using Supabase for authentication and Postgres for storage, and Groq for fast AI-generated question and misconception analysis. The app is deployed with the frontend on Vercel and the backend on Render.
Challenges we ran into
The biggest one hit after I thought I was already done: I deployed the backend, tried logging in on the live site, and got "Invalid session, please log in again" even with correct credentials. I initially assumed it was a config problem, but the real cause was that Supabase had rotated my project onto a new JWT signing key type. Tokens were originally signed with a shared HS256 secret, but Supabase now signs new tokens asymmetrically with an ECC key and my backend was still hardcoded to verify everything as HS256 against the old secret, so every fresh login was silently rejected.
The fix meant rewriting how the backend verifies tokens: it now fetches Supabase's public key from their JWKS endpoint and verifies against that directly, falling back to the old secret only for tokens issued before the rotation.
Accomplishments that we're proud of
Getting the weak-concept detection and targeted quizzing actually working end-to-end tracking accuracy per concept, surfacing the weakest one, and generating a quiz aimed specifically at it feels like the core idea of the app finally clicking into place rather than just being a stack of separate features.
The misconception analysis is the one I'm most proud of specifically: instead of just marking an answer wrong, it explains the actual reasoning error behind the wrong choice, which is a much harder problem than it sounds and the part that makes this feel like a tutor rather than a quiz generator.
I'm also proud of catching and properly fixing two real production issues before shipping this: the Supabase JWT signing-key migration that was silently breaking every login, and a Row-Level Security gap that left a user data table publicly exposed on the API. Neither was something I set out to build both came from actually testing the deployed app critically instead of assuming it worked because it ran locally.
What we learned
That bug taught me more about how JWT authentication actually works than anything I'd read beforehand the real difference between symmetric and asymmetric signing, and why understanding your auth layer matters, rather than just wiring an SDK into your app and assuming it'll keep working.
What's next for Aptly
Spaced repetition resurfacing questions on a weak concept again after a few days, and again after that, instead of just flagging it once.
Built With
- fastapi
- groq
- javascript
- postgresql
- python
- react
- render
- supabase
- tailwindcss
- vercel
Log in or sign up for Devpost to join the conversation.