<?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: Ayush Srivastava</title>
    <description>The latest articles on DEV Community by Ayush Srivastava (@ayush_srivastava_01).</description>
    <link>https://dev.to/ayush_srivastava_01</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%2F4006250%2Fc7790bfd-78eb-40e0-81a1-52fe26147e9b.png</url>
      <title>DEV Community: Ayush Srivastava</title>
      <link>https://dev.to/ayush_srivastava_01</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ayush_srivastava_01"/>
    <language>en</language>
    <item>
      <title>Building InternFlow (Part 4): The Roadmap Beyond an Internship Platform</title>
      <dc:creator>Ayush Srivastava</dc:creator>
      <pubDate>Sun, 28 Jun 2026 09:31:54 +0000</pubDate>
      <link>https://dev.to/ayush_srivastava_01/building-internflow-part-4-the-roadmap-beyond-an-internship-platform-1e0c</link>
      <guid>https://dev.to/ayush_srivastava_01/building-internflow-part-4-the-roadmap-beyond-an-internship-platform-1e0c</guid>
      <description>&lt;p&gt;InternFlow started as a tool to solve one problem. After talking to students, I realized it needs to solve a dozen.&lt;/p&gt;




&lt;p&gt;The first version of InternFlow solved a problem I personally faced: finding internships, getting code reviewed, and turning GitHub projects into a resume — all in one place.&lt;/p&gt;

&lt;p&gt;But as I used the product and talked to other students, something became clear: &lt;strong&gt;landing an internship isn't one problem. It's a series of smaller ones.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finding opportunities is only one piece of the puzzle. Students also struggle with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Optimizing their LinkedIn and GitHub profile for recruiter visibility&lt;/li&gt;
&lt;li&gt;Preparing for technical interviews without knowing where to start&lt;/li&gt;
&lt;li&gt;Understanding what their GitHub projects actually say about them&lt;/li&gt;
&lt;li&gt;Making resumes that pass ATS filters before a human ever reads them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's why the next phase of InternFlow is focused on becoming a &lt;strong&gt;developer career platform&lt;/strong&gt; rather than just an internship portal.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. LinkedIn Profile Optimizer 🟡 Building now
&lt;/h2&gt;

&lt;p&gt;Instead of generic advice, the system will analyze a user's actual profile and provide specific suggestions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rewrite the headline for better recruiter search visibility&lt;/li&gt;
&lt;li&gt;Identify missing skills and keywords for their target role&lt;/li&gt;
&lt;li&gt;Improve the About section impact&lt;/li&gt;
&lt;li&gt;Score current project descriptions and suggest stronger alternatives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is actionable, specific feedback — not "make your headline more impactful."&lt;/p&gt;

&lt;h2&gt;
  
  
  2. AI Interview Preparation 🔵 Exploring
&lt;/h2&gt;

&lt;p&gt;Preparing for technical interviews is overwhelming when you don't know where to start.&lt;/p&gt;

&lt;p&gt;I'm building an interview prep system that adapts to a student's actual skill level and target role — not random LeetCode. It would:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate personalized interview sessions based on your GitHub stack&lt;/li&gt;
&lt;li&gt;Explain mistakes in plain language, not just mark them wrong&lt;/li&gt;
&lt;li&gt;Build a topic improvement plan based on your weak areas&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Personalized Internship Recommendations ⚪ Planned
&lt;/h2&gt;

&lt;p&gt;Right now, InternFlow shows the same listings to everyone. That's not useful.&lt;/p&gt;

&lt;p&gt;The next version will match opportunities to individual students based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Technologies in their GitHub projects&lt;/li&gt;
&lt;li&gt;Skills identified from code reviews&lt;/li&gt;
&lt;li&gt;Roles they've shown interest in&lt;/li&gt;
&lt;li&gt;Gaps between their current profile and job requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Advanced GitHub Insights ⚪ Planned
&lt;/h2&gt;

&lt;p&gt;The current repository analysis gives summaries and code reviews. Future improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project quality score&lt;/strong&gt; — how does this project compare to what recruiters expect?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture analysis&lt;/strong&gt; — is the codebase structured well?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technology trend alignment&lt;/strong&gt; — are you building with in-demand tools?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio impact suggestions&lt;/strong&gt; — what would make this project stand out more?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. ATS Resume Intelligence ⚪ Planned
&lt;/h2&gt;

