• Week 44.26

    Week 44.26

    Kim was away all week, and I managed to be quite productive on my own. Yes, it’s going to be another big vibe coding update — maybe the last one for a while because my 10x access to Hark Pro ends in a few days.

    To recap for those who haven’t been around: many of the apps I’d made earlier this year were exercises in AI frugality: challenges to see how much I could get done with low-cost Flash models. The corollary of that is that they often didn’t reach the heights I really wanted, and were more like minimum viable products (MVPs). Since last week, I’ve been giving some of these older ones a glow-up.

    Easier, better, faster, stronger

    The first project to get a second look this week was Crumbs, my personal location logging tool. It had actually stopped working because the Carto map API stopped being free for public access without a key. That’s now been resolved, and I updated it to v2.0 with some nice improvements, like a new UI. Its journaling feature is now where I’d originally wanted it to be: it can output a nicely formatted PDF detailing your pinned entries, chronicling a trip, for example.

    Chinese Era, which mashes up ancient Chinese art and poetry at random, had also fallen victim to a deprecated API, this time from The Met. I took that opportunity to completely rebuild the app from the ground up, but at first glance you’d hardly know. As I asked in the changelog, “What’s the Chinese equivalent of the Ship of Theseus?” The experience is the same as it ever was, but the Art Institute of Chicago now joins the lineup of museums, bringing the collection to more than 2,200 paintings, paired with a cleaned-up set of nearly 700 poems. The poem now finds the calmest part of each painting to sit in, and its ink adapts to stay legible. You can swipe back to pairings you’ve passed, the controls fade away when you’re just looking, and every artwork links to its museum page if you want to learn more. Underneath it all, the app is more stable and much faster. Well worth doing.

    Shelf Expression, my baby CMS for creating bookshelf microsites that you can host yourself, got Goodreads imports to help users get started, a bookshelf style modeled on the IKEA Billy, and some new starter decorations. I’ve spent a lot of time on this remodel now, and I think it’s finished.

    Hasta la RetroVista

    While looking through the catalog of apps at this point, I wondered, what next? My eyes landed on Window Box, which one might call a first attempt at the same idea behind RetroVista — dynamic scenery and music that you can leave on your second monitor as a companion while you work. Why would I update that now that RetroVista does a better job of the moving scene than Window Box did?

    Window Box

    Wait a minute… why not bring Window Box to RetroVista? Imagine if you could hit a button and the window would slam shut, and a planter box of flowers pops up to turn your view into one from inside an apartment in RetroVista? Or a log cabin? Or an Arctic research station? Or a spaceship? Each different scene would have to have its own breeds of flowers, unique to the locale, and the window glass would have to dull the exterior sounds. And while we’re at it, why not add the city of Tokyo and a Game Boy Advance mode too? So after two days of work, that became v2.0.

    RetroVista v2.0

    Proud of having shipped all that, I was relaxing in the glow of self-satisfaction when Evan, an avid RetroVista user, pinged me to say, “If I may, I’d love to see a train scene”, and goddamn it, he was right. That was an idea too good to sleep on. This would turn out to be the biggest, trickiest update yet.

    Making v3 of RetroVista would involve overhauling each of the existing scenes, which would become scrolling landscapes viewed through the train’s windows. They’d need more details, and to be separated into different foreground/background layers for parallax effects. Then those new details would need porting back into the original worlds.

    I added a Countryside scene exclusive to Express mode, as the train is called, plus unique station platforms for each world, complete with benches and vending machines and sleeping cats and birds eating breadcrumbs (again, different bird species for each locale). All the graphics modes needed updating to deal with the motion. Oh, and the Window Box mode added in v2 wouldn’t work here — so instead you get to step back from the window, and enjoy a dining car scene with different meals served depending on the time of day. Wait, there’s more: I added a Tap mode where you can touch various things in each scene and trigger dozens of surprise events.

    You can just do things

    I believe by this point it was Friday night. It got me reflecting how, back when I worked in a digital agency, if RetroVista were a client project that we had to design, have meetings and reviews about, and then develop and test and launch — the scope of this web app would have easily consumed over a month of several employees’ time, and quite experienced ones at that. The cost would have gone into six-figure territory, markups and all.

    The idea that someone like me with little coding experience could direct the production of this, from an iPhone and iPad, in less than two weeks amid other projects and hobbies and going out to meet friends for beer, is simply stunning. Of course this is only one aspect of the services that creative digital marketing agencies offer, but I don’t know how they’re holding on and justifying the revenue they surely need.

    But that’s not even all I did.

    Return to the Island

    The final app in the back-catalog that I decided to revisit was Island Solitaire, my take on an abandonware PC game called High Seas Solitaire that I have fond memories of. It was made with DeepSeek v4 Flash, which had a shaky grasp of Solitaire variations and generating card layouts. I struggled with making it serviceable, and in all honesty rarely played it myself because I knew how badly it paled in comparison to the original game I so enjoyed.

    Well, it was time to put that right. The only solution was to build Island Solitaire 2, a wholly new game on new foundations. The core gameplay of matching pairs and cards adding up to 14 is the same, but the logic and tableau designs have been simplified and refined. Where IS1 used more cards, here only one deck is ever used: 40 or so cards on the table, the rest in a draw pile. Every game is now guaranteed to be solvable and not left up to luck. The neater layouts work well on screens of any size.

    Taking it beyond just rounds of solitaire, there’s a progression mechanic — your wins develop the beachfront area with more elements, and unlock randomly occurring mini-games that help you win shells (a currency). The shells let you pay your way out of tight spots, such as undoing a bad move.

    You can learn more in a separate post, but at the risk of using an AI-like construction, this isn’t just the game I wanted to make when I attempted the first Island Solitaire back in June — it’s an even better one. Play it at solitaire.sangsara.net.

    Hark the doomsday angels sing

    It bears repeating that Hark Pro has been very impressive, to the point where I’d consider a monthly subscription once I devote a little more time to figuring out what else it can do for me outside of vibe coding and timely updates on local arts events and new music releases.

    It’s my first experience using an AI where I’ve not hit a wall of frustration. It almost always understands exactly what I want, and hasn’t forgotten what we’ve been doing — which I never experienced with paid Gemini, Claude, and ChatGPT (albeit earlier in the year, and lots may have changed since). I think Apple should buy them. This is the Beats Music acquisition for the mid-2020s. Hark can bring agentic capabilities to Siri AI across all their OSes, and be perfectly placed to cockblock Meta’s Muse.

    That’s right, Meta launched their Muse assistant here in Singapore this week. It’s reportedly been super popular in the US, but who knows if long-term engagement will hold up. I decided to try it out, ‘keep your enemies close’ and all that. To prevent myself from being lulled into a false sense of security by its cute yeti mascot, I asked it to change its avatar to Mark Zuckerberg in a yeti costume, which it happily did. Now I won’t forget who I’m really talking to.

    I asked it to help me find the best price for a camera and a soundbar, and it opened its own browser window (which I could watch in real time) and started doing research on Harvey Norman’s website, Lazada, Shopee, and so on. Assuming one can trust its thoroughness and accuracy, that’s a time-consuming task that many people might be happy to delegate. It goes without saying that this lets Meta know a whole lot about what you’re interested in and could be advertised to about.

    After using it for a while, I proposed that I moderate a debate between it and Hark on which one of them would be the better assistant to me, pasting responses back and forth between them. Hark countered Muse’s opening by saying, ‘Brandon doesn’t trust Meta, so why would he use you?’, to which Muse retorted, ‘Sure he does, he trusted me to find out where the Fujifilm X-half camera was cheapest, and told me he wouldn’t pay more than S$600 for it. I’m also keeping watch for new curry restaurants, and every day at 9pm I update him on new events, and and and…’ (it went on to give lots of details).

    Hark shot back, “Look at what you did to prove (it), you named his code project, the camera he’s hunting, the price he’d pay, the shops you watch, and the avatars he picked. You told all of it to another company’s AI. My last reply named no specifics, on purpose. […] A helper that turns his life into debate ammunition the first time it’s challenged hasn’t earned the wider boundaries yet.”

    What a mic drop. Muse could only respond, “That was my mistake. I withdraw the defense, not just the point.”

    What did it cost, Thanos? Oh, nothing!?

    Where does this lead, anyway? Muse is offering this agentic capability to regular users for no money down, it’s a free tier and additional tokens cost extra. OpenAI’s comparable offering, Dots, is only on paid plans starting at $100/mo. Claude’s Duet (a US-only research preview) is also only for paying customers. Hark Pro and to some extent, Instinct, are the other ones with free access, and I’m under no illusions that they will get meaningful traction the way Muse, with Meta’s formidable advertising complex behind it, can. So it’s Muse that most people will experience, and a world where Meta gets even more personal information about more people is not a pleasant scenario. It’s a drum I’ve banged on before.

    As nice as it is to imagine that sanity will prevail and that we’ll take a measured approach to rolling out such disruptive tools, and recognize that doing otherwise exploits the average consumer’s vulnerabilities, I don’t think that daydream is worth indulging any longer.

    That same sentiment came up twice this week in my media diet. I was watching Season 2 of Dark Matter on Apple TV and Episode 3 touched on how humans can’t be stopped, which means we’ll get “Everything beautiful, everything terrible” (which is also the title of the episode). Then, while reading Ray Nayler’s The Mountain in the Sea, the head of an omnipresent Weyland-Yutani sort of global corporation was quoted as saying, “The great and terrible thing about humankind is simply this: we will always do what we are capable of.” About this, I have no doubts.


  • Island Solitaire 2

    Island Solitaire 2

    The tide is back.

    Island Solitaire 2 is the all-new sequel to a card game that at least three people have played more than once. This time it’s been taken to a whole new level. It’s easy to pick up when you have a few minutes, but the addictive yet chill design also makes it a cozy companion late into the evening.

    How do you play? Clear the table by pairing cards that match, or that add up to 14. That’s it! Then deal the next round, and the next. How many can you clear before your shells run out?

    Features:

    • All-new graphics put you on a peaceful island that grows with your win streak. When the seas turn rough, the cards get trickier.
    • Improved tableau designs simplify the Island Solitaire formula, making games faster and fairer.
    • Every hand can be won. And if you play yourself into a corner, you can get help for a few shells.
    • Earn shells! They’re the currency of the island, didn’t you know?
    • This game’s got game. At least 3, to be exact. Beat the minigames that pop up from time to time and get more shells to keep you going.
    • Messages in bottles. Pick them up and join the global conversation!
    • (Just kidding, there’s no online communication network in Island Solitaire 2.)
    • Add it to your phone’s Home Screen and it’ll install itself for offline play. Long-haul flights go by just like that!

    Play Island Solitaire 2 at solitaire.sangsara.net. The original is still in there too, for old times’ sake.


  • Week 43.26

    Week 43.26

    • No new vibe-coded apps this week. What I’ve done instead is gone back to some of my older projects and given them a degree of polish I wasn’t able to before when using low-cost AI like DeepSeek Flash. What a difference a frontier model makes!
    • I did a ton of work on RetroVista, tweaking sounds and improving the authenticity of its classic game console graphics. I also added incidental animations (astral events, animals walking by, planes/trains/watermobiles) to make each of the seven scene types more lively. It looks really great now, if I do say so myself. Most of all, I’m super jazzed about the fact that the City scene now generates jazzy musical themes.
    • While working on RetroVista, I discovered a way for web apps to play audio without having to unmute your iPhone, a change that also allows them to play in the background while your phone is locked — just like a real music player! That technique has now been added to DataDeck, which was designed as a music player to begin with. That app has also been given a tune-up under the hood, with loads of bug fixes and performance improvements.
    • Orchids, Once. also received attention: the same audio behavior as above, and a major upgrade to the plant rendering system. The original code had major bugs that led to the GPU not rendering some intended effects at all, such as leaf textures. Flowers used to be assembled from parts floating in mid-air, so you’d see gaps and clipping. Not anymore. Now each piece grows out of the last and moves out of the others’ way. The graphical fidelity is at an all-time high. As an ‘art project’, I had previously considered the experience complete and never expected to make any changes, but I’m now really pleased about being able to bring it closer to perfection. Is this the same illness that afflicted George Lucas when he added CGI rocks to A New Hope??
    • But maybe the biggest glow-up was given to Shelf Expression, the software that powers my Bookshelf page on this site. On the frontend, new shelves have been installed, animations have been refined, books show physical wear & tear, and you can place decorations to liven things up. On the backend, it’s almost entirely new. I won’t bore you with the details, but the original was little more than a tool that helped spit out some HTML code you then had to paste into a file in order to update the page. The new setup is like a mini CMS in its own right! You can log in and update the bookshelf from anywhere with just your phone. The ‘Share Studio’ that creates social media-ready images and collages to show off your favorite books is now a powerful app in its own right.
    • The best part is it’s easier than ever for non-technical users to configure; it can even detect and install new updates from GitHub with a tap. Now it behaves more like a live service rather than an ad hoc webpage. I cleaned up the GitHub repository and the source code is now up for anyone to grab and set up bookshelf sites of their own in minutes. If they don’t want to run the full app on a server (Vercel and Netlify are supported), they can simply export a static site that’s ready to be hosted anywhere.
    • And finally, my first app Collagen got a Liquid Glass UI and an infusion of new collage-editing code from Shelf Expression’s Share Studio, making it more reliable and nicer to use than ever.
    • On the home front, I’ve had my sleep disturbed by an incessant dripping sound from inside our bedroom AC unit. I had a guy come by to fix it by unclogging the drainage pipe, but he somehow didn’t finish the job and the sound returned a few hours after he left. Isn’t that the worst? Now I have to wait till next week for him to try again.
    • We watched the latest season of Netflix’s The Diplomat, a show that I’d be happy to see continue indefinitely, along with Slow Horses. I think what I like about it is that something is always happening, and someone is always talking. The dialogue is good, and things move fast. That’s not to say I can’t appreciate slow-burn atmosphere, but too many prestige shows nowadays are just stretching a feature film’s worth of plot across eight hours by having characters walk slowly between locations, stare intensely at computer screens, and then realize things the audience figured out three episodes ago. I’m looking at you, Silo and Neagley.
    • I finished reading Electric Dreams, a collection of 10 short stories by Philip K. Dick that were adapted into a TV anthology series by Amazon Prime. Except it’s not on Amazon Prime in Singapore for some reason. The stories are prescient for having been written in the 1950s; many of their darkly humorous extrapolations still ring true today. In one Cold War story, people are urged to upgrade to the latest life-saving shelters each year, and the people who won’t or can’t afford to keep up are social pariahs. More notably, almost all involve a heavy serving of paranoid atmosphere — either fucked-up things are really happening to the protagonists, or maybe it’s all in the mind of someone having a psychotic break. That dissociated POV, earned through his own mental struggles, was maybe PKD’s real gift to the world.
    • I’ve heard before that people were able to buy electronics with their SG60/CDC vouchers (essentially our local government stimulus checks) by spending them at NTUC hypermarts, but I’d never been to one before this week’s visit to Vivocity. I’m pleased to share that I picked up two Nintendo Switch 2 games for free: Splatoon Raiders and Nintendo Switch Sports Resort. If you have vouchers expiring this December, it’s worth checking out; they’ve got household appliances and a small toy selection too.
    • We were at Vivocity to try the first Singapore outpost of the cheap and cheerful Japanese yakitori izakaya, Torikizoku. It was sadly not very good. The executional faults aren’t worth getting into but I’ll sum it up by saying it’s so important to hire people who can identify the factors that make something what it is, and tell you how to replicate or translate it. Singaporeans go to Japan probably more than any other country save for Malaysia, and if they’re coming to eat here, it’s to access an experience they already know. I’m not saying localization is always bad, but you don’t see Apple opening a new store and asking “Hey what if we doubled the prices here and ran it like a Turkish souk where everyone has to haggle? And played really loud dance music?”
    • Music video of the week: The Rolling Stones’ Mr. Charm starring Alexander Skarsgård, who’s looking more like his dad than ever (ameliorative).


  • Week 42.26

    Week 42.26

    • Local haze levels continued to climb and reached a ‘Very Unhealthy’ state in the middle of the week. My haze app, SecondHand, continued to see active use and added about 10,000 visits. I’ve heard that some people at the National Environment Agency (NEA) are aware of it and like it, which warms the smoky, congested cockles of my heart. For the record, Sunday brought some relief, with PM2.5 falling to near normal in some parts of the country.
    • It’s frankly been like an echo of those COVID days — staying home with the windows shut; that feeling of hunkering down under attack. And just like with COVID, restaurants are experiencing difficulties, so says the Straits Times. I’ve taken to walking on the treadmill as often as I can, usually for an hour while watching some insubstantial drama program I normally wouldn’t sit still for. This week, that’s been NHK’s Eat, Sleep, then Wait for Happiness on Amazon Prime.
    • But the real time suck has been provided by a return to vibe coding after a three-month hiatus. This has been thanks to Hark, which fulfills the promise of OpenClaw but without requiring the nerdery and foolhardiness of letting an AI take over your own computer. Hark’s computer runs in the cloud, and it’s intelligent enough to manage its own files and applications and capabilities — dare I say it? — so much so that it’s like handling a remote employee over chat. It sends me updates and artifacts, I give it problem-solving suggestions and creative input, and it comes back with the work. I spent so much time earlier this year with the self-imposed challenge of trying to squeeze water out of the rocks that are low-cost Flash-style models, that I completely missed experiencing what the very best frontier models can do. In retrospect, that was a little dumb, but the upside is I’m filled with so much wonder right now.
    • I’ve mainly been working on the procedural art generator tool that I mentioned back in April. Then, I described it as a never-ending background project for me to dip in and out of, due to each ‘style’ being modular, which has made it easy to jump back in this week. Using modern technology, I overhauled the rendering engines and revisited every individual style, as well as the app’s own UI and foundations (images above). It’s hard to explain how much better it is now, how much closer it is to what I wanted. It even has freaking Apple-style Liquid Glass effects on the toolbar! In a web app! I don’t know if I’ll ever release it or just keep messing around forever making wallpapers for my own amusement.
    • But I do have something to release today, something that came out of building one of those styles. Similar to how making a maze artwork generator led to making a maze game (a maze, a maze, a maze)in the April post above, I was making a pixel art landscape engine for the wallpaper tool and realized it would make a very nice desktop toy — in the vein of my earlier Window Box project.
    • It’s called RetroVista! Leave it open in a spare window or second screen while you work, and its lush natural scenes and chiptune sounds might relax you, if you’re a millennial who grew up playing games that have somehow, seemingly overnight, become retro and vintage. You can read more about it in this separate post.
    • Speaking of old videogames, Street Fighter (2026) is out and we went to see it with Peishan and James. Watching every movie adaptation of games from my childhood, even if I know they’re going to be terrible, is a weak spot I probably share with many my age. One time, I went to see Street Fighter: The Legend of Chun-Li (2009) with Peishan, and followed that up with Snake Eyes: G.I. Joe Origins (2021), and now she thinks we have a bad movie watching tradition. But it’s not. It’s a specific ‘bad movies cashing in on nostalgia’ watching tradition.
    • To get in the mood for it, I fired up the Street Fighter 30th Anniversary Collection on Nintendo Switch the day before. I got my ass handed to me by the CPU in like, the second-round match of SF2 Turbo Edition. When did the game get so hard? When did a Dragon Uppercut become impossible to pull off when you need it?
    • The good news is that the new Street Fighter film understood the assignment. It’s aimed squarely at people who are now dealing with mortgages, perimenopause, reading glasses, and other mid-life crises. They’ve set it in the 90s, packed it with 90s chart-toppers like 4 Non Blondes’ What’s Up?, and exposition is handled with MTV-style video clips passed through faux-VHS filters. For two hours, it puts you in superposition between being a kid on Saturday morning and an adult watching their dream come true. The live action is broken up by anime sequences that are good enough they should be their own feature film. It’s flawed and stupid as hell, but I loved it. A very strong 3.5 stars.

  • RetroVista

    RetroVista

    Picture a (pixel) perfect world

    App URL: retrovista.sangsara.net

    My previous app Window Box was designed to be a second screen companion, showing views of the real world while you work. RetroVista brings you to more perfect places: the kind of pixel-art landscapes you might have grown up with, fully animated and sounding like a lost cartridge from 1989.

    Hit “Start”, watch the console boot up, and find yourself down by the coast, or in the mountains, or a desert, a forest, the arctic, a city, or an alien planet. Each scene is procedurally generated, so no two are alike. Waves crash, clouds drift, birds flock, and trees sway. You can even enable Live Time and Weather and it’ll match the conditions where you are.

    Alongside the vintage graphics, the sound is authentic too. Each console’s audio chip is synthesized in software, so pick the NES and you get its bright pulse waves, the Game Boy and its thin, warm beeps, or the Super Nintendo and its lush instruments. The Master System, Commodore 64, PICO-8, and a 1-bit mode are in there too.

    Scenes produce rain, wind, surf, and thunder sound effects along with gentle, procedurally generated music that’s never the same twice. The tunes weave in and out of silence, slowly evolving, so you can leave them playing for hours.

    Completing the experience are a realistic CRT filter, a handy clock, and a shuffle mode that brings you a new world every so often. Add it to your phone’s Home Screen as a progressive web app and it’ll even work offline.

    Made for your second screen, and your inner child.

    NEW in v3.0!

    • RetroVista Express: Hop on a train and tour the world in Orient Express style. This new mode takes you through the countryside and special versions of all previous scenes with parallax scrolling and a special dining car mode (in place of opening the window).
    • Tap mode: Activate this in all other worlds and interact with the scenery and inhabitants! You can even knock thrice on the window to call your special friend.
    • An absolute avalanche of other improvements and expansions on existing functionality. Oh, and a new logo and start screen.

    NEW in v2.0!

    • RetroVista pays homage to Window Box by ripping it off — you can now shut the window and appreciate the local flora of each scene. Outdoor sounds get muffled, the rain stays out and runs down the glass, all that good stuff is here. “W” acts as the shortcut key.
    • The Game Boy Advance joins its older siblings, with a new backlit LCD filter effect too.
    • Tokyo has been added as a new city, with loads of detail. Our previous City scene has been renamed New York, and looks more the part with smokestacks and water towers.
    • Plus: occasional gusts of wind blow debris around in all scenes, many smaller improvements, and a very special surprise for those who love curling up by the window.

    Changelog:

    3.0.0 – Express train and Tap mode. The biggest update yet. Details in the post above.

    2.1.0 – Tokyo: Trees now line the streets and occasionally bloom as cherry blossoms.

    2.0.5–8 – Tokyo: atmospheric sounds, new event animations, fix for window audio bleed.

    2.0.1–4 – Added window frames for Forest/Mountains and Arctic, tweaks to sfx.

    2.0.0 – Window Box, Tokyo, and GBA. Massive update, details above.

    1.5.0 – City jazz!

    • Every City scene now plays chiptune jazz: swung rhythm, 7th chords over ii-V-I changes, a walking bass and soft brushes on the noise channel

    1.4.10 – Foggy worlds no longer play a low buzzing drone

    1.4.9 – Power savings

    • The screen draws at 20 frames a second instead of 30, which saves power and keeps rain and snow in step with the rest of the animation
    • Sound runs at a lower sample rate (22.05 kHz) with no audible difference, for about half the audio processing cost
    • The screen skips redrawing when nothing has changed

    1.4.8 – Audio behavior

    • The speaker button in the top-left corner now stops and starts sound instead of muting it.
    • Music and sound keep playing when you leave the app or lock the phone

    1.4.7 – Raindrop sfx and visitor animation fixes

    1.4.6 – Master System improvements

    • Master System now plays by the real console’s screen limits: 32 of its 64 colors on screen, in two palettes of 16, with each 8×8 tile using one palette

    1.4.5 – Further C64 optimizations

    1.4.4 – C64 multicolor mode and colors

    • C64 now plays by the real machine’s multicolor bitmap limits: pixels twice as wide as tall, one background color for the whole screen, and only three more colors in each 4×8 cell

    1.4.3 – NES hardware rules, sound behavior

    • NES emulation improved across all scenes to obey the real console’s color limits
    • iPhone and iPad: sound now plays with the silent switch on (it pauses other audio, like a music app)

    1.4.2 – Version numbering

    • The splash footer shows the version number

    1.4.1 – Cricket adjustment

    • Crickets go quiet in the rain, sing at one pitch per world (a second cricket joins now and then), softer, and in spells with long quiet stretches between

    1.4 – Visitor and city sounds

    • City: trains clack along the rail and sound their horn as they cross, ferries give one long low blast and tugs two short toots, and planes swell overhead, only while they’re on screen
    • City: a car horn down the street now and then (rarer at night) and, very rarely, a far-off siren
    • Visitors everywhere get voices, timed to what they do on screen: the elk bugles when it stops, ducks quack, the hawk cries, the barn owl screeches, owls hoot from the trees, the heron croaks as it takes off, boars grunt while they root, gulls cry, dolphins splash back in, the coyote howls, tumbleweeds swish, the saucer warbles and zips off, the whale blows with each spout and sings, the arctic fox yips before it pounces

    1.3.2 – NES colors

    • NES: shades the palette lacks, like a night sky’s navy, are dithered from two colors instead of snapping to the nearest one, so Arctic and Mountains nights no longer go flat teal

    1.3.1 – City storms

    • The city keeps running in storms: ferries, tugs and trains carry on, and planes come in low under the cloud with their lights on

    1.3 – Visitors

    • Visitors: incidental animations in every scene, by day, by night and in the rain (storms stay empty)
      • City: ferries, tugs, planes and trains on a waterfront rail
      • Mountains: elk, ducks, hawks and barn owls
      • Arctic: Arctic foxes, polar bears and whales
      • Coast: sailboats, dolphins, gulls, crabs and turtle hatchlings
      • Forest: deer with fawns, rabbits, boars with piglets, herons and owls
      • Desert: tumbleweeds, camel caravans, vultures, roadrunners, a howling coyote and fennec foxes
      • Alien: saucers, sky jellyfish, slimes, six-legged grazers and crystal spores
    • Visitors respect depth: nearer land hides them, and they’re scaled for their distance
    • Butterflies and fireflies in the forest
    • Night sky: shooting stars, satellites, the odd comet and meteor shower, peeking through on cloudy nights
    • City skies are dimmed by light pollution
    • Crescent moons are lit from below, with their horns up
    • Animations step at a low frame rate, like the rest of the art
    • Fixes: forest walkers no longer wade the stream, streams dim at night, desert mesas no longer hover, sailboats no longer clip the distant island

    1.2 – Music and resolution

    • Three resolution modes: Authentic (default), Chunky and Hi-Res
    • Occasional drums, with kits that suit each world
    • Musical phrases now come home to the root chord
    • Rain and storms are rare in the desert

    1.1 – Coast waves

    • The waterline moves: waves run up the beach, drain back and leave a wet sheen
    • Surf sounds are synced to each visible wave

    1.0.1 – Polish

    • Toolbar fades after 30 seconds untouched
    • Coast palms stay on dry sand
    • New description and social preview image


  • Week 41.26

    Week 41.26

    • The haze (from Indonesia, it should be pointed out) has been steadily worsening, and its combined threat to the local F1 race and Singapore’s global reputation on social media is probably keeping the Singapore Tourism Board on antidepressants. What’s worse, instead of clearing up in a couple of weeks as usual, experts say this time it might hang around until December because of El Niño.
    • Hark Pro, yet another AI agent that promises to manage your life for you, went live this week. They’ve got what would have been called a rockstar design team in the old days — led by Abidur Chowdhury, famously stolen from Apple after he featured in the iPhone Air’s launch video; and including Andrew Kim who used to run the popular site/blog, minimallyminimal. I signed up for their waitlist a few months ago, and was rewarded with free credits for the first month.
    • The confluence of both those things led to me launching my first new web app in a couple of months: SecondHand (blog post / app). It’s an air quality app that measures the haze in cigarettes, with some fun graphics and animations. I got the project started in Hark, made some edits with Muse Spark in OpenCode, and then returned to Hark for more enhancements. It’s pretty capable for coding projects, and extremely convenient because it can publish directly to my GitHub, put up pull requests for me to audit, and publish to the live site — all through a chat thread on my phone.
    • The app has done very well by my lowly standards, with over 18,000 visits in the last four days. Someone put it on Reddit, and people have told me it was forwarded to them by other friends, and I’ve even heard from someone I haven’t spoken to in years all because someone showed it to them at work (and they recognized my domain). The initial version was poorly optimized and consumed some 25GB of my Vercel bandwidth in an afternoon, but thankfully I noticed and managed to rush out some fixes. It’s now lean, mean, and ready to be seen by more people without breaking my account.
    • You know what else deserves to be seen? Digger (2026), the new movie by Cruise/Iñárritu that’s (imo) unjustly bombing at the box office. The film has some vocal defenders, though, including Guillermo del Toro, Anne Hathaway, and Mandy Patinkin. It currently has a 51% Rotten Tomatoes score, but is one of the most ambitious, astounding, and aggressively pointed films I’ve seen all year. Even The Odyssey feels like a distant memory now; merely an expected epic, whereas Digger is a shapeshifting subversion of modern life, culture, and their relationships with capitalism. Tom Cruise does his best work here, and I think it’ll be recognized as a masterpiece in the years to come. Five stars. You must avoid all spoilers and watch it soon.
    • Kim was down with a cold/flu all week, maybe brought on by the haze which has anecdotally given quite a few people sore throats. I’ve miraculously managed to avoid catching it so far. Possibly due to the following:
    • In the middle of her illness, I went for my annual scheduled medical and also got the latest Northern hemisphere flu jab, roughly a year since my last one. I asked the nurse if it was better to get the Southern one that comes out in the spring/summer or this one, and was told you can get both! Each one is apparently like a patch update to the last, including new strains and deprecating old ones. All this time I thought you just chose one and it covered you for a whole year. But perhaps this is unique to equatorial travel hubs like Singapore, where we’re exposed to North/South variants all year round.
    • Friend and ex-colleague Bert was also back in town for his annual visit, the reunion around which we’ve taken to calling Bertopia. This year’s festival was attended by Jaz, Jussi, and Ted (Christian and Jean had a date with air pollution at the F1). For the first time in my life, I decided I’d go non-alcoholic all night at a bar — on the assumption that drinking would weaken my immune system. It was… not entirely unpleasant! On top of saving money, you skip all the physiological punishment of dehydration and fatigue the next morning. I mean, intellectually you know this, but actually experiencing a hangover-free Saturday is something else.
    • Last week I reported the Beats 360 headphones were too small for me, so of course that ended in me buying a pair of Bose QuietComforts. 10 years ago, I wore their predecessors on a flight from Hong Kong to New York and they were roomy and absolutely painless. What will I use them for?
    • The 9th edition of my BLixTape playlists is finished, signaling an increase in the amount of music I’ve been listening to lately. The last few have taken six months each to come together, but this one tracks the songs I’ve liked between July to the present moment — about three months, or half the usual time. I’m quite pleased with some of the juxtapositions and transitions, for example: Bill Callahan’s Computer, an examination of his own distasteful technology use, leads into Ninajirachi’s Fuck My Computer, which is about how she loves it so much she wants to… well, it’s there in the title. Another one-two combo is the Walter Murphy Band’s A Fifth of Beethoven from 1976 going into MEOVV’s present-day K-pop DDI RO RI hit.

    BLixTape #9 (Apple Music)

    1. In The Stars — The Rolling Stones
    2. High Hopes 3000 — ROLE MODEL
    3. Candlebox — The Mountain Goats
    4. Lost Boys — Phoebe Bridgers
    5. Javelin — Kevin Morby
    6. Misery – MPLS Unplugged (Live) — Soul Asylum
    7. Girlfriend — The Modern Lovers
    8. Extra Mile — Will Sheff
    9. Over country — Lizzy McAlpine
    10. Computer — Bill Callahan
    11. Fuck My Computer — Ninajirachi
    12. World Citizen (feat. Kabaka Pyramid) — Irie Souljah
    13. The Art of Anger — BINA.
    14. Hold You — Puma Blue
    15. Be Still in the Pain — Tricky
    16. Hardly Ever Smile (Without You) — Poison Girl Friend
    17. Time goes by — Every Little Thing
    18. Saturday Night — Ravyn Lenae
    19. Cafe au lait — Nana Mori
    20. Sunshine — Jungle
    21. A Fifth of Beethoven — Walter Murphy
    22. DDI RO RI — MEOVV
    23. Ain’t In LA — ADÉLA
    24. SS26 — Charli xcx
    25. HEADLOCK — Luci Gang
    26. EVIL GRIN (feat. JPEGMAFIA) — Denzel Curry
    27. 40 Nights — The Game
    28. Heavy Burden — 38 Spesh
    29. Legends Don’t Die — Morrisson
    30. Nobody Knows — Pastor T.L. Barrett and The Youth for Christ Choir
    31. Our Love Is Here to Stay — Brandon Sanders
    32. Just You, Just Me — Lizz Wright
    33. Stella by Starlight (live in Tokyo, 1987) — Chet Baker

    Enjoy it loud, your windows are likely closed anyway!


  • SecondHand

    SecondHand

    Launch the app

    October 2026 — It’s that hazy time of year again here in Singapore, and lots of air quality apps have been popping up thanks to this being The Year of Vibe Coding. But I hadn’t yet seen one that puts these esoteric numbers into terms we can all understand: like smoking. It’s also fitting, given how this is second-hand smoke from a country that loves its cigarettes. So here’s my contribution to the pool.

    SecondHand takes the live 24-hour PM2.5 reading for your part of the island and converts it using Berkeley Earth’s rule of thumb (22 µg/m³ over a day is roughly one cigarette). Then it puts that number in your hand! Stay indoors my friends, and keep those air purifiers humming.

    A hand holding two cigarettes in front of a cozy room with a bookshelf and a leather chair, featuring a digital display showing air quality measurements and second-hand smoke equivalent.

    Changelog:

    • Added a map view (hold down to pop it up)
    • Added a haze-free state for better days
    • Significant optimizations to size and performance
    • Copy changes for clarity
    • PSI and 24hr PM2.5 figures now scale with the simulation slider
    • Max cigarettes upped from 12 to 20, with room smoke effects
    • Bought a dartboard for the lounge

  • Week 40.26

    Week 40.26

    • I went to Apple Orchard Road and tried the Beats 360 headphones. They’re not large enough for my head; case closed. Money saved.
    • My new Apple Watch likes to try cheering me up by telling me that my body is “Ready” to “Go For It” (I assume “It” is a marathon, a swim to the far side of Australia, or something equally implausible) and that I had excellent sleep the night before, but these science and sensor-backed statements simply don’t match my reality. I’m tired; I wish I could sleep more!
    • I just took a little break (after one paragraph, natch) and went on Instagram, where I saw a post that read “Anyone else turn 40 around the start of the pandemic and now blinked and you’re somehow 46 wondering what the hell just happened?” On one hand, that sentence perfectly captures the fatigue that you’d imagine comes with being abducted by aliens and losing six years of your life — at the very least, the weariness of having to catch up with a lot of missed information, which is what being alive in this time of AI feels like, always on the back foot with lots to learn — but on the other hand, it implies not knowing at all where the time went, which I can’t identify with. Oh I know where the time went. I remember it all perfectly well, but it plays in my mind like a timelapse — hundreds of days passing, the figure getting in and out of bed, the view outside the window gradually changing.
    • Armchair theory: maybe what’s caused this ‘blink and time passed’ effect for many is the combination of massive disruption followed by repetitive discomfort. This is different from repetitive boredom, where days are long and time moves slowly. With repetitive discomfort, you’re constantly insecure and stressed, so the mind protects itself by generating summaries and discarding the details. This sharp change, followed by pain you’d rather forget, dislodges you from whatever life you were living before, making it feel like a separate country.
    • I’m listening to Apple Music 1 and three Taylor Swift songs have played in a short period of time. Without checking, I’ve known it was her from the fact that all her recent music sounds the same. It’s hard to feel bad for a billionaire, but that’s an awful place for any creative person to be. It’s like she doesn’t listen to any other music, or won’t allow herself to appear influenced by anyone else. Lonely at the top, as they say, which is why you won’t find me there (among other obvious reasons)!
    • Kim and I met Mandy for dinner one night to mark her birthday, and we went to a wine-focused place called Fiasco which has taken over the spot where Kilo used to be, that weird little building out in the middle of nothing near Lavender. The food was all really good (I forgot to take pictures), and they’re doing some really interesting things with hanger steak and pork collar, the latter seasoned to resemble a very fancy charsiew.
    • In an example of culinary R&D jumping the shark, we ate at Surrey Hills over the weekend, where my mother-in-law’s corned beef hash came partially covered with a purple sweet potato foam. Needless to say, she did not appreciate the touch. The place purports to be Australian, and with her being Australian too, I tried to gaslight her into believing that it was an authentic Australian recipe that she’d somehow never heard about. Needless to say, I was not successful.
    • I finished PARANORMASIGHT: The Mermaid’s Curse, and found it a worthy sequel, arguably better than the first game in every way unless you want a spooky atmosphere. This one can’t be classified as horror at all. It’s a mystery adventure with supernatural elements so tame they’d elicit no more than a shrug from a timid baby. Like the first game, its story concerns Japanese history and legends that one might find a little boring, but you don’t have to read all the text in its menus.
    • Playing that game unwittingly prepared me for the film Inu-Oh (2021), which I’ve had in my library for years and suddenly decided to watch. From the opening scenes, it eerily echoed story points from PARANORMASIGHT, concerning the 12th-century Heike samurai clan, and their vengeful spirits said to linger across the land after they were wiped out. Inu-Oh is a wildly ambitious and stupendously well-animated musical that is let down by, well, its music. The concept is a fusion of traditional Japanese music with glam rock, and a main character starts playing his biwa one day like an electric guitar without any explanation. The visuals work, but the songs are poorly structured to modern ears, overly long, and basically repeat the same melodies while pages of historical narrative are sung over them. Imagine Billy Corgan’s worst material, stretched twice as long, and the lyrics are all about random days of Napoleon’s life, and you’ll begin to understand how it feels.
    • We finally saw Sentimental Value (2025) and wow it really deserves its Oscar and 95% Rotten Tomatoes score. The opening scene with the house, and the title card needle drop that follows it, was so good that my body felt compelled to stand up and applaud — I didn’t allow it, but that feeling went on for much of its running length. The train oner is a wonderful bit of technical showing off, and actually the whole film’s lush 35mm look just stunts on the pervasive digital signature of Netflix movies. Everyone is great in this, making art about how art both fucks you up and saves you — 4.5 stars.
    • Found time for a grab bag of other films too: Runner (2026) — not to be confused with Gal Gadot’s The Runner (2026), Good Boy (2025), Elle (2016), Grand Theft Hamlet (2024) — the one to watch out of all of these, a very human documentary about two out-of-work actors putting on a production of Hamlet inside the GTA Online videogame whilst stuck at home during the pandemic — Shelter (2026), and Tony (2026).
    • Singapore made headlines this week because of the launch of a new dating site by the government, currently in a pilot phase only open to civil servants. It’s called FirstDate, and matches people based on compatibility assumed from their responses to a questionnaire. The idea of a state-run service has amused observers, with some seeing it as a dystopian step towards arranged marriages by Big Brother, amongst other hot takes on this strategy to combat our falling Total Fertility Rate (TFR). History rhymes, of course, and older folks will remember the existence of the Social Development Unit (SDU) in the 1980s, a pre-digital precursor to this scheme, that was something of a government-run activities club to help rescue graduates from singlehood after being encouraged (by the same authorities) to optimize for good grades instead of dating during their teenage years.
    • But it’s hard for outsiders to decide if Singapore’s environment really does produce a special breed of hapless, rizzless forever-aloners, uniquely ill-equipped to find their own mates through empathy and communication, so Singapore’s own state-run media conglomerate is providing some data in the form of a new reality dating show called Wingman. The show’s format introduces an original element to the Love Island formula, namely that each contestant brings their own wingman/wingwoman to serve as hype men/women, espousing their good qualities so they don’t have to — a perfectly valid and brilliant tweak for Asian cultures where tooting your own horn unironically is a major ick. The contestants, in addition to a few Singaporeans, are a bunch of attractive 20-to-30-somethings from the Philippines and Thailand, all of whom resemble functioning young adults who can read social cues and body language, and interact normally with members of the opposite sex (there is no LGBTQ+ representation). There’s obviously a tilt towards extroversion, which you’d expect from people volunteering to be a dating show, but even correcting for that, there’s an intriguing, discernible difference between the Singaporeans and their SEAblings that’s best seen for yourself. Full episodes are available on YouTube. We binged all 10 so far in one night.