Skip to content
Conduit

skill

interviewdrip

Self-hosted interview question bank that fills itself — scrapes LeetCode interview experiences, extracts questions with AI, local web GUI, optional Notion sync

prakx1/interviewdripcommunitylistedunreviewed

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

Skills do not use an MCP config. Follow the steps in the README below.

README

synced Oct 25, 2026

InterviewDrip 💧

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.

MIT license Python 3.10+ No cloud, no accounts PRs welcome

⚡ 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:

ProviderDefault modelKey
OpenAIgpt-5-minisk-...
Anthropic (Claude)claude-haiku-4-5sk-ant-...
OpenRoutergoogle/gemini-2.5-flash-litesk-or-v1-...
Ollama (local)qwen3:8bnone
LM Studio (local)whatever you loadednone
Custom (vLLM / LiteLLM / any proxy)yoursoptional

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
FlagMeaning
--run-onceRun once and exit (otherwise runs on a schedule)
--interval NHours between scheduled runs (default 24)
--days NOnly posts from the last N days (default 90)
--date YYYY-MM-DDOnly posts from one exact date
--max-posts NCap on posts listed per category (default 600; it warns if hit)
--workers NConcurrent LLM extractions (default 4)
--reprocessRe-extract posts already in the bank too (after switching model/prompt); replaces their questions and takeaways in place
--demoSeed 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 python and 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 extracts questions[{question, canonical, tags, difficulty, round}] and takeaways[{takeaway, theme}]; runs concurrently; degrades gracefully when an endpoint lacks JSON mode.
  • db.py — SQLite storage, dedup, and the insights() 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 --demo generator.

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.

License

MIT

↑↓ navigate openesc close