I typically write about web development, video games, or my own life.

Subscribe

2026

Deltarune Chapter 5 was deliciously close to perfectionI still don't like dodging bullet patterns inside a tiny box, but everything else was firing at 11 for me in this game.Super Mario RPG's charm and clever writing hard carry its mediocre combat and atrocious minigamesI never finished this game back on the SNES when I rented it from Blockbuster. I'm glad to see an old classic get a new coat of paint, a few balance tweaks, and some postgame content (that I will never bother to do).Mina the Hollower is the Hollow Knight of Zelda (derogatory)I'm begging indie game devs to stop making their games more like Dark Souls.MOUSE: P.I. for Hire is a gouda gameReminiscent of DOOM (1993), but with a large emphasis on its WWII allegorical story, and MC Jack Pepper's wise-cracking and "cheesy" narration.Shin Megami Tensei IV wasn't everything I hoped it would beSometimes being disappointed is worse than disliking something. Interesting demons, fantastic music, and a great battle system aren't enough to make me love this game.I liked Demon Tides, but I really wanted to love itDemon Tides is a competent 3D platformer with a few too many layers of unnecessary stuff. Development studio Fabraz really makes some endearing games, though.I got sucked in to Cyberpunk 2077's dark, depressing worldWhat I had assumed was a sci-fi sandbox of gang shootings and carjackings was actually an emotionally devastating tragedy about a horrifying new way to die. And the Phantom Liberty DLC felt like a killer spy movie video game adaptation.NINJA GAIDEN 4 proves that PlatinumGames still has the saucePlatinumGames signature in-depth combat, djent/metal inspired soundtrack, ninjas, cyber ninjas, blood ninjas, demons, sexy ladies, and more. A solid base game plus lots of good "extras".The Hundred Line -Last Defense Academy- is Kazutaka Kodaka's magnum opusThough my favorite routes might be the ones written by Kotaro Uchikoshi. Masafumi Takada returning for the soundtrack and Rui Komatsuzaki returning for art make me glad that Too Kyo games is still around and successful. This is an absolutely massive game, and my feelings about it are complex and hard to cover.I threw cakes, robbed banks, and stomped a monarch in Claire a la ModeThis faster paced sequel to Curse Crackers requires no prior knowledge to enjoy. The game has three full unique storylines, each with five unique stages, and 2-3 playable characters. I really enjoyed the size and exeuction of almost everything in the game. The moment to moment gameplay reminded me of Kirby games of yore.Curse Crackers: For Whom the Belle Toils made my heart jingleThis game is very clearly channeling the Game Boy Color, right down to me wishing it had a manual. Because it feels like they missed a few tutorials that would've been covered by a small booklet back in the day. Other than that and a few odd points of game balance, this is an indie game that I really enjoyed!Mega Dimension is frustrating, overpriced, and doing little to evolve Pokémon as a seriesNot even my favorite Pokémon (Raichu) getting TWO Mega Evolutions---or an entire DLC themed around my favorite pastry (donuts)---could make this feel like anything other than a mediocre cash grab to me.

2025