&lt;p&gt;Instead of generating a resume once and forgetting it, the platform will continuously improve it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compare your current resume against a specific job description&lt;/li&gt;
&lt;li&gt;Identify missing keywords that ATS filters look for&lt;/li&gt;
&lt;li&gt;Estimate ATS compatibility score before you apply&lt;/li&gt;
&lt;li&gt;Suggest targeted bullet rewrites for each application&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What hasn't changed
&lt;/h2&gt;

&lt;p&gt;The scope is bigger. But the filter I apply to every feature is the same one I used when building version one:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Does this make a real difference for a student trying to land their first opportunity?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If the answer is no, it doesn't ship.&lt;/p&gt;




&lt;h2&gt;
  
  
  Series recap
&lt;/h2&gt;

&lt;p&gt;This is Part 4 of a series documenting the technical decisions behind InternFlow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[Part 1]&lt;/strong&gt; — Why I chose microservices over a monolith&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Part 2]&lt;/strong&gt; — Building a RAG pipeline without calling GPT APIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Part 3]&lt;/strong&gt; — Deployment lessons from running 7 Docker services in production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 4&lt;/strong&gt; — This article: the roadmap&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you're a B.Tech or engineering student, InternFlow is free to use.&lt;/p&gt;

&lt;p&gt;Connect your GitHub repo, push a commit, get an AI code review, and turn your real work into resume bullets that get you shortlisted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://intern-flow.in/register" rel="noopener noreferrer"&gt;Create your free account at intern-flow.in&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What features would you want to see? Drop a comment — most of the roadmap above came from conversations with students.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>students</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Building InternFlow (Part 3): Lessons Learned Deploying a Multi-Service AI Application</title>
      <dc:creator>Ayush Srivastava</dc:creator>
      <pubDate>Sun, 28 Jun 2026 09:30:08 +0000</pubDate>
      <link>https://dev.to/ayush_srivastava_01/building-internflow-part-3-lessons-learned-deploying-a-multi-service-ai-application-2hgd</link>
      <guid>https://dev.to/ayush_srivastava_01/building-internflow-part-3-lessons-learned-deploying-a-multi-service-ai-application-2hgd</guid>
      <description>&lt;p&gt;Taking InternFlow from Docker Compose on a laptop to a production server exposed problems that no tutorial prepares you for.&lt;/p&gt;




&lt;p&gt;Deploying a single web application is straightforward. You push code, a server runs it, done.&lt;/p&gt;

&lt;p&gt;Deploying seven interconnected services — with AI models, background crawlers, databases, and a reverse proxy — is an entirely different challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  The production stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Internet ]
     │
[ Nginx reverse proxy + SSL ]
     │
┌────┴────────────────────────┐
│  Next.js  │  FastAPI API    │
├───────────┴─────────────────┤
│  AI Service │ RAG Service   │
│  Job Crawler                │
├─────────────────────────────┤
│  PostgreSQL │ Redis         │
│  Docker volumes (persistent)│
└─────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every layer had at least one thing that surprised me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 1: Separate infrastructure from application logic
&lt;/h2&gt;

&lt;p&gt;The biggest mistake I made early on was mixing infrastructure configuration with application code. Environment variables were hardcoded in places. Database connection strings were duplicated across services.&lt;/p&gt;

&lt;p&gt;The fix was treating infrastructure as a completely separate concern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml — environment from files, not hardcoded&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env.production&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env.production — never committed to git&lt;/span&gt;
&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgresql://user:pass@postgres:5432/internflow
&lt;span class="nv"&gt;REDIS_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;redis://redis:6379
&lt;span class="nv"&gt;SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-secret-here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lesson 2: Logs are your only debugger in production
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; Service fails silently. No error surfaces. User sees a blank response. I SSH into the server and run &lt;code&gt;docker ps&lt;/code&gt; to find a container has been OOMkilled with no trace of why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt; Structured logging with timestamps and service names. Every request logged with duration. Every error logged with full stack trace and context.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_resume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[resume] starting generation for repo=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[resume] completed repo=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; duration=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[resume] failed repo=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;repo_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; error=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Good logs are not a nice-to-have. In a multi-service architecture, they're the only way to know what your system is doing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Lesson 3: Health checks are load-bearing
&lt;/h2&gt;

&lt;p&gt;Docker's &lt;code&gt;healthcheck&lt;/code&gt; directive sounds like a monitoring nicety. In practice it's critical for startup ordering.&lt;/p&gt;

