Showing posts older than 1766848599467

Dec 26, 2025

We Must Build An Enormous McWorld In Times Square, A Xanadu Representing A McDonald’s From Every Nation

The first time I wrote a letter to the president of McDonald’s it was about breakfast. I’m not a huge fan of most of the lunch and dinner options at McDonald’s but I love Sausage Egg & Cheese McMuffins and I love hash browns. I have gone into that McDonald’s in Union Square right around when they close down breakfast and put in low-ball bids on the whole remaining hash brown rack. “What do you got left hash browns-wise? Ten? Twelve? I’ll give you five bucks for the lot.” It’s a great hangover remedy. Giant Coke, tons of ice, bag of hash browns. Why can’t they serve hash browns all day? They come out of the freezer, a McDonald’s employee dumps them into a robot, and the robot cooks them, just like the fries, right? So when I suggested they serve breakfast all day, I expected they would do it. What’s the big deal? When I wrote to Starbucks to ask them to serve more savory breakfast foods, they did it. (I sent them a link to John Thorne’s stone classic “In Defense of the Savory Breakfast.”1 It’s worth reading just for the bit where Thorne blithely tosses off a delightfully Safirian “Eggs McMuffin” reference, miraculously published before the famous Onion joke.) When I wrote to every other fast food company, they at least would send back some coupons or something. McDonald’s just said, “We’ll look into it.” Here we are, years later, and you still can’t get hash browns after breakfast ends.

So that’s why I’m taking a different approach with my current McDonald’s dream. I figure if a bunch of nerds on Facebook can get Betty White onto “Saturday Night Live,” together we can make my McDream a McReality. I would like to introduce you to a concept I call “McWorld.”

Dec 26, 2025

My story begins with another app, now defunct, called Tapstack.

Opening the app, you saw a live feed from your phone’s camera. Below, a grid of faces, some of them representing individuals, others representing groups. My grid had four cells: my mom, my dad, my sister, and a group collecting all three. Just like Snapchat or Instagram, you tapped to capture a photo, pressed to record a video. As soon as you lifted your finger, your message zipped away, with no editing, no reviewing. A “stack” of messages awaited you in the corner, and, after you tapped through them, they were discarded.

It was all so simple that it was barely there. Tapstack more closely approximated a clear pane of glass than any app I’ve ever used.

For several years, Tapstack was the main channel for my family’s communication. The app didn’t lend itself to practical correspondence or logistical coordination; its strength was ambient presence. I met one of Tapstack’s designers once, and they told me it seemed especially popular with far-flung families: a diaspora app. Because there was no threading and no history, messages didn’t carry the burden of an expected reply. Really, they were just a carrier wave for another sentiment, and that sentiment was always the same: I’m thinking of you.

A selfie with coffee, a picture of an ice-covered pond, a video of my nephews acting silly: I’m thinking of you, I’m thinking of you, I’m thinking of you.

It never seemed to me that Tapstack attracted a huge number of users. I don’t think the company ever made a cent. There was no advertising in the app, and they never asked their users to pay.

Why didn’t they ask us to pay?

In 2019, I felt a rising dread as the months ticked by and the app didn’t receive a single update. Sure enough, in the fall, Tapstack announced that it was shutting down. It offered its users a way to export their data. It went gracefully.

It was, I have to say, a really great app.

Dec 26, 2025

There are still a few cases where you won't be in control of the caching behavior. For example, if you render a page, then navigate to a third party website, and the user clicks back. Applications that render HTML on the server and then modify it on the client are at particular risk of this subtle bug:

Dec 26, 2025

Don't break history, enhance it

Form submissions aside, if we were to design any modern web application with only hyperlinks, we'd end up with fully functional back/forward navigation.

Consider, for example, the typical "infinite pagination scenario". The typical way it's implemented involves capturing the click with JavaScript, requesting some data / HTML, injecting it. Making the history.pushState or replaceState call is an optional step, unfortunately not taken by many.

And this is why I use the word "break". With the simpler model the web proposed initially, this situation was not in the picture. Every state transition relied on a URL change.

The flip side of this is that new opportunities emerge for enhancing history now that we can control it with JavaScript.

Dec 26, 2025

7 principles of rich web applications

And in 2010 they introduced Instant Search, which puts JS front and center by skipping the page refresh altogether and transitioning to the "search results" layout as soon as you press a key as we saw above.

Another prominent example of layout adaptation is most likely in your pocket. Ever since the early days, iPhone OS would request app authors to provide a default.png image that would be rendered right away, while the actual app was loading.

Dec 24, 2025

The Title of a Test Post

This is a writeup based on a presentation I gave at BrazilJS in August 2014. It builds on some of the ideas I've been blogging about recently related mostly to UX and performance.

I want to introduce 7 actionable principles for websites that want to make use of JavaScript to control their UI. They are the result of my experience as a web developer, but also as a long-time user of the WWW.

JavaScript has undeniably become an indispensable tool for frontend developers. Its usage is now expanding into other areas like servers and microcontrollers. It's the language of choice for introducing computer science concepts by prestigious universities.