The cute caterpillar game: ÖooNama Takahashi does it again! A perfect bite-sized puzzle platformer.Bonne Maman advent calendar 2025I tried 24 different jams and spreads in the days leading up to Christmas.I just can't PKMN.help myselfI'm gaming again a little, but the ball is still very much rolling on PKMN.help updates.What's new? (November)Little big changes to pkmn.help! A curated links page. And my head is full of TV static.Pokémon Legends: Z-A trapped me in a Potemkin villageZ-A struggles to push the series forward to the same degree as Pokémon Legends: Arceus, but I still enjoyed much of my 60 hours.What's new? (October)Grand Archive, Pokémon Legends Z-A, and a new site design.Everdeep Aurora lets you explore the apocalypse as a cute kittyA cute little exploration game with no combat. Short and sweet, but also a bit obtuse and backtracking heavy.Pipistrello and the Cursed Yoyo felt like an identity crisisWaiter, there's Hollow Knight in my Zelda! I at least fumbled my way through using accessibility settings.Pokémon Type Calculator: Pokédex sorting & UI updatesIn addition to adding the ability to sort the Pokédex by the stat, I refined several aspects of the UI: most notably the type labels, space usage efficiency in the header area, and typography.SHINOBI: Art of Vengeance failed to excite meAn overstuffed and challenging action platformer with gorgeous hand drawn artDELTARUNE Chapter 4 cements this series as one of my favoritesNow *this* is videogaming. It's fun, silly, sad, serious, and made me cry multiple times.NINJA GAIDEN: Ragebound sliced its way to my heartThe Game Kitchen deserves a blue ribbon for this action platforming masterpiece. Absolutely no fluff or filler.Stop giving me the finger: An argument against the pointer cursor on buttonsPutting the pointer cursor (👆) on every button is ugly, unnecessary, and dilutes its power for signaling links.DELTARUNE Chapter 3 spreads its wings with increased time and budgetToby Fox and friends really outdid themselves with this one.Playdate Season 2 asked me to dig holes and help a dog poopA stationary shmup, an ancient aliens archaeology game, a supremely silly point and click adventure, and a game about becoming an extraordinarily long dog with extraordinarliy big poops, and more...What's new? (July)Grand Archive TCG, Hunter × Hunter, finishing Dragon Age: The Veilguard, Playdate Season Two, a new site theme, and health updates.Pokémon Type Calculator: UI updatesI overhauled the Pokémon Type Calculator UI: fixing a 12 month old bug, and improving contrast and readability in the design to help focus attention where it's important.I need juicier interfacesFlat design is easier to make, but I feel like we're all malnourished from lack of lighting and ornamentation. I juiced up my site with more color, and even more fun lighting effects.CSS obfuscation and userstylesHTML is not an API for site visitors; do not expect stability. The days of userstyles are essentially over, and they're not likely to come back.Jade & Lime: A new theme is unveiledI created a new theme to enhance the reading experience of my blog posts and better feature different shades of green.A Balatro-style holographic card hover effectBalatro's hover effect on cards is the perfect example of UI juice that just makes you have fun without even "playing". I was inspired to do a similar effect on the web.Min-maxing dinner with my Zojirushi and Dutch ovenHow my Zojirushi rice cooker and my Lodge Dutch oven have helped me minimize effort spent on dinner while maximizing my results. And a small rant in favor of "intuitive cooking".I played Pokémon Crystal for the first time, 24 years after its releaseI just played Pokémon Crystal (2001) for the first time, despite starting with Pokémon Blue (1998). It looked and sounded great on the Analogue Pocket, but the dated gameplay left me wanting more.In defense of the “for...of” LoopDespite its introduction in ES2015 and implementation in all browsers over 8.5 years ago, I still see `.forEach` used in favor of the modern `for...of` loop. Sadly, `.forEach` is ill-suited for modern `await`-centric code, and complicates control flow. It's time to revisit this commonly banned syntax.Enhancing the Pokédex: Input lag, React, and monitor refresh ratesI released a large update to the Pokédex, intended to better use screen real estate on large displays. Read on for screenshots, the full changelog, and a rant about React and performance.Creating a colorized disjoint union of graphsI used graph traversal to implement an error detection system for a graph editor at a previous job.I actually had to use algebra at work one timeAfter trying and failing to dust off my knowledge of trigonometry, I had to re-learn linear equations and algebraic systems of equations in order to solve a problem at work. I swear this was not an interview question.Simulating JS await with generator functionsDid you know that before async functions existed in JS, we simulated them with generator functions? Come with me on a code journey, in which I reveal the relatively short helper function that made it all possible.Pokémon Type Calculator updatesI made a few nice updates to Pokémon Type Calculator in the last week, adding new features and improving clunky interfaces.Ittle Dew 2 failed to nail everything I love about 2D ZeldaIttle Dew 2 (2016) is an indie game clearly inspired by the 2D Legend of Zelda games. Frustrating combat holds it back from greatness. I loved the art and many of the puzzles, though.Automated image manipulation with ImageMagickImageMagick is one of the best tools I've ever used for automating image manipulation. This post explains some of my common use cases, and links to ImageMagick's full list of commands.Blog questions challengeI've been tagged to answer seven questions about my blog!Cobalt Core does basically everything rightI loved Cobalt Core! A deckbuilding roguelike with an engaging time loop story, great music, gorgeous pixel art, and fun gameplay.Goodboy Galaxy is an authentic GBA game, down to its faultsGoodboy Galaxy (2024) is extremely cute and oozing with style, but I also got a little annoyed in the home stretchVideo games roundup (2024)My thoughts about the games I played in 2024. Contains thoughts about 28 games, over 2 per month. Yeah, I'm a gamer.Editorial style & shrines progressA new design era: Editorial style. Two color design returns, but I'm aiming for something more elegant than retro. I've also started working on my long awaited shrines! Contains 17 screenshots.

2024

