designer/engineer

Wicked good design for wicked problems.

Featured Work

PROJECT FELINES

PROJECT FELINES

The Alzheimer’s field spent billions clearing amyloid plaques from brains that kept declining. FELINES is what happened when I stopped accepting that narrative and started tracing upstream: iron dysregulation, ferroptosis, vascular failure, across six neurodegenerative diseases that enter through different doors but break down the same way.

GOINVO WEBSITE

GOINVO WEBSITE

Migrating a healthcare UX studio off aging Gatsby infrastructure onto Sanity CMS, animated page transitions, and accessibility-first architecture. Nine document types, card-morph transitions, and a content pipeline that lets non-technical editors publish without touching code.

WRITROSPECT

WRITROSPECT

An AI-assisted journaling tool that solves the blank-page problem. Built on neuroscience research about why people abandon commitments to themselves, with a prompt architecture that adapts to what you actually need rather than loading everything at once.

RENDOMAT

RENDOMAT

A programmatic video studio built at GoInvo. Turns structured content into multi-platform video with professional motion design, replacing a manual production pipeline that took a full day per video with an automated system that renders in minutes.

PHYLACTORY

PHYLACTORY

100,000+ concurrent units in a fantasy game that fuses factory management with real-time strategy. Built a custom Entity-Component-Space system from scratch in Godot 4 with C++ and GDExtension, hand-crafted every sprite and tileset in Aseprite, and designed twelve interconnected game systems such as energy grids, trains, pipes, and formation AI.

Case Study

Hundreds of thousands
of moving parts.

A fantasy factory game that fuses factory management with real-time strategy, built on a custom Entity-Component-Space system designed to handle massive unit counts without sacrificing frame rate or gameplay depth.

100K+

Concurrent units

ECSS

Custom architecture

100s

Sprite iterations

12+

Interconnected systems

01

The Game

Phylactory is set in a vibrant fantasy world where players build sprawling factories while commanding armies of units called Thralls. It's not just a factory sim or just an RTS. It's both at once, which meant every system had to work at two scales simultaneously: the micro-level of pipe flow and crafting recipes, and the macro-level of hundreds of thousands of units moving in formation.

The scope demanded an architecture that could handle complexity without accumulating technical debt. Godot 4 had no built-in ECS, and the only third-party option wasn't compatible, so I built one from scratch.

Hundreds of thousands of Thralls organizing into formations in real time.

Every system had to work at two scales: pipe flow and crafting recipes, or hundreds of thousands of units in formation.

02

The Architecture

The Entity-Component-Space System (ECSS) extends the standard ECS pattern with Spaces, shared contexts that let systems communicate without coupling. The data-oriented design ensures cache-efficient memory access, and certain systems leverage GPU acceleration for rendering and physics at scale.

Entities

Individual game objects (units, buildings, factory elements) identified by unique IDs for streamlined management.

Components

Data-only attributes like position, velocity, and command handling, stored in cache-efficient ComponentStorage objects.

Spaces

Shared contexts that allow different systems to communicate and access common game state without tight coupling.

Systems

Game logic (movement, rendering, commands, selection) that operates on entities with specific component combinations.

Archetypes

Groups of entities with similar component signatures, enabling targeted batch processing and memory-efficient iteration.

Godot had no ECS. The only third-party one didn't support Godot 4.

With 100,000+ concurrent entities and complex component combinations, Godot's node-based architecture wasn't designed for this scale. So I built a custom ECSS from scratch: archetype-based storage, GPU-accelerated rendering, and shared Spaces for cross-system communication.

03

The Systems

Phylactory's gameplay emerges from a web of interconnected systems. Energy powers buildings that process resources moving through pipes, while trains carry materials between factory zones and Thralls organize into formations for combat, all running simultaneously on the ECSS.

Movement & Formations

Flocking, group movement, and configurable formations including huddles, lines, and checkerboard patterns with adjustable spacing and direction.

Pipes Network

Dynamic fluid flow calculations that update as pipes are placed, with realistic pressure and flow-rate logic throughout the factory.

Energy Network

A pump-powered energy distribution system (called "Wumbo") that supplies power to buildings, mirroring real-world grid distribution.

Train System

Track-based transportation with strategic stops, enabling logistics planning and resource movement across the factory.

Inventory & Grid Placement

Item management with categorization, stacking, and filtering, paired with a grid-based placement system for precise building positioning.

Skill Tree & Crafting

Progression through unlockable abilities and a crafting system for creating and upgrading items, tying into the factory pipeline.

The Wumbo energy network powering factory buildings.

The crafting system tied into the factory pipeline.

04

The Art

Every sprite, tileset, and visual effect was hand-crafted in Aseprite. The Wizard character alone went through hundreds of iterations, each pixel tuned to convey wisdom, mystery, and power. His familiar Tomey, a sentient tome, needed a character of its own: not just an accessory, but a companion whose positioning and expressions conveyed a bond with the Wizard.

Beyond character design, every asset includes normal and emissive maps so the day-night cycle's dynamic lighting casts real shadows and reflections across the entire world.

Pixel Art & Normal Maps

