Personalized, agentic interview rehearsal CLI. Theory-only — system design, domain (crypto/ML/Solana), JD-specific, general. No leetcode.
reps reads your real shipped work (resume, portfolio, GitHub, JDs, notes), ingests it once, and then runs daily ~15-minute drills with four agents:
- Planner picks what to ask given your weakest topics, ELO, and target JDs.
- Interviewer asks the opening question and decides whether to probe with up to 3 follow-ups.
- Judge grades 1–5 against a category rubric and emits strengths/missed/better-answer-sketch/reading recs.
- Coach (offline) synthesizes a clustered study plan from your accumulated weak topics.
Voice answers via whisper.cpp. Text input too. Per-category ELO. Persistent SQLite store.
curl -fsSL https://raw.githubusercontent.com/Prasad-178/reps/main/scripts/install.sh | bash
reps initThe installer drops the binary at ~/.local/bin/reps (creates the dir, warns
if it's not on $PATH). If no release tarball matches your platform, it
falls back to go install automatically.
reps init then walks you through:
- API key paste once, validated live against OpenRouter, saved to
~/.reps/.env - Model pick a curated default or enter a custom OpenRouter model ID (validated live)
- Sources multi-select (resume / GitHub / portfolio / JDs / LinkedIn / X / notes) — press SPACE to toggle, ENTER to confirm
- Ingest spinner per source
- Profile auto chunk + embed + synthesize
The whole flow is one continuous TUI. No env vars to export, no second command to remember.
- Go install:
go install github.com/Prasad-178/reps/cmd/reps@latest - From source:
git clone https://github.com/Prasad-178/reps && cd reps && make install - Homebrew tap:
brew install repsai/reps(planned)
Tag pushes trigger .github/workflows/release.yml, which builds a CGO binary
on darwin/arm64, darwin/amd64, and linux/amd64 in parallel, then creates a
GitHub release with one tarball per platform plus checksums.txt.
git tag v0.1.0
git push origin v0.1.0scripts/install.sh immediately resolves the latest release and grabs the
matching reps_<v>_<os>_<arch>.tar.gz.
reps init --reset # wipes ~/.reps/* and re-runs the wizard
# or
make fresh # same, via the Makefilepdftotext(poppler) — forresumesource →brew install popplergh(GitHub CLI) — forgithubsource →brew install gh && gh auth loginsox+whisper-cli— optional, for--voicemic input →./scripts/install-whisper.sh
The wizard checks for these up front and prints exact install commands if any are missing.
reps init # or do these manually:
reps add resume ~/path/to/resume.pdf
reps add github your-username
reps add portfolio https://you.dev
reps add jd https://jobs.example.com/staff-ml-eng
reps profile --rebuild
reps drill --qs 3
reps stats
reps planreps init interactive personalization wizard
reps add resume <path> ingest resume PDF (uses pdftotext)
reps add portfolio <url> scrape portfolio (chromedp fallback)
reps add github <user> list repos + READMEs via gh CLI
reps add linkedin <ref> [--from-file p]
reps add x <handle> [--from-file p]
reps add jd <url> scrape JD + extract structured card
reps add note <path> ingest a markdown note
reps profile [--rebuild] show or rebuild synthesized profile
reps drill default: 3 Qs, text input
--voice mic input via whisper.cpp
--category <cat> force a category
--topic <str> force a topic
--jd <id> focus on one JD
--qs N 1..10
--difficulty <elo> override target ELO
reps stats per-category ELO + 7-day trend + weakest topics
reps history [--last N] recent sessions
reps replay <id> re-print a session
reps plan [--days 30] generate Markdown study plan
reps export [--md|--json] dump corpus + drills
reps config <key> [value] get or set a config key
reps reset --yes [--all|--data|--sources]
~/.reps/config.toml. Override via env: OPENROUTER_API_KEY, REPS_MODEL, REPS_EMBED_MODEL, REPS_JUDGE_MODEL, REPS_HOME.
[llm]
provider = "openrouter"
model = "google/gemini-2.0-flash-001"
embed_model = "openai/text-embedding-3-small"
judge_model = "anthropic/claude-3.5-haiku"
[voice]
enabled = true
whisper_bin = "/opt/homebrew/bin/whisper-cli"
whisper_model = "~/.reps/models/ggml-base.en.bin"
recorder = "sox"
[drill]
default_qs = 3
followup_max = 3
time_warn_sec = 240
[elo]
k_factor = 24
start_rating = 1200Defaults to Gemini 2.0 Flash for all four agents. One 3-question drill ≈ $0.005. Daily for a year ≈ $2.
./scripts/install-whisper.sh # installs whisper-cpp + sox via brew, downloads base.enA Next.js frontend lives in web/. The Go backend exposes an HTTP API via
reps serve (default :7777). They run independently — no embedded SPA, no
bundled binary inflation.
Easiest: drop a .env at the repo root and use make dev:
cp .env.example .env # then edit and set OPENROUTER_API_KEY
make dev # backend :7777 + frontend :3000, one terminalThe Go binary auto-loads .env from the current directory, $REPS_HOME/.env, or
$REPS_ENV_FILE. Real shell exports always win, so the loader only fills gaps.
If you prefer separate terminals:
# terminal 1 — backend
reps serve # reads ./.env automatically
# terminal 2 — frontend (dev)
cd web && bun install && bun dev
# open http://localhost:3000Pages:
/landing (marketing)/dashboardELO chart, KPIs, weakest topics, recent sessions/drilllive drill via SSE — Planner → Interviewer → Judge → ELO/sourcesingested resume / GitHub / portfolio / JDs / notes/jdsparsed JD cards/planlatest study plan (Markdown render)/historysession list/replay/[id]full transcript + judgment per question/profilesynthesized profile
Brand: Obsidian Spark — electric violet on near-black. See brand.md.
┌─────────────┐
~/.reps/sources/ ──ingest─▶ │ sqlite │
resume / GH / JD │ + sqlite-vec│
└──────┬──────┘
▼
┌─────────────┐
│ Planner │ picks (cat, topic, difficulty)
└──────┬──────┘
▼
RAG retrieve + rerank (top 3 chunks)
▼
┌─────────────┐
│ Interviewer │ opening → answer → maybe follow-up (≤3)
└──────┬──────┘
▼
┌─────────────┐
│ Judge │ rubric → rating, tags, reading
└──────┬──────┘
▼
ELO update + topic hits
▼
┌─────────────┐
│ Coach │ weekly study plan
└─────────────┘
MIT. BYO OpenRouter key. Local-only data.