<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Son Hoang</title>
    <description>The latest articles on DEV Community by Son Hoang (@hoangson).</description>
    <link>https://dev.to/hoangson</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4120408%2F814c4163-4b0f-47a8-9e0b-49e7fceaf0ae.jpg</url>
      <title>DEV Community: Son Hoang</title>
      <link>https://dev.to/hoangson</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hoangson"/>
    <language>en</language>
    <item>
      <title>We Planted 180 Bugs in Copies of Real Open-Source Backends. Fix Your First One in About 20 Minutes</title>
      <dc:creator>Son Hoang</dc:creator>
      <pubDate>Tue, 15 Sep 2026 05:39:34 +0000</pubDate>
      <link>https://dev.to/hoangson/we-planted-180-bugs-in-copies-of-real-open-source-backends-fix-your-first-one-in-about-20-minutes-59aj</link>
      <guid>https://dev.to/hoangson/we-planted-180-bugs-in-copies-of-real-open-source-backends-fix-your-first-one-in-about-20-minutes-59aj</guid>
      <description>&lt;p&gt;&lt;a href="https://pushforces.com/" rel="noopener noreferrer"&gt;PushForces&lt;/a&gt; is a practice site where you fix bugs we planted on purpose in copies of real open-source backend code. The original projects are untouched. We're the small team that builds it. It's an early alpha (a first test version, open to everyone). It's free, and we have no plans to charge for it.&lt;/p&gt;

&lt;p&gt;Every ticket today is backend work. The backend is the server side of an app (accounts, payments, stored data). We'll add other areas of software work over time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzw9krkve58fs1z6pln72.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzw9krkve58fs1z6pln72.gif" alt="Screen recording of ticket LED-01: someone edits one line of code in the browser (blurred out), runs the checks, and the result turns green" width="719" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That recording shows someone fixing a bug in real money-tracking software, inside a web page, with no account.&lt;/p&gt;

&lt;p&gt;The software is &lt;a href="https://github.com/formancehq/ledger" rel="noopener noreferrer"&gt;Formance Ledger&lt;/a&gt;, an open-source program that keeps track of balances and payments. We cut a small slice out of it and broke one function on purpose. That function should add two amounts of money. It returned nothing. The fix is one line of code, blurred out so you can try it first. A button sends the fix to our checker. The checker runs tests the person never saw, and the screen turns green: accepted.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;Each practice task is called a ticket, the word software teams use for one piece of work. Someone reports a problem. You find and fix the broken code in a real project someone else wrote. A machine checks whether your fix really works.&lt;/p&gt;

&lt;p&gt;The quick facts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free. There is no paid plan, and none is planned.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Account&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not needed for the 93 easier tickets. Harder tickets and deeper features need a verified account (email, gmail, github are welcome)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nothing for the easier tickets. They run in your browser.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;About 15 to 25 minutes for a 1-star ticket. About 2 to 4 hours for a 5-star one.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;180 tickets built on 27 real projects, mostly well-known open-source ones. All of them are backend today. Other areas come later.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What each ticket gives you, in the order you'll meet it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A real project's code to read.&lt;/strong&gt; Each ticket sits on a slice of a real project (a set of files cut from it). Examples include Formance Ledger (money), Ory Kratos (logins and accounts) and Navidrome (music streaming).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A clue or a bug report, depending on the level.&lt;/strong&gt; Easy tickets (1 to 2★) point you at the right file and mark the spot with a TODO, a note left where code is missing. They teach you how a real project is written. From 3★ up, you get only a bug report. It reads like a message from support: what broke, how to make it happen again, and what "done" means. You find the bug yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A clear pass or fail.&lt;/strong&gt; Our checker runs tests you never see. You pass when every one of them passes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practice at the first-week skill.&lt;/strong&gt; Finding your way around code someone else wrote is a big part of starting any new job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A path to the team workflow.&lt;/strong&gt; Harder tickets move to your own computer. You send your fix with git, the tool most software teams use to share code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No penalty for failing.&lt;/strong&gt; A failed attempt costs you nothing. You read what went wrong and try again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A profile that counts your accepted fixes.&lt;/strong&gt; It shows tickets finished, attempts judged, and how often you passed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it compares with other coding practice sites
&lt;/h2&gt;