&lt;p&gt;Services come up in unpredictable order. A FastAPI service that starts before PostgreSQL is ready will crash on first database connection — silently, in a way that looks like the application is broken when it's actually just a race condition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD-SHELL"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pg_isready&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-U&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;postgres"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;

  &lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;  &lt;span class="c1"&gt;# waits for postgres to pass health check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single change eliminated an entire class of random startup failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 4: Persistent storage requires deliberate planning
&lt;/h2&gt;

&lt;p&gt;The FAISS vector indexes are large. Model weights are large. PostgreSQL data must survive container restarts.&lt;/p&gt;

&lt;p&gt;Early on I had all of this in ephemeral container filesystems. One &lt;code&gt;docker compose down&lt;/code&gt; wiped everything — including indexed repositories.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;faiss_indexes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;model_cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;

  &lt;span class="na"&gt;rag_service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;faiss_indexes:/app/indexes&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;model_cache:/app/models&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Named volumes persist across &lt;code&gt;docker compose down&lt;/code&gt; and &lt;code&gt;up&lt;/code&gt;. Pair this with a nightly backup script and you have a real persistence story.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 5: Nginx config is part of your application
&lt;/h2&gt;

&lt;p&gt;I treated Nginx as an afterthought — something I'd configure "at the end." That was wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;intern-flow.in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="s"&gt;https://&lt;/span&gt;&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;intern-flow.in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/intern-flow.in/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/intern-flow.in/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Frontend&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://frontend:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# API&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/api/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://api:8000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_read_timeout&lt;/span&gt; &lt;span class="s"&gt;120s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;# AI endpoints take longer&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the &lt;code&gt;proxy_read_timeout 120s&lt;/code&gt; for AI endpoints. Default Nginx timeout is 60 seconds — AI generation regularly exceeded this and caused cryptic 504 errors that took me hours to trace.&lt;/p&gt;

&lt;h2&gt;
  
  
  The key lessons, distilled
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure is application code&lt;/strong&gt; — treat Dockerfiles, Nginx configs, and Compose files with the same care as your Python or TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability before features&lt;/strong&gt; — logging and health checks should be set up before any feature goes to production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assume services will fail&lt;/strong&gt; — design for restart, not for reliability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence is separate from compute&lt;/strong&gt; — containers are disposable, data is not&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the timeout docs&lt;/strong&gt; — every proxy, every client, every service has a default timeout that will surprise you in production&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;In &lt;strong&gt;Part 4&lt;/strong&gt;, I'll cover where InternFlow is going next — beyond an internship tool into a full developer career platform.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://intern-flow.in" rel="noopener noreferrer"&gt;InternFlow&lt;/a&gt; helps B.Tech and engineering students turn their GitHub projects into internship offers. AI code reviews on every commit, ATS resume generation, and daily internship listings.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;→ Try it free at &lt;a href="https://intern-flow.in" rel="noopener noreferrer"&gt;intern-flow.in&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>nginx</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building InternFlow (Part 2): Designing an AI Pipeline Without Calling GPT APIs</title>
      <dc:creator>Ayush Srivastava</dc:creator>
      <pubDate>Sun, 28 Jun 2026 09:25:39 +0000</pubDate>
      <link>https://dev.to/ayush_srivastava_01/building-internflow-part-2-designing-an-ai-pipeline-without-calling-gpt-apis-2ekj</link>
      <guid>https://dev.to/ayush_srivastava_01/building-internflow-part-2-designing-an-ai-pipeline-without-calling-gpt-apis-2ekj</guid>
      <description>&lt;p&gt;How I built a Retrieval-Augmented Generation system for code review and resume generation — and why avoiding hosted LLMs was the right call.&lt;/p&gt;




&lt;p&gt;One of the first decisions I made when designing InternFlow's AI layer was this: &lt;strong&gt;I didn't want to depend on OpenAI or any hosted LLM API&lt;/strong&gt; for the core functionality.&lt;/p&gt;

&lt;p&gt;This wasn't about cost alone — though that matters for a student project. It was about understanding how AI products actually work underneath the marketing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just call GPT?
&lt;/h2&gt;

&lt;p&gt;The core problem with sending code to a hosted LLM without context: it hallucinates. It'll write confident-sounding review comments about patterns it hasn't seen. For a resume generator, it'll invent metrics. None of that is useful for a student trying to land an internship.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hosted LLM API ❌&lt;/th&gt;
&lt;th&gt;Local RAG Pipeline ✅&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hallucinations on repo-specific code&lt;/td&gt;
&lt;td&gt;Answers grounded in real repo data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API cost scales with every request&lt;/td&gt;
&lt;td&gt;Fixed infrastructure cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No control over context window&lt;/td&gt;
&lt;td&gt;Full control over what the model sees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party dependency&lt;/td&gt;
&lt;td&gt;Runs entirely on our infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The RAG pipeline
&lt;/h2&gt;

