This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend
What I Built
Flashcard Pro — DP-600 Exam Trainer, built for my friend Den who is preparing for the Microsoft DP-600: Implementing Analytics Solutions Using Microsoft Fabric exam.
Den was drowning in Fabric docs — lakehouses, warehouses, KQL, DAX, governance — with no good way to do active recall. So I built him a simple Flask study app:
Pick a mode + topic → see a term → try to recall → reveal definition → self-grade Yes/No → next card.
- 202 cards across all 8 DP-600 topics, in one merged
flashcards.json - Modes: Any / New / Incorrect /
simple/intermediate/advanced+ per-topic filter -
/statsdashboard: accuracy overall, by topic, by difficulty - JSON file storage, no DB, runs locally in 10 seconds
- Results log with auto-compaction + 7 unit tests
Problem it solves: turns passive reading into spaced, self-tested review — especially re-drilling the cards he gets wrong.
Demo
Live local run: pip install -r requirements.txt && python app.py → http://127.0.0.1:8001/
Screenshots instead of video:

Home: mode + topic picker with progress summary

Quiz: term → Show Definition → Yes/No self-grade

Stats: overall / by-topic / by-difficulty accuracy
Full flow: Home → Start Study (e.g. incorrect + Topic 5) → Quiz loop → Session Complete! → Stats.
Code
https://github.com/dmytrovoytko/flashcards
Stack: Python + Flask + Jinja + Bootstrap 5, app.py for routes/session, data_manager.py for filtering/stats/compaction, templates/index.html, quiz.html, stats.html.
How I Built It
Built agentically with open-source AI:
- Model: google/gemma-4-31b-it — used for codebase analysis, spec writing, and implementation
-
Harness: OpenCode coding agent — Task/Todo-driven edits, test runs, verification via
python -m unittest -
Frameworks: Flask 3, Bootstrap 5.3, stdlib
json -
Local-first: all inference-assisted coding + all app data runs locally — cards, topics, and
results.jsonnever leave the machine
The AI did what it's best at: brainstormed the specs and made key decisions, generated flashcards by topics and difficulty (simple/intermediate/advanced in data), merged flashcards1-8.json → flashcards.json, fixed the filter, then implemented the suggested roadmap: topic picker, /stats, /end, stale-ID skipping, SECRET_KEY/FLASK_DEBUG/PORT env config, requirements.txt, and test_data_manager.py.
Why Does Open Innovation Matter?
This project only works because it's open:
- Forkable study content: anyone can PR new cards for DP-700, AZ-104, etc. A closed API with proprietary quizzes wouldn't allow that.
-
Inspectable learning logic: Den can read
get_filtered_cards()andget_stats()and trust how "incorrect" and accuracy are computed. -
Self-hostable + private: exam prep progress stays in a local
results.json, no tracking, no subscription — perfect for Hacktoberfest-style community contributions. - Open models → open builders: I could reproduce this entire workflow with an open-weight assistant in OpenCode, iterate locally, and push back to GitHub for others to reuse.
Open innovation turned a one-off favor for Den into a template anyone can clone for any certification.
Top comments (0)