Featured work
Twenty four titles, and what each one is evidence of
Seven years of commercial work, grouped by what it proves rather than by date. The middle section is the one most portfolios leave out: five projects that went wrong, what the decision cost, and what I changed afterwards.
2022 to 2026
MirraGames, ported, rebuilt and shipped
Sixteen of the 100+ titles I worked on as Senior and then Lead Unity Developer. Ports from Android, iOS and Steam into browsers and alternative stores, rebuilds where the original could not absorb what platforms were asking for, and a few built from nothing.
-
Product
MirraSDK
Every new platform used to mean deleting one vendor SDK, importing another and rewriting the calls against it, once per title. I put ads, payments, cloud saves, analytics and platform APIs behind one interface layer, shipped each implementor as its own UPM package, and had three Roslyn source generators wire them together on recompile. A NodeJS and TypeScript companion detects the host portal at runtime, which is what lets one WebGL build serve many of them.
OutcomeIntegrated into 300+ shipped games and adopted by 100+ external developers. New platform integration dropped from days to a few hours.
-
Port
Solar Smash
Handed over to be put on web portals. I rebuilt the interface around the paid surfaces so buying was a deliberate act rather than a hunt, cleared the memory and stability backlog in the profiler, and wired the title into MirraSDK for ads, payments, saves and platform APIs, with Firebase and GameAnalytics reporting the same events and Adjust reporting ad and purchase revenue together.
OutcomePublished to 20+ platforms. The improved build ended up on Google Play as well, rather than staying the web only version it was commissioned as.
-
Port
Minetap
Everything lived in interlocking UPM packages with the main project only wiring them together, which reads as modular and behaves as one unit. I worked with the grain of it rather than rewriting: cleared the old monetisation, optimised assets and gameplay for web first because it is the least forgiving target, then wired in MirraSDK. Android needed what Unity does not cover, so I wrote the Java bridges for native link sharing and account onboarding myself.
OutcomeShipped stably to more than 10 platforms, from Google Play and RuStore to CrazyGames and Yandex Games, with alternative Android stores passing 50K installs.
-
Rebuild
Bus Simulator
It arrived working and monolithic. Platform partners kept asking for features the codebase could not absorb, so every request turned into a risky edit somewhere unrelated. I rebuilt the core loop and vehicle physics behind dependency injection with a real composition root, so missions, custom levels, leaderboards, bus customisation and seasonal modes could each be added without reaching into the core.
OutcomeFeatured on GameDistribution, the top earning title in the portfolio for roughly six months, and past 2M installs.
-
Optimisation
Pocket Zone
500MB of RAM the moment it started, and a frame budget draining into Update loops with nothing to do. The profiler found the cause: localisation doing string replacement inside tight loops. Async tasks came out entirely because web is single threaded, and went back in as coroutines. Then I redrew the interface so one build works in portrait and landscape at any frame size, which is not optional in a resizable browser window.
OutcomeShipped to 20+ platforms and past 100K players on the strongest of them. Players on the original Google Play build started asking why the web version looked better.
-
Port
Happy Town
Another title built as packages depending on packages, with no seam to work along, and several developers had passed through it before me. I made the call not to rewrite it: the metrics were positive, the audience was growing, and decoupling on that scale would have cost more than the title could return. So I scoped the work to social features, monetisation, payments and optimisation, and left the architecture alone deliberately rather than by default.
OutcomeShipped to more than 10 platforms and past 50K players on the strongest of them, with alternative Android stores passing 10K.
-
Port
Love Archer
Accepted in one region and rejected in another on content grounds, where the characters themselves were the issue. Reskinning them meant retexturing the art wholesale and rebuilding the 2D rigs and sprites, because the replacements did not match the originals bone for bone. The team and QA worked through it in a week, and the result met the regional requirement without losing what the game was.
OutcomePublished to 10+ platforms, repeatedly featured on portal front pages, and past 500K players on the strongest of them.
-
Port
Cat and Granny
When a platform had no documentation and nobody had shipped to it yet, this is the title I sent first. Small enough to debug end to end, complete enough to exercise ads, payments, saves and analytics against an API nobody had used. Whatever it took to get it live became the written pattern the rest of the catalogue followed onto that platform.
OutcomePublished to 20+ platforms, past 100K players on the strongest, and the first release on several portals that went on to take many more titles.
-
Port
Trap Craft
The title I used to test a new package before it went anywhere near a large project: Appodeal, IronSource and Clever Ads Solutions mediation, Firebase, Adjust, GameAnalytics, XSolla payments. Whatever survived here became a MirraSDK module the team could select from a dropdown. It also took the full mobile treatment, so one build serves alternative Android stores and instant games running as a WebView.
OutcomePast 200K players at its peak. It went quiet, and after a stability and monetisation update it returned to the top of a portal chart, which is why I keep checking on titles nobody is watching.
-
Port
Pixel House
One title taken through Google Play, RuStore, OneStore, the web portals and Nintendo Switch. Each platform wanted something different underneath, from control schemes to mandatory build flags, and each took a week or two to reach a build QA would sign off and a business team would feature. The console SDK support and the control porting convention are mine; the certification submissions were carried by other developers.
OutcomePublished to more than 10 platforms with steady income and few interventions, and past 50K players on the strongest of them.
-
Rebuild
End of War
The source was an entry level MonoBehaviour template with no architecture to speak of, and it could not absorb the platform work the partner wanted. We rebuilt it with the team to look identical and behave predictably: dependency injection with a clear initialisation order, then monetisation, analytics and cloud saves on the standard path. Shaders went back to the built in pipeline so that old iPhones in a browser held their frame rate.
OutcomeShipped to 20+ platforms and ran for about a year before the audience moved on, past 50K players on the strongest of them.
-
Optimisation
House Design
A 300MB+ Android build aimed at players on slow connections and weak devices, and no web portal will accept that. I rewrote the initialisation into a strict sequential load, moved the bulk of the assets into AssetBundles served from a CDN, and batched cloud saves behind a cooldown so the backend was not hit on every interaction. The team ran more than 10 branches off it for reskins and niche tests.
OutcomeA 15MB initial download that opened quickly on the slowest phones, past 500K players on the strongest platform, and a title that earned steadily while rarely needing intervention.
-
Port
Mangavania
First release onto a portal that had just launched, against an API that had never been written down. We spent a few nights reading requests and responses to work out what it expected, while I stayed on both sides of it, the platform's engineers and my own team. The game shipped in a week with native ads and paywalls working as they should.
OutcomeDelivered on schedule against an API with no documentation, and the notes from it became the pattern for onboarding the next unknown platform.
-
Built from scratch
Stickman Broken Bones
Under development when I joined and shipped with the team. My first from scratch project at the company, and the last one before a unified SDK existed, so every service went in by hand: Firebase for analytics, Clever Ads Solutions for mediation, Android SDK levels and manifests maintained manually per release.
OutcomePublished to more than 5 platforms and did not find an audience. The manual integration work in it is exactly what MirraSDK was built to delete a year later.
-
Built from scratch
Match 3 for Yandex Games
A seasonal match three commissioned two weeks before new year, where each matched piece unlocks a recorded video message. Unity WebGL handles video badly and the size budget was unforgiving, so I built the video player in the WebGL template rather than in the engine and talked to it over .jslib. The project went back to bare MonoBehaviour with no UPM extras, and I wrote the match three core myself so that nothing in the build was unpredictable.
OutcomeA 7 to 9MB build excluding video, working across Windows, Android and iOS browsers, delivered playable in one week.
-
Built from scratch
City Driver
An MVP built in a few weeks with an animated intro, damage scored into a leaderboard, side quests, a garage and upgrades. The first pass was plain MonoBehaviour, and I rewrote it into modular dependency injection with a bootstrap so that cars and localisation load through Addressables at runtime rather than loading a garage full of destructible vehicles at once.
OutcomePublished to 20+ platforms, more popular on mobile than on web, past 50K installs on the strongest. Its source became the base other developers built variants from, and the material for internal jams I judged.
The other half
What went wrong, and what I do differently now
These are here on purpose. Each one names a decision that was mine, what it cost, and the specific thing I changed afterwards. Four of the five are estimation, judgement or process rather than engineering, which is roughly the ratio I would expect from anyone who has led work rather than only done it.
-
Correction
Pixel Combat
Async everywhere, complex shaders, and audio middleware that stutters whenever the frame budget moves. We replaced all of it: coroutines and UniTask, simple mobile shaders, built in pipeline and gamma, and a custom audio wrapper over plain AudioClips. It ran on desktop, then on phones too once I wrote my first editor tool to bulk correct import settings. It still never cleared review, and the budget ran out before the bug list did.
What changedThe import pipeline and my profiling habit both come from this project. The lesson is the other half of it: a title can be technically achievable and still not be worth its budget, and that judgement belongs in the first week, not the ninth month.
-
Correction
Up or Lava
The hard part was done. The heavy game ran smoothly, even in an Android WebView, because by then I knew how to strip and replace everything WebGL will not hold. Then the core feature turned out to be session based multiplayer, and a single threaded browser build cannot carry the latency for it. Two players together was teleporting, not co-op, and that is the first thing portal QA rejects.
What changedWe cancelled the day we proved it, which was right and still weeks late. I check the load bearing dependency against the target platform before anything else now, and I would decline this one outright today rather than start it.
-
Correction
Blackriver
I kept the schedule by moving the title between whoever was free, and by branching it hard for cross platform features. It hit the date. Then production found what the churn had left behind: broken cloud saves, missing quests, unclickable interface elements, hundreds of reports a week, on a title with purchases and players tens of hours deep, where the storage format could not be changed without risking their data.
What changedI was matching people by who was free rather than who was suited, and that was my misjudgement rather than theirs. It stabilised as soon as the right developer took it, and the reports cleared within a few months. I match people to projects deliberately now.
-
Correction
Hay Farm
A month went into preparing a purchased source before I concluded it was unusable and restarted from scratch on my own architecture. The rebuild went well and had a working economy. What I had not accounted for was that 2D was new to me, so an unfamiliar domain landed on top of a month already spent, and the project ran past its date and was dropped with a solid build in hand.
What changedThe mistake was estimation, not engineering. I had two separate reasons to move the date and raised neither, which takes the decision away from everyone else. I say plainly and early that the scope changed and the date moves with it.
-
Correction
Earthquake.io
My first hiring round as a lead. The portfolio and the interview were convincing, and the work told a different story: the build did not hold frame rate even on desktop, and core SDK files had been edited to force the game to work, which would have broken on the next update. Part of that was mine. Nothing in my conventions said the core files were off limits, and I had not caught it at review while it was still cheap.
What changedI made the rule explicit, rebuilt the project in a few days, and changed how I hire: a small paid task inside our real conventions before committing, and an early conversation about what is fixed in the codebase and what is open. It shipped, ran smoothly and held its players.
2019 to 2022
TeamGZ, my own titles on Google Play
Part time, alongside a marketing degree, in a team of developers, 3D artists and sound designers. These are the games where my work covered both sides: the code I wrote with the other developers, and the store pages I ran myself.
-
Growth
The Dead Zone series
A series with a real audience that had stopped growing, where nobody on the team was treating the store listing as a product surface in its own right. Alongside the other developers I wrote gameplay and systems code, the first person controller, weapon handling and mission logic, and then took the other side on myself: app store optimisation, cover art I produced and A/B tested, listing copy, in game events, and answering player reviews rather than leaving them.
OutcomeThe third entry passed 1.5M installs, with the two earlier ones at 100K and 700K. Roughly a 20 percent install lift traceable to the store work.
-
Growth
Scary Land
A horror spin off built to answer one question: did our players come for The Dead Zone specifically, or for the genre around it. We ran the same store optimisation and A/B testing playbook on it, the listing barely moved, and players kept asking for updates to the main series instead. That is a clear answer, and it cost a fraction of what building the wrong sequel would have.
OutcomeGrew from 100K players in 2021 to 250K by the end of 2022, and settled what the audience was actually attached to.
-
Built from scratch
Five Nights at Dr. Livesey's
Built alone to find out how fast a trend can be caught and what catching one is actually worth. Rapid prototyping against a window that closes on its own schedule: no user acquisition, no A/B tests, no store page work, ship and watch.
Outcome100K downloads in a week with nothing spent, then a flat line within months. It is the clearest evidence I have for how trend titles behave, and why I would rather build something with a second month in it.
My personal creations
An Android app taken to production in two months, four Unity packages public on GitHub, and four prototypes built to answer one question each. If what you need is closer to the commercial work above, email is the fastest way to start.