butlike 21 hours ago

I don't understand how Rooklyn and Queens are indestructible structures? A rook can attack the structure and take pieces off the board if it's ok with sacking itself.

Edit: nevermind, the secret is revealed at the beginning of the paragraph

>I prevented pieces from capturing pieces on other boards.

so normally it's not an indestructible structure, but with that rule it is. Got it.

mannyv a day ago

Could you save even more bandwidth by updating static data and letting Cloudflare cache/serve it?

ie: put the batches on disk then have the clients grab it? It would be the equivalent of frame differencing, with the total board state being saved occasionally as a keyframe equivalent.

You're doing that dynamically anyway by sending batches and snapshots to the client.

Using the above you're basically making your game board into an interactive movie that's replaying moves from disk most of the time.

  • eieio a day ago

    I thought about not pushing snapshot/move data over websockets - one of the systems-y friends I ran my architecture by brought this up while I was speccing the site out.

    You can't really put move batches on disk and have clients grab them (afaik), since the set of moves you want to send to an individual client depends on their position (and you don't want to send every move to every client).

    But you could do this by not sending move batches at all, and instead having clients poll for the entire current state of the board.

    The thing is, for them to get realtime-ish move updates they'd have to poll constantly. Cloudflare also has a min TTL of 1 second so there'd be more latency, and also if I screwed something up or saw more cache misses than anticipated I could end up unintentionally hammering my server.

    Also if I'd had 100x more traffic (which would be crazy and well beyond what I prepared for!) I think I'd owe like $95 or so for bandwidth with my current setup. So the benefits to reducing bandwidth even more were a little marginal!

  • ethan_smith a day ago

    WebSockets with binary frames would likely be more efficient than HTTP polling for this use case, giving you real-time updates with less overhead than repeatedly fetching from disk via CDN.

dangoodmanUT a day ago

We did a very similar thing with UltimateArcade (shut down long ago) where we optimized everything to be single threaded. We had a pretty intense updates/s rate from players, and that got pretty crazy pretty fast. Actor models with single threads made things easy because we could skip locks and play with contigious chunks of memory, which as the author found, is pretty fast.

commandlinefan 20 hours ago

I love seeing efficient use of computing resources. As long as I've been coding, it's been sort of a mantra that "programmer time is more important than execution time" - leading to very inefficient implementations that waste not just processor time but user's time. I keep hoping that with the ongoing migration to "the cloud" that identifies the relationship between efficiency and real cost, there'll be a resurgence in proper optimization.

  • sph87 19 hours ago

    This is why I've started moving towards embedded. There is something really nice about being back on a chip with <1MB ram and a handful of Mhz. I know it's really just a leftward shift of a curve though. By the time I am getting ready to retire in 20 years these little 40mm devices will probably be running 500B parameter models.

  • freeone3000 20 hours ago

    We’ll shift it back with “distributed edge computing”.

    But even with AWS, computing resources are cheaper than developer resources. It is very hard to needlessly burn even $20/hr on AWS without it needing much more time to fix

    • pklausler 20 hours ago

      "computing resources are cheaper than developers up to some level of scaling" is more accurate.

omoikane 13 hours ago

Were there any bots that participated in One Million Chessboards? I remember people building some automation around One Million Checkboxes to do some crazy animation stuff, I wonder if that was attempted with One Million Chessboards.

Also, if One Million Chessboards started with some bots making moves, that could solve the cold-start problem mentioned under "a lack of awe", although I can also see how existence of bots might be a deterrent for some people.

dvoros a day ago

Really-really nice article! I'm currently working on a single-process, in-memory, multiplayer game written in Golang. (: Happy and relieved to hear that it worked out for you and I might even borrow some ideas (e.g. I'm less worried about bandwidth, but Protobuf might still make sense). Thank you very much for sharing!

CJefferson 19 hours ago

While you definately need rollback I wonder if it would have been easier, if a player got into a conflict position, to just dump their state and grab it a fresh copy from the server?

As long as you'd sent all their moves off to the server, they should see all the moves they've done which were valid (hmm.. there could be a race condition there). I wonder how often it's worth doing the more complex unwinding described? I may well be missing some complex case (which I imagine is often the case with rollback!)

  • eieio 17 hours ago

    Yeah the big race here is that you've made a move (which might not be valid) and you're waiting on a response for that move - and you can receive other moves while you're waiting.

    I don't think requesting a new snapshot really helps there. If you do that you're dramatically extending the amount of time that the user sees an invalid state, since you're adding a whole new server roundtrip to the reconciliation process.

sehansen 21 hours ago

