Once a month my coworkers and I play a game together. This is the story of a game that I worked on for 47 days, a game meant to be played for only 30 minutes at one of those sessions.
My turn to host our team’s online “Social” was on May 28, 2026. Far in advance, I already knew what I wanted them to play. This game was just an idea in my head, but no matter: I figured that I could manually “run the game” by hand using ChatGPT.
My personal philosophy is to first do a thing 100% manually, then semi-automate it, then fully script it. Usually the “manual version” is good enough. So it was settled: I’ll make my game idea come to life as the jankiest manual version of itself.
The game I had in mind
The Dark Lord, and Anubis-looking dude
We are all in a Hell Dimension.
Monsters from all over the galaxy have gathered to battle each other on a desolate planet, under the eyes of a Dark Lord.
Each player picks a noun and their monsters’ image is AI-generated from it. Players are encouraged to choose a silly noun – so you may get a “bubblegum monster” or an “old shoe monster”.
The monsters do battle, with each player typing in attacks as fast as they can for 25 seconds. Finally the Dark Lord (really a ChatGPT adjudicator) looks at the monster’s images and attacks to decide the winner.
Here’s the twist: the winner absorbs the loser.
After the battle, a new monster is created. The new monster is made up of 75% of the Winner’s body and 25% of the Loser. The losing player continues to be part of the new creature. This duo will then fight in a 2-on-2 battle against another duo (with their own composite monster). The “winner’s” attacks are weighed at 75%, but the previous round’s “loser” can still contribute to victory at a 25% weighting. And so on for smaller fractions at future rounds.
The game concludes with an everyone-against-everyone brawl that’ll synthesize the final winner.
Proof of concept
On November 28, 2025, I went ahead and checked if this idea was even feasible. I had ChatGPT do the following:
Generate two monster images,
Decide which one would win in a battle, and
Combine them at a 75/25 ratio into a new monster
The concept looked feasible:
Lobster MonsterCorn Husk MonsterLobster Monster prevails in battle (because its hard shell protects it)
We were in business, baybeeeee!
Are we truly in business, baybeeeee?
I couldn’t think of a way to manually run this experience over a Zoom call. Like, I could collect nouns from roughly 12 teammates, generate initial monsters for them and then what? Make pew-pew noises while they watch me screenshare a ChatGPT session?
I guess I’ll have to build a multiplayer game.
On April 10, I started coding.
Time for tradeoffs
Dear Reader I’ve nevor made a multiplayer game in moy loife.
I’ve only made 1 game before. While it catapulted me to the top of the “violent canal-boat games” category, I built it with the Godot game engine and I had no clue how to use Godot for multiplayer games.
May 28 was fast approaching. The pressure was on, but my work schedule had recently changed in a way that juuust gave me a chance to finish on time.
The fact this game was meant for a specific group of people meant that I could skip certain challenges:
Scaling – only between 10 and 16 people would be playing.
Logins – no need for logins or passwords.
Anti-cheat – this wasn’t some competitive Counter Strike game. Nobody was cheating (and if they were, it would be fugging awesome!)
Sleek design – this game could be real rough, because it’s charm was going to be in the fact that I hand-created it specifically for my coworkers.
Asset hosting – our Team Social will last only 30 minutes, so I didn’t have to worry about storing the monster images. I could just hotlink to the images that my chosen AI platform generates – these image URLs each had an ample 1-hour lifetime.
Funny enough, the unpolished look of the game made it feel like a “quick and simple” creation to me (and I know it was neither!). My programmer sister, immediately picked up on the tonne of work that went into this game, though.
I chose not to vibe-code this thing. Partly because I don’t have experience with coding harnesses. Partly because I wanted to put my own energy into this game so it felt like a gift to others. Finally, I wanted to learn some new technologies and you can’t learn if an LLM is doing all the work for you!
No regrets here. Although there was a tetchy night with just 4 hours of sleep right before the deadline.
Tournament begins – each monster is made up of 100% one person/nounFinished tournament – the winners absorbed the losers, and synthesized new monsters. Each monster’s composition is shown under its picture.
Me learn little
I’m a strong believer that you should “only have one crisis at a time”.
You could rephrase this as “learn one new thing at a time, while keeping everything else familiar”.
For this project, that meant running the game on my existing – NEARLY UNLIMITED – $90/year shared hosting (affiliate link because I’ve been with them since 2008 and this is what love feels like).
This dictated that I use a “polling” architecture where each player’s computer repeatedly hits the server for updates, instead of a more appropriate WebSockets/Sockets.io approach where the server proactively sends updates to the players only when an update is available.
I also leaned heavily on Python, and SQLite which is my “comfort zone database”.
The 3 new things I decided to learn were:
Building multiplayer capabilities into an app
HTMX: an easy way to do polling, and to make use of data from the game server
Using AI APIs throgh an Inference Platform (I chose Replicate.com)
Hot take: Git is awful version-control software. If it takes everyone a lifetime to understand the mental model of a tool, then it’s been designed very badly. I don’t care how pretty the internals are or that 100 tiny Linuses created it in 1 night while dancing on the head of a pin.
I ended up using “Fossil” version control for the first time. But as an amateur from the “just use CTRL Z as version control” school of programming, I still don’t understand the benefits of it. Finally, I had to learn Mermaid as that was the easiest way to visualize the tournament brackets.
Things that happened along the way
Here are some interesting parts of the 47 day journey:
Everything’s a Chinese Dragon
Initially, I was using “prunaai/z-image-turbo” to quickly generate monster images. But it was really difficult to get the look I wanted. Here’s an example of tweaking the prompt to generate a “crystal goblet monster”:
All the monsters had a particular look. Eventually I thought maybe this image generation model was trained in a way that biases it. Turns out that the Z-Image foundation model was created by Alibaba’s AI division. They must’ve used a lot of images from China during model training, as well as lots of e-commerce imagery. That must be the reason why all the monsters look like Chinese Dragons and/or product hero-shots!
I ended up switching to Flux.2 Pro. That one was created by Black Forest Labs, a German company. Their images more closely matched my concept of a monster. It’s interesting to note that this means my aesthetic preferences have a Western cultural bias.
With all generative image models, I found that some concepts are so strong that they completely override my prompting. As an example, an “owl inspired monster” would strongly snap to being… just an owl:
Attempts to create an owl monster mostly ended up as just an owl. Similarly, some models spotted the word “predatory creature” or “alien being” and would generate monsters that looked identical to the Predator and Alien movie monsters.
I had to put lots of work into the monster-generating prompt. It had to be generic enough to work with any noun, but also consistent enough to give a certain look. This won’t be surprising to anyone who frequently creates AI images, but it was eye-opening to me (or maybe eye re-opening, as I’d previously used Midjourney and all the prompt tweaking was exhausting).
Click to expand the final monster-generation prompt I went with.
A photorealistic fictional predatory alien with a body inspired by {noun} morphology. The creature is 4 meters tall, set in its natural ecosystem on an alien planet where such a creature can evolve. It { random.choice([“has a markedly asymmetrical body”, “has an odd number of limbs”, “has additional tentacles”, “has insectoid antennae”, “has tribal markings on its body”, “has an unsettling look”, “is holding the typical weapon of a ” + noun + ” monster”]) }. Its mouth is open in a snarl.
The design is monstrous, intimidating, biologically plausible. Cinematic wildlife photography style. Facing left.
Here is the typical look of the monsters this prompt generated:
Notice that they’re all bipedal lizardy dudes, framed by the background on boths ides, have the right number of limbs and 5 fingers on their hands. It’s a very standard look and I would use more extreme random elements in the prompt next time (“3 hands”, “a horn coming out of the chest”, “spraying acid”). The look came out a bit vicious. It would’ve been better for a game with coworkers if it was more goofy and lighthearted
How an initial monster looks in the game interface. This one’s a “Gold Coin” monsterAlternative: same “Coffee Monser” from above but rendered in a goofier Pixar style. A bit more work-appropriate.
Adjudication took longer than expected
I thought that, after a battle, deciding on a winner would be quick and my players could read through the decision right away (with the slow work of generating a composite monster image happening in the meantime).
Things worked out the opposite way.
The Dark Lord takes his sweet time to declare a winner
In case of timeout or error, I made the Dark Lord choose a winner at random and say “X wins, because I like the cut of their jib and don’t owe anyone an explanation”. A simple solution for rare errors in a 1-time game!
For some reason, OpenAI’s GPT-5-nano and GPT-5-mini would take 15 – 30 seconds to analyze the monsters’ images and attacks while generating a decision in the Dark Lord’s style. This slowed down gameplay significantly.
In contrast, combining multiple monster images into one only took 13 – 17 seconds. I believe that it’s the analysis of 2 or 3 monster images that slowed down the adjudication. In the end, I chose to use Google’s Gemini-2.5-Flash model for generating the final decisions – it took only 5 – 7 seconds.
Adding some spice
I’ve already listed the things I could remove because this was a game for one group and one time – scalability, authentication, etc.
Towards the very end, I realized that I could add certain in-jokes for the specific individuals playing the game. Each monster had a semi-random name and I made the name sometimes end similarly to a team member’s name. So it would sound eerily familiar but not quite.
Monster name suffixed that would appear 1 out of 25 times
In retrospect, I should’ve made these suffixes a lot more probable. After all, we’re playing this game only once together!
Did my tech choices work out?
With 20/20 hindsight, if I were to build this game again I would’ve upgraded my hosting to a VPS so I could have long-running apps and use Socket.io.
Socket would let the server inform the players when there is a game event / new command to run. I had to build a polling system instead, and that was unnecessarily time consuming. I believe Socket.io would’ve also helped with synchronizing the “current time” between the server and players, to avoid key events like Battle End happening at different times for different people.
I liked HTMX! I never understood the hassle of having the server send JSON objects that then influence the HTML structure of the page. HTMX cuts all that out by having the server respond to REST requests with a finished HTML fragment, that the client then jams into the existing page.
In case you’re curious, the last programming language I actually liked was Perl 5.
I still hate Python but I’ve gotten more comfortable with it because of this project. So, maybe I hate it a little less now?
The final battle: everyone against everyone
Replicate.com was a good tool for testing and switching AI models quickly. Kudos to my sister for educating me about OpenRouter and similar middleware. Replicate made it a breeze to call a variety of AI APIs, a big benefit to the project.
What I didn’t like about Replicate how difficult it was to find a suitable AI model for a given task. Their UI is unusable for this (they provide marketing-speak instead of a comparison of features/speed). I had to use artificialanalysis.ai to choose models for the project. I also didn’t like that Replicate throttles their API usage unless you set up auto-deposits to top up spend. This wasn’t called out upfront and their documentation showed conflicting figures for the amount of preloaded cash that lifts the throttle. Finally, I thought that I’d be able to use one simple API for all models on Replicate, but each one required slightly different parameters and setup. None of these were deal-breakers.
Was the outcome good?
Yes!
The whole team and I played the game and we had fun.
I’m very satisfied with what I built! Visually, the game came out looking very Boris Vallejo (NSFW) / “pulpy” because of the font and the classic hero-stance of the monsters.
The tournament ended and the final monster is born. The player with the “Fluffy” monster is the winner – because their original monster constitutes the biggest portion of this final creature.
The beauty of throwing your life away
Isn’t it funny to spend so much time on creating a 30-minute experience?
On projects like these I am usually torn between two feelings:
As a creative man I often feel like life is slipping away from me. With 2 kids occupying evenings and weekends and a full-time job, I would have to make brutal decisions about how I use my free time. This was especially relevant prior to April, when I’d had only ~2 hours free for projects after the kids went to bed (in practice, this often meant a lack of sleep for me).
But also, I find that these projects – where the effort is comically disproportionate to the output – are the most satisfying to undertake (and read about! obligatory Mehran’s Steakhouse mention). I get to learn something new and, ironically, the noncommercial nature of the project gives me the stamina to carry it out to completion.
Ultimately silly projects like “Monster Mash” are what abundance looks like. They are undertaken out of curiosity and generosity.
If you’ve fallen in love with the Hell Dimension Extended Universe, and you’re a loyal reader of the blog (disloyal readers will be chased out!) then reach out to me and I might set up some games for you & your friends/colleagues. No promises.
As always, I’m <my first name> at <this website>.
Adjudication for one of the initial 1-on-1 battles.
So, I was reading about the battle of Dien Bien Phu, where the Vietnamese broke the French’s colonial dominance over “Indochina”. And this little detail jumped out:
The French forces came to Điện Biên Phủ accompanied by two bordels mobiles de campagne, (mobile field brothels), served by Algerian and Vietnamese women. When the siege ended, the Viet Minh sent the surviving Vietnamese women for “re-education”.
But of course the French army travels with combat brothels! And they brought two to this battle!
Dien Bien Phu was a whopper of a battle:
The French artillery commander Piroth committed suicide in his dugout by hugging a grenade.
Colonel de Castries effectively checked out and hid in his bunker during the battle. Allegedly leading to a “paratrooper putsch” where another commander took over.
About 50,000 Vietnamese combat personnel fought against 14,000 French.
The battle lasted 55 days – from 13 March – 7 May 1954 (55 days)
Finally, the Viet Minh detonated a 1-tonne explosive mine under the French position on hill A1 and made it disappear:
Reading about the field brothels is a hoot. I especially appreciate that the last one was shut down because of a complaint from a Brazilian pimp about “unfair competition” from the French government. Truly, the wholesome little guy fighting for what’s right.
What’s another year?: The now largely overlooked story of the American civilians that stayed behind in Saigon after April 30, 1975, some due to haplessness, others for heroics, or because they did not want to leave.
The exhortation “learn to code” has its foundations in market value. “Learn to code” is suggested as a way up, a way out. “Learn to code” offers economic leverage, professional transformation. “Learn to code” goes on your resume.
But let’s substitute a different phrase: “learn to cook”. People don’t only learn to cook so they can become chefs. Some do! But many more people learn to cook so they can eat better, or more affordably. Because they want to carry on a tradition. Sometimes they learn because they’re bored! Or even because they enjoy spending time with the person who’s teaching them.
Weird device: the Cuttelola Dotspen – the motorized pen that puts down dots for you!
That’s it for now – if you liked one of these links, share it with your friends!
Remember: Facebook, Instagram, Linkedin and Twitter intentionally hide links that you share on their platform. Because they hate the Web. Each link you share is a little bit of spit in their eye. A tiny likkle spittle for our beautiful friend Mark.
Every year, I try to visit my local “Arts College” – OCADU – to see what creative young people are up to.
This post is the first time I’m highlighting the people who’s work made an impact on me, to give them some publicity. Go ahead and visit their sites:
I really liked Selina Zheng‘s “Shanzhai Is Culture” graphic design capstone project. She made a neat zine that explained how bootlegs and fakes are not considered “bad” in Eastern cultures, and she showed appreciation for the fun and creativity of knockoffs. Selina was inspired by Pacific Mall, which happens to be one of my favourite places in the Greater Toronto Area!
Also in Graphic Design, Warrick Bruan (a friend of the blog commented that he has a fantastic name) his photography of decaying signage and the patina of age that certain materials gather when they’re used on building facades. He developed the photos in OCADU’s darkroom, and created 3 small books themed on metal, masonry and wood. He also created a 3D-printed building that is made up of liminal spaces (and continues in an infinite loop if you look at it just right).
There were several strong photographers at GradEx 2026, with 2 or 3 strong “absurd” photographers’ work exhibited together in a small room to great effect. Interiors by Reilly Narod. Blue 52 by Ethan Yoshitomo. And a third series of photographs of used up soap/items.
Maya Jurichad a series of large prints called “When I’m in Cosplay”. The prints themselves were intentionally faded/processed and featured her friends in Cosplay. What I liked about these photographs is that they reflected her love for her friends and showed everyone in their best light – similar to the qualities in a John Singer Sargent portrait. (A certain friend of the blog pointed out that, while I thought of Sargent showing women “as they are”, I was mistaken. Their necks and limbs are unnaturally elongated. Touche.)
Finally, Ilaria Serra had these great ethereal 80s photographs in her “Liminal Reflections” series. I even bought a couple of small prints!
In the Illustration program, Kaisy Tsoi was hands-down the standout star. Her series of soft illustrations commemorated pets who passed away – and their special quirks. I think what’s interesting about Kaisy is that she has her own style and has something to say (sort of like the embroidery in Tomoko Konoike’s project that delivers a brutal message in a cutesy package).
The vast majority of the young illustrators at the show had strong technical skill – but they’re young and don’t have a strong message to deliver. Yet.
Lin Sun’s unique creature illustrations stood out. There’s something original here – Lin knows how to elongate and twist a body while keeping the end result cohesive.
Ren (https://imginn.com/shadow.elysium/) had several illustrations themed around death and warfare. This one contrasts the glamour of war with the fact that the warriors are disposable cogs in the machine. I like the layout.
Edouard Vallerand (https://imginn.com/lazy_cr0w/) presented a collection of illustrations from a post-apocalyptic world. We definitely have a kindred vibe and I appreciated his entertaining takes on futuristic cults, like these “Harbingers of the Invisible Gifts”:
This cult worships the power of nuclear waste and the mutations and afflictions they provide from the invisible radioactive gifts that are given by their entity, The Kind One. They congregate in old, worn down nuclear facilities where the people of the old time have set up large spike monuments to worship their deity.
Devin Yang‘s work stood out from the other illustrators’ in the large hall. It is vibrant and dynamic. His style is not my jam, but I gotta give kudos to the lively spark in his work. His website his here.
Daniel Vrbos made a font by running an ink-dipped marble in a series of rubberband tracks that he constructed. The result was pleasing and “punk”. Daniel’s site is at danielvrbos-portfolio.format.com
Daniel has several interesting ideas on his site – like graphic design work he’d created with unusual tools (ie. no Adobe tools!):
Aaryan Pashine had several cool books laid out. Aaryan creates custom programs that generate bespoke book layouts. He also makes generative images. And an XKCD search engine that reveals all the traffic going back and forth between the client and server as you do the search…. Just wild stuff. Check out his site a-p.space.
In the Painting department, I liked this “centauress” by Maya Kaplan. The rest of the collection is also wonderfully weird. Like melonking in real life.
Jake Santos (https://imginn.com/jaeksantos/) had a series of 4 defocused airbrush paintings of European metalwork. The paintings are large, so they create a very odd feeling when you stand nearby – something almost recognizable but not quite. Like you’re stroking out.
They’re usually depicted with heavyweight rifles and babies. And they’re definitely not wearing those impractical “battle bikinis” in the Yank illustration.
Looking at the artwork above reminded me of this beautiful staged propaganda photo of a “field hospital”, from the later war against the USA:
Hah! “Saigon Sally” is probably a stand-in for “Hanoi Hannah” – a real Vietnamese broadcaster who’d try and demoralize American soldiers with her English-language broadcasts. She’d play music, read listener-submitted mail, list the names of freshly captured US soldiers and announce the locations of American units.
Eastern Jewel
The “Related Articles” list for Hanoi Hannah is wild. Including Eastern Jewel, a transgender spy for Manchukuo (sorry to burst your kawaii bubble!) who was descended from Japanese royalty.
“Will ya just stop asking what I’m thinking about?! I’m not thinking about anything!!!” sourceWhat was the rhyme from Basic Training? “Two in the head / make the shark dead” source
https://archityp.es – great storefront typography from the streets of France.
So, there’s this 4-volume book with photographs of China from 1873 (!). The couple above are getting married, and the photographer just goes savage on Chinese marriages:
Dreary and uninteresting from beginning to end is a Chinese marriage ceremony and in too many cases it must lead to a lifetime of disappointment and tears. In China, as in other parts of the world ladies prefer if they can, to get a glimpse of their intended partners. This may be done if circumstances are favourable but frequently they never see their lord and master, until the day when they are united to him for ever. One can readily fancy that, at such times, the first sight of an ill-favoured face will create a sad feeling of disgust and disappointment.
This post is not a review – it’s just a page about my favourite prepackaged coffee. I like drinking this Coco Bruni Americano coffee pouch. It is available here in Toronto at the “Galleria” Korean grocery chain.
When it disappeared from the store, I couldn’t find it again because I didn’t know the brand. Now that it is back, I’ve created this post as a way for others to find this brand through general search phrases.
The phrases I most associate with it:
Girl on a bird coffee
Girl riding a bird coffee pouch
Korean coffee pouch drink
Coco Bruni coffee
The design of these pouches is really something. There is an inflated handle for you to comfortable hold it. You can tear off the tip and pour the coffee into a cup, or you could use the telescoping straw to drink this like an adult juice pouch.
These Coco Bruni pouches seem to be associated with a fancy cafe based in Seoul, South Korea:
Hana no Shiori – which translates to something like “Pressed Flower Bookmark” was a Japanese printers’ exchange. It was a compilation of the finest Japanese letterpress work of the late 19th century.
The the Tokyo Tsukiji Type Foundry published Hana no Shiori, and there were 5 volumes:
My comments: many of these images feature bent-rule work. It is the art of making a picture by using snippets of ~1cm tall pieces of flat metal. Part of creating the picture involves the use of wooden blocks to hold the metal wires in place tightly.
A LOT of very finnicky rule-work went into this picture. I have no idea how the sakura flowers on the kimono were done – perhaps with pre-cast “printers’ ornaments” that were filed down or masked-off in the final print?A house made out of printers’ ornaments – this is a different kind of manual artwork than rule-work
This is very much in the style of western “Artistic Printing”Incredible work – made with bent copper “rules” and remixed borders & printers’ ornaments.
I can see at least 11 distinct colours here – the rest would’ve been created by overprinting different colours with each other. Imagine passing 11 different plates through the press, all perfectly aligned, to get this picture.
Just a little too late. Never enough to swallow those pills – now I’m sick. And always will be.
Curve – Coast is Clear
Leaky Websites
Melonking’s leaky webring – I was on a site, and it started filling up with water 😕. But fortunately it gave me a chance to bail the site and lower the level of water. That’s how I found out about Melonking’s super creative Leaky Ring:
(If you’ve never experienced Melonking’s site, he’s on the very far end of the Indieweb spectrum. You can even get a gif pet for your site from MK.)
Huffin’ it
This is one of those egregious examples where academics are huffing their own perfume so hard that they forgot what a real flower smells like:
The article proposes archival thinking as an analytical framework for studying Facebook. Following recent debates on data colonialism, it argues that Facebook dialectically assumes a role of a new archon of public records, while being unarchivable by design. It then puts forward counter-archiving – a practice developed to resist the epistemic hegemony of colonial archives – as a method that allows the critical study of the social media platform, after it had shut down researcher’s access to public data through its application programming interface. After defining and justifying counter-archiving as a method for studying datafied platforms, two counter-archives are presented as proof of concept. The article concludes by discussing the shifting boundaries between the archivist, the activist and the scholar, as the imperative of research methods after datafication.
… and this is from a cool academic who’s writing about a topic I’m passionate about (archiving Facebook despite its archive-hostile design). All this talk about decolonializing the datafied infospace to counter the neocolonial antiarchives of Zuck- and Zuck-adjacent Bergs reminds me of the World’s First Matcha Labubu Genocide.
Cukak Remixes
Yooooo, did you know that Vietnam is friggin’ rocking it on the music front? If you want to listen to fantastic “put a donk on it” remixes of Vietnamse songs, that’ll have you going “ting ting ting ting ting” mentally for days, then check out Cukak:
You know what, let’s throw in a Korean artist too – Minsu. There’s so much going on musically in Korea, even aside from K-Pop:
On her channel, there are English lyric sheets for all the songs in this album.
Snackbonmination
Frankly, reading this article had my physiognomy contorted in distaste:
Just… the awful crossovers, the amount of slop that is being produced. Some poor suckers had to formulate these abominations, procure and install the factory tooling to produce this ick, create and print the packaging. Nobody wants this. It’s sick.
I can’t quite articulate what makes these snacks so much worse than the weirdly-named ones that I like to try. I think it’s the low-effort mashup nature of it: let’s combine Cinnamon Toast Crunch and El Paso! Let’s put marsmallows into instant noodles!
The trick is to go to the “Gallery” view on the top right, set the geography to one of the capitals of the Muslim/steppe republics of the former Soviet Union and the date range to 1986-1996 and just … bodysurf through the waves of history.
PXL2000
The PXL2000 – A toy video camera that recorded onto audio cassettes.
Cherkizovsky Market
It was fascinating to read this article about a Moscow market that functioned, essentially, as it’s own fiefdom. In the racist hellhole that is Russia, this was a rare place where multiple cultures could coexist.
And there’s a fascinating analysis of how the vast, vast market was constructed. It was made of storage containers that were piled in 2 storeys. The bottom container was the shop, and the top was living quarters. The path between the containers was covered with a lightweight canopy to protect shoppers from the weather.
Lobsang Rampa – from prosthesis fitter in Devon, to hosting the spirit of a Tibetan Lama, then becoming a bestselling author, and finally retiring in Calgary.
Making art by hand teaches my daughter—and me—things that cannot be learned by prompting:
Material constraints. What do we have to work with? How do these pieces fit together? What can we make from what we have?
Physical manipulation. How does this paper feel? How does it tear? How does glue behave? How do colors interact when they’re actually touching? How does the physicality of a material affect what we later see?
Aesthetic judgment. Does this feel right here? What happens if I move it? What does this composition need?
The satisfaction of making something exist that didn’t before. Of putting yourself into it. Of leaving traces of your decisions in the final object.
It just struck me: when the AI mania passes, after the awful way in which AI is being forced down our throats there’s going to be a PTSD period when people will want nothing to do with AI even in cases where it’s genuinely useful.
PastVu is a great site for finding historical photos from specific locations on a map. The interface is only partly in English, but it is easy enough browse the map to find pictures in a specific area.
There is also a slightly-confusing search function. Here is an example link to a filter specifying images from Tashkent between 1993 and 1999.
While PastVu is particularly rich in pictures from Eastern Europe, there are many user-contributed photos covering North America and other regions.
Here is an example of the kind of pictures you’ll find – these are from a 1990s Moscow market that specialized in bootleg software and VHS tapes:
The market was called “Gorbushka” (Горбушка).
For a similar “Wayback StreetView” experience covering Toronto, check out OldTO.org.
We’ve baked the concept of “countries” into the Internet domain system. And that makes domain names tied to real-world territorial conflicts, countries splitting apart and countries going underwater (like Tuvalu)
.yu is an early example of something that will happen more and more often.
It is unfortunate that we didn’t preserve the .yu domain space like a nostalgic Internet memorial to the country. Instead, the sites became unmoored and unreachable.
Kaloyan referred to the research paper “What does the Web remember of its deleted past? An archival reconstruction of the former Yugoslav top-level domain” by Anat Ben-David. In that paper, Ms. Ben-David reconstructed a network graph of .yu domains from the Internet Archive’s Wayback Machine.
Ben-David’s paper used the below sources as seed lists:
By crawling links from these pages to other .yu URLs, she eventually found 17,460 unique websites in the .yu domain.
The adventure begins
Dear Reader: after hearing all this, I bellowed out a mighty
Akshuallyyyyyyyy!
I dropped my bag of mini M&Ms onto the house robe I was wearing. Unshaven and red eyed, I yelled up from the basement: “MOM, fire up the router! I’m going on an Internet Adventure!!!!”.
You see, I figured I was good enough to discover all the archived domains under the .yu TLD. After all, last time I had an akshually moment, good things happened!
At first I tried doing a wildcard search for all *.yu domains at the Wayback Machine. That didn’t work.
The CDX API – a dead(ish) end
Then, I discovered that the Wayback Machine has a “CDX Server” API that can tell us if a page is archived or not.
Below is an example of a CDX query that grabs all the unique file paths at the domain “jacobfilipp.com”, filters them down only to HTML files that were successfully fetched (status starts with a 2), and shows you only the first 10 that are archived at the Wayback Machine.
Unfortunately you can’t easily fetch all archived URLs under the TLD “.yu”. However, if you try, you get a message that says “Forbidden: This type of CDX query requires authorization.” Which tells me that you could do this if you politely ask the staff at the Internet Archive.
What does work is fetching all the files under the Yugoslavian subdomains like *.co.yu and *.org.yu and *.ac.yu.
Here is an example of fetching all the URLs under *.co.yu:
I went ahead and used my newfound CDX skills to download a list of all indexed “domain listing” pages. Not all of them are in the Wayback Machine: most listings stop at “page 20” of each letter.
Then, I downloaded all those pages locally using wget (use the id_ URL trick to get a page with un-altered URLs), and extracted all the .yu domain names from the links inside.
Finally, looping through each domain name, I used the CDX endpoint to check whether the domain is in the Archive or not.
End result:
21,864 domains with 13,292 of them having an archived copy in the Wayback Machine.
While writing this post, I realized that the parent of www.yu – memodata.net – also has a list of domains. Theoretically it is the same list of domains. But, practically, the Wayback Machine might have indexed alphabetical listing pages that it didn’t index for www.yu. You’d have to grab all the listings pages using the CDX API and extract the domains.
If you really need more .yu domains, Nikola Smolenski and Anat Ben-David are easy to find online. You should ask them nicely – I bet they have their lists saved somewhere.
This is a list of restrictive grocery covenants from across Canada. The Halifax covenants were graciously shared by Jenna Khoury-Hanna and Matt Vaughan. I paid for the rest of them – now they are available to you for free.
And, before we get to the list: I am asking for your help. Contact me if you spot any mistakes, or if you are aware of a restrictive covenant that should be on this list. My email is “jacob” at this website.
Here is a list of restrictive grocery covenants on this page:
Lawton’s Drug Stores blocks groceries, convenience store and pharmacy. Pharmacy restriction lifts 5 years after Lawton’s leaves – but grocery restriction is never lifted.
2 Covenants, one with Sobeys blocking another grocery/pharmacy tenant for the duration of their tenancy. Another blocking any petroleum business for 25 years.
Blocks independent gyms (but not the major players) from operating on the plaza. And a variety of other businesses like thrift shops. Limited to the duration of the grocer’s tenancy.
3 covenants on one location. One, with Clayton, blocks grocers from an adjacent property, forever. The other (snippet from longer doc) blocks food stores from the specific property. A final one with Sobeys blocks any “non first-rate” gyms, thrift stores, etc. from the location.
Blocks the landlord from renting to another grocer in a 2km radius. Only as long as the grocer uses 50% of their space as a grocery. (Standard Loblaws + CP REIT covenant)
Great example of the standard deal between Loblaws and CP REIT. Forbids food businesses, convenience store, pharmacy, arcades, billiards etc. Blocks “loss leaders” on national brands. Lists types and quantities of tenants allowed on the premises. Blocks landlord from renting to grocers in 2km radius. For as long as Loblaws uses 50% of their space as a grocery store.
A remarkable example of Shoppers, located at 1595 Bedford, reaching beyond their mall to the neighbouring mall across the road. This covenant prevents this 3rd party landlord from renting to a pharmacy for 3 years.
What are restrictive covenants?
“Restrictive Covenants” are a tool that Canada’s biggest grocers use to block competing groceries from moving in to certain locations. The Competition Bureau is currently investigating the harms that stem from this.
The concept of Restrictive Covenants is long-established in real estate: it is a restriction on the use of land for certain purposes. For example, it could block you from opening a smelly petting zoo on your property. Historically, they were used to keep out members of minority races from neighbourhoods in the USA and in Canada.
Covenants typically “travel with the land” – this means that they bind all future owners of the land. Sometimes in perpetuity. Covenants override a city’s municipal zoning rules.
Here is a clear summary of how grocers use covenants to reduce competition, from a 2023 Grocery Market study by the Competition Bureau of Canada:
They explain why covenants are rarely challenged in practice:
Although it appears that the use of restrictive covenants to inhibit competition is found in a number of commercial realms, there is rarely an incentive on the part of would-be purchasers to challenge the validity of a restriction. Why mount an assault if there are ample alternative business sites? … At the same time, a rival business might not wish to invalidate the restriction even ignoring the time, expense and uncertainty surrounding that kind of legal action. After all, that firm might want to free-ride on the restriction by locating near to the restricted parcel, since it is likely that a competitor will not try to set up shop on the restricted site.
List of grocery covenants
Edmonton, AB: 5120 122 St NW, Lansdowne Centre (T6H 3S3)
This is a restrictive covenant between Safeway and Three M Investments, from December 2008.
The covenant forbids renting out the premises to businesses that sell food for off-premises consumption (grocery stores):
My understanding is that this covenant applies forever. Until Safeway says in writing that it is lifted:
The property was operating as an IGA back in 2007:
But as of at least between 2009-2012, there has been no tenant there. In 2014 Google streetview shows “Find” – a furniture/thrift store – moving in.
This is the same block of properties as “Crestwood Centre” at 9604 142 St NW.
This is a covenant that was connected to a year 2000 lease with Great Pacific Industries (“Save-on-Foods”). It only lasted as long as the tenancy – so it didn’t “carry with the land” for an unreasonable span. While it was in force it forbid other tenants in the plaza from selling foods.
The covenant also includes a restriction on cinemas, spas and gyms, under the rationale that they place undue burden on parking facilities. They also block adult book stores under the same logic… which doesn’t seem consistent.
This property has a LINC identifier of 0027588798, and the restrictive covenant is registered as document 002193697.
In this document Sobeys, the owner of the “dominant lands” on the Northwest corner at 97 St. NW and 137 Ave. NW, places a restrictive covenant on the owners of the land on the Southwest corner:
The “subservient lands” on the Southwest corner are currently a Ford dealership. The owner is prevented from renting the premises to a supermarket for a whopping 60 years. This contract was signed in 2014, so it’ll be 2074 before a grocery store can even think of moving in!
A previous restrictive covenant from 2005 indicates that there used to be a Sobeys (“Garden Market”) on the site of the Ford dealership. In the older covenant a diagonal slice of the property is forever blocked from becoming a grocery:
The parcel in question. There covenant also extensively talks about a right of way between the owner of that land (Bear Creek Properties Inc.) and the adjoining Sobeys property.
This is a large lot that stayed unused for at least 12 years when Safeway left and nuked it with a restrictive covenant. Eventually, a Long & McQuade musical instrument store moved in. Take a lookat this series of Google Streetview pictures of the location:
The covenant on this one is interesting because it prevents a grocery/food store on the property for as long as 3 other Safeway (Sobeys) locations remain functioning:
Are those 3 “dominant tenants” still functioning as grocers in 2026?
8118 118 Ave. NW is currently a FreshCo. (a brand of Sobeys – which took over Safeway Canada)
At Manning Crossing in Edmonton, there is a Safeway:
3210 118 Ave NW ceased being a grocery, and is now an “Amazone Playzone”. I wouldn’t be surprised if Safeway also put a restrictive covenant on that property when they left.
This Vancouver city policy report from 1998 (backup) describes the location as: 1650 Davie Street is a former SuperValu site, currently occupied by London Drugs. In 1996, Loblaw’s (SuperValu) agreed to give up their lease provided the site’s owner agreed to a covenant restricting the use of the property for the sale of food. This covenant runs with the leases of the nearby stores it is meant to benefit (1030 Denman Street and 1255 Davie Street) and is automatically renewed with renewal of those leases.
The 1030 Denman location has a NoFrills (as of March 2026) and 1255 Davie has a “Your Independent Grocer” – both Loblaws’ brands. So the covenant is very much still active.
Here is the restriction on the % of floor space that can be used for groceries:
And the condition that ties this to the other leases, with those relevant “dominant lands” parcel identifiers:
The below restrictive covenants for Halifax were captured in 2019 and may not be valid at this time. These covenants were generously provided by Jenna Khoury-Hanna.
84 Main St. (Dartmouth) & 10 Gordon Ave.
In this one, Lawton’s Drug Stores Limited blocks the landlord from allowing the land to be used as a grocery or a pharmacy. Only 5 years after Lawton’s leaves the strip mall, will the landlord be allowed to rent to another drugstore.
Notice that the grocery restriction is never lifted – the land can never be rented to a grocer!
Click for full scan
210 Wyse Rd. (Dartmouth)
This one is a blanket 20 yearblock on using the land for a grocery or a drugstore. I believe this covenant was put in place by Sobeys.
Click for full scan
268 Baker Dr. (Dartmouth)
This is a Sobeys contract preventing the sale of groceries or drugs on the plaza. The covenant refers to Irving, Westwood and Clayton lands. I did not purchase the entirety of this document, but I wonder if the mention of these 3 parties means that the covenant covers a bigger area than just the plaza.
Click for full scan
279 Herring Cove Rd.
This is a Sobey’s covenant, preventing the property owners from leasing to another grocery during the duration of Sobey’s tenancy (pretty reasonable). What makes this document interesting is that it blocks a variety of other businesses from moving in nearby. Businesses like “non first-class gyms”. It’s interesting to see how these private agreements stifle the creation of new businesses in Canada – in this case, favouring incumbent gyms over upstarts.
Click for full can
287 Lacewood Dr.
There is a 1990 covenant between Clayton and “Food City” on this property. In this deal, Clayton agrees to not permit a grocery to operate on their lands – which are adjacent to the actual Food City lands. In this way, the grocer is expanding their sphere of control over nearby properties.
This is a perpetual agreement, running with the land forever.
Click for full scan
There’s an additional covenant, of which I only have a snippet:
There’s a 3rd covenant on this property from 2008. For the duration of Sobey’s lease (and any extensions), it blocks any food businesses (other than fast food/sit-down restaurants). It also restricts any secondhand business, gym or billiard facility to “first class” facilities – in this way, a big grocer is blocking start-up businesses in a variety of fields from rending at this property.
In this covenant, Atlantic Superstore restricts the landlord from renting to another supermarket for the duration of the lease (reasonable), but also blocks renting to another supermarket on any properties the landlord owns in a 2km radius (unreasonable).
This is one of the deals between Loblaws and CP REIT.
Click for full scan
535 Portland St.
This covenant has a grocery restriction, but I think it might be restricted to the term of the current lease.
Click for full scan
5240 Highway 7
This is a Loblaws & CP REIT agreement. Contains a 5Km “radius lands” restriction, and blocks dollar stores from promoting national brands as a loss leader.
Click for full image
650 Portland St. / 6141 Young St.
Both 650 Portland and 6141 Young are owned by Choice Properties REIT, and this covenant is an example of the kind of deal Loblaws signs with itself when it rents in a CP REIT mall.
The contract with Loblaws specifies in minute detail which kind of tenants can be in the mall (no more than 1 dollar store, 1 cafe, 1 pet store), forbids awful stuff like cinemas or bowling alleys. It also includes a 2km radius condition forbidding CP REIT from renting to another grocery store at their other properties.
This is a fantastic example of the fiction inherent in REITs – they’re supposedly neutral land-holding vehicles. In reality, these covenants favour Loblaws and shape the operations of the mall around this tenant. CP REIT is absolutely not independent of Loblaws when they’re allowing these sweetheart deals.
Click for full scan
745 Sackville Dr.
Another deal between Weston-owned Loblaws and a Weston-owned CP REIT mall, as above.
This covenant is an amendment to a previous covenant – I believe it is a refresher that updates the parcel’s record through sales to subsequent owners. It benefits Sobeys by blocking any grocery store, convenience store or pharmacy on the location. Many thanks to Matt Vaughan for acquiring “Schedule B” of this document.
A small snippet deal between Loblaws and CP REIT on a strip mall. This one is different from Loblaws’s standard covenants because it prevents CP REIT from renting to another grocer in a 5 Kilometre radius (instead of a 3k radius).
Click for full scan
Toronto, ON: 985 Woodbine Ave.
Lease between Valu-Mart (Loblaws) and CP REIT (Loblaws). These are not independent entities and are both controlled by the Westons.
This is a Lease agreement preventing anyone from selling groceries on the territory of a shopping block while the Valu-Mart is in operation.
What’s interesting is that this one lease also blocks the Landlord from leasing property to any other grocer within a 2 Kilometre radius of the shopping centre. The landlord in this case is CP REIT – Canada’s largest real estate investment trust, and you can bet that they own land nearby*.
* Actually, I will owe you an update: CP REIT discloses all their properties, and I will check whether any major ones are within that radius. The adjoining ones on Danforth Ave. are definitely owned by CP REIT.
The lease spells out what type of tenants, and how many of them are allowed on the plaza. It also has a clause that forbids a dollar store like Dollarama from promoting any “loss leaders”, a direct way of setting a “price floor” on National Brand products.
The restrictions are only in place as long as Loblaws uses at least 50% of their tenanted area as a grocery.
Here is a visualization of the “no grocery leasing” area that’s covered. This is a big urban swath of land. It covers the distance of 5 subway stations.
This covenant shows you what happens when Loblaws negotiates with an independent landlord (RioCan) – contrast it with the sweetheart covenant (985 Woodbine) that CP REIT gives Loblaws automatically when there is zero negotiating.
The highlighted passage shows the kinds of activities that are restricted. Section 2 illustrates the power of a Restrictive Covenant to bind future owners of the land. The restrictions are in place as long as Loblaws is operating on the property, and for 6 months afterwards – which makes it one of the more reasonable covenants on this page.
Question for readers who are Lawyers: what does section 3 mean? Does the covenant expire if Loblaws stops operating for 6 months in the future, or does it expire only if Loblaws fails to operate a store for just the initial 6 month period after the covenant is added?
This is a lease agreement for a shopping plaza, where Metro put in a “Food Basics” grocery. It forbids other tenants from selling foods while the tenancy is active:
What’s interesting is that the lease outlines in minute detail what foods, and how much of each, a potential Shoppers Drug Mart is allowed to sell. There are strict limits on how much bread can be sold. In what other context is one business allowed to control another business’ operations in such detail? Is this what you would call free-market competition?
This is a 20-year lease agreement between Sobeys and “Picton Properties Inc.”
In this shopping plaza, none of the other tenants are allowed to sell food or non-alcoholic beverages without Sobey’s permission. There is also a 3 Kilometre radius restriction placed on Picton Properties Inc. – they can’t rent their other land to a grocer.
Dear Lawyer readers: I’m not clear if this covenant runs with the land independently of the lease. Could you please weigh in?
This lease has a whopper of a clause where Sobeys permits any Dollar Store tenants to sell name-brand non-perishables. But only if they never undercut Sobey’s price (ie. use them as a “loss leader”). If this happens, the landlord is obligated to prevent selling National Brand goods.
This document contains an example of a restrictive covenant on pharmacies and a variety of other businesses.
It is part of a bankruptcy procedure and deals with removing restrictive covenants that prevent running a pharmacy in a commercial plaza. It looks like the covenants were extended from one property to the neighbouring property, owned by the same people (similar to the “restricted radius” concept in some of the grocery covenants). And the bankruptcy administrator wanted to remove that restriction.
This one is a limited 7-year covenant that prevents the landlord from renting to another pharmacy business.
Click for full scan
The above covenant is for the benefit of the Shoppers Drug Mart at 3430 Joseph Howe Dr. There is an additional restriction in a lease with Giant Tiger, forbidding it from ever operating a pharmacy – in favour of that same Shoppers location.
This is part of the same property as the above 3531 Dutch Village Rd. location. This is a covenant with Shoppers which restricts what kinds of other tenants the landlord can rent to for the duration of the lease. The full list of forbidden businesses is extreme – dollar stores, photo shops, postal outlets and beauty shops are just some of the businesses that Shoppers won’t tolerate on the plaza.
Click for full scan
The set of covenants that covers the entire property and Giant Tiger shows you that the landlord is very serious when it comes to enforcing Shoppers’ interests.
90 Lamont Terrace
I only have a snippet for this one – a covenant from 2006, potentially with Home Deopt, blocking the use of the property for any hardware-related business. I believe that it was signed upon HD leaving the location, as there is a Walmart at that address now. The duration of the covenant is 10 years.
A covenant that binds the owners of the building at 1658 from 2012 to 2015, in favour of the Shoppers Drug Mart location across the road in Sunnyside Mall. Shoppers is renting from a completely different landlord.
The owners of the pink mall are promising not to rent to any pharmacies, in favour of Shoppers which is located in the green mall:
This is a remarkable example of Shoppers using covenants to control the economic environment around their location – going beyond their immediate landlord, and binding surrounding landlords through separate agreements.
A REIT is a special structure that allows Canadian landlords to pay lower taxes, through a concept called Return of Capital.
Are you familiar with REIT taxation? How exactly do REITs allow real-estate businesses to be taxed at a lower rate than other types of businesses? (I used to know this but forgot. Is it that you collect your RoC tax-free, and then sell the property cheap to your cousin, so that you don’t trigger a capital gain?)
Choice Properties REIT was created as a way to spin out Loblaws’ real estate holdings into their own entity. It is owned by essentially the same people as Loblaws, and many of their properties have a Loblaws as an “anchor tenant”.
CP REIT is Canada’s largest REIT – their 2025 investor report indicates that they hold 699 properties worth $17.8 Billion. They hold everything from standalone Superstore locations, to grocery-and-gas-station combos, warehouses and malls.
Their 2013 prospectus includes this information about covenants:
Restrictive Covenants Each of the Loblaw Leases will include a radius restriction pursuant to which the REIT will agree that the REIT and any person controlled directly or indirectly by the REIT will not lease to third parties other premises on lands located within a specified radius of the leased premises (the ‘‘Radius Lands’’) for use as a food supermarket or grocery store (‘‘Supermarket Business’’). This restriction will not apply to properties acquired by the REIT, or a person controlled directly or indirectly by the REIT, (i) from Loblaw Companies Limited or any person controlled directly or indirectly by Loblaw Companies Limited, or (ii) that at the time of such acquisition are subject to an existing lease to a Supermarket Business. The restriction shall also not apply to any amendment or extension of an existing lease to a Supermarket Business within the Radius Lands.
In addition, in Loblaw Leases for leased premises in a multi-tenant retail shopping centre, the REIT will agree, subject to certain limited exceptions, including existing uses by other tenants as of the Closing Date, not to lease or allow the occupation of premises in the shopping centre for use as a Supermarket Business or an amusement arcade, bingo hall, bowling alley, billiard parlour, convenience/variety store, drugstore or pharmacy, cinema, bar, tavern, nightclub, massage parlour or retail store selling pornographic, adults only or erotic material.
This prospectus is eye-opening: it explains why so few malls have convenience stores, and also why you never see arcades in malls anymore. Surprisingly, cinemas are also forbidden in CP REIT properties that are anchored by Loblaws.
Finally, the existence of CP REIT as Loblaw’s landlord explains a neat trick that the Weston family can use to make their grocery business look low-margin while pocketing extraordinary profits: CP REIT can eat up Loblaw’s profits by charging it very high rents, and passing all that money back to the Westons.
The money ends up in the same hands. Except it is now “real estate investment” income instead of “grocery” income.
Final note: just as Choice Properties is controlled by the same people as Loblaws, so is Crombie REIT controlled by the same people as Sobeys. This is a good explanation of how the REIT-grocer relationship can result in anti-competitive behaviour.
Edmonton has been fighting restrictive covenants for a long time. Safeway (now a Sobey’s brand) is a particularly bad offender, “salting the earth” after they leave. This 2008 report by Nairne Cameron and Lee Yen Chong, lists 18 Edmonton locations with restrictive grocery covenants, and 12 of them are Safeway’s.
I believe that Edmonton’s Council misunderstood what restrictive covenants are. Covenants are a legal concept dating to the British legal system. A provincial minister cannot make them disappear.
Municipal governments everywhere should consider using Realpolitik to deal with restrictive covenants: ensure that all Safeway locations across the city undergo constant electrical, plumbing and water maintenance. And have surprise food-safety inspections every week until all covenants are removed.
The restrictive covenants are intended to limit competition that might affect nearby supermarkets owned by the chain that is closing the store. By restricting the opportunity for other food retailers to locate on these sites – even the smaller specialty type supermarkets which are responding to consumer diversification – covenants negatively affect the future viability of neighbourhood shopping streets.
This passage explains why grocers can’t “just find another location for a supermarket” – there are few suitable large lots in a dense urban environment:
Large consolidated sites like these supermarket sites are rare, and consolidating new ones in established shopping streets is difficult.
In Halifax, Sobeys uses restrictive covenants to block Dollarama from selling bread – depriving locals of choice: