<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: vahenoor</title>
    <description>The latest articles on DEV Community by vahenoor (@vahenoor).</description>
    <link>https://dev.to/vahenoor</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4159929%2F3856463b-d825-45e1-ba0f-c136a6438dfd.jpeg</url>
      <title>DEV Community: vahenoor</title>
      <link>https://dev.to/vahenoor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vahenoor"/>
    <language>en</language>
    <item>
      <title>I Built a Local AI Roadmap Generator for My Friend Who Keeps Getting Lost in Tutorial Hell</title>
      <dc:creator>vahenoor</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:45:30 +0000</pubDate>
      <link>https://dev.to/vahenoor/i-built-a-local-ai-roadmap-generator-for-my-friend-who-keeps-getting-lost-in-tutorial-hell-2g20</link>
      <guid>https://dev.to/vahenoor/i-built-a-local-ai-roadmap-generator-for-my-friend-who-keeps-getting-lost-in-tutorial-hell-2g20</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

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

&lt;p&gt;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 &lt;strong&gt;nobody tells you what order to learn things in&lt;/strong&gt;. He'd start a course, hit a wall, jump to another tutorial, and repeat. Classic tutorial hell.&lt;/p&gt;

&lt;p&gt;So instead of handing him another YouTube playlist, I built him something that answers the actual question: &lt;em&gt;"What should I learn next, and why?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Demo video: &lt;a href="https://youtu.be/97DKdwSNPPQ" rel="noopener noreferrer"&gt;https://youtu.be/97DKdwSNPPQ&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vahenoorsingh" rel="noopener noreferrer"&gt;
        vahenoorsingh
      &lt;/a&gt; / &lt;a href="https://github.com/vahenoorsingh/Roadmap-AI" rel="noopener noreferrer"&gt;
        Roadmap-AI
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Roadmap-AI&lt;/h1&gt;

&lt;/div&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/vahenoorsingh/Roadmap-AI" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The whole thing runs &lt;strong&gt;entirely on my laptop, offline&lt;/strong&gt;, using open-source AI at every layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;llama3.1&lt;/code&gt; via &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;&lt;/strong&gt; — the open-weight model doing the actual curriculum generation. No API keys, no rate limits, no per-token cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://streamlit.io/" rel="noopener noreferrer"&gt;Streamlit&lt;/a&gt;&lt;/strong&gt; — the entire UI and chat interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/dkapur17/streamlit-flow" rel="noopener noreferrer"&gt;&lt;code&gt;streamlit-flow&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; (React Flow under the hood) — renders the interactive graph canvas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://networkx.org/" rel="noopener noreferrer"&gt;NetworkX&lt;/a&gt;&lt;/strong&gt; — 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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pipeline is simple on purpose:&lt;/p&gt;

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

&lt;p&gt;The hardest part was making the graph feel &lt;strong&gt;interactive and stable&lt;/strong&gt; — Streamlit reruns constantly, and custom React components don't like being re-mounted. The fix was persisting the flow state in &lt;code&gt;st.session_state&lt;/code&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;This project would have been &lt;strong&gt;strictly worse&lt;/strong&gt; as a closed-API build.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy.&lt;/strong&gt; My friend's career goals, current skill level, and gaps are personal. With a local model, none of that ever leaves his laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero cost.&lt;/strong&gt; 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."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline.&lt;/strong&gt; He can use it on a train, on a flight, in a cafe with bad Wi-Fi. No dependency on someone else's uptime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swap the model.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tweak the behavior.&lt;/strong&gt; The prompt is right there in &lt;code&gt;roadmap_generator.py&lt;/code&gt;. He can change the tone, the granularity, the hour estimates — it's his tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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 &lt;em&gt;personal&lt;/em&gt; tool instead of a &lt;em&gt;product&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Open-Weight Models&lt;/li&gt;
&lt;li&gt;Best Local / Offline Build&lt;/li&gt;
&lt;li&gt;Best Use of Ollama&lt;/li&gt;
&lt;li&gt;Beginner-Friendly Build&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
