DEV Community

Cover image for I built a free alternative to CodeCrafters, because it's 2026 and I'm done paying to learn
Rubaiyat Siam
Rubaiyat Siam

Posted on

I built a free alternative to CodeCrafters, because it's 2026 and I'm done paying to learn

I'll be upfront: I love the CodeCrafters idea. Building real systems from scratch instead of grinding another tutorial is genuinely how a lot of this stuff finally clicks. But every time I went to commit, the price stopped me cold. And somewhere around the tenth time I closed that pricing page, I had the obvious thought: it's 2026, why am I being asked to pay this much just to learn by building?

So I built the thing I wanted instead. It's called Ship That Code, it's run under my company Echoed Labs, and the whole pitch is simple: the build-your-own-X approach, free.

What it actually is

Every lesson runs on the same loop: choose → write → run. You get a real problem, you write real code, it executes against real tests right there in the browser. No multiple choice, no copy-pasting from a sidebar. There's AI feedback as you go so you're not stuck staring at a red test with no idea why.

What a lesson actually looks like

Rather than describe it, let me walk you through the very first lesson of the Build Redis course: implementing PING.

Redis speaks a protocol called RESP, where every response starts with a type prefix and ends in \r\n. The lesson gives you just enough to act on:

  • PING should reply with the simple string +PONG\r\n
  • PING hello should echo the message back as a bulk string, which encodes the length first: $5\r\nhello\r\n

You're handed a starter file with the plumbing already done (reading stdin, parsing quoted arguments) and one function to fill in:

def handle_command(args):
    """Process a Redis command and return the RESP response."""
    cmd = args[0].upper()

    if cmd == "PING":
        # TODO: Return +PONG\r\n for no args
        # TODO: Return bulk string for PING <message>
        pass

    return "-ERR unknown command\r\n"
Enter fullscreen mode Exit fullscreen mode

That's the choose and write part. Here's the answer you'd write to make the tests pass:

def handle_command(args):
    """Process a Redis command and return the RESP response."""
    cmd = args[0].upper()

    if cmd == "PING":
        if len(args) == 1:
            # PING with no message -> simple string PONG
            return "+PONG\r\n"
        # PING <message> -> echo it back as a bulk string
        message = args[1]
        return f"${len(message)}\r\n{message}\r\n"

    return "-ERR unknown command\r\n"
Enter fullscreen mode Exit fullscreen mode

Hit run, the tests fire against your actual program over stdin, and you watch PING and PING hello go green. Small win, but you just implemented a real Redis command from the protocol up, and every later lesson (SET, GET, expiry, replication) builds on exactly this loop.

What you can build

There are 80+ build-from-scratch courses so far. A taste:

  • Redis, a database, Git
  • A compiler (you build your own programming language)
  • A container runtime, basically your own mini-Docker
  • An OS kernel, a shell, a text editor
  • A ray tracer, a 3D renderer, a game engine
  • A neural network, BitTorrent, a blockchain, a Raft KV store

All across 9 languages, so you can build Redis in Go, then go again in Rust if you want the pain.

Not just one-off projects

If you'd rather follow a track than poke around, there are two structured ways in:

  • Language tracks — Fundamentals → Intermediate → Advanced for each language (37 of them right now).
  • Career paths — courses chained into routes like Backend, Frontend, Full-Stack, and DevOps. The backend path runs around 80 hours, zero to job-ready.

Why free

Because the thing that kept me out was the cost, and I didn't want to rebuild the exact wall I was trying to knock down. Free forever, no credit card, your first lesson takes about two minutes. That's the whole promise.

I'd love your feedback

It's early and I'm building in the open, so I genuinely want to hear what breaks, what's confusing, and which course you'd want next. If you've bounced off tutorials before, pick a system and start building — then tell me what you think in the comments.n

Your Task
Build a program that:

Reads commands from stdin (one per line)
Parses the command name and arguments
For PING, writes the correct RESP response to stdout
This is the foundation everything else builds on. Let's go!

Top comments (0)