A productized practice experience built on Lydia Hallie's JavaScript questions.
JS Questions Lab turns the well-known javascript-questions repository into an interactive
learning product with active recall, runnable snippets, event-loop visualization, local-first
progress tracking, and optional cloud sync.
This repository is not just a website and it is not just a content mirror. It is both:
- a Next.js application in
apps/web - a content pipeline rooted in the synced upstream source
JS Questions Lab is designed for several audiences at once:
- Site users: people practicing JavaScript interview questions in a faster feedback loop
- Product and design collaborators: people shaping UX, learning flow, onboarding, and retention
- Contributors: engineers improving the app, docs, tooling, and pipeline
- Upstream-aware maintainers: people who need a clear boundary between original source material and product-specific layers
Lydia Hallie's original repository is one of the best JavaScript learning resources on the internet. But reading a long README is a different activity than practicing under interview conditions.
This project turns that source into a product flow:
- Browse a curated library of questions
- Commit to an answer before seeing the explanation
- Run the snippet when relevant
- Inspect runtime behavior and event-loop details
- Track progress and come back through review loops
| Topic | Details |
|---|---|
| Product goal | Make JavaScript interview practice feel focused, fast, and repeatable |
| Core loop | Browse -> answer -> reveal -> run -> inspect -> review |
| Rendering model | Static-first for content, dynamic only where auth or sync truly needs it |
| Runtime model | Worker-based client-side execution for runnable snippets |
| Persistence | Local-first progress with optional Clerk + Supabase sync |
| i18n | Locale-prefixed routes with next-intl |
| Source content | Synced from Lydia Hallie's original repository |
The canonical source content in this repository is:
content/source/README.upstream.md
This file is a synced snapshot of Lydia Hallie's upstream repository and is treated as the source of truth for the question corpus.
Generated artifacts are derived from it:
content/generated/questions.v1.jsoncontent/generated/manifest.v1.jsoncontent/generated/locales/*
Important
Do not manually edit generated content files.
If you need to change source material, prefer:
- an upstream fix
- a documented local overlay strategy
- or a parser/content-pipeline update
Because this project builds on the original source, the historical context of that source still matters:
Note
This repo was created in 2019 and the questions provided here are therefore based on the JavaScript syntax and behavior at that time. Since JavaScript is a constantly evolving language, there are newer language features that are not covered by the questions here.
That note is relevant here too. JS Questions Lab modernizes the learning experience, but it does not pretend the original question set was authored against today's full JavaScript surface area.
- A cleaner question library instead of one giant markdown scroll
- Answer-first practice instead of passive reading
- Runnable snippets in a browser-friendly worker sandbox
- Event-loop and runtime visualization where it adds learning value
- Local-first progress that works without account creation
- Optional authentication and sync for persistence across devices
- Multi-locale support for six pilot locales
- The app lives in
apps/web - The upstream source snapshot lives in
content/source - Generated content lives in
content/generated - The parser and sync scripts live in
scripts - Local-first guest usability is a deliberate product choice
- Worker-based snippet execution is a deliberate architectural choice
- Next.js 16 App Router
- React 19
- Tailwind CSS v4
- Static-first rendering for content-heavy routes
- Dynamic rendering only where auth or personalized server behavior needs it
- Sync upstream source into
content/source/README.upstream.md - Parse the source into structured JSON
- Load generated JSON at build time
- Render localized question experiences without requiring a content backend
- Local browser storage is the primary persistence layer
- Clerk provides optional identity
- Supabase provides optional sync storage
apps/web Product app (Next.js)
content/source Canonical synced upstream source snapshot
content/generated Parsed/generated question data and manifests
scripts Upstream sync + parsing pipeline
supabase Migrations and sync-related backend setup
CONTRIBUTING.md Contribution workflow and expectations
AGENTS.md Current engineering context for coding agents
- Bun
1.3.9 - Node.js
18+
bun installbun run devThen open http://localhost:3000.
Guest mode works by default.
If you want to test authentication or progress sync:
- Copy
apps/web/.env.exampletoapps/web/.env.local - Fill in Clerk and Supabase values
- Review
.context/docs/auth-sync.md
| Command | Purpose |
|---|---|
bun run dev |
Start local development |
bun run build |
Build the app for production |
bun run start |
Start the production build |
bun run lint |
Run repo lint checks |
bun run typecheck |
Run TypeScript checks |
bun run sync:upstream |
Refresh the upstream source snapshot |
bun run parse:questions |
Parse source content into generated JSON |
bun run content:refresh |
Sync upstream and regenerate content |
GitHub Actions is the source of truth for validation. Local hooks like Husky are helpful for faster feedback, but they are not relied on for correctness.
The CI workflow currently:
- caches Bun's global package download cache
- installs dependencies with
--ignore-scriptsso local-only hooks do not slow down CI - runs lint, typecheck, and build as independent checks
- supports optional Turborepo Remote Cache when GitHub Actions is configured with:
- repository variable
TURBO_TEAM - repository secret
TURBO_TOKEN
- repository variable
If those cache credentials are present, Turbo can reuse work across CI runs instead of rebuilding from scratch each time.
The product aims for:
- a LeetCode-like JavaScript interview practice feel
- premium but restrained design
- a fast answer -> feedback -> retry loop
- excellent mobile ergonomics
- strong explanation + visualization pairing
The product avoids:
- auth-first UX
- runtime-model sprawl
- generic dashboard bloat
- turning the upstream source into an untraceable fork
This repo is especially useful if you want to reason about:
- onboarding and activation for learners
- retention loops through review, streaks, and recommendations
- static-first content delivery with selective personalization
- how learning UX can become more interactive without losing source fidelity
This project is built with explicit attribution and source integrity in mind.
- Original questions and explanations come from Lydia Hallie's work
- The source snapshot remains traceable in this repository
- Product-specific UX, runtime tooling, and progress systems are layered on top
- Generated files are derived artifacts, not a new canonical source
| File | Why it matters |
|---|---|
CONTRIBUTING.md |
Setup, validation, workflow, and PR guidance |
AGENTS.md |
Current repo guardrails and architecture context |
.context/docs/learning-roadmap.md |
Current product direction and learning-platform priorities |
.context/docs/question-discovery.md |
Filter, progress, and discovery architecture decisions |
.context/docs/auth-sync.md |
Auth + sync integration details |
.context/docs/content-pipeline.md |
Upstream sync and generated-content contract |
Contributions are welcome across:
- product UX
- frontend implementation
- content pipeline improvements
- auth and sync flows
- docs and onboarding
- performance and rendering strategy
Start with CONTRIBUTING.md.
JS Questions Lab is built on top of
Lydia Hallie's javascript-questions.
The educational source material belongs to that original work and its contributors. This repository adds the product layer around it: interface design, practice flow, visualization, runtime tooling, progress systems, and localization infrastructure.