An honest read of what you already have, what to fix first, and what can wait.
For anyone already running a system and suspecting they are paying too much for something that should be simple, or anyone about to start who would rather not find the architecture mistake six months into the code.
I look at performance, architecture and the maintenance cost of what exists. What I hand over is direction: where it hurts, why it hurts, what breaks as it grows, and in what order to touch it.
A consultancy that leaves your team unable to carry on alone has not delivered anything, so the report comes in plain language rather than jargon.
It tends to return more than expected: half of what holds a system back is not a hard decision, it is a decision nobody made because nobody wanted to own it.
Building what was decided, for web, mobile or desktop, with the back end to hold it up.
The part where I do the work. Interfaces in React, Next.js and React Native, desktop applications where the use case calls for it, and on the other side APIs in Node, NestJS, Go and Python, with the database chosen by the shape of the data rather than by habit.
Integration is usually where a project stalls, so I treat it as first-class work: third-party systems, payment gateways, government services, and whatever else has to talk without taking the rest down when it slows.
I have worked at high volume, where millions of records a day move through a distributed pipeline and one wrong field becomes a wrong invoice. That changes how I write even the simple code.
I take on new projects and existing ones. On the second kind, the first delivery is usually understanding what is there before touching it.
Where the system runs, how it ships, and how you find out it is down before a customer tells you.
I set up cloud servers and physical ones, with everything around them: domains, certificates, backups, and a deployment process that does not depend on someone remembering the right sequence.
Containers and orchestration with Docker, Docker Swarm and Kubernetes, sized to the problem. A small team rarely needs a cluster, and selling extra complexity is the fastest way to leave people stuck with something they cannot operate.
The part I do not skip is observability: metrics, logs and alerts through Grafana, Prometheus and Loki. A system that only reports failure through customer complaints has already failed twice, and the second time was you not knowing.
From a mechanics script to a finished game, including what runs inside someone else’s platform.
A game is the software where performance is not an optimisation but a requirement: a late frame is felt immediately, and there is no acceptable "loads in two seconds" in the middle of a match.
I work with Lua, the scripting language of most engines and of the platforms that accept mods, and with JavaScript and TypeScript for games that run in a browser.
This covers a whole game or just the part that is stuck: a specific mechanic, a progression system, an integration with an external service, or performance that dropped and nobody found out why.
That manual task someone does every week whose cost nobody measures.
Every operation has one: export the spreadsheet, rename the files, reconcile data between two systems, send the same report every month. Nobody adds those hours up, and they are expensive because they come out of the time of someone who could be doing something else.
I automate that kind of task, connect systems that do not talk to each other, and build routines that run on their own and speak up when they fail.
The last part is the one that matters: automation that breaks silently is worse than manual work, because the error only surfaces once it is already a problem.
Messy spreadsheets, exports from an old system, a file that will not open in the right format.
System migrations, bulk imports and third-party integrations almost always hit the same wall: the data exists, but not in the shape the other side accepts.
I clean, deduplicate and convert large volumes between formats, with validation so errors surface before entering the system rather than after.
I have done this at telecom scale, where the daily file holds millions of records and one wrong field becomes a wrong invoice.