DEV Community

vahenoor
vahenoor

Posted on

I Built a Local AI Roadmap Generator for My Friend Who Keeps Getting Lost in Tutorial Hell

This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend

What I Built

I built Roadmap AI, a learning roadmap generator that turns a vague goal like "I want to become a machine learning engineer" into an interactive, visual graph of topics — showing which concept unlocks which next one.

I built it for my friend, who is trying to break into ML but keeps getting stuck. Not because the resources don't exist — there are thousands of them — but because nobody tells you what order to learn things in. He'd start a course, hit a wall, jump to another tutorial, and repeat. Classic tutorial hell.

So instead of handing him another YouTube playlist, I built him something that answers the actual question: "What should I learn next, and why?"

The app generates a directed graph where every node is a topic (with difficulty and estimated hours) and every edge is a prerequisite relationship. You can drag nodes around, zoom in, and see exactly which topic unlocks the next.

Demo

Code


How I Built It

The whole thing runs entirely on my laptop, offline, using open-source AI at every layer:

  • llama3.1 via Ollama — the open-weight model doing the actual curriculum generation. No API keys, no rate limits, no per-token cost.
  • Streamlit — the entire UI and chat interface.
  • streamlit-flow (React Flow under the hood) — renders the interactive graph canvas.
  • NetworkX — validates the LLM's output as a proper DAG (no cycles), then computes a layered layout so the graph reads left-to-right by prerequisite depth.

The pipeline is simple on purpose:

  1. User types a learning goal + what they already know.
  2. The prompt asks the model for JSON only — an overview, a list of nodes, and a list of edges where each edge means "from must be learned before to."
  3. Python parses the JSON, builds a NetworkX DiGraph, breaks any cycles the LLM accidentally introduced, and computes layer positions.
  4. streamlit-flow renders it as a draggable, zoomable flowchart with color-coded difficulty (green/yellow/red).

The hardest part was making the graph feel interactive and stable — Streamlit reruns constantly, and custom React components don't like being re-mounted. The fix was persisting the flow state in st.session_state and rendering the canvas in a dedicated section instead of inside a chat bubble. It took a lot of debugging, but it works smoothly now.

Why Does Open Innovation Matter?

This project would have been strictly worse as a closed-API build.

  • Privacy. My friend's career goals, current skill level, and gaps are personal. With a local model, none of that ever leaves his laptop.
  • Zero cost. He can regenerate roadmaps all day, try 20 different goals, and it costs nothing. A closed API would turn "let me explore" into "let me count my tokens."
  • Offline. He can use it on a train, on a flight, in a cafe with bad Wi-Fi. No dependency on someone else's uptime.
  • Swap the model. If a better open-weight model drops next month, he swaps one line. If he gets a beefier laptop, he runs a 7B or 13B model instead of 3B. No permission needed.
  • Tweak the behavior. The prompt is right there in roadmap_generator.py. He can change the tone, the granularity, the hour estimates — it's his tool.

None of that is possible with a closed API where the weights, the behavior, and the pricing are all someone else's call. Open innovation is what made this a personal tool instead of a product.

Prize Categories

  • Best Use of Open-Weight Models
  • Best Local / Offline Build
  • Best Use of Ollama
  • Beginner-Friendly Build

Top comments (0)