&lt;p&gt;PushForces trains one narrow skill: finding and fixing a reported problem in a backend someone else wrote.&lt;/p&gt;

&lt;p&gt;LeetCode trains you to solve a clearly stated puzzle inside one function, and it does that very well. Many job interviews still include an algorithm round, so LeetCode practice keeps its place. PushForces is practice for the weeks after you get the job.&lt;/p&gt;

&lt;p&gt;Here is how PushForces sits next to the practice sites we compared ourselves against:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;th&gt;The code you work in&lt;/th&gt;
&lt;th&gt;How you hand in your work&lt;/th&gt;
&lt;th&gt;Price (checked Sep 2026)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://leetcode.com/" rel="noopener noreferrer"&gt;LeetCode&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Interview-style algorithm puzzles&lt;/td&gt;
&lt;td&gt;One function or class per problem&lt;/td&gt;
&lt;td&gt;Browser editor&lt;/td&gt;
&lt;td&gt;Free; paid Premium plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://exercism.org/" rel="noopener noreferrer"&gt;Exercism&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Getting fluent in 80+ programming languages, with volunteer mentors&lt;/td&gt;
&lt;td&gt;Small exercises that come with their own tests&lt;/td&gt;
&lt;td&gt;Browser editor, or a small tool on your own computer&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://codecrafters.io/" rel="noopener noreferrer"&gt;CodeCrafters&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Rebuilding well-known tools (a database, git, a command-line terminal) step by step&lt;/td&gt;
&lt;td&gt;Your own code, written from scratch&lt;/td&gt;
&lt;td&gt;Upload with git (git push)&lt;/td&gt;
&lt;td&gt;Free tier; paid membership&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://sadservers.com/" rel="noopener noreferrer"&gt;SadServers&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Fixing broken servers (the computers that run websites)&lt;/td&gt;
&lt;td&gt;A real, throwaway rented server&lt;/td&gt;
&lt;td&gt;Typing commands in the browser, then a check button&lt;/td&gt;
&lt;td&gt;Free tier; Pro from $9/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://buglyst.com/" rel="noopener noreferrer"&gt;Buglyst&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Bug-fixing drills, plus practice on outages and on code that fails to build&lt;/td&gt;
&lt;td&gt;Mostly labs written for the site, plus a few rebuilt from real open-source fixes&lt;/td&gt;
&lt;td&gt;Browser workspace&lt;/td&gt;
&lt;td&gt;Free public challenges; paid Pro pass&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PushForces&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fixing a reported bug in someone else's backend&lt;/td&gt;
&lt;td&gt;A slice of one of 27 real projects, mostly well-known open-source backends&lt;/td&gt;
&lt;td&gt;Easy tickets in the browser; harder ones with git push&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We took each row from that site's public pages in September 2026 (pricing: &lt;a href="https://codecrafters.io/pricing" rel="noopener noreferrer"&gt;CodeCrafters&lt;/a&gt;, &lt;a href="https://sadservers.com/pricing" rel="noopener noreferrer"&gt;SadServers&lt;/a&gt;, &lt;a href="https://buglyst.com/pricing" rel="noopener noreferrer"&gt;Buglyst&lt;/a&gt;). If a row is wrong or out of date, tell us in the comments and we'll fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where PushForces stands out
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Someone else's code, from a real project.&lt;/strong&gt; Most tickets name the open-source project they come from, such as Formance Ledger, Ory Kratos, Casbin and NetBox. A few tickets also add a small module of ours, and the deep dive explains why. The other sites in the table mostly use exercises written for the site, or have you write your own code. Buglyst is the closest site we know of. It has 145 playable labs. It writes most of them for the site, and four are rebuilt from real fixes in open-source projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From 3★ up, you start from a report, and the checks you can see already pass.&lt;/strong&gt; Only the bug report says something is wrong, and only hidden tests catch it. So you find and reproduce the problem yourself, the way you would at work. Warm-ups are gentler: they point you at the file and mark the spot. Many sites give you sample tests or a failing test to aim at. Hidden tests by themselves are common: LeetCode, Codewars and Buglyst all use them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The workflow a team uses, on code that already exists.&lt;/strong&gt; Harder tickets give you your own private copy of the code. You fix it on your computer, send it back with git, and an automated judge decides. &lt;a href="https://docs.codecrafters.io/challenges/how-challenges-work" rel="noopener noreferrer"&gt;CodeCrafters&lt;/a&gt; also takes work through git, for code you write yourself. What we add is the combination: existing code, a team-style git flow and hidden tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Harder tickets read like urgent incidents at work.&lt;/strong&gt; They carry a severity level and a response deadline, like an alert from a live system. The catalogue covers logins, money, data sync, and two requests hitting the same data at the same moment. SadServers runs incident practice on servers, and Buglyst's &lt;a href="https://buglyst.com/incident-labs" rel="noopener noreferrer"&gt;incident labs&lt;/a&gt; grade your diagnosis. Here you finish by sending a code fix that has to pass the hidden tests.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Several other teams are also building practice for finding and fixing bugs (debugging), including &lt;a href="https://www.recticode.com/" rel="noopener noreferrer"&gt;Recticode&lt;/a&gt;, &lt;a href="https://buggr.dev/" rel="noopener noreferrer"&gt;Buggr&lt;/a&gt; and &lt;a href="https://debuginterview.dev/" rel="noopener noreferrer"&gt;debuginterview.dev&lt;/a&gt;. The deep dive below lists which of our parts are standard elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in about 20 minutes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://pushforces.com/tickets/backend/LED-01" rel="noopener noreferrer"&gt;LED-01&lt;/a&gt;, the ticket from the recording. It's a 1★ ticket on the money ledger.&lt;/li&gt;
&lt;li&gt;Read the ticket. It names one function that should add two amounts of money and sends you to the TODO inside it.&lt;/li&gt;
&lt;li&gt;Jump to the line marked TODO and fix the function.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Run smoke&lt;/strong&gt; (a quick self-check), then &lt;strong&gt;Submit for CI&lt;/strong&gt; (the judged run).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you know Python better, PDC-01 is another good first ticket. Harder tickets (3★ and up) need a free, verified account. You sign in with GitHub or Google.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we built it
&lt;/h2&gt;

