[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)