Work

Independent game & original IP, 2026

A whole card universe, from the ground up.

Original creatures, collectible packs, a digital binder and a battle system, backed by a persistent game economy.

Role
Product and game engineering, original card-generation workflow, backend systems and responsive browser experience.
Stack
Next.js, TypeScript, Convex, Clerk, Python, Replicate, OpenAI, Capacitor, RevenueCat
Status
Hosted browser game
www.bashlings.com

Sign-in and camera features work best in the full app.

Context

Bashlings brings original creature cards into a connected collecting and battling game. The work spans the content pipeline, the moment a pack opens, a growing collection and the rules that make progression consistent.

What I did

  • Wrote a custom Python NFT/card-generation script and used Replicate and OpenAI to create the entire Bashlings card collection, including artwork, metadata and visual card treatments.
  • Built the collection binder, packs, progression, evolution and multiple battle experiences around the original card catalogue.
  • Implemented server-side economy records, locked pack contents and idempotent opening so retries do not create duplicate rewards or reroll cards.

Engineering decisions

The card artwork, the pack reveal and the player’s collection need to agree. I built both the Python generation workflow and the server-side pack economy that connects the catalogue to gameplay.

From generated artwork to a card you own.
  1. Create the cataloguePython, Replicate and OpenAI produce artwork, metadata and composited cards.
  2. Create the packThe server stores the chosen card IDs when the pack is created.
  3. Reveal and collectOpening reveals those cards and records ownership idempotently in Convex.
Tradeoff
The reveal is a presentation of an existing result. Keeping card selection on the server means a refresh cannot reroll the contents, and a repeated opening cannot grant duplicate cards.
Result
An original card collection connected to packs, a binder, progression and shared battle rules. The live pack flow has been explored from individual reveals through the final collection summary.

Decide the pack before it is opened.

Card IDs are stored when a pack is created. Opening reveals that existing result and records ownership idempotently, so refreshing does not change what is inside.

Share the combat rules.

A common battle core serves multiple modes. Ground and space lanes, card statistics and matchup rules stay consistent as the surrounding progression changes.

Build the tools that build the cards.

I wrote the Python NFT/card generator behind the collection, combining Replicate and OpenAI with card compositing and metadata generation. Its output becomes a versioned catalogue, so the game uses a consistent set of cards and rules.

Scope

Browser gameplay is hosted. Native wrappers and purchase integrations are implementation work, not a claim of verified App Store or Google Play publication. Screens were captured in a creator account.

Reviewed the authoritative project documentation, pack implementation and mobile purchase architecture. Explored the live signed-in binder and battle setup, and opened a fresh Cosmic Clash pack through its individual reveals and final collection summary.

Next projectThingBound