🎲

Gila Monster

GoKafkaS3PostgreSQL

Gila Monster is my character and monster management service for tabletop RPG content β€” a home for the player characters, NPCs, and monsters that show up across the campaigns I run, instead of scattering stat blocks across notebooks and chat logs.

Every entity shares a simple PokΓ©mon-inspired six-stat block plus a free-form type, size, and alignment, so it works across genres without forcing a rules system on me. Characters carry named actions and can have multiple images β€” hand-picked uploads or AI-generated art requested through Harpy Eagle and wired back over Kafka when generation finishes. It’s a small Go service: a ConnectRPC API over PostgreSQL, an optional MinIO upload path, and a CLI. Not a full VTT β€” the data layer I wanted underneath one.

Gila Monster is my character and monster management service for tabletop RPG content β€” a home for the player characters, NPCs, and monsters that show up across the campaigns and one-shots I run. I wanted a single structured place to keep stat blocks, descriptions, and artwork instead of scattering them across notebooks, spreadsheets, and chat logs.

Every entity β€” human, orc, dragon, alien, robot, whatever a scene calls for β€” shares the same simple, Pokemon-inspired six-stat block (HP, Attack, Defense, Special Attack, Special Defense, Speed) plus a free-form type, size, and alignment, so it works across genres without forcing a rules system on me. Characters can carry a list of named actions/abilities, and each one can have multiple images attached β€” hand-picked uploads or AI-generated art requested through a companion service, Harpy Eagle, with the result asynchronously wired back in over Kafka once generation finishes.

It’s built as a small Go service: a ConnectRPC/gRPC API backed by PostgreSQL, an optional MinIO-backed upload path for images, and a CLI for scripting CRUD without touching a UI. Nothing here is trying to be a full VTT β€” it’s the data layer I wanted underneath one, so the characters I create stay structured, queryable, and mine.

Documentation