&lt;p&gt;We built PushForces because friends who aced algorithm interviews struggled on their first day at work. They opened the company's code and got lost.&lt;/p&gt;

&lt;p&gt;They could code well. They were used to one file, one function, and a problem statement that said exactly what to do. Real work hands you a bug report from support and a program you didn't write. It also hands you automated checks that must pass and a reviewer who asks why. We wrote the two lists side by side:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe4d231nh67is4oh9ldto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe4d231nh67is4oh9ldto.png" alt="Side-by-side comparison titled " width="800" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Harder tickets aim at most of the right-hand column: a reported symptom, code you can't rewrite, and a build that has to go green. The reviewer who asks why isn't built yet.&lt;/p&gt;

&lt;p&gt;We posted an early version on &lt;a href="https://www.reddit.com/r/SideProject/comments/1wan681/we_built_a_platform_where_you_debug_real_bugs/" rel="noopener noreferrer"&gt;r/SideProject&lt;/a&gt;, a Reddit forum for side projects. Two of the replies:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;reading unfamiliar codebases and hunting down bugs is like 90% of actual dev work anyway compared to leetcode stuff&lt;/p&gt;

&lt;p&gt;navigating someone elses codebase is the actual skill gap nobody talks about&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's one thread and a handful of comments. It was still the first time strangers described the problem back to us in their own words.&lt;/p&gt;

&lt;h2&gt;
  
  
  The technical deep dive
&lt;/h2&gt;

