318 comments

[ 4.3 ms ] story [ 309 ms ] thread
I feel like the checkbox grid should have been locked to a certain width. I can see people attempting to draw things, but they're skewed on my screen.
(I made the site)

this was on purpose! I figured there have been enough collaborative internet drawing experiences (with a locked canvas that was easy to draw on) that it'd be interesting to try something a little different and see what emerged.

That said, it might be a dumb idea! But I wanted to try it.

If one uncheck and check again should claim it as checked
I think having to "scan" to identify images is kind of fun! And it means the artist gets to choose the width of their own art. A lot of folks have a common screen width so there are fewer combinations than you think.
Oh, that's a shame. The big willy I drew is only visible at exactly the width I have it set at. I wonder what random things I'm missing. It takes a while to reflow too so it's not like it's easy to resize the window and see in realtime what other people are ding.
I can see some click wars currently ongoing :-)
What is special about the red checkboxes?
Those with borders is people jumping
(comment deleted)
this is very neat, I love this kind of experiments! could I ask you what's your hardware configuration for handling so many WebSocket connections? I'm just curious to know what's the maximum capacity of WS connections you can reach now that you posted on HN :)
> "One million checkboxes that anyone can check"

> Why

> I don’t really know. The idea came up in a conversation last Friday and I felt compelled to make it.

The best kind of reason :)

(developer here)

this is....more popular than i expected. the server's gonna be having some problems for a while

What are you running that can handle that many websocket connections/messages?
just a bunch of little flask servers lmao i thought I'd get like 50 people on this thing tops
I've been having it out with someone clicking my green box. The rage grows playing this.
So it's you unchecking my box?!?!
basically anything that supports async/event-based would work just fine on a $10/mo vps
I think there's a severe problem with this implementation. By using wrapping, I can't write "boobs" and have everyone else read my graffiti without them having having the same zoom wrapping point.
I spent five minutes writing “hey you, yes you” only to read your comment and realize my message is unparsable for those not on mobile.
These days we say "encrypted" rather than "unparseable".
Encrypted using EBCDIC
¯_ (ツ)_/¯
Here, you dropped this: \",
I made https://shru.gg/r for this reason
What's the r for? reddit (markdown?)
There's a link in the bottom-left corner, haven't checked, but reads like an accompanying reddit tool (since there's no real plugin system, guess it's a web app requiring credentials)
No plugins, just HTML, no credentials
Cool!

Sorry that my comment read like an accusation, should have clicked/tapped the link ;)

Not following links is a bad habit easy to pick up on mobile.

On iOS long pressing a link so it previews is very nice for these kind of things. I only wished you were able to scroll inside that popup/preview.
Reddit (and other fora). The homepage is for non-escaped. There's also /free
I added a Mac keyboard shortcut, so anywhere I type "shrg" it expands to ‾\_(ツ)_/‾

If I need an escaped version, that's "shrgg": ‾\\\_(ツ)\_/‾

Did this ever turn against you when coding?

`std::shared_ptr<Gate> shrg = ...` or similar?

