• Week 12.26

    Week 12.26

    Another busy week, and I’ve been like a caffeinated creature hunched over its keyboard with bloodshot eyes. You may notice I’ve updated the navigation bar on this site to point to a dedicated page listing all my apps. This takes the place of a page that pointed to all my custom GPTs on ChatGPT (that never really took off, did it?) and before that, my NFT experiments. Those are still around, though!

    You may call it AI slop but I’ve generated key images for each of the apps on that page, which I like to think of as analogous to game box cover art, those evocative artistic representations that used to stretch truths to their breaking points, back in the days when games looked like Lego.

    Here they are, just so you can admire them.

    The latest for now is CommonVerse, my daily magnetic poetry app. Give it a go!


    I’m writing this paragraph on Thursday after another failed attempt to stop vibe coding and focus on other pursuits. So far I’ve mostly finished one project and started on another that I meant to leave aside until next week. What is this feeling? This need to actualize a new ability that I’ve always wanted but never had to worry about not having?

    Instead of being able to recognize that I’ve already accomplished a lot, and “taking the rest of the week off” to go watch movies or something, I’m sucked into continually iterating and improving upon these apps like I’m on a deadline. It’s that paradox (mentioned here last May) where new technologies don’t decrease our workloads but only make us busier instead.

    Productivitymaxxers will say this is fine. This is how it’s supposed to be: you can do more, so you work just as hard and get twice as much out of it. Why would you want to work half as much? And they’re not wrong — that’s the engine of progress. But it’s also how you end up making six apps in three weeks and treating it as some kind of baseline rather than a miracle. As predicted, my capability has grown but I got desensitized to the satisfaction.

    The discomfiting shock to the system as I struggle with this resetting of scale, and feeling addicted to realizing more ideas, is an adaptation crisis. Adapting to life at a new speed and learning to balance capability with sensibility. Astronauts and pilots have to train to handle G-forces, in which the G stands for gravitational. I’m suggesting that working with AI has its own G-force, where the G is gratification. You can suddenly manifest many of the things you can think of. That’s a very powerful impulse to get under control. How do you engage with life’s responsibilities, appointments, or your growling stomach, when there’s always just one more prompt and revision to make? After getting home from a few drinks on Friday night, I found myself on my laptop in bed after midnight, fighting with a procedural audio generation engine that wouldn’t trigger drum sounds for any obvious reason.

    The next night I did the same, staying up to 3:30 AM because I had some new ideas that just could not wait. My Apple Watch sleep score is in shambles. But App #6 is certainly shaping up to be my best work. I’m going to sit on it for a whole week and keep polishing, instead of putting it out and moving on to the next one. That’s my strategy for slowing this down — it’s all I’ve got.


    Over the weekend, I also attended an Apple Store photo walk activity on a sweltering afternoon (up to 36°C next week) with Cien and Peishan. I hadn’t done one of these in years, but always keep meaning to. This one was conducted by the staff at Apple Orchard, and was a walking tour of Emerald Hill — which in reality is just a tiny street off Orchard Road. I’ve been there dozens of times over the years, but never saw the details just sitting there in tiles, old paintwork, and ornamental doorframes. Going to a small area with the intention of taking photos, and giving it more time than you’d normally allocate, can be a really fun and creative exercise.

    There’s no reason one couldn’t do this themselves any time, anywhere, of course. But these free ‘Today At Apple’ sessions are a good excuse to get off the couch. The other two local stores have their own programs, and I might check them out someday: Apple Jewel Changi Airport looks at the indoor waterfall, and Apple Marina Bay Sands has a night photography focus.

    Another nice touch is that they’ll lend you an iPhone 17 or 17 Pro if you don’t have one, and they’re incredibly relaxed about handing them out. No paperwork to fill out or deposits to pay. That’s the great thing about Find My protection, I guess. A comment was made that in the UK, those phones would disappear the instant the group left the store — even if just for parts. But they must do these sessions worldwide, so I’d love to know how it’s dealt with.


  • CommonVerse

    CommonVerse

    Play at commonverse.app


    Magnetic poetry for a post-Wordle world.

    Every morning, everyone on the planet wakes up to the same handful of words. Drag them around the canvas. Arrange them into something — a poem, a phrase, a punchline, a prayer. Save it to show your friends, then come back tomorrow.

    No scores. No wrong answers. Just you, today’s words, and whatever you make of them.


    How it works

    New words drop at midnight in your timezone. They’re a mix of nouns, verbs, and adjectives, enough to build something with. There’s a bin in the corner where you can drag unwanted words to, freeing up some space. You’ll also find a few connector words stashed in the bin every day to help you create your masterpiece. Tap words once to make them bigger. When you’re done composing, click the Share icon to save an image with the day’s date.


    Three themes

    CommonVerse comes dressed for the occasion.

    • Fridge Magnets puts you in front of a stainless steel door covered in letter magnets and a few decorative surprises.
    • Notebook gives you dot-grid ivory paper, a bookmark ribbon, and a handwriting font.
    • Typewriter goes analogue all the way — classic typeface, paper bail, wire mesh bin.

    Everyone gets the same words each day. What will you do with them?

    Play CommonVerse →


    Disclaimer: I made CommonVerse with the help of Google’s Gemini 3/3.1 Pro LLM and take no responsibility for any damage or disappointment.


  • Week 11.26

    Week 11.26

    If you thought I was going to stop after last week’s two apps, I wouldn’t blame you. I’ve been having poor luck staying focused on new hobbies and pursuits over the past year; they all just seem like too much work for too little payoff and I drift off. Vibe coding seems different so far because it lets me start making weird things that I want to see, without being dependent on anyone else’s time or generosity.

    If you think in terms of music albums/careers, then Collagen was the mixtape that I put together to see if I could be a real musician. Urban Jungles was a big leap forward, the debut album, if you will. It had way more polish and was usable by almost anyone (whereas Collagen had what you might call a niche audience).

    Which brings us to the sophomore curse or slump. The second album tends to be over-ambitious, myopically conceived, and underwhelms audiences looking for more of what made the debut good. There are exceptions to this mythical rule, like Radiohead’s The Bends, Lorde’s Melodrama, and D’Angelo’s Voodoo. By this logic, my next app was statistically going to “fail” by being a harder one to get into.

    I ended up making two apps again this week: SkySpotter and Library Supercollider. Each one has a separate page on this site that shows and explains what they are, so you should stop here and go read them before coming back.

    Like a sophomore album, SkySpotter probably reached a little too far. It took the real-time weather data angle from Urban Jungles, added the more complex dimension of real-time air traffic data, and then threw in rendering a first-person 3D world as a bonus challenge. I started refining the concept and prototyping it on Sunday afternoon, and then worked on it for two full days on Monday and Tuesday. I literally forgot to eat lunch, and was still messing with it at 11pm both nights. It was like a job.

    Gemini 3 struggled. The Canvas chat became so long and convoluted that it won’t even load now in the iOS apps — I have to use the web interface. It hallucinated making changes, and introduced new bugs each time I made an improvement. It built planes with reversed wings and nose cones pointing backwards. Working with bugs in a 3D app was so blood-boilingly frustrating that I wanted to give up.

    I actually did give up… on implementing a VR mode for Apple Vision Pro. We got it to half work but the skybox sphere was too far away and would keep turning black. Rather than risk corrupting the working regular version any further, I decided to cut it.

    I’m proud of SkySpotter because it’s pretty damned cool to lie in the virtual grass and watch real planes go by. Even as someone who doesn’t care about planes more than the average person! But it was a technical challenge first and a passion project second. So if that was my over-produced sophomore studio album the label breathed down my neck for, then the next release would be its opposite: a scrappy, self-funded back-to-roots project recorded directly to tape in a Nashville studio over an inspired couple of days.

    Library Supercollider was an idea that came to me all of a sudden after I’d finished SkySpotter. I’d been interested in the concept of cut-up poetry since I was in university (popularized by Brion Gysin and William Burroughs around the 1960s), and I believe it occurred to me back then that someone could make a computer program to cut up and mash two classic texts. I just didn’t know it would be me, twenty years later.

    I expected it would take me the next couple of days to get working, being that it requires the somewhat complex-sounding downloading and processing of entire ebooks in the background of a web app. I didn’t know if it could even be done. So imagine my surprise when I had a working prototype by lunchtime on Wednesday. But between polishing the experience and overcoming download limits with Project Gutenberg servers, I wouldn’t be done until Saturday morning, making it a longer project with different challenges — comparatively less frustrating, more educational.

    I understand that it’s not an app for everyone — you might read a page and conclude that it’s worthless gibberish. Maybe it takes the sort of person who likes abstract art and free jazz. But personally I’m so pleased with this project that I’ve bought two domain names to go with it: librarysupercollider.com and the superior smashmybooksup.com, which I’ll retain for a year as a ‘marketing URL’.

    In all seriousness, I think this is the finest work of my two-week career as a builder of software! The user experience for remixing and reading the resulting texts is brilliant, if I do say so myself. The steampunk UI and animations are completely unnecessary but bring me joy (notice the moving gears in desktop view). I had to come up with caching and proxy solutions to make the app more reliable under load. I even got a little into the weeds: installing node.js and Vite on my Mac, running scripts in the terminal, trying to compile a macOS port to get around problems (eventually unnecessary).

    Even if I were a skilled and experienced developer, I can’t see how I would have made these apps in two weeks; from writing to designing and coding them up, plus preparing documentation and website copy (plus one very dubious video ad). Deploying Library Supercollider to its own domain made the reality click for me, a feeling kinda like publishing your first thing on the App Store. It says: this thing is now real and can be used by real people.

    Then I came across this article in the NYT Magazine, entitled “Coding After Coders: The End of Computer Programming As we Know It”. It notes an interesting inversion of what we’re seeing in other fields — AI is taking away the drudgery of programming and leaving the human, soulful (and fun) parts.

    “The work of a developer is now more judging than creating.”

    In that way, I may not have magically joined the ranks of coders overnight, but I could probably say I’m developing. At my job, I used to direct the form of apps in a way so removed that I could only claim the role of design, but not the larger making. Part of the handwringing in design circles today is precisely about how designing and developing are merging, and soon only making will remain.

    Not everyone will bother to turn their ideas into reality, and fewer still have the experience and vocabulary to prompt polished apps distinct from the models’ averaged-out defaults, but those who persevere will be bringing tools and toys into existence the likes of which you may have been waiting decades to see.

    What’s next? Well, I might have a couple of ideas…

    One thing all this app-making has done is bring me back to my Mac. I usually spend most of my computing time on my iPhone and iPad, but there’s no substitute for a Mac when it comes to managing local files, running scripts and compiling code. I’ve had coders like Michael make this point to me before, but I never got it because I never needed to sync a local repo with GitHub or anything before.

    So a side effect of spending long stretches of time on my five-year-old and long-neglected M1 MacBook Air is that I’m wondering “Why did I ever stop? This thing is great!”

    It’s worth noting that this week Apple’s newly released MacBook Neo has been getting a ton of praise on my social feeds for being an affordable and all-round capable machine at an unbelievable $599 price point. I got a tear in my eye as I read this essay by Sam Henri Gold: “This Is Not The Computer For You” — it perfectly encapsulates what it was like to grow up on computers and teach yourself things, even on PCs.

    Too much screen time is awfully bad for you, so on the weekend I touched some metaphorical grass by taking our niece out to Disney on Ice at the Singapore Indoor Stadium. It’s extremely well-timed, with the world still coming down from Alysia Liu’s gold medal, and Singapore being in the midst of a Disney craze — a Disney Cruise offering has launched after delays and is now at the local docks, with fireworks and drone shows along the bay at night.

    These were Live Photos of some stunts

    I have no deep affection for Disney IPs but appreciate the amount of effort and coordination that goes into making magic, and it clearly works with so many adults into this stuff. What’s interesting is that while ice-skating can get pretty boring after awhile — it’s all the same moves over and over, around a static rink — adding a layer of characters and storytelling works to keep it fresh over an hour and a half.

    Oh, and our niece is 9, and by way of introducing her to the MacBook Neo, I asked her what computer she uses. I swear, her response was not far off the punchline in that Apple ad that everyone but me seems to hate, in which a girl who’s been using her iPad all day for creative things is asked what she’s doing on her computer, and she responds “What’s a computer?” Will iPads become open enough to support kids learning to (vibe) code? Or will nature heal in a post-post-PC revival led by the MacBook Neo? In any case, that ad was prescient.

    Bonus: Steve asks the same question in a different context (around 1:30). You must watch this video, it’s breathtaking. He’s 28 at this point. In addition to confidently describing things like Street View, mobile wireless computing, LLM chatbots, and the App Store, there’s a part near the end where he says “What we need to do is get away from programming. People don’t want to learn programming, they want to use computers.” He was talking about providing more finished software products to customers, because writing custom software was the norm then, but it’s an eerily relevant quote!


  • Library Supercollider

    Library Supercollider

    Go to SmashMyBooksUp.com or LibrarySupercollider.com

    In 1959, William S. Burroughs took a pair of scissors to a page of text, rearranged the pieces, and taped them back together. His argument was that linear language was a control system — that by cutting it up, you could slip between the lines and find what was actually being said. Library Supercollider is the logical conclusion of that idea, scaled to over 10,000 books from the Project Gutenberg archives. CERN could never imagine.

    Pick any two public domain texts and collide them. The engine samples a selection of pages and forces two authors who never met into a shared narrative space they never consented to. How it’s taped back together is up to you:

    • Paragraph level: Preserves some structural dignity.
    • Sentence level: Grammar survives, but sequence does not.
    • Word level: Sweet, nonsensical poetry.

    A source tracking mode colour-codes the wreckage by origin, in case you need to know who to blame for a particular sentence. The interface is intentionally a slot machine, and what emerges is not literature, exactly. It is also not not literature — which puts it in good company with many award-winning books! Burroughs believed the cut-up revealed hidden structures beneath the surface of language. Library Supercollider gives you the tools to find them for yourself.

    Desktop view
    Mobile view
    Mobile reading view with three modes

    And just because I had some time and Veo credits to spare, I thought I’d try my hand at making an over-the-top video ad to show it in motion on social media. Which meant a portrait video. Definitely stepping out of my comfort zone here.


    Disclaimer: I made Library Supercollider with the help of Google’s Gemini 3/3.1 Pro LLM. The authors of Project Gutenberg’s texts were not consulted, but they are hardly in a position to object.


  • SkySpotter

    SkySpotter

    Try it at useskyspotter.vercel.app

    GitHub page here

    Lie back in the grass and watch planes fly over. That’s it, that’s the idea.

    Every other flight tracker gives you God’s view — cold and omnipotent, a screen full of blips moving across a flat map from thirty thousand feet above the action. Detached from the thrilling hum of jet engines and the sizzle of rain. SkySpotter puts you at ground level, either laying with your head down, or seated comfortably for a bit of plane-spotting. Watching real aircraft crossing real weather, in a 3D world designed at human scale.

    Screenshot

    It pulls live ADS-B data and renders it against procedurally generated airport runways anchored to real-world coordinates, in weather matching current conditions out there — fog, storms, clearing skies, stars coming out after midnight. Five vantage points are available: Changi Beach (Singapore), the TWA Hotel (New York), Myrtle Avenue (London), Jonanjima Seaside Park (Tokyo), and Al Garhoud Park (Dubai).

    Climb to bird’s eye height if you want the lay of the land. But the view worth staying for is flat on your back, watching the underside of something enormous drift silently overhead while the sound catches up.


    Disclaimer: I made SkySpotter with the help of Google’s Gemini 3/3.1 Pro LLM and take no responsibility for any damage or missed connections.



  • Week 10.26

    Week 10.26

    Last week I got started vibe coding with Gemini 3 Pro and was happy enough with the collage-making app I made that I deployed it to Netlify and posted a separate writeup for it here on this site. I also decided to rename it to Collagen, as in Collage-Generator, thanks to a suggestion from Michael.

    For my second project, I wanted to go much further and test the LLM’s ability to code up something more complex, with real-time 3D modeling and rendering. But what to make? One shower later* and I had a concept I was excited to try out: An app called Urban Jungle that would be a weather visualizer, depicting a world where humans have disappeared and our cities have been reclaimed by nature.

    I could see it clearly in my head, and had the idea (in retrospect, a brilliant one that you should absolutely steal) that vibe coding projects should start just like real ones — with concept art. Taking the time to visualize what you want is the first test of whether it deserves to be built. It aligns the team behind a single vision, with fewer chances for miscommunication and wasted time.

    I prompted Nano Banana 2 to generate a screenshot of Urban Jungle as if it were a finished product, describing it exactly how I wanted. The result was astoundingly close to what I’d imagined. With this visual in hand, I was able to brief the coding AI that much faster. Sure enough, the first prototype it spat out nailed the isometric view angle, UI, and core functionality.

    That it could achieve a pseudo-3D effect with CSS and standard web technologies, writing the whole thing in a minute, was already blowing my mind. But like any difficult client, I thought “why not ask for more and see how far I can push my luck?”

    The next version (v1.0) was a total rewrite of the graphics engine, now in full 3D using three.js. Each city is procedurally generated to be unique, with different forest/jungle topographies depending on the region. The increased detail meant I could add decaying buildings, pylons, and roads. When you tap on the trees, flocks of birds scatter. When it gets cold, the vegetation dies, and below 0ºC the ground becomes covered in ice and the birds disappear. I thought… ‘this is great! I think we’re done!’

    But I should have known projects like this are never done. Next came v2.0 which rewrote the architecture to allow it to act like a proper weather app. You can now simulate the weather for any city over the next 24 hours, scrubbing through time with a slider. As you do, the lighting and climate effects change dynamically. It generates live sound effects for wind, rain, birds, and thunder. You can pan and zoom around the model with your fingers. There are now drifting clouds and proper lightning that strikes the earth during storms.

    Comparing the concept art with the ‘finished’ product, and I’d say I got as close as one could hope with a web app contained in a single HTML file. Here’s a standalone post about the app, which brings me to another advantage of vibe coding with an LLM: these things write their own “App Store”-like product copy!

    Try Urban Jungles at urbanjungles.netlify.app

    Edit: I couldn’t leave it alone and after writing the above, made so many changes I had to implement a version history link on the front page. Now in v3.1, there’s an animated starfield in the night sky, and a freakin’ VR mode for Apple Vision Pro! It uses WebXR to place you inside a 3D environment with the city model floating in front of you. And after a couple of people suggested I add iconic landmarks like the Eiffel Tower, I decided that we could have a few as Easter eggs in major cities. Customizing every city to get full landmarks coverage of the world would be too much, even for me. But err check back next week, you never know.

    It strikes me that generative AI vibe coding is modern day Lego. It lets kids and adults alike build silly (or serious) things straight from their imaginations. It’s extremely fun and educational to express yourself in this way, if you just look at it as an advanced toy. The difference is that no one is using Lego to build a working car, or furniture, or anything that can be exchanged for money. But LLMs are already used in the building of most commercial software, and the proportion of their contributions is only going to grow.

    But as a hobbyist with little coding experience, I’m afraid about how desensitizing this new ability can be, and how it will dull our ability to wait for good things. It will heighten our time preference, in other words. While it was downright exhilarating to see my idea come to life in minutes instead of weeks, or never, I know it has already rewired my brain. I expect this now. The next app I make will be judged more harshly — they all will, now that I know how “easy” this is. Patience is going to be impossible, and that’s bad for everyone.

    *But what was that asterisk up there with the shower thought? It occurred to me later that maybe I came up with Urban Jungle because of The Wall which I read last week. To reiterate, it’s a survival story that takes place after an Event seemingly decimates all of humanity save for our female protagonist. She lives in a lodge in the Austrian Alps, getting by on limited matches, ammo, and medications. She’s constantly battered by storms and weather conditions, fighting a slow, losing battle against nature. That imagery must have stuck in my head.


    After that recent aggressive reading spell, I slowed down and decided to chill with one of those cozy Japanese books that are still so popular — you know the ones, set in convenience stores, or bookstores, or cafes, or the backseats of taxis, where absolutely nothing important happens apart from a mild mental breakdown brought on by social anxiety and ennui, aka living in Japanese society. I’ve semi-enjoyed a few of these before, most notably Michiko Aoyama’s What You Are Looking for Is in the Library.

    But even those lowered expectations could not have prepared me for the absolute waste of paper/pixels that is Atsuhiro Yoshida’s Goodnight, Tokyo (translated by Haydn Trowell and published by Europa Editions). I mention all involved parties because the blame for this should be shared. Multiple people started work on this, knew what they had, and decided to keep going. I can only guess the motivating factor was profit and cashing in on this cozy Japanese book trend. I hope it was worth it.

    I am now reading Olga Tokarczuk’s Drive Your Plow Over the Bones of the Dead (translated by Antonia Lloyd-Jones), and it is soooo much more deserving of your time. Then again, she’s a Nobel laureate — perhaps not a fair fight. But that’s the thing about books versus things like Michelin restaurants: the good ones cost about the same.

    I’ll leave you with some non-AI photos I took on a walk yesterday as a palate cleanser.


  • Urban Jungles

    Urban Jungles

    Try Urban Jungles at UrbanJungles.netlify.app


    Screenshot

    We have always known, somewhere beneath the noise, that the cities we build are temporary. That the concrete will eventually crack. That something green and patient is waiting.

    Urban Jungles shows you the present — your present — transposed onto a world that has already moved on without us. The rain falling on your city right now is the same rain soaking the ruins in the app. The cold front rolling in tonight will strip the canopy bare, just as it strips the leaves from whatever remains.

    It is a diorama of grief and relief in equal measure. A miniature planet after humanity, held in your hands.

    Every city is searchable. Every hour of the next day is walkable. Step forward and watch the light change, the temperature drop, the landscape respond. Hear the sounds of wind and rain passing through empty streets. Orbit the ruins in full 3D — pan, tilt, inspect the overgrowth up close. The shadows track the actual sun, the stars come out at night. Tap the trees and birds scatter.

    Spin it slowly. Let it rain.


    Disclaimer: I made Urban Jungles with the help of Google’s Gemini 3/3.1 Pro LLM and take no responsibility whatsoever for any damage you do with it.

    P.S. If you use it on an Apple Vision Pro, a button for VR mode will appear on the toolbar. It is exactly what you think it is.


  • Collagen

    Collagen

    Use Collagen at usecollagen.netlify.app


    A simple tool for making collages, specifically with album cover art.

    Most collage tools are either bloated with unnecessary social features or too restrictive to be useful. Collagen is a single-purpose utility designed to solve a specific friction: the tedious process of manually sourcing high-resolution album art, aligning it in a grid, and then realizing you want to swap the top-left for the bottom-right. It turns a multi-step design chore into a fluid, drag-and-drop experiment.

    Screenshot

    Features

    • Integrated Sourcing: Queries the iTunes database for official, high-resolution artwork (600×600) so you don’t have to hunt for covers or deal with low-res thumbnails.
    • Tactile Reordering: Drag and drop tiles to swap positions instantly. The layout logic handles the movement so you can focus on the visual flow.
    • Flexible Dimensions: Define your grid up to 10×10. The preview and export scale dynamically to match your rows and columns.
    • Hybrid Content:
      • Search: Instant API pulls for mainstream releases.
      • Upload: Support for local files (obscure imports, demos, or personal photos).
      • Text Tiles: Add context or labels with custom text tiles. Features automatic contrast (white/black) and a choice between a clean sans-serif or a classic serif typeface.
    • Borders: Toggle between borderless, white, or black frames. The logic includes outer edge padding for a symmetrical, finished look.
    • PWA Architecture: Built to be “Added to Home Screen.” It caches assets locally on your iPhone for faster subsequent loads and works as a standalone app.
    • Export: One-click generation of a high-resolution stitched PNG. It uses a dedicated image-proxy pipeline to ensure every tile renders correctly without the “blank square” errors common in browser-based canvas exports.

    Disclaimer: I made Collagen with the help of Google’s Gemini 3/3.1 Pro LLM and take no responsibility whatsoever for any damage you do with it.