A memorial for CurryA memorial post about Curry, our beloved cat of the last 12 years.Tidying up the website againI took some free time to improve the desktop navigation on my website, and better organize information and links. Enjoy the screenshots.Very Verdant: Even More GreenAfter starting Firefox and VS Code themes, I realized my website didn't have enough green. I massively improved dark mode, and added more green everywhere. Enjoy the screenshots.Creating a fresh new green themeExploring the process behind my fresh new green, including a design I discarded and the inspiration for my new style.A memorial for CoryA memorial post about Cory, one of my closest friends.Health is temporaryAfter a year of chronic pain, I wish I had more relief. But I am making progress. I also discovered I don't even use my teeth and tongue correctly, lol.Home page updateI updated my home page and added more decoration to the site. I want it to be easier to browse and more fun looking.Creating an HTML “spoilers” element with no JSIt's strangely difficult to make a “spoilers” element without JS, and even harder to do it with support for all mobile operating systems and screen readers.Diagnosing a common source of race conditions in JSMy thoughts on why expression statements can be a source of bugs—especially in async code—and a proposal for reviving JavaScript's nearly unused void operator.Getting weirder with fonts, and: Too much of a good thingPP Talisman from Pangram Pangram Foundry is my new heading font---or "cool font" as I'm calling it in the code. But I'm trying not to overuse it!Becoming an Astro-notI spent an entire weekend migrating my Eleventy site to Astro—and then back to Eleventy! A reflection on using the right tool for the job, when many options are viable.Experiment: Puffy 3D modeTaking inspiration from Claymorphism, I made an experimental version of my site with a puffy 3D look.wavebeem 2.0: Slime ModeWith cohost.org going away, I decide to lean even harder towards working on my personal website. I've created a new theme, with a softer, more playful aesthetic than ever before. I've also created many new sections on my website.Open world fatigueA brief reflection on the Legend of Zelda and the popularity of open world video games.JS context managersSee how to adapt Python's context managers for use in JavaScript. Break free from clunky try...finally blocks with this one weird trick.Introducing: The ToyboxThe Toybox is a new section of my site for web toys, jokes, and experiments.Cool 3D buttonsA nice collection of buttons you'll want to push over and over again. These 3D buttons call back to a time of shiny silver plastic and tactile experiences.Making a theme selectorHow to make a theme selector for your website, and why you might want to have more than one theme.I made a new 88×31 site buttonI made a new site button GIF for folks who want to link to my website.10 years of themes for wavebeem.comAn image gallery and reflection of 10 years of themes I've made for wavebeem.comJS compare functionExploring a small but mighty function that supercharges the JS Array sort method to rival Lodash's orderByHow to query shadow DOM, and why you might not want toExamples of how to query shadow DOM, and when you actually don't want to. Based on real life testing with Stencil.js web components.Making an interactive flashlight toy for the webI made a toy flashlight for the web. It simulates darkening the web page and following the cursor. It looks somewhat convincingly like a flashlight. Enjoy!Turning your mouse cursor into a flashlightTurns the lights off and navigate the page using a flashlight.JS proxy and private propertiesThe default `Proxy` implementation doesn't work well with private properties, but we can fix this! I also explore other approaches to private data in JS.

2023

Developing with web componentsThoughts on developing with web components from scratch; no UI libraries. This covers custom elements and very basic use of the `<template>` element. Shadow DOM is mentioned but not used.Windows Vista in CSSPure CSS nostalgia.What pronouns does a jester use?Press to reveal the punchline.You deserve to be happy, or: The web wasn't a mistakeA discussion of why people hate JS, Electron, and the web. Also a plea about how excessive negativity hurts you and those around you.The web is an app platformThe web has been an app platform for most of its life. I discuss the history of the web and my definition of "app".

2022

ザ・ワールド (The World)無駄 無駄 無駄 無駄 (MUDA MUDA MUDA MUDA)I made a Geocities site button88×31 GIFs were all the rage back on Geocities; I decided to finally make one for my own site.Best dip everMy favorite IBS-friendly dip to make at home.Why I don't like useStateWhy useState is so hard to use correctly, and what we can do about it.

2021

Buttermilk biscuit recipeDetailed instructions on how to make fluffy biscuits at home.

2020

Adventures in de-GooglingMy successes and failures in trying to de-emphasize Google's presence in my life.Crispy tofu recipeHow to make delicious crispy tofu at home.Tagged unions in JavaScriptA disciplined approach to state management and domain modeling for JavaScript and TypeScript. Also known as algebraic data types / discriminated unions.

2019

SeaGL 2019Building Your own keyboard with free software.Mechanical keyboards 201: Beyond pre-builtThinking beyond pre-built gear, this guide will help prepare you to build your own keyboard.

2018

Mechanical keyboards 101: An introductionAn introduction to the exciting world of mechanical keyboards.7 tips for better bashBash is not easy or enjoyable, but it can be very useful once you understand a few of its quirks

2017

Generators, iterators, and iterables in JSA comparison and overview of generators, iterators, and iterables in JS.React without JSXA quick overview on using React without JSX or any build tools.

2016

Broken promises: how to use promises effectivelyHow to use promises effectively (written before async/await existed)Compiler code generationHow to make code generation for a compiler.Making a Lisp-style programming language interpreter in JSHow to make a programming language from scratch in JS.The leaning tower of BabelAn exploration of Babel's caveats.

2015

JS gotchas with this and newHow JS's `this` and `new` work, and how to avoid issues with them.Squiggle: an immutable, value oriented, compile-to-JS programming languageAn introduction to Squiggle, a compile-to-JS programming language I made.