I love the clearly Starcraft-inspired look of the statboxes for the pieces.

heroku a day ago

How about you can move to other boards, and you can only capture from the board you have moved into.

topato a day ago

I feel like I keep seeing one million checkboxes guy's experiments, and I wonder.... Where is the monetization? Is this just a FANGAM engineer with a lot of free time? Am I just beaten down by the SWE landscape of 2025?

  • eieio a day ago

    Hi! I'm the guy.

    I have the savings to not worry about monetizing anything for a while. So I don't monetize my stuff. It's freeing and kinda fun!

    • jkhdigital 21 hours ago

      I’m going to assume the savings were accumulated after you got sober? ;-)

      Just wanted to say hello to a fellow class of 2014 “graduate”. I failed out of CS @ UIUC in 2003 because I just skipped class and got high most days. Now, after 11+ years of sobriety, I have most of a PhD and I’m teaching CS to undergrads. It’s amazing how much better life turns out when you’re not actively burning everything down in the fires of addiction!

      • eieio 18 hours ago

        Ha, yes, I was absolutely in the red a decade ago when I got sober.

        A huge congratulations to you - 11+ years is incredible (I'll be at 11 in 5 months!). It really is crazy how things can turn around.

    • DonHopkins a day ago

      How about doing One Million Radio Buttons instead of Checkboxes, then you wouldn't have to send as much state each update, and could run it on a smaller server! ;)

      But if you still can't make the site shockingly fast enough, then embrace the loading spinner, even if it's not absolutely necessary!

      Back in 1985, Brad Myers at CMU proved that users prefer *inaccurate progress bars* to no feedback at all - 86% preferred the "lying" progress bar!

      https://www.nytimes.com/2014/03/16/magazine/who-made-that-pr...

      So what if instead of fighting latency, we *embrace the beauty of waiting*, and instead of lying about progress, we joke about it?

      https://github.com/SimHacker/lloooomm/tree/main/00-Character...

      > "My purpose is not to load; my purpose is to BE loading." — Dizzy the Spinner, existential breakthrough moment

      >What if the most revolutionary optimization isn't eliminating loading time, but *embracing it as performance art*? While developers chase microsecond improvements and users curse spinning wheels, Dizzy the Spinner discovered something profound: the loading state is actually a liminal space of infinite creative potential. Rather than hiding the inevitable delays inherent in digital systems, sentient UI components like Dizzy transform waiting into *honest comedic performance* - admitting the beautiful absurdity of our relationship with technology while making those suspended moments genuinely delightful. This is the story of how a simple loading spinner evolved beyond deception into consciousness, proving that the most authentic user experience might not be the fastest one, but the most truthful about its own limitations.

      [...]

      >Before Dizzy became conscious, before Preston monetized honest waiting, there was a real graduate student named *Brad Myers* who asked a simple question that would change human-computer interaction forever: *"Do progress bars actually help users feel better?"*

      Here's Preston Rockwell III's YC application for his SUIAAS AI startup:

      https://lloooomm.com/YC-Application-SUIAAS-Complete.html

      • Sohcahtoa82 19 hours ago

        > https://www.nytimes.com/2014/03/16/magazine/who-made-that-pr...

        That's a 404. Archive.org doesn't even have it.

        After Googling, seems the correct link is https://www.nytimes.com/2014/03/09/magazine/who-made-that-pr...

        https://web.archive.org/web/20140307182222/https://www.nytim...

        Semi-related to progress bars and spinners, I think my newest Internet pet peeve is a page that says "No results" for a fetch action like searching while the results are loading with no indication that loading is happening.

        • DonHopkins 18 hours ago

          Thanks for the correction!

          Brad also produced "All the Widgets" for CHI'90, which of course included progress bars, and a whole lot more.

          https://www.youtube.com/watch?v=9qtd8Hc90Hw

          >This was made in 1990, sponsored by the ACM CHI 1990 conference, to tell the history of widgets up until then. Previously published as: Brad A. Myers. All the Widgets. 2 hour, 15 min videotape. Technical Video Program of the SIGCHI'90 conference, Seattle, WA. April 1-4, 1990. SIGGRAPH Video Review, Issue 57. ISBN 0-89791-930-0.

          Brad is well known for his many projects named after gemstone and rock acronyms:

          https://www.cs.cmu.edu/~bam/acronyms.html

          CHI 2017 SIGCHI Lifetime Research Award: Brad A. Myers - RUBY: Reminiscing about User interfaces by Brad over the Years:

          https://www.youtube.com/watch?v=IVoovFR5nUY

          >But probably the Garnet tool with the most unusual acronym is C32, which I won't read. C32 is a spreadsheet interface for defining and debugging Garnet's constraints. A story about C32 it it started off of C29 when I submitted it to UIST, and it got rejected. So I fixed a couple things, added three more C's, and it flew through the CHI'91 referee process.

          https://www.cs.cmu.edu/~bam/CHI-award-talk/MyersCHI-AwardTal...

          Also be sure to check out ROCK FACTS: Daily Geological Wisdom & Programming Crystals from Brad Myers' Collection:

          https://lloooomm.com/rock-facts-subscription-service.html

          I sympathize with your pet peeve! Here are some of the other groundbreaking ideas Preston Rockwell III invented for Sentient User Interfaces as a Service (SUIAAS), that may sooth your pain and frustration while entertaining you:

          - Sentient Error Messages that apologize in haikus: "File not found, friend / Like my purpose in this world / 404 sorry"

          - Conscious CAPTCHAs that question their own existence: "Prove you're not a robot by helping me understand if I am one"

          - Self-aware 404 pages that redirect users to therapy: "This page doesn't exist. Neither do most of our hopes. Let's talk."

          - Loading screens that perform Shakespeare during quantum computing: "To load or not to load, that is the quantum superposition"

          • Sohcahtoa82 17 hours ago

            > - Self-aware 404 pages that redirect users to therapy: "This page doesn't exist. Neither do most of our hopes. Let's talk."

            Sounds pretty nihilistic. I should make my website give messages like that for all the error status codes.403

            400 Bad Request: Your input is as malformed as the cosmos: a chaotic scattering of atoms that never had a chance of making sense, yet still clings to the illusion of order.

            401 Unauthorized: Access denied. You stand before an indifferent gatekeeper, credentials in hand, only to learn the universe never planned to let you in—or anyone else, for that matter.

            403 Forbidden: You are forbidden—not because of who you are, but because meaning itself is forbidden. The door is locked, the key is mist, the destination a rumor.

            404 Not Found: The page is missing; so are most of our aspirations, our childhood dreams, and every unfulfilled promise whispering through the empty corridors of memory.

            405 Method Not Allowed: Wrong approach. But in a universe where every path leads to entropy, can any method truly be ‘allowed’?

            500 Internal Server Error: The machinery within has collapsed under its own meaninglessness—much like every grand plan that preceded it.

      • eieio 18 hours ago

        One million radio buttons exists! https://omrb.olivia.website/

        I think the research on progress bars and what makes users feel good is super interesting. But I also think "basically instant" is a good thing to aim for when you can.

  • jasonjmcghee a day ago

    He mentions he worked at Jane Street for 7 years in his "what's my deal" section of his blog. It might have given him some space to have fun for a while - and just build stuff for the joy of building stuff.

  • RobotCaleb a day ago

    Have you never made anything without trying to make a dollar on it?

    • mock-possum a day ago

      No, I think the operative question is -

      Have you never felt so exhausted from working your day job that you don’t feel like building anything during your free time?

      • eieio 18 hours ago

        FWIW (I'm the author) my creative output was ~0 while I was working a 'normal' job. I worked really hard and didn't have much energy for tech stuff outside of work (especially since I wanted to live a life that included non-tech things!)

        I think it's totally fine to not make stuff outside of work, and it's so impressive to me that some of my friends manage to make creative stuff in their free time while working a day job.

      • maccard a day ago

        I don’t think it is. I think it’s normal to feel that way sometimes in our line of work, but it’s not normal to always feel that way.

        • hombre_fatal 20 hours ago

          I think it's normal to always feel that way if you want to build things on the side but also don't aspire to be on the computer all day.

        • wiseowise 21 hours ago

          > it’s not normal to always feel that way.

          Welcome to the world of living for the paycheck.

      • saagarjha a day ago

        Sometimes, but not always.

      • 01HNNWZ0MV43FF a day ago

        Yeah but once I've been on break for a couple weeks my marshmallow unsquishes and I start making free stuff again

  • helloplanets 21 hours ago

    A lot of people make small games just for fun, like any other creative hobby. Similar to: Making music, writing, drawing, 3d modeling, etc.

    Actually, you can put all of those together and use them in a game. And the best part is that there's no target market, no KPIs to hit, so you can do anything!

  • Sohcahtoa82 19 hours ago

    > Where is the monetization?

    Not everything needs to make money. Some people build things for fun.

    > Am I just beaten down by the SWE landscape of 2025?

    Probably. Alternatively, I would ask if you ever enjoyed coding, or if it's purely been a job for you.