_/`(ツ)_/¯

walk like an Egyptian

The idea of public canvases has been explored thousands of times: r/place, 1 million pixels,...

This feels like something else, it's ok if it has its own identity, otherwise it devolves/converges into a place to draw dicks in.

It's a rectangular grid. People aren't going to troll with dicks, but swastikas.
Virtually all monitors are rectangular grids
You could sorta kinda claim that most OLED displays are not rectangular [1], since only green is at full resolution, with blue and red being at a partial resolution, by sharing those sub pixels between "logical" pixels.

[1] https://www.oled-info.com/gs5-diamond-pixel-architecture-not...

Note for anyone confused, this is about AMOLED displays commonly used in phones and some OLED laptops from a few years ago.

W-OLED and QD-OLED have unconventional layouts compared to LCDs but every pixel has the complete set of sub pixels (RGB for QD-OLED, RGBW for W-OLED) so it looks more like this:

https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2F...

Just mentioning as while AMOLED phones being the majority of OLED displays seems plausible to me, it's likely not what people in this thread are picturing when they see OLED.

The dick is humanity’s logo - wherever humankind is, dicks are being drawn
This problem is traditionally solved by attempting to teach the aliens how to decode the pattern inside the pattern itself. For example a rendering might look like

    x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
    x _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x
    x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
    x _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x
    x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
    x _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x
    x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
    x _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x
    x _ _ x _ x _ x x x _ x _ x _ _ x _ x _ x x x _ x _ x _ _ x
    x _ _ x _ x _ x _ _ _ x _ x _ _ x _ x _ x _ x _ x _ x _ _ x
    x _ _ x x x _ x x _ _ x x x _ _ x x x _ x _ x _ x _ x _ _ x
    x _ _ x _ x _ x _ _ _ _ x _ _ _ _ x _ _ x _ x _ x _ x _ _ x
    x _ _ x _ x _ x x x _ _ x _ _ _ _ x _ _ x x x _ x x x _ _ x
    x _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x
    x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
    x _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x
    x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
    x _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x
    x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
    x _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x
    x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
The idea is that the aliens can figure out first that these opening and closing sections have periodicity 30, and because they are so repetitive they do not contain the actual data bits, but then there is a central section which does contain complexity.

So then they will hopefully alight upon the idea of looking at the code two-dimensionally, and adjust their browser width until the lines all line up, at which point they get the custom message.

Wouldn't it be slightly simpler to use a prime number of rows and columns?
Slightly, yes! The Arecibo message was 73×23 bits, with the hope that the aliens would break lines after 23 bits. But,

    i f . t h e s 
    n e i l a . e
    s . l i k e .
    o r t s u o b
    p h e d o n .
    w . r e d r o
    e . a r e . k
    c s . a d n i
    r e w e d . o
    a . e h t . n
    r e c i b o .
    e g a s s e m
    . a n y w a y
and that's to say nothing of spiraling orders etc.
Not enough boustrophedon order comments on HN, congrats.
I like 'conventional' order, and I could figure out your message block.

Give the aliens some credit, they might figure it out.

How long did you spend crafting this comment? Be honest.

I could imagine doing that with Vim, but I don’t think I could do it in less than ten minutes. And then I’d get sidetracked about whether to represent empty checkboxes with _ or - or a Unicode box.

Thank you so much for this. I wonder, at a global level, how many potentially productive man-minutes will be wasted thanks to your comment.

    ┌───────────────────────┐
    │ https://asciiflow.com │
    └───────────────────────┘
Can be pretty fast if you know your tools well :)

Just tried in VSCode; 2:38min using its fabulous multiline editing. 1:34min on second try due to practice

IIRC these messages usually have their dimensions equal to primes, to help the aliens a little bit - for example the Arecibo message was 1679 = 73 * 23 bits. We're hoping the aliens have the sense to recognize a product of two primes.
If you used a prime number instead of 30 (e.g. 29) then the aliens would spend less time checking the factors of 30 (15, 10, 6, 5, 3, 2).
Morse code would do the trick!

One check for short, two checks for long, two blanks for end-of-character.

No, no, it's a feature. Your message has been cleverly hidden behind a modern day scytale cipher. Intended recipients must know the correct screen width.
The other problem is that there are a bunch of people here running scripts to automatically erase anything you do in the name of checking every box
just ban all those jerks who keep unchecking
Before I read your comment, I was looking for a way to uncheck all at once :)
Would be fun to read a writeup of how you implemented it.
By the performance of it, probably some bloated server-side Javascript running on a toaster.
that's not fair it's a slow python server running across 5 toasters
How else do you propose a toaster generate heat to make the toast? At least it's not the thermostat so it thinks the AC needs to constantly be running. So there's quite a bit of positive logic in the toaster decision
it's a tiny flask server, a bitset stored in redis, updates broadcast (too frequently! but i don't want to change it now) via websockets, and react-window to only render the checkboxes that are in view.

I'll do a writeup when i finish putting out fires!

Fun challenge: userscript to make an animated fire out of checkboxes
userscript to make real fire on hosted server for bonus points
for future readers, i ended up swapping things out and batching my updates. spooky to do live, but helped a lot with performance
You could sell T-shirts to cover your costs:

A T-shirt with a checked box on the front an unchecked box on the back.

A T-shirt with an unchecked box on the front and a checked box on the back.

You have two bits, which clearly results in four shirts.
I don't think you can put out a fire like this. Should have tried some kind of webrtc and Kademilia network and crypto to eventually communicate all updates.
I don't understand, where is the AI + LLM part
Each time a checkbox is checked, a backend job asks ChatGPT to analyze the board state and write a script using Brainfuck that updates the checkbox states and runs it directly in production.

AI LLM cloud crypto.

You said crypto but you forgot where running it in production writes the checkbox change event to the blockchain. Checkbox display states only get read from the blockchain, obvi. Otherwise how could it possibly be secure

Checkboxcoin will be a separate product though, that's for the funding

How can I pump? 3 months from now I should dump.
Actual Intelligence + Logical Language Manifestation
But how did you do this without (ab)using a blockchain? You'll never get get funding like this...
> react-window

I'm confused, I read everyday on hacker news that react is the slowest JS framework ever made. Seems fine to me.

Funny, a websockes hell! Can you port it to Nostr? Could be an interesting stress-test
The devtools console is chaos
i spun up 5 more servers and pushed some optimizations and i think it's gonna be ok for a bit.
I think you just hit the 640K problem.
(comment deleted)
hn hug of death in full action. currently unable to visit. all the best working it out tho!
You announced it on the FediVerse, where it has already been boosted almost 700 times as I write this 4 hours later, and it spread to Reddit within 2 hours of that, as you know because you replied to the Reddit post. There is definitely going to be an initial spike of activity, given those. (-:
Out of curiosity, what’s the Reddit thread?
I suspect it's this one:

https://www.reddit.com/r/InternetIsBeautiful/comments/1dp4t7...

By the way, Reddit allows you to track which communities a domain has been shared in, very interesting. This is how I quickly found it:

https://www.reddit.com/domain/onemillioncheckboxes.com/

Ironically, I was looking to see whether Hacker News and anyone else had picked it up, from the FediVerse post. Bing found the Reddit thread from "One Million Checkboxes" as the search query. It's the second search result as I type this.

Other interesting Bing search results are Arnold Trakhtenberg's re-creation of the WWW site code using Convex, at https://github.com/atrakh/one-million-checkboxes .

Love seeing things go viral off the fediverse, it's not designed to push the end of the spectrum out and more organic examples like this might help bring another layer of user adoption.
I'm glad about that. Should keep Reddit type people occupied for days.
> more popular than i expected

we know what's important here on hn

Is it ok if I try to write a script to uncheck all the boxes? I don’t want to spam your server and ruin it for everyone if there’s no rate limiting.

(I wince mentioning this publicly; still have flashback trauma from when some HNer wrote a script to download as much data as possible from our Firebase and got a $1k bill overnight.)

Stop that script, I'm watching you ruin the board!
I haven’t opened my laptop yet. But it’s inevitable someone will write one.
Either there's some kind of update batching or it's already happening.
Hi! Sorry it took me a bit to get to this, I've been hacking to keep the server up for the last several hours.

Lots of people are botting, I don't think there's anything wrong if you bot too. There's a tiny bit of client-side rate limiting and originally i had server side rate limiting too, but I got rid of that a while ago (I was cutting anything I could to speed things up).

Haha. Cutting rate limiting to speed things up
alright yes this sounds funny now but at the time my rate-limiting implementation was very slow!
(it's back in and faster now)
Oh my god that sounds like my worst nightmare.. this is why I'm scared to death with these pay as you solutions
If you have time, one cool suggestion for gamification would be to do a SHA-256 hash of the binary values of the checkboxes and display current hash and the lowest hash so far.
Just an idea, but make it an internet game. Have a level 2,3,4.

The question is under what circumstances should that game switch to the next version. The idea I had was if all 1Million boxes are unchecked, but this is the internet someone would make it their life’s mission to keep one box checked.

IDK, I think you hinted upon something fun that we all like, it’s the Twitch vs thing, where everyone can interact and our total capacity makes the experience. This is also like the reddit/r/place which was also very fun.

I think you have a genuinely interesting idea, how can you grow it, nurture and change it to hit the true itch of humanity?

I love some stats and details on this, what kind of traffic are you seeing etc. Do you have a way to determine how many boxes in your visitor checks/unchecks? 97% of your pictures from Hacker News etc. Congrats on the hit!!!! Fun playing with it!!!
How much is all this costing you?
I am very late to this but as of now I think it has cost me about $85, although that will go up a little more quickly once I go through the bandwidth buffer I have with digital ocean (shouldn't be too bad tho)
Thanks for the reply! That's actually less than I would have guessed.
Can you make the checkboxes indexed from zero?

(Maybe I am too dogmatic)

Scrolled down randomly, found a swastika, clicked back.
Honestly that was one of my first thoughts when I saw this, someone is going to draw one of those. People love trying to be offensive in something that barely allows communication. I remember seeing some MMORPG that had no chat where players would log in and just stand in the shape of a swastika.

Makes me wonder if it's reasonable to write an algorithm to detect that.

Which MMO was that in? I'm working on my own and now I have a new worry on my plate. Short of standard moderation, an algorithm to detect it could be interesting.
(comment deleted)
You could search for the article about how the Lego mmo (or that's what i think it was) was shut down, then stop worrying about it. Unless you want to spend the rest of your natural life on detecting penises, swastikas and everything else. I mean, everything is offensive to someone.
I realized it would be easy enough to detect when certain lines are forming and manually shuffling the players a few spots, but your comment made me smile. Somewhere in there is the start of a biography title.
I built a grid-based music sequencer for the web a while ago that lets people see projects other people made in a side panel.

I very quickly realized I needed some manual content moderation because some people immediately started sharing patterns that looked like dicks and swastikas lol

Paternalism at its finest.
(comment deleted)
On the old internet, there was a rule, which was, "if you let users create dicks and swastikas, they're going to create dicks and swastikas".
Worked in a games company in the early(ish) days of UGC - we (and I'm sure we weren't alone) dubbed it the "Swasticock problem"
People draw these things precisely because of this kind of pearl clutching overreaction
Gives me concert ticket purchase anxiety
heh, me guarding my area I wrote my name in heavily for a bit
You have checked -100 boxes

Pick your side folks.

-120, I just want to make neat patterns :(
> You have checked -264 boxes

Then got a message:

> Chill LOL

Good advice, thanks.

(comment deleted)
The meta now is people upvoting/downvoting HN comments which are in favour of checking or unchecking boxes, depending on their ahem kinks.
The first unchecked box and I saw -1, knew I was in the wrong side of history
You have checked 720 boxes

but it started out empty?

this will get more interesting around half a mill checked. 427608 boxes are [√]

Are you gonna setup Adsense? lol
It only works in Chrome, not Firefox or Safari. Sad.
huh! I tested in firefox and safari and it worked for me on both. maybe you're just running into the fact that the website is kinda dying right now?
It would be fun to attempt this with crdt's and libp2p (...or similar, I don't actually know those tools well I just like the idea of getting the server out of the loop).
tried doing:

```