&lt;p&gt;The rest of this post is for developers who want the details. It covers how a ticket is built, both ways to submit, the judging sandbox, the numbers, and what's still weak.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a ticket is built
&lt;/h2&gt;

&lt;p&gt;Each ticket starts from a slice of a real open-source project, with one bug planted on purpose. The bugs follow common kinds of production failure. None of them is a copy of one specific historical bug.&lt;/p&gt;

&lt;p&gt;From 3★ up, a ticket is written the way an incident arrives at work: usually a summary, steps to reproduce, expected output and a definition of done. Warm-ups are shorter. They name the function to fix and mark the spot with a TODO. Some tickets accept more than one correct fix.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The workspace is a slice of the repository.&lt;/strong&gt; LED-01 is a 13-file extract of Formance Ledger with one editable file. LED-05, a 5★ ticket on the same project, carries about 25 upstream files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some tickets add code of their own.&lt;/strong&gt; When the upstream code has no good spot for a bug, we sometimes add a small module of our own.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The harder the ticket, the more it reads like an incident. A few 3★ tickets carry a SEV3 label. 4★ tickets carry SEV2, most with a 240-minute SLA (a response deadline). 5★ tickets arrive as SEV1, the most severe level, with a 120-minute SLA. The clock starts when you accept the ticket. The deadline is there for realism, and going over it costs you nothing. Some tickets come with an &lt;code&gt;incident-artifacts/&lt;/code&gt; folder of logs and traces to dig through.&lt;/p&gt;

&lt;p&gt;Most of the 17 five-star tickets are concurrency races, such as double spends and check-then-act gaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Warm-ups run in your browser (1 to 2★)
&lt;/h2&gt;

&lt;p&gt;The 93 easy tickets open straight into a browser workspace. It uses Monaco, the editor inside VS Code, on a small extract of the repository. There's no clone and no account. Most warm-ups have one editable file with a TODO marking the spot. They train you to read a real project's types and conventions. The hunting starts at 3★.&lt;/p&gt;

&lt;p&gt;Here's LED-01, the ticket from the recording:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faikgbthxodnlev36vk63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faikgbthxodnlev36vk63.png" alt="The LED-01 browser workspace: the ticket description on the left, a 13-file Go extract of Formance Ledger in the middle, and the editor open at the TODO in internal/machine/monetary.go" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ticket says &lt;code&gt;MonetaryInt.Add&lt;/code&gt; in &lt;code&gt;internal/machine/monetary.go&lt;/code&gt; is incomplete and points you to the TODO inside it. Jump there and you find this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;MonetaryInt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;MonetaryInt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;MonetaryInt&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// TODO: return the sum of a and b as *MonetaryInt&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;MonetaryInt&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;MonetaryInt&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fix is one line. We won't paste it, because finding it among the &lt;code&gt;big.Int&lt;/code&gt; wrappers is the exercise. Hit &lt;strong&gt;Run smoke&lt;/strong&gt; to check the basics, then &lt;strong&gt;Submit for CI&lt;/strong&gt;. In this run, the judged checks took about 16 seconds:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwmnkt2jg2w5d8zb6qboy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwmnkt2jg2w5d8zb6qboy.png" alt="CI output for LED-01: hidden Add cases pass, the anti-cheat check passes, 2/2 checks passed, PIPELINE PASSED, browser workspace accepted" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The title bar still says "praxis CI". Praxis was the project's name before PushForces.&lt;/p&gt;

&lt;p&gt;Guests can submit too. If you sign up later, your guest progress moves into your account.&lt;/p&gt;

&lt;h2&gt;
  
  
  The visible checks stay green
&lt;/h2&gt;

&lt;p&gt;On 3 to 5★ git tickets, the public smoke tests pass before you change a single line. They only check baseline sanity. The tests that catch the bug live on our server, and CI injects them into your run. They never ship to you.&lt;/p&gt;

&lt;p&gt;So a passing &lt;code&gt;./local-test.sh&lt;/code&gt; tells you very little. You read the report, dig through the artifacts, and reproduce the problem yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F58ks2utzb7eg63dosdoo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F58ks2utzb7eg63dosdoo.png" alt="The Reproduce step from the site's " width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We know some people will dislike this choice. It's the closest thing we found to how a bug actually reaches you at work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Harder tickets: the git flow (3 to 5★)
&lt;/h2&gt;

