GrillKit – self-hosted AI technical interview trainer GrillKit, an open-source AI technical interview trainer, has been released, allowing users to configure OpenAI-compatible models and practice from YAML question banks. The tool features real-time scoring, optional voice input and question audio, and supports multiple tracks including Python, Database, and System Design. It runs locally via Docker Compose, storing data in SQLite, and is designed for self-hosted interview preparation. Open-source AI technical interview trainer. Configure an OpenAI-compatible model, practice from YAML question banks, and get real-time scoring with optional voice input and question audio. Quick start quick-start · Changelog /GrillKit/grillkit/blob/main/CHANGELOG.md · Architecture /GrillKit/grillkit/blob/main/ARCHITECTURE.md Demo video — full flow from setup to scored feedback Dashboard — recent sessions and quick start Interview setup — question-bank tracks, levels, topics, and session options Interview session — real-time Q&A with AI scoring and final evaluation Interviews — multi-track setup Python, Database, System Design, … , several topics per session, WebSocket Q&A, AI scoring 1–5, up to 2 follow-ups per question Timer — optional per-round time limit; expired rounds score 0 and the session moves on Voice — offline Whisper dictation for answers; optional Piper TTS to read questions aloud Question banks — Python, Database/SQL, and System Design data/questions/{track}/ , junior / middle / senior Setup — model catalog on /config , interview locale AI feedback language , Whisper/Piper downloads from the UI Dashboard — recent interview history on the home page Persistence — SQLite data/db/grillkit.db ; Docker Compose on port 8000 with ./data volume Planned - Session-wide time limit total interview duration - More question banks Go, JavaScript, Java, C++, … - Code editor in the interview UI - Custom question banks, PWA / standalone frontend Docker https://docs.docker.com/get-docker/ and Docker Compose https://docs.docker.com/compose/install/ - API key for a cloud provider, or a local OpenAI-compatible server Ollama, vLLM, … git clone https://github.com/yourusername/grillkit.git cd grillkit docker compose up --build Open http://localhost:8000 http://localhost:8000 . Optional question voice Piper TTS, same app container : - Run docker compose up or uv run uvicorn app.main:app for development . - Open /config , enable Read questions aloud , save. - On the Configuration page, use Download question voice when prompted ~60 MB per locale voice from Hugging Face . - Start an interview — questions can play aloud; WAV cache lives under data/tts-cache/v2/{locale}/ . ./data on the host holds SQLite, config.json , llm models.json , Whisper/Piper models, and TTS cache. Question banks, templates, and static files are in the image. If bind-mounted data/ is not writable Linux UID mismatch : PUID=$ id -u PGID=$ id -g docker compose up --build Configuration /config — add one or more OpenAI-compatible models to the catalog, select an interview model, set interview locale; test connection, then save. New interview /setup — enable one or more question-bank tracks level per track , select multiple topics, set total question count at least one per selected topic; interview locale is read-only from config . Interview /interview/{id} — page loads history; answers and completion go over WebSocket. Without saved provider config, /setup redirects to /config . uv sync --extra dev uv run uvicorn app.main:app --reload Same first-time flow at http://127.0.0.1:8000 http://127.0.0.1:8000 . Any OpenAI-compatible HTTP API works single adapter in code : | Provider | Example base URL | |---|---| | OpenAI | https://api.openai.com/v1 | | Ollama | http://localhost:11434/v1 | | vLLM / others | your endpoint + /v1 | On /config , use Add model to catalog to save OpenAI-compatible providers base URL, model name, optional API key . Entries are stored in data/llm models.json /GrillKit/grillkit/blob/main/data/llm models.json gitignored . Select an interview model from the list, run Test Connection , then save. Application settings and interview locale AI feedback and dictation language live in data/config.json gitignored . Do not commit secrets. After saving configuration, choose a Whisper model size small , medium , or large and download it from the Configuration page stored under data/whisper-models/