&lt;p&gt;RAG stands for Retrieval-Augmented Generation. Instead of asking a model to answer from memory, you first retrieve relevant context, then pass it to the model alongside the question.&lt;/p&gt;

&lt;p&gt;Here's how the InternFlow pipeline works step by step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Step 1: fetch_repository()
        ↓
        Pull metadata + source files from GitHub API
        Filter to relevant file types (.py, .ts, .md, etc.)

Step 2: chunk_content()
        ↓
        Split files into overlapping chunks
        Function-level splitting for code
        Paragraph-level for documentation

Step 3: generate_embeddings()
        ↓
        Run each chunk through sentence-transformers
        Local embedding model — no GPU required

Step 4: store_in_faiss()
        ↓
        Index all embeddings in FAISS vector database
        Persistent per-repository index

Step 5: retrieve_context(query)
        ↓
        Embed the query at generation time
        Retrieve top-k most similar chunks

Step 6: generate(context + prompt)
        ↓
        Pass retrieved context to local language model
        Output is grounded in actual repository content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;RAG reduces hallucinations because the model is answering from retrieved evidence, not from memory. For code review, this matters enormously.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The tools I used
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Embedding model
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sentence_transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SentenceTransformer&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SentenceTransformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all-MiniLM-L6-v2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Vector store
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;faiss&lt;/span&gt;
&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;faiss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IndexFlatL2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Chunking
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain.text_splitter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RecursiveCharacterTextSplitter&lt;/span&gt;
&lt;span class="n"&gt;splitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RecursiveCharacterTextSplitter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;chunk_overlap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt; model is small enough to run on CPU without meaningful latency. FAISS handles similarity search efficiently even with thousands of chunks per repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  What made this harder than expected
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Inference speed&lt;/strong&gt; — Local models are slow without a GPU. I had to experiment with quantization and pick model sizes carefully. The right model for this use case is the smallest one that produces acceptable output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker image size&lt;/strong&gt; — A single AI service image with model weights bloated to gigabytes. I ended up downloading weights at container startup rather than baking them into the image layer, which made deployments much faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory management&lt;/strong&gt; — Loading multiple models simultaneously caused OOM errors. Each service needed explicit memory budgets and lazy loading — models loaded on first request, not at startup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt engineering&lt;/strong&gt; — Getting consistent, structured output from local models required significantly more iteration than with hosted APIs. The model needs very explicit instructions about output format.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;When a student connects their GitHub repo and pushes a commit, InternFlow can now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review the diff against their existing codebase context&lt;/li&gt;
&lt;li&gt;Generate resume bullets that reference actual functions, actual metrics, actual decisions — not generic boilerplate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pipeline runs entirely on our infrastructure, with no per-request API cost.&lt;/p&gt;

&lt;p&gt;The bigger lesson: &lt;strong&gt;most of the engineering in an AI product has nothing to do with AI&lt;/strong&gt;. It's data pipelines, memory management, latency budgets, and output parsing. Calling a hosted API hides all of that from you.&lt;/p&gt;




&lt;p&gt;In &lt;strong&gt;Part 3&lt;/strong&gt;, I'll walk through the deployment challenges: getting all of this running reliably in production with Docker, Nginx, SSL, and persistent storage.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm building &lt;a href="https://intern-flow.in" rel="noopener noreferrer"&gt;InternFlow&lt;/a&gt; — connect your GitHub, get AI code reviews on every commit, and generate ATS-ready resume bullets from your real work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;→ Try it free at &lt;a href="https://intern-flow.in" rel="noopener noreferrer"&gt;intern-flow.in&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building InternFlow (Part 1): Why I Chose a Microservice Architecture for a Student Project</title>
      <dc:creator>Ayush Srivastava</dc:creator>
      <pubDate>Sun, 28 Jun 2026 09:24:44 +0000</pubDate>
      <link>https://dev.to/ayush_srivastava_01/building-internflow-part-1-why-i-chose-a-microservice-architecture-for-a-student-project-1on5</link>
      <guid>https://dev.to/ayush_srivastava_01/building-internflow-part-1-why-i-chose-a-microservice-architecture-for-a-student-project-1on5</guid>
      <description>&lt;p&gt;Most tutorials tell you to start with a monolith. Here's why InternFlow went the other way — and what I learned from it.&lt;/p&gt;




