Bug hunts: debugging challenges on real code
Fix more than 300 real, broken projects in JavaScript, Python and Java: a bug report, the code as shipped, and hidden tests that judge your fix. Free to read.
What is a bug hunt on CodeKairo?
A bug hunt is a debugging exercise on real code. You get a small project as it shipped — in JavaScript, Python or Java — and a bug report that says what is wrong, not where. You read the code, find the fault and fix it in the editor; hidden tests decide whether the fix is complete, and a partial fix shows as a partial pass count. There are more than 300 hunts, tagged by category (frontend, backend, database) and difficulty. A complete fix pays 50 XP and keeps your streak alive. Any hunt can be read without an account. From 1 January 2027, the Free plan allows one hunt a day.
Browse by language
- JavaScript 190 hunts · 53 easy · 97 medium · 40 hard
- Python 66 hunts · 20 easy · 37 medium · 9 hard
- Java 55 hunts · 15 easy · 26 medium · 14 hard
Browse by layer
Every bug hunt
JavaScript (190)
- Average Watch Time: Infinity Easy · Frontend
- Back to 1970 Easy · Backend
- Commission on the Tax Easy · Backend
- Distance to the Decimal Easy · Backend
- Divide by Zero, Dead in the Water Easy · Backend
- Divided by the Sum, Not the Average Easy · Backend
- Double-Charged at Checkout Easy · Frontend
- Every Region in One Flight Easy · Backend
- Four Years and a Day Off Easy · Frontend
- Goto Fail, Goto Fail Easy · Backend
- IN () Means Nothing Easy · Database
- Infinite Scroll, Infinite Repeats Easy · Frontend
- Left-Pad the World Easy · Backend
- Posting on Anyone's Timeline Easy · Backend
- Public by Default Easy · Frontend
- Refunds for Money Never Taken Easy · Database
- rm -rf on an Empty Variable Easy · Backend
- Secrets for Every Fork Easy · Backend
- Ten Seconds to Next Episode Easy · Frontend
- The 130% Progress Bar Easy · Frontend
- The 140-Character Lie Easy · Frontend
- The Backup That Never Took Over Easy · Backend
- The Cache Key With a Twist Easy · Database
- The Checkout Meltdown Easy · Frontend
- The Dividend Paid in Ghost Shares Easy · Database
- The Error Code That Meant Yes Easy · Backend
- The ETA That Went Negative Easy · Frontend
- The Infinite Spinner Easy · Frontend
- The Invisible Tweet Button Easy · Frontend
- The Invite Link That Shared a Hash Easy · Backend
- The Key That Joined the Wrong Repository Easy · Backend
- The Lookup That Confirmed Every Email Easy · Backend
- The Meters That Thought It Was 1920 Easy · Backend
- The Move That Quartered Crits Easy · Frontend
- The Negative-Price Flash Sale Easy · Backend
- The Null Price Latte Easy · Backend
- The One-Night Overcharge Easy · Frontend
- The Password in the Debug Log Easy · Backend
- The Plague the Pets Carried Easy · Backend
- The Preview That Minted Someone Else's Token Easy · Backend
- The Quote That Escaped the Link Easy · Frontend
- The Regex That Trusted Email Easy · Backend
- The Resurfaced Memory Easy · Frontend
- The Slash That Flagged the Whole Web Easy · Backend
- The Spreadsheet That Ran Code Easy · Backend
- The Sure Hit That Missed One Time in 256 Easy · Frontend
- The Tweet ID JavaScript Rounded Off Easy · Frontend
- The Unauthenticated Customer Lookup Easy · Backend
- The Upvote That Counted Twice Easy · Frontend
- The Vanishing Search Results Easy · Frontend
- Undo Send Never Works Easy · Frontend
- Version 1.10 Beats Version 1.9 Easy · Backend
- Your Password, in the Address Bar Easy · Backend
- 610,000 Shares at One Yen Hard · Backend
- Both Halves Thought They Were Primary Hard · Database
- Cache Stampede at Dawn Hard · Database
- Drill or Live, Same Prompt Hard · Frontend
- Everyone Tried to Fix It at Once Hard · Backend
- Ghost in the Hostname Buffer Hard · Backend
- Heartbleed's Little Cousin Hard · Backend
- Keyset Without a Tiebreak Hard · Database
- One Shard Took Every New User Hard · Database
- Rate Limiter Free-for-All Hard · Backend
- Root, No Password, Second Try Hard · Backend
- Signed In as Somebody Else Hard · Backend
- Six Degrees, Give or Take Hard · Frontend
- The /24 That Swallowed YouTube Hard · Backend
- The Alarm Queue That Went Quiet Hard · Backend
- The Extra Second That Pegged Every CPU Hard · Backend
- The Fetch That Reached the Metadata Service Hard · Backend
- The Flag That Fired Old Code Hard · Backend
- The Freelist That Ate the Raft Log Hard · Backend
- The Gift Card Paid Twice Hard · Database
- The Heatmap That Mapped the Base Hard · Backend
- The Index That Started at Zero Hard · Backend
- The Intermediate Nobody Was Watching Hard · Backend
- The Late Enactor and the Empty Record Hard · Backend
- The Opening Cross That Never Closed Hard · Backend
- The Password Reset Sent to a Second Address Hard · Backend
- The Player That Wore Out Disks Hard · Database
- The Re-Mirror Storm Hard · Backend
- The Reject Term Moved to the Top Hard · Backend
- The Reply Meant for the Last User Hard · Backend
- The Rover That Could Not Finish Booting Hard · Backend
- The Scheduler That Never Converged Hard · Backend
- The Seventy-Two Byte Password Hard · Backend
- The Task That Ran Out of Stack Hard · Backend
- The Transaction That Changed Its Own Name Hard · Backend
- The Wallet Library That Killed Itself Hard · Backend
- The Zero Root Everyone Trusted Hard · Backend
- Twenty Thousand Spaces on the Home Page Hard · Backend
- Two Spikes, 1.2 Seconds Apart Hard · Backend
- Withdraw, Then Withdraw Again Hard · Backend
- 184 Billion Coins From Nowhere Medium · Backend
- Access Denied at Midnight Medium · Database
- Any Email You Asked For Medium · Backend
- Anyone Could Initialise the Wallet Medium · Backend
- Audio Before the Call Was Answered Medium · Backend
- Crossing the Date Line Medium · Backend
- Cursor Chaos After the Emoji Medium · Frontend
- Document 000000001, No Login Required Medium · Backend
- Entropy Removed to Silence a Warning Medium · Backend
- Every Post, One Id at a Time Medium · Backend
- False Positives at the Signup Gate Medium · Frontend
- Ghost Rows in the Audit Log Medium · Backend
- Half the Servers Had the Old Config Medium · Backend
- Happy New Year, Dropped Messages Medium · Backend
- Java, Newline, Script Medium · Frontend
- Listening Everywhere, Asking Nothing Medium · Database
- More Routes Than the Router Could Hold Medium · Backend
- Negative Altitude, Underground Medium · Backend
- Nine Digits and You're In the Meeting Medium · Backend
- One Customer's Config Took Down the Edge Medium · Backend
- One Domain Checked Three Times Medium · Backend
- One Flipped Bit, Gossiped Everywhere Medium · Backend
- One Plus Two Plus Three Is Twenty-Four Medium · Frontend
- One Sensor, No Second Opinion Medium · Backend
- One Typo, Half the Internet Medium · Backend
- Readable Passwords at Rest Medium · Database
- Release the Connection! Medium · Database
- Retry After What? Medium · Backend
- Scaled Down Overnight, Trampled at Dawn Medium · Backend
- Scaling Up Past the Thread Limit Medium · Backend
- Schrödinger's Follower Count Medium · Backend
- Seven Minutes to Parse a Menu Medium · Backend
- Shuffle Isn't Random Medium · Frontend
- Sold Out, Sold Again Medium · Database
- Somebody Else's Videos in My Takeout Medium · Database
- Someone Else's Account Page, From Cache Medium · Backend
- Someone Else's Bank Account Medium · Database
- Stuck on Mute Medium · Frontend
- The API That Returned More Than the Profile Medium · Backend
- The Backup That Deleted the Primary Medium · Database
- The Canary That Failed and Was Overruled Medium · Backend
- The Car That Only Asked for Its VIN Medium · Backend
- The Check That Hadn't Cleared Medium · Backend
- The Cleanup That Deleted the Customers Medium · Database
- The Config Value That Crashed Every App Medium · Frontend
- The Console That Thought 2010 Was a Leap Year Medium · Backend
- The Defaults That Reached Every Object Medium · Backend
- The Deposit From Address Zero Medium · Backend
- The Distribution List That Replied to Itself Medium · Backend
- The Donation That Skipped the Health Check Medium · Backend
- The Drain Order That Matched Too Much Medium · Backend
- The Email Claim Anyone Could Set Medium · Backend
- The Endpoint That Forgot Private Meant Private Medium · Backend
- The Environment Variable That Ran Code Medium · Backend
- The Exchange That Could Not List Itself Medium · Backend
- The Feature File That Doubled Overnight Medium · Backend
- The Fields You Never Saw Medium · Frontend
- The Files Deleted Years Ago Came Back Medium · Database
- The Filter That Held Back the Flood Medium · Backend
- The Greedy Regex Medium · Backend
- The Group Chat Nobody Approved Medium · Backend
- The Internal Header Anyone Could Send Medium · Backend
- The Key That Was Marked Keep Medium · Backend
- The Label That Kubernetes Removed Medium · Backend
- The Leaning Tower of Pins Medium · Frontend
- The Leap Second That Went Negative Medium · Backend
- The Log That Wore Out the Car Medium · Backend
- The Login Key Made of Passwords Medium · Database
- The N+1 Query Storm Medium · Database
- The Node Update That Cut the Network Medium · Backend
- The One-Cent Book of Madness Medium · Backend
- The Open Redirect Medium · Backend
- The Payment Method Called Nothing Medium · Backend
- The Payment Page Script Nobody Pinned Medium · Frontend
- The Phantom Unread Badge Medium · Frontend
- The Phantom WHERE Clause Medium · Database
- The Pointer That Ran Past the Buffer Medium · Backend
- The Reducer That Bit the Hand Medium · Frontend
- The Rotation That Ate the Backups Medium · Database
- The Route Leak Nobody Filtered Medium · Backend
- The Script That Granted Everyone Everything Medium · Database
- The Term That Matched Every Route Medium · Backend
- The Tip That Didn't Add Up Medium · Backend
- The Toast That Never Left Medium · Frontend
- The Token That Never Dies Medium · Backend
- The Two-Terabyte Wall Medium · Database
- The Update That Redirected Your Documents Away Medium · Backend
- The Wrong Audience Medium · Backend
- Three Checkboxes and $900 Million Medium · Frontend
- Too Young by One Birthday Medium · Frontend
- Touchdown at Forty Metres Medium · Backend
- Tweets From a Borrowed Number Medium · Backend
- Twenty-One Fields, Twenty Supplied Medium · Backend
- Version 2.3.10 Is Not Older Than 2.3.9 Medium · Backend
- When 65536 Read as Zero Medium · Frontend
- Wildcards for Every Account Medium · Database
- Zero Usage Meant Zero Quota Medium · Backend
Python (66)
- Five Countries Missing From the Average Easy · Backend
- Four Hours of Any Password Easy · Backend
- Good Time on the Enhancement Easy · Backend
- Nine A.M. Somewhere Easy · Backend
- Nobody Left to Fly Christmas Easy · Backend
- Pounds Where Kilograms Should Be Easy · Backend
- The 1900 Leap Year Lie Easy · Backend
- The Alarm That Slept In Easy · Backend
- The Backup That Always Said Yes Easy · Database
- The Deposits Nobody Reported Easy · Backend
- The Draft That Overwrote the Publish Easy · Backend
- The Ledger That Leaked Cents Easy · Database
- The Metric Mars Mission Easy · Backend
- The Mutable Default Trap Easy · Backend
- The Negative Invoice Easy · Backend
- The Notification Echo Easy · Backend
- The Runaway Retry Easy · Database
- The Uploader Nobody Checksummed Easy · Backend
- Twelve Dollars for Google.com Easy · Backend
- Two Digits Too Few Easy · Backend
- Infinite Leverage Hard · Backend
- The Backslash at the End of the Line Hard · Backend
- The Block Only Half the Network Accepted Hard · Backend
- The Fsync That Lied on Retry Hard · Database
- The Lookalike Domain Hard · Backend
- The Signature Nonce That Never Changed Hard · Backend
- The Thruster That Spun It Faster Hard · Backend
- The Track That Forgot Its Past Hard · Backend
- The Username That Changed When Asked Twice Hard · Backend
- alg: none Medium · Backend
- Debts Averaged Out of Thin Air Medium · Backend
- Default Country Roulette Medium · Backend
- Every 256th Setup Medium · Backend
- Half an Emoji in the Username Medium · Database
- Locked Out of Everything Medium · Backend
- Noon in Which Timezone? Medium · Backend
- NULL Isn't Equal to NULL Medium · Database
- Rounded Out of a Refund Medium · Backend
- The Backup That Backed Up Nothing Medium · Database
- The Cleanup Job That Ran Against Production Medium · Database
- The Cursor at the End of Time Medium · Database
- The Duplicate Check Skipped for Speed Medium · Backend
- The Empty Argument List That Became Root Medium · Backend
- The Fees That Priced People Out Medium · Backend
- The Final Invitation That Never Came Medium · Backend
- The Folder Called .GIT Medium · Backend
- The Gene Named September 2nd Medium · Backend
- The Generator That Vanished Medium · Backend
- The Half-Applied Batch Medium · Database
- The Hash That Started With a Zero Byte Medium · Backend
- The Hashes Without Salt Medium · Database
- The Index That Rounded Itself Poor Medium · Backend
- The Installer That Deleted boot.ini Medium · Backend
- The Invariant Off by a Hundred Medium · Backend
- The Leap Day Meltdown Medium · Backend
- The Loss That Lost Its Minus Sign Medium · Database
- The Migration That Unblocked Everyone Medium · Database
- The Missing Table Rows Medium · Backend
- The Optimistic Lock That Wasn't Medium · Database
- The Path That Climbed Out Medium · Backend
- The Patriot's Drifting Clock Medium · Backend
- The Replayed Webhook Medium · Backend
- The Reset Mail Sent to a Look-Alike Medium · Backend
- The Spreadsheet That Ran Out of Rows Medium · Database
- The Streak That Died at Midnight Medium · Backend
- Three Presses, Three Remittances Medium · Database
Java (55)
- Gangnam Style Broke the Counter Easy · Backend
- Read Your Own Writes Easy · Database
- Sessions for Someone Else Easy · Backend
- The 37th of March Easy · Backend
- The Auction That Closed Instantly Easy · Backend
- The Coupon That Stacked Itself Easy · Backend
- The Dotless I in Istanbul Easy · Backend
- The Request With Too Many Parameters Easy · Backend
- The Share Price That Outgrew Its Integer Easy · Backend
- The Sunset That Crashed the Phone Easy · Frontend
- The Upsert That Forgot to Add Easy · Database
- The Year 2038 Problem Easy · Backend
- The Year That Didn't Fit in an Int Easy · Backend
- Two Billion Events and One More Easy · Database
- User Minus One Is Root Easy · Backend
- Ariane's Sixteen Bits Hard · Backend
- One Frame Behind Forever Hard · Frontend
- Priority Inversion on Mars Hard · Backend
- The Break That Left the Switch Hard · Backend
- The Class Path Nobody Denied Hard · Backend
- The Clock That Ran Backwards Hard · Database
- The Hang at 49.7 Days Hard · Backend
- The Log That Looked Things Up Hard · Backend
- The Missing Torque Calibration Hard · Backend
- The Root That Brought Its Own Generator Hard · Backend
- The Signature Made of Zeros Hard · Backend
- Three Runs Deep Is Not Deep Enough Hard · Backend
- Two Billion Transactions Later Hard · Database
- Two Waypoints, One Name Hard · Backend
- 248 Days to Reboot Medium · Backend
- A Century of Missing Interest Medium · Backend
- Escaping the Wildcard Medium · Database
- Interest Sent as Orders Medium · Backend
- Orders Sent to the Unknown Queue Medium · Backend
- Random Routing, Idle Dynos Medium · Backend
- Satoshis, Not Doubles Medium · Database
- Tenths of a Second Since 2000 Medium · Backend
- The App That Kept Registering Itself Medium · Backend
- The Autosave That Cut You Off Medium · Frontend
- The Blank Field That Crashed Every Region Medium · Backend
- The Certificate Nobody Renewed Medium · Backend
- The Clock Started Eleven Hours Early Medium · Backend
- The Consumer Key That Opened Enterprise Mail Medium · Backend
- The Edge of the Far Lands Medium · Backend
- The February 29th Certificate Medium · Backend
- The Kill Screen at Level 256 Medium · Frontend
- The Leaderboard Shuffle Medium · Frontend
- The Midpoint That Overflowed Medium · Backend
- The Negative Shard Medium · Database
- The Percent That Escaped Medium · Backend
- The Storage Certificate That Lapsed Medium · Backend
- The Week Number That Went Back to 1999 Medium · Backend
- The Week That Belonged to Next Year Medium · Backend
- The Zune Freeze Medium · Backend
- Two Files Named classes.dex Medium · Backend
How it works
- Read the report. Every hunt opens with the bug report and the project files. No line numbers, no hint about where — finding it is the exercise.
- Trace and fix. Edit the files in the workspace. The tests are hidden; run them as often as you like to see how many pass.
- Submit the fix. A complete fix awards 50 XP, counts as an active day for your streak and appears in your submission history with the code you sent.
Who it is for
Developers who want the skill interviews and jobs actually test — reading and reasoning about someone else's code — rather than another blank-function exercise.