Calaverd

I build things you can open up and look inside.

Small things I made for fun. A pixel art editor for the terminal, a 3D engine on top of LÖVE2D, a pathfinding library in Lua and this site. Nothing fancy, but you can open almost any of it and see how it works.

[1] The branch is a Lindenmayer system. It is generated once and stops.

axiom X X -> F+[[X]-X]-F[-FX]+X F -> FF angle 22.5° depth 4

axiom X X -> F+[[X]-X]-F[-FX]+X F -> FF angle 22.5° depth 4

amberglyf — spec

Amberglyf running in a terminal. Thirty seconds, no audio.

Amberglyf is a pixel art editor that lives inside the terminal. I made it for myself: drawing sprites without leaving where I already am, with the keys where I already have them. It is dogfooding and bragging rights, both.

I have not published it yet; it still feels green. But it works and I use it, and the colour picker it ships with came out of needing one here.2

The table overflows to the right on narrow screens — drag it.

languagePython 3.12Textual for the interface, Pillow for the images
controlsvim-styleright hand: r t y u i o p on top, f g h j k l in the middle
animationframes with their own hold timeonion skin, playback in place
exportsPNG · its own formatthe spritesheet is a PNG too; imports PNG and GIF
status0.1.0 · privatenot published yet; in daily use

How I made the colour picker

[2] I needed to pick colours without leaving the terminal and ended up drawing the OKLCH gamut with braille dots.

everything else I have built

Pajarito computing the movement area over a grid with terrain of different costs.

Pajarito Pathfinder

lualöve2d2023

Inspired by old school Fire Emblem: a pathfinder friendly to that kind of game, where swamp and road do not cost the same. The game never came out; the library did, and there it stays for whoever wants it.3

Playable demoCode on GitHub

A low poly model turning in Zapote3D with the cavity shader.

Zapote3D

lualöve2d2025

A personal 3D engine on top of LÖVE2D, built from what other game jams taught me: skeletons, gltf and glb, cameras. It is an experiment and dogfooding at once. It still needs assets for the game that shows it off.4

Engine notes

John Huesos title screen.

John Huesos

lualöve2d2019

A solo entry to a game jam at the Centro de Cultura Digital.5 Design, code and assets, inside the time there was.

Play in the browser

This site

htmxnode2025

Functional composition to assemble nested pages, conditional responses depending on who is asking, and tree-based routing. It navigates like an SPA and weighs 14kb instead of 200. Inspect the source if you don't believe me: that is the whole argument.6

How it is built

All projects

[3] The examples live in their own repo, so the library stays clean.

[4] The last thing I added was a GLSL cavity shader, so the low poly reads better.

[5] I had a lot of fun showing it, defects and all.

[6] In 2024 it moved from GitHub Pages to a VPS of my own. Since then it is a server too.

in the works

Latest updates

I have been working in a glsl cavity shader for the engine in love2d to showcase better this lowpoly model.

I saw something the other day about using a texture with transparency for the eyes on low poly models and had to do a small test. 🙂

Sprite compositor

python · qt · gimp

A top-down sprite maker for in-house use: it composes the four facings from parts and reloads itself every time I save in GIMP. A rough draft, no name yet.

What amberglyf still lacks

python · textual
  • magic wand
  • zoom
  • frame reorder
  • GIF export
  • layers, deferred on purpose

All updates

[7] Most of this I make because I want to have it made, even if the world does not need another one of these. I do.

come read the blog

The whole blog

[8] By topic, not by date. A note from 2020 and one from this year sit together if they are about the same thing.