&lt;p&gt;Accepting a 3 to 5★ ticket gives you a private git remote and a token that works for that one repository only. &lt;code&gt;main&lt;/code&gt; is protected, so you branch, fix, and push:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# clone your private remote (username = your handle, password = the ticket token)&lt;/span&gt;
git clone &amp;lt;remote issued when you accept&amp;gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;ticket-folder&amp;gt;

&lt;span class="c"&gt;# main is protected, so branch off&lt;/span&gt;
git switch &lt;span class="nt"&gt;-c&lt;/span&gt; feature/&amp;lt;ticket&amp;gt;-fix

&lt;span class="c"&gt;# reproduce first (these checks stay green, remember)&lt;/span&gt;
./local-test.sh

&lt;span class="c"&gt;# fix it in your own editor, then ship&lt;/span&gt;
git commit &lt;span class="nt"&gt;-am&lt;/span&gt; &lt;span class="s2"&gt;"fix: &amp;lt;ticket&amp;gt;"&lt;/span&gt;
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin feature/&amp;lt;ticket&amp;gt;-fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each 3 to 5★ ticket page names the container image its tests run in (for example &lt;code&gt;golang:1.26-bookworm&lt;/code&gt; or &lt;code&gt;python:3.12-slim&lt;/code&gt;). That lets you match your local setup, or you can push and let CI answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens after you push
&lt;/h2&gt;

&lt;p&gt;The push starts a judged run in a disposable container. It has no network, dropped capabilities and resource limits. The run goes through the public checks, then the hidden suite, then an integrity check. Pass all three and &lt;code&gt;main&lt;/code&gt; advances, and the ticket is marked Accepted.&lt;/p&gt;

&lt;p&gt;XP lands at that moment. A failed run costs nothing. You lose no XP. There's one limit. Each account gets 10 judged runs per rolling 24 hours across all 4★ and 5★ tickets. Pushes over that are rejected until the window resets. Our Terms don't cap 3★ tickets or browser warm-ups.&lt;/p&gt;

&lt;p&gt;The whole loop is six steps: &lt;strong&gt;accept, clone, reproduce, fix, push, verdict&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fine print on the comparison
&lt;/h2&gt;

&lt;p&gt;Several parts of PushForces are standard elsewhere, and we'd rather say so before the comments do.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Submitting with git push&lt;/strong&gt; also exists at &lt;a href="https://codecrafters.io/" rel="noopener noreferrer"&gt;CodeCrafters&lt;/a&gt;, for code you write from scratch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hidden tests&lt;/strong&gt; are how most judges work, including LeetCode, HackerRank, Codewars and Buglyst.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A browser editor plus a local option&lt;/strong&gt; also exists at Exercism, through its &lt;a href="https://github.com/exercism/cli" rel="noopener noreferrer"&gt;command-line tool&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging practice on realistic code&lt;/strong&gt; exists too. &lt;a href="https://buglyst.com/practice" rel="noopener noreferrer"&gt;Buglyst&lt;/a&gt; has 145 playable labs and a hidden CI suite. Four of its labs are reverted from real fixes in axios, express, node-fetch and node-redis. It runs in the browser, and its local mode is listed as &lt;a href="https://buglyst.com/open-source/labs" rel="noopener noreferrer"&gt;coming soon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real repositories in hiring tests&lt;/strong&gt; exist at HackerRank (&lt;a href="https://support.hackerrank.com/articles/1900882930-code-repository-questions" rel="noopener noreferrer"&gt;Code Repository questions&lt;/a&gt;), &lt;a href="https://karat.com/karat-acquires-byteboard/" rel="noopener noreferrer"&gt;Karat&lt;/a&gt; and &lt;a href="https://skillpanel.com/blog/welcome-to-skillpanel/" rel="noopener noreferrer"&gt;SkillPanel&lt;/a&gt;. You only see those when an employer invites you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source &lt;a href="https://goodfirstissue.dev/" rel="noopener noreferrer"&gt;"good first issues"&lt;/a&gt;&lt;/strong&gt; give you the full, real repository and real maintainers. If you want to contribute to a project for real, that is the better route. It comes with no guaranteed verdict or timeline, and issues can already be claimed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it stands
&lt;/h2&gt;

