[HN Gopher] Running a million-board chess MMO in a single process
       ___________________________________________________________________
        
       Running a million-board chess MMO in a single process
        
       Author : isaiahwp
       Score  : 172 points
       Date   : 2025-07-12 10:56 UTC (4 days ago)
        
 (HTM) web link (eieio.games)
 (TXT) w3m dump (eieio.games)
        
       | dangoodmanUT wrote:
       | 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.
        
       | jasonjmcghee wrote:
       | Big thread from a few months ago with the author.
       | 
       | One Million Chessboards
       | 
       | 336 points | 76 comments
       | 
       | https://news.ycombinator.com/item?id=43825336
        
       | mannyv wrote:
       | 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 wrote:
         | 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 wrote:
         | 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.
        
       | topato wrote:
       | 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?
        
         | RobotCaleb wrote:
         | Have you never made anything without trying to make a dollar on
         | it?
        
           | mock-possum wrote:
           | 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?
        
             | 01HNNWZ0MV43FF wrote:
             | Yeah but once I've been on break for a couple weeks my
             | marshmallow unsquishes and I start making free stuff again
        
             | maccard wrote:
             | 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.
        
               | wiseowise wrote:
               | > it's not normal to always feel that way.
               | 
               | Welcome to the world of living for the paycheck.
        
               | hombre_fatal wrote:
               | 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.
        
             | saagarjha wrote:
             | Sometimes, but not always.
        
             | eieio wrote:
             | 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.
        
         | jasonjmcghee wrote:
         | 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.
        
         | eieio wrote:
         | 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!
        
           | DonHopkins wrote:
           | 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 wrote:
             | > 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.nyti
             | m...
             | 
             | 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 wrote:
               | 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 wrote:
               | > - 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.
        
               | DonHopkins wrote:
               | Here are some honest and scientifically accurate product
               | warnings:
               | 
               | https://www.donhopkins.com/home/catalog/text/warnings.htm
               | l
               | 
               | And here are some classic X-Windows warnings from a flyer
               | distributed at the first X Window System Conference:
               | 
               | https://www.donhopkins.com/home/catalog/unix-
               | haters/x-window...
        
             | eieio wrote:
             | 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.
        
           | jkhdigital wrote:
           | 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 wrote:
             | 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.
        
         | helloplanets wrote:
         | 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 wrote:
         | > 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.
        
       | heroku wrote:
       | How about you can move to other boards, and you can only capture
       | from the board you have moved into.
        
       | dvoros wrote:
       | 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!
        
       | butlike wrote:
       | 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.
        
       | sehansen wrote:
       | I love the clearly Starcraft-inspired look of the statboxes for
       | the pieces.
        
       | commandlinefan wrote:
       | 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.
        
         | freeone3000 wrote:
         | 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 wrote:
           | "computing resources are cheaper than developers up to some
           | level of scaling" is more accurate.
        
         | sph87 wrote:
         | 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.
        
       | CJefferson wrote:
       | 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 wrote:
         | 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.
        
       | omoikane wrote:
       | 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.
        
       ___________________________________________________________________
       (page generated 2025-07-16 23:01 UTC)