Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data โ all from the browser, and deployed in milliseconds.
Simulate real interview sessions, get AI-scored feedback, and improve fast.
Built on Val Town โ runs in your browser, powered by OpenRouter free models.
- 5 dynamic screens โ Setup โ Interview โ Feedback โ Results, with a global loading overlay
- 4 interview modes โ Technical, Behavioral, System Design, HR
- AI-generated questions matched to job title, level, and company type
- Per-answer scoring across Clarity, Depth, Relevance, and Structure
- Strengths, improvements, coaching tip, and model answer for every question
- Voice input via the Web Speech API (Chrome)
- Optional countdown timer with circular SVG progress indicator
- Hints, skips, and retries during the session
- Session results page with radar chart, expandable per-question table, and personalized recommendations
- Export session report as
.txtor copy summary to clipboard - Retry weak questions to drill the ones you scored lowest on
- Auto-resume an in-progress session on accidental refresh (via
sessionStorage) - Dark professional theme with smooth animations, no frameworks
Rendering mermaid diagram...
The OpenRouter API key is held only on the server as the OPENROUTER_API_KEY
env var โ it is never sent to the browser. All AI calls go through /api/ai.
| File | Role |
|---|---|
main.tsx | Hono HTTP server. Hosts static files and the /api/ai proxy. |
index.html | Markup for all four screens + loading overlay. |
styles.css | Design system, dark theme, animations, responsive layout. |
app.js | Client logic: state, screens, API calls, voice, timer, radar. |
favicon.svg | App favicon. |
Set the env var on your val:
| Key | Description |
|---|---|
OPENROUTER_API_KEY | Your OpenRouter API key (already configured) |
The model is openrouter/free โ OpenRouter's auto-router for free models โ
which survives individual model deprecations.
- Setup screen โ user picks job title, level, type, timer, etc.
- Question generation โ
/api/aiis called once with a prompt asking for a JSON array of N questions. The client parses the JSON (with markdown-fence stripping fallback) and stores it inAppState.questions. - Interview screen โ for each question the user types or speaks an answer.
- Per-answer evaluation โ on submit,
/api/aiis called with a scoring prompt; the JSON response feeds the Feedback screen with animated bars and a color-coded overall score. - Session results โ after the last question, a radar chart is drawn from the average sub-scores, the per-question table is rendered, and a final recommendations call generates 5 study tips.
- Free-tier OpenRouter models have rate limits (~200 requests/day on unfunded accounts). Heavy testing may exhaust the quota.
- Voice input requires Chromium-based browsers.
- WebSockets aren't supported on Val Town โ all communication is HTTP.