My real, working daily AI job-prep setup β a local LLM (via Ollama) generates a fresh DSA problem, CS fundamentals concept, and tailored interview Q&A every morning, scheduled to run automatically. No per-call API costs, nothing sent to third parties (except the optional job-digest agent, which uses Ollama's hosted search, plus DuckDuckGo/YouTube lookups for links/videos).
π Read the full write-up: Tired of Doing Job Prep Manually Every Day? I Built Agents That Do It For Me β the complete Windows setup walkthrough with screenshots, from installing Ollama to scheduling it with Task Scheduler.
Tested and running on: Windows 11, GTX 1050 (4GB VRAM), phi4-mini via
Ollama, Ollama's hosted web search API, and the YouTube Data API for embedded
videos.
Want a version you can configure with your own background and choice of LLM provider (including hosted APIs like Groq/Mistral/Gemini, not just Ollama)? See HermePrep β Generic Edition β the generalized version of this same project.
Inspired by freeCodeCamp's "How to Build and Schedule Local AI Assistants for Daily Tasks".
Every morning, it prepares:
- A real LeetCode problem (Beginner/Intermediate/Advanced, with hints, three solution tiers, a diagram, and a real LeetCode + YouTube link)
- A CS fundamentals concept (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 digest of fresh job postings matching my target roles
...shown in a clean local web page, with a desktop notification when it's ready.
- Fully local LLM inference via Ollama β no data leaves the machine (except the optional live-search features noted above)
- One scheduled task, smart daily rotation (each agent declares which weekdays it runs)
- No-repeat memory β every agent tracks what it's already covered
- Real, curated DSA problems (not AI-invented) with tiered solutions and a Mermaid diagram of the optimal approach
- Live "Further Reading" links for CS concepts, fetched via DuckDuckGo
- Voice read-aloud for sample interview answers, with a voice picker
- A tabbed, dark-themed local web viewer + native popup notification
job-prep-agents/
βββ scheduler.py # loads every agent, runs what's due today, builds the viewer
βββ run_scheduler.bat # Windows Task Scheduler entry point
βββ notify.ps1 # native popup notification window
βββ .env.example # copy to .env β your model/API-key settings
βββ config/
β βββ profile.py # my real background/projects/target roles
βββ outputs/ # generated each run: viewer-YYYY-MM-DD.html + raw .md files
βββ history/ # auto-tracked: what's already been covered per agent
βββ agents/
βββ _history.py # shared no-repeat tracking helper
βββ _websearch.py # shared DuckDuckGo lookup helper (graceful fallback)
βββ dsa_problem.py # curated real 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 my target roles
Every agent is a Python file with a NAME and a run() that returns
Markdown. scheduler.py just discovers and runs everything in agents/.
Each agent declares which weekdays it runs via a SCHEDULE set (0=Monday
... 6=Sunday); no attribute means "every day." dsa_problem,
cs_fundamentals, interview_qa run daily; job_digest runs Mon/Thu.
ollama pull phi4-miniVRAM/context-window note: some models default to a huge context window, which can force far more memory allocation than the model's file size suggests β sometimes overflowing a small GPU into slow CPU inference. This project caps context via
num_ctx=4096in every agent. If things run slowly, runollama psβ ifPROCESSORisn't close to 100% GPU, the model/context is too big for your VRAM.
git clone <this-repo-url>
cd job-prep-agents
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txtcopy .env.example .envFill in .env:
OLLAMA_MODELβ the model you pulledOLLAMA_API_KEY(optional) β only needed forjob_digest. Get one at https://docs.ollama.com/api/authenticationYOUTUBE_API_KEY(optional) β enables real embedded videos for DSA problems. Get a free key via Google Cloud Console (enable YouTube Data API v3).
python scheduler.pyWatch for [run]/[ok] lines. When it finishes, your browser should
auto-open to outputs/viewer-<today>.html, and a popup notification appears.
Edit the two paths in run_scheduler.bat (project folder + venv's
python.exe), then test:
.\run_scheduler.batCheck runner.log for the same output as step 4.
schtasks /Create /SC DAILY /TN "HermePrep" /TR "D:\full\path\to\job-prep-agents\run_scheduler.bat" /ST 10:30 /RL HIGHESTVerify anytime:
schtasks /Query /TN "HermePrep" /V /FO LISTCheck the Last Result field β 0 means success.
| Want to change... | Edit this file |
|---|---|
| Background, projects, target roles, past questions | config/profile.py |
| Which DSA problems are covered / their difficulty | agents/dsa_problem.py β PROBLEM_BANK |
| Which CS topics rotate through | agents/cs_fundamentals.py β TOPICS |
| Which interview focus areas show up | agents/interview_qa.py β FOCUS_AREAS |
| Job search queries | config/profile.py β JOB_SEARCH_QUERIES |
| Which days an agent runs | that agent's SCHEDULE set |
| The model / API keys | .env |
| The look of the viewer page | scheduler.py β PAGE_STYLE / VIEWER_SCRIPT |
Scheduler hangs for minutes with no output
Almost always Ollama loading the model into memory for the first time (or
after being idle) β not actually stuck. Check ollama ps. Set
OLLAMA_KEEP_ALIVE=30m in .env so repeated runs stay fast.
ollama ps shows a huge memory size / mostly CPU, not GPU
The model's default context window is likely bigger than your VRAM can hold.
This project caps num_ctx=4096 in every agent already.
Batch file errors with garbled paths
The entire path needs to be inside one pair of quotes. Wrong:
cd /d C:\"My Folder"\project. Right: cd /d "C:\My Folder\project".
Windows Task Scheduler: task exists but "Last Result" isn't 0
-2147024891 (0x80070005) is "Access Denied" β a Task-Scheduler-specific
permissions issue, not a script bug (especially if double-clicking the
.bat directly works fine). Try recreating the task with /RL HIGHEST, and
check Windows Security β Virus & threat protection β Controlled folder
access, which sometimes blocks non-interactively-triggered scripts.
Embedded YouTube video shows "Error 153"
That's YouTube's error for "video owner disabled embedding elsewhere." This
project uses a clickable thumbnail + link instead of an <iframe>, which
works regardless of embed permissions.
Mermaid diagram shows a "bomb icon" / syntax error
Small local models occasionally produce invalid Mermaid syntax. The viewer validates syntax before rendering and shows a clean "Diagram unavailable" message instead.
Small local models still hallucinate β spot-check DSA solutions, job postings, and technical explanations before trusting them fully. Treat this as a study nudge and starting point, not gospel.
MIT β free to use, modify, and redistribute.