Hand-designed sprites with normal and emissive maps for dynamic lighting, all crafted in Aseprite across hundreds of iterations.

Visual Shaders

Rain particle systems and underwater entry effects that add atmospheric depth without compromising frame rate.

Day-Night Cycle

Dynamic normal-based lighting that casts shadows and reflections adapting to time of day, making the world feel alive.

Lorenomicon

An interactive lore book weaving backstory and world-building through a narrative interface that rewards exploration.

The Lorenomicon, an interactive lore book for world-building.

05

Character Design

I needed the Wizard to encapsulate the game's tone: magical, slightly enigmatic, and powerful without being generic. I started broad, exploring silhouettes and color palettes in Aseprite, then narrowed through hundreds of iterations until the final design emerged, one that not only defined the character but set the color language for the entire game.

Tomey, the Wizard's tome familiar, had to read as more than a prop. I designed its expressions, idle animations, and spatial relationship to the Wizard to convey a partnership. The final pairing became the emotional anchor of the game's visual identity.

Wizard character iterations in Aseprite

A selection from hundreds of Wizard iterations exploring silhouette, color, and personality.

The Wizard and Tomey, his tome familiar

The final Wizard and Tomey pairing, the emotional anchor of the game's visual identity.

The Wizard's color palette didn't just define a character. It set the visual language for the entire game.

06

What I Learned

Data-oriented design changes what's possible.

Switching from object-oriented inheritance to a data-oriented ECS wasn't just a performance optimization. It changed what the game could be. Systems that would have been impossibly tangled in a class hierarchy composed cleanly when entities were just IDs with component bags.

Art and architecture are the same problem.

Pixel art with normal maps isn't just aesthetic. It's a lighting contract with the rendering system. Every artistic decision was also a technical one, and the best results came from treating them as inseparable.

Interconnected systems create emergent gameplay.

When pipes, energy, trains, and combat all talk to each other through shared Spaces, players discover strategies I never designed. The architecture didn't just support the game. It made the game more interesting than I planned.

Built with

Godot 4GDScriptECS ArchitectureGPU AccelerationAsepriteShader ProgrammingA* PathfindingNormal Mapping

About

Someone didn't give up on me.
That's why I build.

There is no definitive formulation of a wicked problem.

When I was three months old, I had intestinal volvulus. I wouldn’t stop crying, every doctor had a different explanation, and my parents kept looking until they found one who could see what the others missed.

The choice of explanation determines the resolution.

That persistence saved my life. It also gave me something I’ve carried ever since: the recognition that how you frame a problem determines whether you can solve it at all.

Every wicked problem can be considered a symptom of another problem.

I don’t just say “wicked” because I’m from Massachusetts. In 1973, Horst Rittel and Melvin Webber described wicked problems: the kind where the crying is a symptom of something deeper, and treating the surface never reaches the root.

Every wicked problem is essentially unique.

I started where a lot of CS grads start: writing Perl scripts for an escalation engineering team at Dell EMC, then two jobs in the gaming industry building things that were complex, fast, and fun. But games ship patches. The problems I kept gravitating toward were the ones where you don’t get to patch. I earned a Master’s in bioinformatics because I wanted to bring engineering somewhere the problems don’t repeat: healthcare, government, regulated systems where every deployment is its own context and every patient is their own case.

Wicked problems do not have an enumerable set of potential solutions.

I joined a small studio designing for healthcare and government because the solution space is never closed. There’s no dropdown menu of correct answers. You design, ship, learn, and revise, knowing the next version will be different, not because the last one failed, but because the problem shifted underneath you.

Every solution is a “one-shot operation”; every trial counts.

In regulated environments, every release matters. There are no sandbox deployments when someone’s care depends on the system working. That weight is something I chose, not something I stumbled into.

The planner has no right to be wrong.

When you build software for medical contexts, you carry a specific accountability. The system you ship becomes part of someone’s care, and “move fast and break things” is not an option when the things that break are people.

Wicked problems have no stopping rule.

Over the past several years, that same instinct has pulled me toward problems with no finish line. I started researching neurodegenerative disease on my own, not because I expected to solve it, but because I couldn’t stop looking once I started seeing what others were missing. That’s how I work on everything: once I care about a problem, there is no clean stopping point, only the next question.

There is no immediate and no ultimate test of a solution.

I’ve learned to be comfortable building things I can’t fully validate yet. Whether it’s a healthcare prototype shipping to users whose feedback won’t arrive for months, or a research framework whose predictions won’t be tested for years, the work has to be good enough to act on before you know if it’s right. That uncertainty isn’t a flaw in the process. It is the process.

Solutions are not true-or-false, but good-or-bad.

That’s the lens I bring to everything I build. Not “is this correct” but “is this better.” Better communication, better questions, better tools for the people using them. My independent research on neurodegeneration, Project FELINES, follows the same principle: it doesn’t claim to be the right answer, just a framework that generates better questions than the ones we’ve been asking.

I build software. I design systems. But what drives me is the same thing that’s driven me since before I could talk: someone needs to keep looking until they find what the others missed.

Contact

Let's build something together.

Interested in working together, have a question, or just want to say hello? I'd love to hear from you.