DEV Community

Cover image for Tired of Doing Job Prep Manually Every Day? I Built Agents That Do It For Me
Metta Surendhar
Metta Surendhar

Posted on • Originally published at Medium

Tired of Doing Job Prep Manually Every Day? I Built Agents That Do It For Me

When I started serious interview prep, I ran into the same problem every day: what do I even practice today?

One day it was a random LeetCode problem, the next day I'd forget CS fundamentals entirely, and interview Q&A prep only happened the night before an actual interview.

There was no rhythm to it — just scattered effort.

So I built the Job Prep Agents :

A fully local, scheduled system that wakes up every morning and hands me a fresh DSA problem, a CS fundamentals concept, and a tailored interview Q&A, generated by a local LLM running through Ollama.

No API costs. Nothing sent to third parties, aside from an optional job-digest agent that uses Ollama's hosted search plus DuckDuckGo/YouTube for links and videos.

In this blog, I'll walk through exactly how I set this up on Windows:

  • Installing Ollama
  • Configuring my profile with help from Claude
  • Testing the scheduler
  • Testing the batch file
  • Scheduling it both via terminal and the Task Scheduler UI.

At the end, I'll also point you to the customizable edition of this project if you want to run your own version.

What It Actually Does

Every morning, it prepares:

  • A real LeetCode problem (Beginner/Intermediate/Advanced) with hints, three solution tiers (Brute Force → Better → Optimal), a Mermaid diagram, and real LeetCode + YouTube links
  • A CS fundamentals concept (OS, DBMS, CN, OOP, System Design — rotating) with a diagram and live further-reading links
  • A tailored interview Q&A, grounded in my actual projects and past interview questions
  • (Mon & Thu) A job digest of fresh postings matching my target roles

All of it shows up in a tabbed, dark-themed local web viewer, with a native desktop popup telling me when it’s ready.

Repo:

Inspired by freeCodeCamp’s blog :

Step 1: Install Ollama and Pull a Model

The whole point of this project is that inference happens locally. That’s powered by Ollama, which makes running open LLMs on your own machine almost trivial on Windows.

  1. Download and install Ollama from ollama.com — it installs like any normal Windows app and runs as a background service.
  2. Pull a model. I settled on phi4-mini, which runs comfortably even on a modest GPU (I’m on a GTX 1050, 4GB VRAM):
ollama pull phi4-mini
Enter fullscreen mode Exit fullscreen mode

  1. Test run the pulled model :
ollama run phi4-mini:latest "Say hello in one sentence."
Enter fullscreen mode Exit fullscreen mode

Quick tip: some models default to a huge context window, which can force way more memory allocation than the model’s file size suggests — sometimes spilling a small GPU into slow CPU inference. This project caps context at num_ctx=4096 in every agent to avoid that.

If things run slowly, check:

ollama ps
Enter fullscreen mode Exit fullscreen mode

If PROCESSOR isn't close to 100% GPU, the model/context is too big for your VRAM.

Step 2: Clone the Repo and Set Up the Environment

Project Setup

git clone https://github.com/MettaSurendhar/job-prep-agents
cd job-prep-agents

python -m venv .venv
.venv\Scripts\activate

pip install -r requirements.txt
Enter fullscreen mode Exit fullscreen mode

Project structure:

job-prep-agents/
├── agents/
│   ├── dsa_problem.py       # curated LeetCode problems + tiered solutions
│   ├── cs_fundamentals.py   # rotating OS/DBMS/CN/OOP/System Design concepts
│   ├── interview_qa.py      # tailored + generic interview Q&A
│   └── job_digest.py        # Mon & Thu: job postings matching target roles
├── config/
│   └── profile.py           # my real background/projects/target roles
├── scheduler.py             # loads every agent, runs what's due, builds the viewer
├── run_scheduler.bat        # Windows Task Scheduler entry point
├── notify.ps1               # native popup notification
└── .env.example             # copy to .env for model/API-key settings
Enter fullscreen mode Exit fullscreen mode

NOTE : Every agent is just a Python file with a NAME and a run() that returns Markdown. scheduler.py discovers and runs whatever's in agents/, based on each agent's own SCHEDULE. That's the trick one scheduled task instead of four.

Step 3: Configure the Profile — With Help From Claude

The one file with actual personal content is config/profile.py — my background, real projects, target roles, and past interview questions. This is what makes the daily Q&A feel tailored instead of generic.

Instead of writing this by hand, I used Claude: I fed it my resume and a rough note of my target roles, and had it draft config/profile.py in the structure the project expects. This is exactly the kind of scaffolding an AI assistant is good at — turning a messy resume into a clean, structured config file, which I then reviewed and tightened up myself.

Set up the environment file:

copy .env.example .env
Enter fullscreen mode Exit fullscreen mode

In .env:

  • OLLAMA_MODEL — set to phi4-mini
  • OLLAMA_API_KEY (optional) — only needed for the job_digest agent's live search
  • YOUTUBE_API_KEY (optional) — enables real embedded videos for DSA problems

Step 4: Test the Scheduler Manually

Before scheduling anything, I ran it by hand to confirm it actually worked end-to-end:

python scheduler.py
Enter fullscreen mode Exit fullscreen mode