&lt;p&gt;When I started building InternFlow, I knew it wouldn't be just another CRUD application. The platform needed to handle job crawling, AI-powered repository analysis, resume generation, authentication, and multiple background processes — all running concurrently.&lt;/p&gt;

&lt;p&gt;The obvious first instinct was to put everything inside one FastAPI application. Easier to build, easier to run locally, easier to reason about.&lt;/p&gt;

&lt;p&gt;But I kept running into the same problem: &lt;strong&gt;each feature had wildly different resource requirements.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The resource mismatch problem
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Job Crawler&lt;/strong&gt; — Network I/O bound, runs on a schedule&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Service&lt;/strong&gt; — CPU and memory heavy, unpredictable duration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web API&lt;/strong&gt; — Latency sensitive, users expect immediate responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG Service&lt;/strong&gt; — FAISS indexes + embedding models loaded in memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If all of these lived in one process, a single heavy AI request could block user-facing API responses. The job crawler running on a schedule would compete for the same thread pool as the REST endpoints. Debugging which part of the monolith was causing the slowdown would become a nightmare.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Running different workloads inside one process means the worst-performing one defines your entire system's reliability.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The architecture I settled on
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;         ┌─────────────────────┐
         │   Next.js Frontend  │
         └──────────┬──────────┘
                    │ HTTP
         ┌──────────▼──────────┐
         │  FastAPI API Service │
         └──┬──────────────┬───┘
            │   Docker     │  internal network
   ┌────────▼───┐   ┌──────▼──────┐   ┌───────────┐
   │ AI Service │   │ RAG Service │   │  Crawler  │
   └────────────┘   └─────────────┘   └───────────┘
            │              │
   ┌────────▼──────────────▼──────────┐
   │     PostgreSQL  │  Redis          │
   └─────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker Compose became the glue holding everything together. Each service has its own &lt;code&gt;Dockerfile&lt;/code&gt;, its own environment variables, and its own health checks. They communicate over a shared internal network, but are completely isolated from each other's failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monolith vs microservices for this project
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Single FastAPI App&lt;/th&gt;
&lt;th&gt;Microservices (chosen)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Heavy AI task slows all API responses&lt;/td&gt;
&lt;td&gt;AI service is isolated — API stays fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crawler competes with user requests&lt;/td&gt;
&lt;td&gt;Crawler runs on its own schedule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One crash takes everything down&lt;/td&gt;
&lt;td&gt;Service restarts don't affect others&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard to find the slow component&lt;/td&gt;
&lt;td&gt;Per-service logs make debugging fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Simpler local dev setup&lt;/td&gt;
&lt;td&gt;❌ Docker Compose adds initial overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The trade-off was real: the initial setup took longer. Writing Docker configs, managing inter-service communication, and dealing with network issues added friction in the first week. But every hour spent on that setup saved multiple hours later when debugging and scaling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd tell someone starting a similar project
&lt;/h2&gt;

&lt;p&gt;If your project has &lt;em&gt;genuinely different resource profiles&lt;/em&gt; across features — network-heavy, compute-heavy, latency-sensitive — separate them early. The cost of splitting a monolith later is much higher than the cost of Docker Compose configuration upfront.&lt;/p&gt;

&lt;p&gt;If you're building a simple CRUD app with one background job, a monolith is probably the right call.&lt;/p&gt;

&lt;p&gt;InternFlow wasn't that kind of project.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Docker Compose isn't just a deployment tool — it's an architectural decision that forces you to think about service boundaries before you have to.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;In &lt;strong&gt;Part 2&lt;/strong&gt;, I'll explain how I designed the AI pipeline that powers repository analysis and resume generation — including why I chose RAG over direct LLM API calls.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm building &lt;a href="https://www.intern-flow.in/" rel="noopener noreferrer"&gt;InternFlow&lt;/a&gt; — an AI code review and resume generation platform for B.Tech and engineering students. Connect your GitHub, get line-level code reviews on every commit, and turn your real work into ATS-ready resume bullets.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;→ Try it free at &lt;a href="https://www.intern-flow.in/" rel="noopener noreferrer"&gt;intern-flow.in&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>architecture</category>
      <category>python</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