$$('input[type=checkbox]').forEach(elt => elt.click());

```

and got an alert that said "CHILL LOL". fun site

You need to directly send 42["toggle.... via WebSocket. Of course you need to check which are checked before if you want to clear instead of reverse.
Hmm… Is there a way to trick it to accept js that checks all boxes?
Yes
I trust this guy knows how, just by his username.
HN usernames are not that hard to get
i am pretty sure cursing is against the site rules, so i object ;-)
The fuck it is, shit, what kinda cunt makes a rule like that!?

(With apologies should anyone be offended).

to the downvoters, parent comment is just trying to be funny and deserves pity ;-)

and we are now stuck in an endless loop due to a recursive error. damn!

maybe he is campaigning for the reintroduction of cursive script in schools
The problem is you need to send 467k (current count of checked boxes) websocket messages and backend(s) are already dying for ~1 hour. Good luck with that, I only played for some time by clearing first 1000 boxes every few seconds.

Even after you send those 467k messages they need to be sent to (I assume) few thousands browsers each, so you need to wait for 467M messages to go through :D

Time to write a Playwright script.

const { chromium } = require('playwright');

(async () => { // Launch the browser const browser = await chromium.launch({ headless: false }); const context = await browser.newContext(); const page = await context.newPage();

    // Navigate to your page
    await page.goto('https://example.com'); // Replace with the actual URL

    // Click all checkboxes
    await page.$$eval('input[type=checkbox]', checkboxes => {
        checkboxes.forEach(checkbox => checkbox.click());
    });

    // Close the browser
    await browser.close();
})();

I'm proud of myself for getting the chill alert without even running a script, just frantically tapping with my fingers!

document.querySelectorAll("input[type=checkbox]").forEach(i => { i.checked = false; });

seems to work for a second. no alert.

Presumably that skips the code that sends the event to the backend?
(comment deleted)
Zooming out, I see patterns of empty lines. Screen resolution borders I guess.
All the boxes must be checked. To whoever is unchecking them, please reconsider and come over to the checked side.
No. I want the world to burn.

  document.querySelectorAll('input[type="checkbox"]').forEach(function(checkbox) {
    checkbox.checked = Math.random() >= 0.5;
  });
Reconsidered and im with the uncheck gang fam
stay out of my boxes.

the more you check, the less freedom you have, so i am in favor of leaving some boxes unchecked. especially the boxes that contain my private stuff.

treasure hunting for those boxes
ok, fair point. i like treasure hunting. i should keep my private boxes locked.

and that makes me think of a new version of the game: actually hide treasures in some of the boxes. cookies, and also colored keys. keys allow you to lock (or unlock) boxes of a matching color. each key can only be used once.

That “both sides are the same” attitude is how we got ourselves into this situation in the first place.

Vote Unchecked in November!

"The road to hell is paved with good intentions."
I did 1k (0.1 percent) then figured I'd done my job. No scripts, just human labor/algorithm.

Could I boost it to 2-5x time with a simple JS script? Sure. However I figured rate limits were in place/that wasn't the spirit of...whatever this is.

Reminds me of Peter Molyneux's Curiousity: https://en.wikipedia.org/wiki/Curiosity%3A_What%27s_Inside_t...

> I don’t really know. The idea came up in a conversation last Friday and I felt compelled to make it.

That's probably one of these reasons that cross your mind to justify buying new domains. Which is an addiction to some folks (including me)

Tried and seems to work.

async function main(){ let elems = Array.from(document.querySelectorAll("#root > div > div.grid > div input")).filter(v=>!v.checked) for(let ee of elems){ await (new Promise(resolve => setTimeout(() => { resolve() }, 500))) ee.click() } }

main()

This is great, anything I make is grieved instantly. I unironically love this cathartic chaos!
Just checked 1000 boxes. Fun.
Keyboard shortcuts to scroll up/down don't work unless you click into the array of checkboxes. I think this could be fixed by adding `tabindex="0"` to the div holding the grid.