&lt;p&gt;PushForces has 180 tickets as of September 11, 2026, all in the Backend field. The board lists 28 codebases from 27 projects. The authentik project has one ticket family for its Go code and one for its Python code. A few tickets (the Dart app and parts of Stremio Web) sit in client-side code. We filed them under Backend for now.&lt;/p&gt;

&lt;p&gt;The spread by difficulty:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Difficulty&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Tickets&lt;/th&gt;
&lt;th&gt;Time estimate&lt;/th&gt;
&lt;th&gt;XP&lt;/th&gt;
&lt;th&gt;Runs in&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1★&lt;/td&gt;
&lt;td&gt;Good first ticket&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;15 to 25 min&lt;/td&gt;
&lt;td&gt;+160&lt;/td&gt;
&lt;td&gt;Your browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2★&lt;/td&gt;
&lt;td&gt;Routine&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;30 to 45 min&lt;/td&gt;
&lt;td&gt;+320&lt;/td&gt;
&lt;td&gt;Your browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3★&lt;/td&gt;
&lt;td&gt;Standard&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;45 to 75 min&lt;/td&gt;
&lt;td&gt;+640&lt;/td&gt;
&lt;td&gt;Your machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4★&lt;/td&gt;
&lt;td&gt;Complex&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;1.5 to 2 hours&lt;/td&gt;
&lt;td&gt;+1,280&lt;/td&gt;
&lt;td&gt;Your machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5★&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;2 to 4 hours&lt;/td&gt;
&lt;td&gt;+2,560&lt;/td&gt;
&lt;td&gt;Your machine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By the files you actually edit, about 80 tickets are Go, 36 Python, 19 TypeScript, 17 JavaScript, 11 Dart and 6 Java. The other 11 sit on the OpenTelemetry Demo, which mixes Go and Python.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffvm41n0bqvu4lnyy18lk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffvm41n0bqvu4lnyy18lk.png" alt="The PushForces ticket board: five fields, 180 backend tickets sorted by difficulty, each with an XP reward and a solve count. The screenshot is a few days old, so it shows 22 shipped." width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Where the bugs live, by area:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/formancehq/ledger" rel="noopener noreferrer"&gt;Formance Ledger&lt;/a&gt;&lt;/strong&gt;: a programmable financial ledger in Go, and home of LED-01.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/ory/kratos" rel="noopener noreferrer"&gt;Ory Kratos&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://github.com/dexidp/dex" rel="noopener noreferrer"&gt;Dex&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://github.com/goauthentik/authentik" rel="noopener noreferrer"&gt;authentik&lt;/a&gt;&lt;/strong&gt;: identity and login. Email validation, OIDC scopes, PKCE, LDAP attribute sanitizing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/apache/casbin" rel="noopener noreferrer"&gt;Casbin&lt;/a&gt;&lt;/strong&gt;: authorization rules, including KeyMatch2 RESTful pattern matching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/prisma/orm" rel="noopener noreferrer"&gt;Prisma&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://github.com/ent/ent" rel="noopener noreferrer"&gt;Ent&lt;/a&gt;&lt;/strong&gt;: ORMs and query builders, where one missing quote ruins your day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/jupyterhub/jupyterhub" rel="noopener noreferrer"&gt;JupyterHub&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://github.com/learningequality/kolibri" rel="noopener noreferrer"&gt;Kolibri&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://github.com/netbox-community/netbox" rel="noopener noreferrer"&gt;NetBox&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://github.com/dimagi/commcare-hq" rel="noopener noreferrer"&gt;CommCare HQ&lt;/a&gt;&lt;/strong&gt;: large Python platforms with long histories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/livekit/livekit" rel="noopener noreferrer"&gt;LiveKit&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://github.com/navidrome/navidrome" rel="noopener noreferrer"&gt;Navidrome&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://github.com/Stremio/stremio-web" rel="noopener noreferrer"&gt;Stremio Web&lt;/a&gt;&lt;/strong&gt;: real-time and media.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/FudanSELab/train-ticket" rel="noopener noreferrer"&gt;Train Ticket&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://github.com/delimitrou/DeathStarBench" rel="noopener noreferrer"&gt;DeathStarBench&lt;/a&gt;&lt;/strong&gt; (research benchmarks for microservices), plus the &lt;strong&gt;&lt;a href="https://github.com/open-telemetry/opentelemetry-demo" rel="noopener noreferrer"&gt;OpenTelemetry Demo&lt;/a&gt;&lt;/strong&gt; (a demo app).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/allegro/bigcache" rel="noopener noreferrer"&gt;BigCache&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://github.com/grantjenks/python-diskcache" rel="noopener noreferrer"&gt;python-diskcache&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://github.com/isaacs/node-lru-cache" rel="noopener noreferrer"&gt;node-lru-cache&lt;/a&gt;&lt;/strong&gt;: small libraries that make good 1★ warm-ups.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seven more projects fill out the list, including one Dart app. A few of them are smaller or less well known, and their ticket pages name them less clearly.&lt;/p&gt;