Watch for [run] / [ok] lines as each agent fires — DSA problem, CS fundamentals, interview Q&A (and job digest, on Mon/Thu). Once it finishes, the browser auto-opens to outputs/viewer-<today>.html, and a popup notification confirms it's done.

NOTE : This manual run is the real checkpoint. If something’s misconfigured like wrong model name, missing API key, Ollama not running then it shows up here, in a plain terminal, long before Task Scheduler enters the picture.

Step 5: Test the Batch File

Task Scheduler doesn’t play nicely with Python scripts directly — it’s much easier to point it at a .bat file that activates the virtual environment and calls the script. That's run_scheduler.bat.

I edited the two paths in it (project folder + venv’s python.exe), then ran it directly:

.\run_scheduler.bat
Enter fullscreen mode Exit fullscreen mode

This writes the same output into runner.log, so I could confirm the batch file behaves exactly like the manual run:

Gotcha: if your project path has spaces, the entire path needs to sit inside one pair of quotes. Wrong: cd /d C:\"My Folder"\project. Right: cd /d "C:\My Folder\project".

Step 6: Schedule It With Windows Task Scheduler

With the batch file confirmed working, the last step was making it run automatically every morning. I tried both the terminal command and the Task Scheduler UI to compare.

Via Terminal (schtasks)

schtasks /Create /SC DAILY /TN "Job Prep Agents" /TR "D:\full\path\to\job-prep-agents\run_scheduler.bat" /ST 10:30 /RL HIGHEST
Enter fullscreen mode Exit fullscreen mode

This creates a daily task named “Job Prep Agents” that fires run_scheduler.bat at 10:30 AM with the highest available privileges (/RL HIGHEST — without it, some non-interactive runs get blocked).

Verify it anytime with:

schtasks /Query /TN "Job Prep Agents" /V /FO LIST
Enter fullscreen mode Exit fullscreen mode

NOTE : The field to watch is Last Result0 means success. Anything else, most commonly -2147024891 (0x80070005, "Access Denied"), usually points to a Task Scheduler permissions issue, not a broken script. Recreating the task with /RL HIGHEST, or checking Windows Security → Virus & Threat Protection → Controlled Folder Access, tends to fix it.

Via the Task Scheduler UI

I also set this up through Task Scheduler (taskschd.msc) to see the equivalent flow:

  1. Open Task Scheduler → Create Task (not “Basic Task” — this gives access to all options).
  2. General tab — name it “Job Prep Agents,” set “Run whether user is logged on or not,” and “Run with highest privileges.”
  3. Triggers tab — New → Daily → set start time (10:30 AM, matching the terminal example).
  4. Actions tab — New → Start a program → point it at run_scheduler.bat, with "Start in" set to the project folder.
  5. Conditions/Settings tabs — unchecked “Start the task only if the computer is on AC power,” since this runs on a laptop.

Both routes create the exact same underlying task — schtasks is faster once you know the flags, the UI is easier to eyeball and tweak.

Final Results

With the task scheduled, this now runs unattended every morning. Here’s what actually shows up:

Main dashboard :

CS Fundamentals tab :

DSA Problem tab :

Interview Q&A tab :

A few things worth flagging after actually living with this:

  • No-repeat memory works well — every agent tracks what’s already covered in history/, so I'm not seeing the same DSA problem or interview question loop back too soon.
  • Small local models like phi4-mini occasionally produce invalid Mermaid diagram syntax. The viewer validates this before rendering and shows a clean "Diagram unavailable" message instead of breaking.
  • Small local models still hallucinate sometimes. I treat the DSA solutions, job postings, and technical explanations as a study nudge, not gospel — spot-check before trusting anything fully.

Want Your Own Version? Try the Customizable Edition

Everything above is my real setup — my resume data, my target roles, tuned for my hardware. If you want your own version with your own background, and a choice of LLM provider (not just Ollama — Groq, Mistral, or Gemini too, if you’d rather skip local GPU constraints).

Customizable edition:

Same agents, same features, but config-driven:

  • config/profile.py is where your background, projects, and target roles go — with a filled-out example in examples/profile.metta.py for reference
  • LLM_PROVIDER in .env switches between ollama, groq, mistral, or gemini — one line, nothing else in the codebase changes
  • It ships with a CLAUDE.md file written specifically to guide Claude (or Claude Code) through setting the whole thing up — picking a provider, filling in your profile from your resume, installing dependencies, and scheduling it. If you have Claude Code, just open the repo and ask it to set the project up for you.
  • scheduler.py itself runs fine on macOS/Linux too (cron instead of Task Scheduler); the popup notification (notify.ps1) is currently Windows-only.

If you’re a fresher, a career-switcher, or anyone doing structured interview prep who’d rather have a study plan waiting each morning than build one from scratch every day — this fork is for you.

Conclusion

Job prep doesn’t need to be something you scramble to figure out every single day. By combining a local LLM, a set of small Python agents, and Windows Task Scheduler, I turned my daily study routine into something that just runs itself — for free, entirely on my own machine.

If you’re prepping for interviews and want this same daily rhythm without the manual effort, give Job Prep Agents a try — and if you want your own personalized version, the customizable edition is ready to fork.

Top comments (0)