challenges
No blanks. Write the whole thing.
Same test suites, nothing filled in for you. Use these when an exercise has stopped being hard.
56 challenges · from scratch, build the tool, and pin it down
- TypeScriptadvanced
Challenge: write promiseAll from scratch
Implement the semantics of Promise.all — results in input order, first rejection wins, plain values pass through — without calling Promise.all.
Other · read it; sign in to run
- Reactintermediate
Challenge: Build a Custom useLocalStorage Hook
Create a React hook that persists state to localStorage with proper typing.
From scratch · read it; sign in to run
- TypeScriptadvanced
Challenge: build a min-heap
Implement push, pop and peek over an array-backed binary min-heap — the smallest value is always one index away.
Other · read it; sign in to run
- Reactintermediate
Pin it down: the cases that make a classnames helper unambiguous
Five implementations of cn(). One is right and four skip a sentence each — and every one of them handles cn('btn', 'active') perfectly. Write the cases that tell them apart.
Pin it down · read it; sign in to run
- TypeScriptbeginner
Challenge: Build a Type-Safe Counter
Implement a counter class with proper TypeScript types from scratch.
From scratch · read it; sign in to run
- TypeScriptexpert
Challenge: a consistent hashing ring
Place cache nodes on a hash ring so that adding or removing one barely remaps the keys — the placement rule behind every distributed cache.
Other · read it; sign in to run
- Reactintermediate
Build the tool: check every usage against the props table
The wrong props for an internal Button feel type-checked because they are famous, not because they are right. The props table exists. Write the rule that holds every usage to it.
Build the tool · read it; sign in to run
- TypeScriptintermediate
Challenge: an LRU cache
Implement a fixed-capacity cache that evicts the least recently used key, with constant-time get and put.
Other · read it; sign in to run
- Vue.jsintermediate
Build the tool: find the watcher that watched a value
A search composable here shipped a watch(state.query) that never fired once. Vue only warns at runtime, on the path nobody exercises. Write the rule that finds it in source.
Build the tool · read it; sign in to run
- Vue.jsintermediate
Challenge: Build a Custom useLocalStorage Composable
Create a Vue composable that persists reactive state to localStorage.
From scratch · read it; sign in to run
- TypeScriptintermediate
Build the tool: find the tests that assert nothing
A test with no assertion passes as long as the code compiles. Reviewing for it by hand does not scale. Write the check that finds them across a whole corpus.
Build the tool · read it; sign in to run
- Vue.jsintermediate
Pin it down: the cases that make a relative timestamp unambiguous
Five implementations of relativeLabel. One is right and four skip a sentence each — and all five agree that ten minutes ago was "10 minutes ago". Write the cases that tell them apart.
Pin it down · read it; sign in to run
- TypeScriptintermediate
Pin it down: the cases that make a slug unambiguous
Six implementations of slugify. One is right and five are subtly wrong, and every one of them satisfies a careless reading of the request. Write the cases that tell them apart.
Pin it down · read it; sign in to run
- TypeScriptadvanced
Challenge: days until a warmer day
For every temperature, return how many days until a warmer one — in one pass with a stack of pending days.
Other · read it; sign in to run
- Vue.jsintermediate
Challenge: Build a Debounced Search Component
Create a search component with debounced API calls and proper loading states.
From scratch · read it; sign in to run
- TypeScriptintermediate
Challenge: the insertion index
Return where a value belongs in a sorted array — the count of elements strictly smaller — with a half-open binary search.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: every permutation
Generate all orderings of distinct values with backtracking — a used set, a path, and a swap of perspective.
Other · read it; sign in to run
- TypeScriptexpert
Challenge: edit distance
Compute the minimum number of single-character edits — insert, delete, replace — that turn one word into another.
Other · read it; sign in to run
- TypeScriptintermediate
Challenge: Generic Array Utilities
Implement type-safe generic array utility functions from scratch.
From scratch · read it; sign in to run
- TypeScriptexpert
Challenge: a bloom filter that says maybe
Build the probabilistic membership filter — never a false negative, rarely a false positive, and never the item itself.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: longest span without a repeat
Find the length of the longest substring with no repeated character, in one left-to-right pass.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: make the change with fewest coins
Return the minimum number of coins that sums to an amount — bottom-up, one slot per cent.
Other · read it; sign in to run
- TypeScriptintermediate
Challenge: a token-bucket rate limiter
Implement a rate limiter that starts full, refills continuously up to capacity, and never reads the clock itself.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: the kth largest in a stream
Answer kth-largest after every new value with a heap that only ever holds the k largest seen.
Other · read it; sign in to run
- Reactintermediate
Challenge: Build a Debounced Search Component
Create a search component with debounced API calls and proper loading states.
From scratch · read it; sign in to run
- TypeScriptintermediate
Challenge: take a URL apart by hand
Parse scheme, host, port, path and query parameters out of a URL string without the URL class.
Other · read it; sign in to run
- TypeScriptintermediate
Build the tool: find the template that breaks hydration
One bare template element inside a Vue page made the server and the client disagree about the whole page. Reading did not find it. Write the rule that does.
Build the tool · read it; sign in to run
- TypeScriptintermediate
Challenge: the tortoise and the hare
Detect whether a linked list loops back on itself — two runners at different speeds, no set, no extra memory.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: a tiny event emitter
Implement on, off, once and emit — the pub-sub primitive every framework interview expects you to know cold.
Other · read it; sign in to run
- TypeScriptintermediate
Challenge: count the islands
Count connected blobs of land in a grid — the depth-first flood fill that sinks each island once.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: autocomplete on a trie
Return every word that extends a prefix, in dictionary order — walk to the prefix node, then collect every word beneath it.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: the most frequent words
Return the k most frequent words, ties broken lexicographically — counts in a map, then the exact ordering rule.
Other · read it; sign in to run
- TypeScriptintermediate
Challenge: the first character that is unique
Find the index of the first character that appears exactly once — two passes, one hash map.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: a sliding window rate limiter
Count requests inside a moving window of wall time — old acquisitions fall out at exactly the boundary, new ones queue nothing.
Other · read it; sign in to run
- TypeScriptintermediate
Challenge: range sums in constant time
Precompute prefix sums once so every range-sum query is a single subtraction.
Other · read it; sign in to run
- TypeScriptintermediate
Challenge: a retry that backs off
Wrap a flaky request in exponential backoff — injected sleep, doubling delays, and the original error when you give up.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: merge overlapping intervals
Collapse a list of intervals into the disjoint set — sort by start, then sweep once.
Other · read it; sign in to run
- TypeScriptintermediate
Challenge: merge two sorted lists
Splice two sorted linked lists into one sorted list — one dummy head, one loop, no arrays.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: deep equality by hand
Decide whether two unknown values are structurally identical — primitives by identity, arrays element-wise, objects key by key.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: combinations that sum to a target
Find every combination of numbers that adds to a target, reusing each number as often as needed — backtracking where the loop start carries the no-duplicates rule.
Other · read it; sign in to run
- TypeScriptexpert
Challenge: search with a wildcard
Support queries where a dot matches any single character — the trie search that fans out across every branch when it must.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: fewest hops across a graph
Find the length of the shortest path between two nodes of an undirected graph — breadth-first with a visited set.
Other · read it; sign in to run
- Vue.jsadvanced
Challenge: Build a Virtualized List Component
Create a performant virtualized list that renders only visible items.
From scratch · read it; sign in to run
- TypeScriptadvanced
Challenge: Build a Promise Retry Utility
Implement a utility that retries failed Promise operations with exponential backoff.
From scratch · read it; sign in to run
- TypeScriptadvanced
Challenge: the longest rising thread
Find the length of the longest strictly increasing subsequence — the DP that indexes by where a run can end, not where it started.
Other · read it; sign in to run
- TypeScriptadvanced
Challenge: the longest common thread
Compute the length of the longest common subsequence of two strings with the classic two-dimensional table.
Other · read it; sign in to run
- Reactadvanced
Challenge: Build a Virtualized List Component
Create a performant virtualized list that renders only visible items.
From scratch · read it; sign in to run
- TypeScriptadvanced
Challenge: Build a Type-Safe Event Emitter
Create a strongly-typed event emitter with proper TypeScript generics.
From scratch · read it; sign in to run
- TypeScriptadvanced
Challenge: debounce with cancel and flush
Implement a trailing-edge debounce whose pending call can be cancelled or fired on demand.
Other · read it; sign in to run
- Reactadvanced
Challenge: Build a Form Validation Hook
Create a reusable form validation hook with custom rules.
From scratch · read it; sign in to run
- TypeScriptexpert
Challenge: a circuit breaker
Stop hammering a failing dependency — closed, open, half-open, with an injected clock deciding when one careful probe may run again.
Other · read it; sign in to run
- Vue.jsadvanced
Challenge: Build a Form Validation Composable
Create a reusable form validation composable with custom rules.
From scratch · read it; sign in to run
- TypeScriptadvanced
Challenge: Build a Mini Redux Store
Implement a type-safe state management store with Redux patterns.
From scratch · read it; sign in to run
- Vue.jsexpert
Challenge: Build an Infinite Scroll with Data Fetching
Create a performant infinite scroll component with data fetching and caching.
From scratch · read it; sign in to run
- Reactexpert
Challenge: Build an Infinite Scroll with Data Fetching
Create a performant infinite scroll component with data fetching and caching.
From scratch · read it; sign in to run
- TypeScriptexpert
Challenge: Build a Query Builder
Create a type-safe SQL query builder with method chaining.
From scratch · read it; sign in to run