I think there are 3 main reasons to make things: I enjoy the process of making it I want it to exist I am being asked to make it As an employed person, most of the time I spend making in the last category. I never touched any networking or cloud infra stuff until it became my job. I ended up really enjoying it, not because I want to make this stuff or find it particularly interesting compared to…
Here’s the thing about AI writing—and this is load-bearing—it’s not just bad, it’s a testament to badness. Let me unpack this. In today’s fast-paced content landscape, we’re all navigating an unprecedented tapestry of synthetic prose. But here’s the kicker: the problem isn’t just that AI writes poorly. It’s that it writes confidently poorly. Not just…
I want to write about the hard part of this though: the sync engine. I want online persistence for two reasons with Bookchoy: I want everything I do to be backed up and accessible on any device. This is pretty much a standard expectation for any modern app. The chrome extension is an immediate second device, which means (I hope) every user will actually have utility for online persistence. Version…
The core piece of functionality in Bookchoy is “tap on a character, see a popup with the dictionary definition”. Sounds simple, but because of the ambiguity in the language it’s not a trivial problem. I think while it can be a crutch, having the ability to not lose your flow in reading/navigating/writing is critical, to avoid just getting bored or frustrated and stopping the…
building random small things At this point we all know that AI lets us build whatever we want when we want it. It’s especially nice when I have small things I want for myseelf and I wouldn’t have otherwise spent the time bootstrapping and polishing them to the point that they’re daily-drivable. The reason I frequently feel the need for such tiny apps is that most things available…
UPDATE: I made this into a small Go module: https://github.com/stevenctl/deadlog . It is a drop in replacement for sync.Mutex and sync.RWMutex , with the option to call the returned unlock closure if you want to track unreleased locks. Don’t run with this in production, it’s only for debugging deadlocks. Multiple times, I’ve had to debug deadlocks in some Go code. Even though…
It’s been a while! My last post was about this app, about a year ago after a couple months of work. I did not expect this to be a long-term project. Studying Mandarin became one of my main hobbies. Using my own app to study was cool, but it had lots of issues so I kept chipping away at it over nights and weekends. At this point I use it daily. After showing my in-laws (who are Malaysian…
I’ve been studying Mandarin Chinese for a few years, starting with basic phrases (Pimsleur) and then moving on to Hello Chinese . This app was excellent for the basics, offering (quality!) gamified lessons and a content of library with a slick reading interface where you could tap unknown words for translation and audio. After completing all the structured lessons, I focused on reading. When…
Introduction I don’t think I would have become interested in shooters if it weren’t for Halo 3’s forge mode. I probably logged 1000 hours in Minecraft when I was a kid (and learned Java because of it!). Games that let you make stuff are the best. Making games is even better. After a few years focusing on my career in network programming I decided to revisit games, this time…
In the last post we were able to randomly generate “correct” looking 3D shapes. However, my goal was something that a user or game developer could create levels with. Let’s look at our requirements: The user should have direct control of the generation. BorisTheBrave describes calls this “Driven WFC”. We need a lot of tiles. That would take a lot of time to model for…
During the intro to a game I (perodically) work on, the player starts on a pirate ship. Realistic water doesn’t fit the style, and scroling textures on a big plane looked pretty boring. To make things a bit angrier I needed intense waves, and I needed those waved to actually affect the world. Waves To keep it simple, I just did procedural heightmap; i.e. set the vertical coorinate to be a…
I am not a good artist. One of the reason 3D is a bit more attractive to me is that I can usually build something rather than draw it or sculpt it. Digital art gives you an “undo” button, but being able to undo or redo things out of order makes it even easier to experiment. Most of the terrain tools out there have a destructive workflow. Using various brushes, you write directly to a…
Triplanar mapping is already expensive, and multiplying that by the samples for paralax occlusion mapping is probably a bad idea. It was fun to implement this anyway, even if I don’t use it in a game. In my current WFC prototypes, I’m re-using models and rotating them. At some point I’ll need to handle also transforming the UVs based on the rotation of the tiles’ models,…
These are a few of the first things I ever made in Blender. It turns out characters are way harder than hard surface. Legfish Literally the first completed model I ever made in Blender. For this, I used a Skin Modifier and Subdivision Surface based workflow. Joey Carlino has some great tutorials for this on YouTube. A nice starting point, but a bit finnicky. Cat Knight I read the first few…
I saw this picture on Reddit or something, and I decided to recreate it. There were other decorations I wanted to put in the train station, like a Goblin-themed vending machine and better-looking torches. I needed to wrap it up and move on. To build the environment, I re-used the tileset that I made for my Wave Function Collapse level editor. Rather than copying the tiles into this blender file…