&lt;p&gt;Usage is small. Across the whole site, people have shipped a fix 23 times. Our two team accounts shipped 17 of those while testing the pipeline. Those 23 fixes cover 18 different tickets, and the leaderboard has five names. If you ship one ticket today, you are a statistically significant share of our users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it struggles
&lt;/h2&gt;

&lt;p&gt;These are ordered by how much they affect you today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend only, for now.&lt;/strong&gt; The Frontend, DevOps, SRE and Cloud fields already show on the board, and all four hold 0 tickets. We're starting with Backend and will fill the other four gradually. If you don't work on backends, there isn't much here yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Early and quiet.&lt;/strong&gt; Most fixes so far are ours (see the numbers above). The community discussion channels have 0 threads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3★ and up need setup.&lt;/strong&gt; You need a verified account (GitHub or Google sign-in), git, and ideally the project's toolchain. That's the point, and it's also friction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Difficulty is our guess.&lt;/strong&gt; Every ticket at a given star level shows the same time estimate, set by us. Expect a 2★ that feels like a 4★ now and then, and please tell us when you hit one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No rating yet.&lt;/strong&gt; Tickets are unranked, and progress shows as XP and levels. Our sign-up page and our "How a ticket works" page still mention an Elo rating (a chess-style skill score). That copy describes a rating we haven't turned on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some language labels are wrong.&lt;/strong&gt; About a dozen Python and Go codebases show up as TypeScript on the ticket board, and 55 tickets have no language label. The file extensions inside each workspace are correct.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;180 tickets might not be enough.&lt;/strong&gt; We don't know yet, and that's one of the things we're asking you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Feature tickets come next. Fixing a bug is half of the day-one problem. The other half is building something new inside a codebase you didn't write. You have to find where the feature belongs, what it touches, and which conventions you're about to break. We'll also add the other four fields (Frontend, DevOps, SRE and Cloud) gradually, on the same kind of real projects.&lt;/p&gt;

&lt;p&gt;One question for you: &lt;strong&gt;which open-source backend should we break next?&lt;/strong&gt; If you try LED-01, we'd also love to know how long it took you, and whether 180 tickets feels like enough. We read and answer every comment ourselves.&lt;/p&gt;

&lt;p&gt;Next in this series: how we break a real repository on purpose without turning it into a trivia quiz.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was drafted with AI assistance, then edited and fact-checked by the PushForces team. The story, the product decisions and the numbers are ours. Every PushForces number was checked against the live site on September 11, 2026. Details about other sites come from their public pages, checked the same month.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>career</category>
      <category>backend</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
