skill
interviewdrip
Self-hosted interview question bank that fills itself — scrapes LeetCode interview experiences, extracts questions with AI, local web GUI, optional Notion sync
Set up
Skills are installed by placing their folder where your agent loads skills.
The download comes from github.com/prakx1/interviewdrip itself, not from our server, so what you get is exactly what its author published.
Install instructions come from the README
README
synced Oct 25, 2026InterviewDrip 💧
A self-hosted interview question bank that fills itself.
InterviewDrip pulls fresh posts from LeetCode Discuss — interview experiences and the career discussion around them — and uses an LLM to turn them into structured data: every question asked (with a canonical name, difficulty, round and topic tags), plus takeaways about how people are actually getting interview calls and what's in the way. An Insights dashboard shows what's being asked, by which companies, how it's trending, and what the job-hunt conversation is about — over the last 30/60/90 days. Bring any LLM: OpenAI, Claude, OpenRouter, or a local model. Your data stays in a SQLite file on your machine.
⚡ Try it in 60 seconds
No API keys, no accounts — the demo seeds sample data instantly:
git clone https://github.com/prakx1/interviewdrip.git
cd interviewdrip
make demo # installs everything, seeds sample questions
make gui # opens http://localhost:8000
macOS / Linux
python3 -m venv venv
venv/bin/pip install -r requirements.txt
venv/bin/python main.py --run-once --demo
venv/bin/python webapp.py
Windows
py -m venv venv
venv\Scripts\pip install -r requirements.txt
venv\Scripts\python main.py --run-once --demo
venv\Scripts\python webapp.py
Only prerequisite: Python 3.10+.
git clone https://github.com/prakx1/interviewdrip.git
cd interviewdrip
docker compose up # builds and serves on http://localhost:8000
The question bank persists in a named volume. Seed sample data with:
docker compose run --rm interviewdrip python main.py --run-once --demo
For real scraping, copy .env.example to .env (add your LLM key) and
uncomment the env_file: lines in docker-compose.yml.
That's the app with sample data. To fill it with real, current questions: click ⚙ Settings, pick a provider, paste a key (or point it at a local model — then there's no key at all), hit Save & test, then Fetch new. Done — no config files needed.
📊 What the dashboard tells you
Open the Insights tab and pick a window (30 / 60 / 90 / 180 days):
- KPIs with deltas — interview posts, questions, companies, career discussions, takeaways; change vs. the previous window of the same length.
- Weekly activity — how many interview posts landed each week.
- Companies asking the most — ranked by questions extracted, with trend; click one to browse every question from that company.
- Hot topics — question tags (Arrays, System Design, DP…) with the change vs. the previous window.
- Most-asked questions — the same problem seen across posts, grouped by canonical name ("LRU Cache", "Design URL Shortener") with the companies that asked it; click to see every instance.
- Round / difficulty / outcome breakdowns.
- Career pulse — takeaways from career-discussion posts grouped by theme:
how people are getting interview calls, referrals, resumes, the job market,
ghosting, layoffs, off-campus, preparation. Each links to its source post.
The top-voted replies to every post are pulled too, so advice given to
a poster is captured and tagged
reply. - What people recommend — only the reply-sourced advice, by theme: the community's actual answers to "how do I get more calls?".
- Recent posts — newest first, with the one-line summary the LLM wrote.
The Questions tab is the searchable bank: filter by company, topic, round, difficulty and window.
🧠 Bring your own model
Every provider goes through one OpenAI-compatible client — pick one in Settings, or run fully local and pay nothing:
| Provider | Default model | Key |
|---|---|---|
| OpenAI | gpt-5-mini | sk-... |
| Anthropic (Claude) | claude-haiku-4-5 | sk-ant-... |
| OpenRouter | google/gemini-2.5-flash-lite | sk-or-v1-... |
| Ollama (local) | qwen3:8b | none |
| LM Studio (local) | whatever you loaded | none |
| Custom (vLLM / LiteLLM / any proxy) | yours | optional |
Extracting a run of 30 posts costs about a cent on the cheap cloud models,
zero on local ones. Base URL and model are editable, so any OpenAI-compatible
endpoint works — including corporate LLM gateways / LiteLLM proxies (pick
Custom, paste the gateway URL, and use the model name it lists at
/v1/models). For reasoning models (gpt-5.x, o-series) you can set a
Reasoning effort (low → xhigh); it's sent as reasoning_effort and dropped
automatically if the endpoint doesn't support it. Prefer files? Everything can
also live in .env (.env.example) — GUI values override it.
🤖 Use it from Claude Code
Install the plugin and Claude can search your bank mid-conversation:
/plugin marketplace add prakx1/interviewdrip
/plugin install interviewdrip@interviewdrip
Then just ask "what system design questions has Meta been asking lately?" —
Claude calls the bundled MCP tools (search_questions, list_companies,
scrape_now). The MCP server is stdlib-only: nothing to install.
🔁 Keep it dripping
make run # scrape once
make schedule # scrape now, then every 24 hours
| Flag | Meaning |
|---|---|
--run-once | Run once and exit (otherwise runs on a schedule) |
--interval N | Hours between scheduled runs (default 24) |
--days N | Only posts from the last N days (default 90) |
--date YYYY-MM-DD | Only posts from one exact date |
--max-posts N | Cap on posts listed per category (default 600; it warns if hit) |
--workers N | Concurrent LLM extractions (default 4) |
--reprocess | Re-extract posts already in the bank too (after switching model/prompt); replaces their questions and takeaways in place |
--demo | Seed generated sample data — no keys, no network |
Nine Discuss categories are pulled (interview experiences, interview questions, career, job search, off-campus, tips…). Posts are deduplicated by URL before their bodies are fetched and each one is saved the moment it's extracted, so runs are incremental and interruption-safe: leave the schedule running and the bank drips fuller every day.
Optional Notion mirror: add a Notion API key + database ID in Settings and every new question also lands in Notion (columns auto-detected: Question, Company, YOE, Source URL, Date Scraped, Tags — share the database with your integration). SQLite stays the system of record; if Notion is down, nothing is lost.
🩹 Troubleshooting
python3: command not found— install Python 3.10+ from python.org (macOS:brew install python).- SSL/urllib3 errors on macOS — you're on the ancient system Python 3.9;
brew install pythonand recreate the venv. - Dashboard says "No posts in the last N days" — widen the window (30 → 90 → 180 days) or hit Fetch new. A brand-new, empty bank offers Seed demo data instead.
- LLM test fails with a local provider — make sure Ollama / LM Studio is running and the model is pulled/loaded.
- Port 8000 in use —
venv/bin/python webapp.py --port 9000.
🔧 How it works
LeetCode Discuss ──> LLM extraction ──> SQLite (yours, local)
(9 categories, (any provider, ├─> Insights dashboard + question browser
GraphQL API) 1 call per post) ├─> Claude Code plugin (MCP)
└─> Notion (optional mirror)
scraper.py— LeetCode's public GraphQL API (what their frontend calls), newest-first across nine categories, stopping at the window edge. No browser, no HTML parsing.processor.py— one LLM call per post classifies it (interview experience / career discussion) and extractsquestions[{question, canonical, tags, difficulty, round}]andtakeaways[{takeaway, theme}]; runs concurrently; degrades gracefully when an endpoint lacks JSON mode.db.py— SQLite storage, dedup, and theinsights()aggregator behind the dashboard (trends vs. the previous window, canonical-question grouping, themes).config.py— settings resolution: GUI (SQLite) >.env> provider presets.webapp.py+web/— dependency-free GUI: Insights + Questions views, settings, fetch.mcp_server.py— stdlib-only MCP server for the Claude Code plugin (get_insights,search_questions,list_takeaways,list_companies,scrape_now).notion_writer.py— optional Notion sink.demo_data.py— the--demogenerator.
Privacy: the GUI binds to 127.0.0.1 only; keys you save live in your
local SQLite file and are masked in every API response. Nothing leaves your
machine except the scrape and LLM calls you configure.
⚖️ Responsible use
InterviewDrip is a personal, self-hosted research tool. Please use it that way:
- It reads LeetCode's public GraphQL API — the same endpoint the site's own frontend calls — with modest rate-limiting. That API is unofficial and using it is subject to LeetCode's Terms of Service; you are responsible for your own use.
- Discussion posts are their authors' content. The tool keeps the source URL on every question for attribution, and is meant for private study — not for republishing scraped posts.
- Don't run this as a shared/hosted scraping service or publish a dataset of
verbatim scraped posts. The only public/shareable data this project ships is
the synthetic sample data from
demo_data.py. - No warranty — see the LICENSE. Be a good citizen of the sites you read.
🤝 Contributing
PRs welcome — see CONTRIBUTING.md. Good first issues: more sources (Glassdoor, Blind, Reddit), more sinks (CSV, Google Sheets, Obsidian), GUI niceties.