Whenever I make something I write a blog about it. Sometimes I write essays too. Here's everything I've made and written.

I like being able to see how my work has changed over time! Infinite Hamlet isn't great, but there's a throughline from it to Stranger Video.

Anyway. Click the tags below to filter down the posts. I've tagged what I think is my best work with "Best of." Hopefully the other tags are self-explanatory.

  • Auto-texting STOP to unknown numbers

    I’m sick of political spam texts. Here is a stupid solution.

    I’m not telling you that you should do this. But this morning I made my phone auto-respond “STOP” to any unknown number:

    Sharing iOS automations is weirdly annoying (it’s easy to share shortcuts via iCloud, but I built this directly into an automation and I can’t make an iCloud link for it), so here is the logic written out:

    Keep reading...

  • PacCam: Pacman controlled with your face

    Chomp to move, look to turn

    I made a game. It’s called PacCam. It’s Pacman, but you control it with your face.

    Looking very cool

    You can play it here (or see the code here).

    You chomp your mouth to move and turn your face to steer. You look…pretty dumb while playing it. At the end it tries to give you the dumbest possible gif of yourself (it tracks when your mouth is the most open, and builds the gif around that moment).

    I could fill a book with dumb gifs of me after all the testing I did

    I’m really pleased with how the game turned out, but making it was way more work than I expected. Let’s look at why.

    Keep reading...

  • DOOM in the iOS Photos app (kind of)

    Giving iOS some critical functionality

    I made a game with Adnan Aga. It’s DOOM, but it runs inside the iOS photos app. Kind of.

    look, we eventually manage to get up some stairs

    It is…technically playable? We managed to pick up some power ups and shoot at some enemies. It requires 8 manually configured iOS shortcuts, a dedicated photos folder, and a separately configured computer.

    Let’s look at how it works!

    Keep reading...

  • Data and code from One Million Checkboxes

    It's all here

    I’ve released the data and code from One Million Checkboxes.

    Thanks for playing. More games to come :)

    Keep reading...

  • The secret inside One Million Checkboxes

    Teens wrote me a secret. I found them.

    A few days into making One Million Checkboxes I thought I’d been hacked. What was that doing in my database?

    A few hours later I was tearing up, proud of some brilliant teens.

    But let’s back up.

    Note - I’m trying something new; I’ve also made a YouTube video that tells this story. I’m trying to decide whether I’m interested in making videos; check it out if you’d like!

    Keep reading...

  • Scaling One Million Checkboxes to 650,000,000 checks

    Dealing with unexpected popularity

    On June 26th 2024 I launched a website called One Million Checkboxes (OMCB). It had one million global checkboxes on it - checking a box checked it for everyone on the site, immediately.

    The site, 30 minutes after launch

    I built the site in 2 days. I thought I’d get a few hundred users, max. That is not what happened.

    Instead, within hours of launching, tens of thousands of users checked millions of boxes. They piled in from Hacker News, /r/InternetIsBeautiful, Mastodon and Twitter. A few days later OMCB appeared in the Washington Post and the New York Times.

    Here’s what activity looked like on the first day (I launched at 11:30 AM EST).

    boxes checked hourly during OMCB's first day. The first few hours are missing. boxes checked hourly during OMCB's first day. The first few hours are missing.

    I don't have logs for checked boxes from the first few hours because I originally only kept the latest 1 million logs for a given day(!)

    I wasn’t prepared for this level of activity. The site crashed a lot. But by day 2 I started to stabilize things and people checked over 50 million boxes. We passed 650 million before I sunset the site 2 weeks later.

    Let’s talk about how I kept the site (mostly) online!

    Keep reading...

  • One Million Checkboxes

    One million checkboxes that anyone can check
    Hi. It’s Nolen (eieio) from the future, a day and half after I posted this.

    While it was live, One Million Checkboxes was played by over half a million people. Over 650 million boxes were checked. The site was featured in the New York Times and has a Wikipedia page. Wild stuff.

    This post discusses the original implementation. You can read about how I scaled up the site here, and you can read a story of some incredible emmergent gameplay from the site here.

    The original blog post continues below.


    I made a website. It’s called One Million Checkboxes. It has one million checkboxes on it. Checking a box checks that box for everyone (and makes some numbers go up).

    You can find it at onemillioncheckboxes.com.

    checking some boxes

    Why

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

    Keep reading...

  • Questions to ask when I don't want to work

    Treating myself a little more kindly

    Sometimes I don’t want to work. Not wanting to work makes me feel bad.

    My identity is tied up in liking to work hard! And I work for myself - it’s very easy to slack off. Not wanting to work makes me feel lazy. It makes me feel like I need to buckle down, and I feel like something is wrong with me when I can’t.

    This used to make me upset. I’d spend days distracted, neither fully working nor fully relaxing. Now when this happens I tell myself:

    You love to work. That hasn't changed.
    Something else needs to.

    This reframing has been a revelation for me. Thinking this way makes it easier to change my process, helps me find what excites me, and makes it easier to consciously take breaks. Here are some questions I ask in order to isolate what needs to change.

    Keep reading...

  • BreakTime

    Putting Brick Breaker inside Google Calendar and writing an engine along the way

    I made a game. It’s called BreakTime. It’s Breakout (aka Brick Breaker) running inside Google Calendar. Your meetings are bricks. It (optionally) declines the meetings you destroy.

    shattering some meetings

    It’s a chrome extension. You can install it here. It has no external dependencies; it’s 1,500 lines of javascript including a little game engine I made for the project.

    Making it was a ton of fun. Let me tell you about it.

    Keep reading...

  • TelEyegraph

    Converting blinks to morse code

    I made a little tool. It’s called telEyegraph. It converts blinks to morse code.

    me, blinking out a dril tweet

    I built it because I’m fascinated with controlling things with your eyes and as a test of the React and CSS skills that I spent January learning.

    You can play with it here or check out the code on github.

    Keep reading...

  • Talk Paper Scissors

    Rock paper scissors on the phone

    I made a new game with greg technology. It’s called Talk Paper Scissors. It lets you play rock paper scissors with strangers by calling a phone number.

    the Talk Paper Scissors mascot

    It’s an attempt to make an audio-only stranger video. Here’s how it works:

    • you call a phone number
    • you’re asked to say rock, paper, or scissors
    • you aren’t allowed to say anything else
    • you hear a recording of what the stranger said and are told whether you won or lost

    Games are 3 rounds long. Your stats are tracked between rounds.

    To play call 1-(515)-762-5762 (that’s 1-515-ROCK-ROC). Note that this is a US number so fees may apply if you call internationally!

    Keep reading...

  • I made a substack

    Thinking about audience engagement

    I made a newsletter. It’s here, on substack. Then I wrote a post on my blog about making a substack. It’s here, on my blog, which you’re reading right now.

    Keep reading...

  • My Computer Tells Me to Go to Bed

    Every night at 12:15 AM my computer tells me to go to bed.

    No, really. A voice says “time to sleep.” Then this window pops up:

    yeah, it's a little verbose

    If I hit “ok” the window pops up again a minute later. Sometimes I move the popup out of view and ignore it for a few minutes. Sometimes I snooze it and keep coding (or writing - it’s 12:28 AM right now). But most of the time I go to bed.

    Keep reading...

  • Stranger Video

    Staring contests with strangers

    Update: the day after I posted this stranger video went viral in japan. It was a ton of fun. The viralness has died off for now; I’m working on a separate post about the experience of using stranger video at peak popularity.

    I have a new project. It’s called ‘stranger video.’ It’s about staring at strangers.

    this is me and a friend - no strangers!

    stranger video has some rules:

    • you are paired with a stranger for a video call.
    • video is tightly cropped to just your face and cuts out if there’s no face in frame.
    • no audio, no text chat, just silent video.
    • video cuts out as soon as one of you blinks.

    You can play it at stranger.video

    It’s the most uncomfortable thing I’ve built. I hope you love it.

    Keep reading...

  • Flappy Dird

    Flappy Bird implemented in MacOS Finder

    I made a game. It’s called Flappy Dird. It’s Flappy Bird inside MacOS Finder.

    ad placements start at $2,000

    It has instructions, high score tracking, and marquee banner ads. You double-click to start a game and select any file in the window to jump. It runs at 4 frames a second and can’t run much faster. It occasionally drops inputs for reasons that you’ll understand if you finish this blog.

    I’m going to lay out how Flappy Dird works and how it got there. Head to the github repo if you want to check out the code or play the game yourself.

    Keep reading...

  • My Sheets Adventure

    A totally normal real-time game running in a Google Sheet

    I made a game. It’s in a Google Sheet:

    really, really, I'm fine

    There’s some stuff going on here! But in addition to aesthetics this game is “real time” - the spreadsheet tracks the time when you complete tasks and compares those times to where the animated blue progress bar is. Your final evaluation (in the lower right) tells you whether you completed your tasks early, on time, or late. This is all driven purely via Google Sheets formulas - no Apps Script or other trickery needed.

    Let’s talk about how this works!

    Keep reading...

  • Measuring something changes it - and sometimes that's enough

    Every night I write down six seconds of my day that I want to remember.

    Some nights I struggle to come up with something worth writing down. That’s ok! Sometimes I’ll struggle for many days in a row. That’s less ok.

    But when I have multi-day stretches where I have nothing to write down I notice. And noticing causes me to start changing my behavior. Journaling this way helps me seek out memories worth remembering.

    Measuring and optimizing the right metric can be powerful. Measuring and optimizing the wrong metric can be disastrous. But sometimes the act of measurement itself is sufficient to change behavior for the better.

    Keep reading...

  • Hexagone

    A font that converts hex color codes to rgb

    So here’s a neat trick:

    the font is called hexagone because it gets rid of hex

    By changing the font I’m able to automatically convert hex color codes to RGB! What’s going on?

    Keep reading...

  • Swedish Furniture Conglomerate Survivors

    Basics

    Gameplay Video

    I like the 'pop' that the ghosts make

    Keep reading...

  • Wub

    Say nonsense words fast

    Basics

    • Genre: Competitive toungue twister
    • Links: play it right here or play it on itch
    • Engine: A little hand-rolled javascript
    • Time Spent: ~4 hours one evening
    • Other Stuff: I built this game at Recurse Center, a magical place that functions like a writers retreat for programmers. Consider applying!

    In Wub you’re prompted to say some silly phrases while a timer plays. When you finish saying the silly phrases the timer stops. The first phrase you say is “wub wub1.” That’s why it’s called wub.

    wub wub wub wub wub

    1. Interestingly, the API does a better job of detecting the phrase “wub wub” than detecting a single wub! 

    Keep reading...

  • Infinite Hamlet

    Typing Shakespeare via Twitch chat

    I turned off Infinite Hamlet on September 30th.

    Some quick stats: 41 unique chatters submitted 4,400 characters and completed 136 lines of hamlet. Running it was a ton of fun! I’m excited to revisit this kind of game in the future.

    Basics

    • Genre: twitch-plays-pokemon-like
    • Links: play it live on twitch
    • Engine: Godot 3.5
    • Time Spent: ~2 weeks on and off
    • Other Stuff: I built this game at Recurse Center, a magical place that functions like a writers retreat for programmers. Consider applying!

    Gameplay Video

    To play Infinite Hamlet you attempt to type out all of Hamlet one character at time via twitch chat. That’s the whole game. It’s called “Infinite Hamlet” because of the infinite monkey theorem

    Riveting

    Keep reading...

  • Wordle (Firefox's Version)

    Running Wordle in the Firefox address bar via OpenSearch

    So here’s a neat trick:

    If only the font was monospaced

    That’s the firefox address bar! And I’m playing a full game of Wordle in it! What’s going on?

    Keep reading...

  • Game 6: Put the DVD logo in the Corner

    This game was linked from New York Times Watching newsletter on Friday September 8, 2023. This was super cool for me! Margaret Lyons I have no idea how to get in touch with you but thanks for mentioning my game!

    Basics

    • Genre: Uh. Arcade action game / childhood dream achievement simulator (?)
    • Links: play it on itch or check out the code on github
    • Engine: PICO-8
    • Time Spent: 4 days (June 27th - June 30th)
    • Other Stuff: I built this game at Recurse Center, a magical place that functions like a writers retreat for programmers. Consider applying!

    Gameplay Video

    My favorite part was adding manual 'particle effects' by drawing individual pixels to the screen

    Keep reading...

  • Game 5: ReShape Tower Defense

    Basics

    • Genre: Tower defense with a vaguely roguelike choose-1-of-3 upgrade system
    • Links: play it on itch or check out the code on github
    • Engine: Godot 3.5
    • Time Spent: Uh. 15ish days? May 8th - May 13th part time, May 29th - June 11th full time1.
    • Other Stuff: This game shamelessly rips off the UI of DesktopTD, one of my favorite games of the flash game era. Thanks for the many hours of enjoyment, DesktopTD!

    Gameplay Video

    I was so excited when I first combined 'many projectiles' and 'exploding projectiles'

    1. More context than you want or need: I started making a tower defense, went on a trip and worked on it in my off hours, dropped it to make click click trick for a game jam, and then started back up on a new tower defense on June 7th (using the bones of the original TD). 

    Keep reading...

  • Game 4: click, click, trick

    Basics

    • Genre: Rhythmic puzzle game
    • Links: play it on itch or check out the code on github
    • Engine: Godot 3.5
    • Time Spent: May 15th - May 21st (1 week)
    • Other Stuff: The first few levels of the game are probably too hard. If you almost immediately get stuck check out “the game is too damn hard” below.

    Gameplay video

    No phones in sight just squares pulsing to beats

    Keep reading...

  • Game 3: Don't Send Me a Puddle (Ludum Dare 53)

    Basics

    Gameplay video

    If I showed any more you'd get spoiled!

    1. Alright I did a two-hour game jam and made a relaxing drive but that doesn’t really count. 

    Keep reading...

  • Game 2: Sisyphus Needs a Nap

    Basics

    • Genre: Launcher, almost idle. Inspired by “Learn to Fly” and some other games popular in the Flash era.
    • Links: play it on itch or check out the code on github
    • Engine: Godot 3.5
    • Time Spent: April 11-13, April 18-26 (12 days with some traveling in between)
    • Other: Sisyphus Needs a Nap got more plays on itch in a single day than platris did over its lifetime! It also made it to the top of itch’s “new and popular web games” page. Neat!

    Gameplay Video

    alright I cheated and started part of the way through the game but it's more fun that way.

    Keep reading...

  • Game 1: Platris

    Basics:

    Gameplay Video:

    the enemy is named doug

    Keep reading...

  • No Results Found!

    try another search

get new posts via twitter, substack, rss, or a billion other platforms
or subscribe to my newsletter right from this page!