The journey of building a hex-grid strategy game — from first render to feature-complete
So... I did it. Tessara is live. On itch.io. Right now. You can go play it. Tessara on itch.io. That sentence still doesn't feel real to me.
If you've been following along, you know this thing started as a scrappy little hex grid prototype back in December. Just colored circles moving around a canvas, capturing tiles. No combat, no AI, no reason to keep playing. And somewhere between Christmas and today it turned into... well, a real game. An actual, honest-to-god game that I built and shipped. That still blows my mind a little.
This week was all about getting the game ready to deploy. And let me tell you, the gap between "it works on my machine" and "it works embedded in an itch.io iframe" is... humbling. Asset paths that worked locally were returning 403 errors. The save system was crashing because of how browsers handle localStorage in iframes. The victory screen was getting cut off so you couldn't even reach the Continue button. Sound files weren't loading. One by one, tracked them all down and fixed them. Built the zip, uploaded it, tested it, found another issue, fixed it, rebuilt, re-uploaded. Repeat. I lost count of how many builds I went through before everything was actually working.
But it's working now. And it's out there. For anyone to play. That's... kind of terrifying, honestly.
I'm going to be real because that's kind of my thing at this point. Hitting that publish button was scary. There's this voice in the back of your head that says "nobody's going to play this" and "someone's going to tear it apart" and "you should have spent another month polishing." I've been through this before with Dodgy Rush and it doesn't get easier. But I promised myself I'd ship the damn thing, and here it is. It might not be perfect. It might have bugs I haven't found yet. But it's done, it's out there, and that is an achievement all of its own.
What's next? Honestly, I don't know yet. I want to see how people respond first. If there's interest, I've got a notebook full of ideas — new game modes, more factions, expanded upgrade paths, maybe even some kind of challenge system. But for right now, I'm going to take a breath, maybe sleep for once, and just let it sink in that I actually finished something.
If you want to try it, here it is: Play Tessara on itch.io. I'd genuinely love to hear what you think. Leave a comment, rate it, tell me what's broken, tell me what's fun. This is a solo dev thing built in spare hours between work and family and life, and every bit of feedback means the world.
Thanks for being here. Seriously. Whether you've been following along since December or you're just stumbling across this now... thanks for caring.
Not going to lie, this was a rough week to stay motivated. After the adrenaline rush of January where I was building new features every day, this week was all about cleanup. No new systems. No exciting unlocks. Just digging through the codebase and fixing everything that got messy during the sprint.
The big task was a full codebase refactoring pass. I ripped out about 2,800 lines of dead code — old V1 files that were still hanging around next to their V2 replacements, archived components nobody was using, legacy systems that never got deleted. Then another 1,700 lines got refactored into smaller, focused components. GameUI alone went from over 2,000 lines down to about 1,250 by extracting all the inline HUD panels and overlays into their own files. The monolithic types file that had 895 lines of every type definition crammed into one place got split into 8 domain-specific files. It's the kind of work where you can spend an entire day on it and the game looks exactly the same when you're done. But the code is so much easier to work with now.
I also tracked down a bunch of gameplay bugs that were hiding. King of the Hill could spawn its hill on an impassable mountain tile, making the game literally unwinnable. Towers were ignoring drone defense stats when calculating damage. The elimination mode wasn't properly checking if all enemy bases were destroyed. Point capture was sometimes placing capture points off the edge of the grid. One by one, squashed them all. On top of that, I cleaned up the spawn point system so drones rotate across all your spawn points instead of only spawning at your base, fixed the faction mastery bonuses that weren't actually being applied to your stats, sorted out a confusing legacy "Movement Speed" stat that overlapped with the Drone Mobility upgrade, updated a bunch of icons for towers, walls, resource nodes, and the HQ. It's a lot of small stuff but it all adds up. The game feels tighter now, even if nobody will ever know the difference.
After the madness of last week, I slowed down a bit and focused on making things feel right. The biggest issue was the strategy system. The old strategies were basically just stat sticks — you'd pick "Aggressive" and your drones got a small attack bonus, but they still wandered around aimlessly like every other strategy. It didn't feel like you were making a real choice. So I tore it out and rebuilt it around actual drone behavior.
Now Aggressive drones push toward enemy spawn points and hunt down enemies within two tiles. Defensive drones expand in a circular pattern around your spawn and only engage threats that get too close to home. Balanced drones finish what they're doing before responding to nearby enemies. And Standard is just the default free roam, unchanged. Each strategy also has stat bonuses and weaknesses tied to it, so Aggressive gets +10% Attack but -10% Defense, Defensive gets the opposite, that kind of thing. Rally Points override everything though, because player control should always come first. The difference in how games play out depending on your strategy pick is night and day compared to before.
I also spent time this week on the AI side and the faction system. Worked through a whole document on smarter AI behavior — things like strategic spawn point placement with scoring systems, intelligent tower and wall positioning based on chokepoints and proximity to threats. The factions got refined too. Instead of dumping all 13 factions into one unlock menu, they're sprinkled throughout the upgrade tree as discovery rewards. Max out Attack I and you find the Crimson Legion. Unlock Auto-Production and the Swarm Collective shows up. It gives players a reason to explore different branches of the tree instead of just bee-lining for the upgrades they want. The mastery system on top of that lets players invest deeper into a faction they like for enhanced bonuses. It's a small thing but it adds a lot of "what's down this path?" motivation.
I don't even know where to start with this week. I just... built everything. The whole game. I looked at the seven-phase plan I made last week and decided that the only way to do this was to put my head down and go. So I did.
First up was the balance restructure. Turns out Stage 1 was literally impossible to win without upgrades. Did the math and you could only capture about 17% of the map in the time given, but you needed 60%. So the 15x15 grid got shrunk to 10x10, timer went from 60 to 90 seconds, and the win threshold dropped to 50%. Then I rebalanced all six stages with a proper difficulty curve. Added new upgrades like Extended Time and Drone Mobility so players have more ways to approach the early game. The full upgrade tree got redesigned from scratch — 38 upgrades across five categories (Combat, Production, Utility, Strategic, Special), 172 total tiers. And then a multi-currency system with Research Points, Advanced Data, and Faction Essence so the late-game has proper gating.
Then I built the faction system. 13 factions across three tiers that players discover through upgrade tree milestones. Each faction has real bonuses and weaknesses that change how you play, plus a mastery system for players who stick with one faction. After that came game modes. Five of them. Conquest was already there, but I added Elimination, Point Capture, King of the Hill, and Survival, each with their own win conditions and a staged unlock progression so players aren't overwhelmed with choices. Then Rally Points, which might be my favorite system in the whole game. Right-click to place a flag, drones auto-assign, and they have this whole behavior state machine for patrolling, attacking, and capturing. It finally gives the player real strategic control instead of just watching drones wander.
I also built an eight-tier difficulty system that scales AI stats relative to the player's progression, a hands-on tutorial scenario on a tiny 4x4 grid, 50+ achievements with Research Point rewards, and six prestige levels. By the end of the week, the project review said it all — feature complete. Around 15,000 lines of TypeScript, 40+ React components, Phases 1 through 11 all marked done. I'm honestly not sure I've ever coded that fast in my life. It was exhausting but I couldn't stop. Every feature I finished just made me want to build the next one.
I did it. I committed to the redesign and went all in. Territory Conquest is now an incremental roguelite. The whole game got restructured around a new core loop: you start at a Hub world, pick your faction color, spend your upgrade currency, then launch a Run. You play a quick tactical stage on the hex grid, earn Research Points based on how well you did, come back to the Hub, buy some permanent upgrades, and do it again. Hub, Run, Results, Upgrades, Repeat. That's the game now.
The first thing I did was sit down and write out a full design doc suite. Seven documents covering everything — Game Vision, Upgrade Tree Design, Scenario Design, Economy Balance, Feature Gating, UI/UX, and an Implementation Roadmap with seven development phases. I needed to get it all out of my head and onto paper before I touched any code. The two-currency economy was the piece that made everything click. You've got Coins that you earn and spend during a run to buy drones and structures, and Research Points that you earn at the end of each run and spend on permanent upgrades. Coins reset every run. Research Points stick around forever. That separation is what creates the "just one more run" pull.
I also renamed units to "Drones" because it just fits better for the vibe I'm going for. And the starting experience got completely redesigned. Players start with one single tile, a button to manually create drones, and a tiny map. That's it. No strategies, no tile upgrades, no auto-production, no structures. All of that stuff is still in the game, but now it's locked behind the upgrade tree. You earn it. You unlock it. You discover mechanics as you progress. The upgrade tree IS the tutorial. That was the design philosophy that tied the whole thing together. Instead of throwing 15 systems at a new player and hoping they figure it out, you drip-feed them one unlock at a time and every single one feels like a reward.
By the end of the week I had a working prototype with the hub world, a stage select popup, and a basic upgrade tree with 6 upgrades across multiple tiers. It's rough, but the loop works. You can play a stage, earn points, buy an upgrade, and feel yourself getting stronger. I mapped out a seven-phase development plan to get from here to launch. This is going to be a lot of work. But for the first time since I started this project, I know exactly what the game is supposed to be. This was the week everything changed.
I think I figured it out. I've been playing a lot of Vampire Survivors lately and it hit me — the reason that game is so addictive isn't the gameplay itself, it's the loop. You do a run, you earn some currency, you spend it on permanent upgrades, and then you do another run but now you're a little stronger. "Just one more run" turns into two hours disappearing. What if Territory Conquest had that? What if instead of one standalone match, each game was a "run" that earned you some kind of meta-currency, and between runs you could spend it on a permanent upgrade tree? Start the player with almost nothing, just one tile and a button to manually create units, and let them unlock everything through progression. The strategies, the tile upgrades, auto-production, new maps, all of it. Didn't write a single line of code this week. Just sat with a notebook sketching out upgrade trees and thinking about how this would all connect. But I haven't been this excited about the project since week one.
Short week. Not a whole lot to report. Spent most of it squashing bugs from holiday testing and tightening up the UI. Swapped out some placeholder icons, added better tooltips and hover effects, cleaned up some visual inconsistencies that were bugging me. The kind of stuff that nobody notices unless it's missing but, it's gotta be done.
Honestly though, I spent more time thinking than coding this week. That feeling I had at the end of December hasn't gone away. The game plays well. It looks decent. The AI puts up a fight. But I keep coming back to the same question — "Is this enough to keep someone playing?" You beat the AI, maybe try a bigger map, try a different strategy, and then... you're done. There's no pull to come back. No reason to hit "play again." I don't have an answer yet but, it's eating at me. Something needs to change about this game, I'm just not sure what.
The week between Christmas and New Year's is a weird time. Nobody expects you to be productive, the kids are home, there's leftover everything in the fridge... but I couldn't stop working on this thing. I had a playable game and all I could think about was what it was missing.
First thing I tackled was sound. The game was completely silent and that was driving me crazy. Got Howler.js set up with background music that switches between the menu and gameplay, a settings menu with volume sliders and a mute toggle, and it immediately made the whole thing feel more... real. It's wild how much audio changes the experience. After that I polished up the pause menu with a proper overlay, added an ESC shortcut for pause/resume, and put in a confirmation dialog so you don't accidentally bail on a match. Little things, but they add up.
The bigger additions this week were towers and walls. Towers are automated turrets you place on your tiles that shoot at nearby enemy units. Walls are destructible barriers that block enemy movement, so you can funnel them into choke points or protect key tiles. The AI can build them too now, and it actually spends resources on upgrades and structures, which makes it feel way more competitive. I also built out a supply line system where if your territory gets cut off from your base, those disconnected tiles go neutral. That one was a pain to get working but, it adds a whole layer of strategy around protecting your connections.
Wrapped up the week with a UI overhaul, swapping out the placeholder icons for Lucide React and adding proper tooltips with Radix UI. Multiple win conditions are in now too — territory percentage, elimination, and survival. So as the year wraps up, I've got a solid prototype. It looks good, plays well, has music, structures, multiple ways to win... and yet. I don't know. Something feels off. I keep playing it and thinking "okay, I beat the AI... now what?" There's no reason to play again. No progression, no hook, no "just one more round." It's a good game for 20 minutes and then you're done. That's been nagging at me all week and I'm not sure what to do about it yet. But, something needs to change. Going into the new year with that stuck in my head.
Okay so this week was a big one. Territory Conquest went from "watch circles move around a grid" to something that actually feels like a game. The big addition was combat. When two units from different sides land on the same tile, they fight. It's simultaneous — both units deal their attack minus the other's defense, both take damage at the same time. Simple rules but, it creates some really interesting situations. Equal units just kill each other and the border freezes. Send two units against one and you break through. Upgrade your attack and suddenly you're punching through defenses they can't match. I'm really happy with how much strategy comes out of such a basic system.
From there I fleshed out four expansion strategies that the player can switch between. Aggressive pushes toward enemy territory, Defensive stays close to home, Balanced expands evenly, and Directional lets you focus one direction. Then came the enemy AI, which honestly was the part I was most nervous about. Spent some time researching different approaches (Utility AI, Behavior Trees, Influence Maps) and landed on a hybrid setup. The AI spawns its own units, captures territory, fights the player, and makes decisions about where to push. It's not genius-level stuff but, it puts up a fight, and that's all I needed for now.
I also got the economy working this week. Each tile you own generates resources over time, and you can spend those on upgrades (production speed, attack, defense, health) or upgrade individual tiles with resource boosts, defense bonuses, even additional spawn points. There's a resource display up top, costs on every button, and things actually grey out when you can't afford them. Behind the scenes stuff, mostly, but it all adds up. I sat down Christmas Eve and played a full match against the AI, watching us fight over tiles, saving up resources to upgrade my attack and finally punch through, and... yeah. It's a game. A real one. Merry Christmas to me, I guess.
So, here we go again. New project, new idea, new burst of energy that I'm hoping doesn't fizzle out in two weeks like the last few. The concept this time is a real-time strategy game played on a hex grid. I'm calling it Territory Conquest, at least for now. The idea is pretty simple — you've got a base, it spawns units, and those units go out and capture territory by moving onto tiles. Color-coded, so you can watch your little empire spread across the map like paint on a canvas. I've always been drawn to those territory control games where you just sit back and watch colors take over the screen, and I wanted to try my hand at building one.
Tech stack is React with TypeScript, Vite for the build, and Canvas API for rendering the actual game. Spent the first couple days just getting the hex grid to render properly, which... is more annoying than it sounds. Hex math is not friendly. But once I got it working, with camera panning and zoom, it actually looked pretty cool. From there I built out a territory ownership system so each tile tracks who owns it, and the colors change when a unit walks over it. Then came the unit system — spawning from a base, pathfinding with A*, and automatically capturing tiles as they move. Nothing fancy, just little circles moving around a grid, but it's something.
I'll be honest, the moment I got a handful of units spawning and spreading out across the map on their own, just watching the blue tiles slowly take over... that felt good. That's the feeling I'm chasing. There's a long way to go, obviously. No combat, no AI, no real game yet. But, the foundation is there, and it feels solid. We'll see where this goes.