Skip to content
sp1le.tech
UA

Full-cycle engineer · Ukraine · remote

From the schema to the systemd unit.

I'm Dmytro Stasiuk. I design, write, deploy and then operate complete products on my own: a multi-tenant Python SaaS, a Telegram storefront trading for a real business, a Unity co-op shooter, a realtime browser game. Everything below is either running right now or honestly labelled as unfinished.

Every box on this line is mine to build and mine to keep up.
Manifest What exists, what it runs on, and what state it is actually in. No rounded-up counters.
2 running · 2 unfinished · compiled 2026-09-10

Decisions

  • three of 16 records
  • full records live in the case studies

Decisions worth defending

A portfolio of screenshots proves very little. These are the calls behind the screenshots, including what each one costs.

Getaway

The level, prefabs, characters and UI are generated by editor code

Instead of
Authoring scenes by hand in the Unity editor
Because
A hand-built scene is a binary blob that one person can edit and nobody can review. Generated content turns the entire block into a readable diff, and a full rebuild is one menu item or one batchmode command.
Costs me
3 918 of the 10 723 lines are tooling that ships to no player. Moving one wall means editing code, not dragging a handle.
ReplyDeck

One Postgres database, with every query path forced through a tenancy guard module

Instead of
A database or a schema per tenant
Because
One box, one backup, one migration run. Schema-per-tenant multiplies operational work by the number of customers, and I am the operator.
Costs me
Isolation is now a property of my code instead of the engine. That is exactly why the tenancy rules have their own test module rather than being trusted by inspection.
Voice Duel

One answer parser, imported by both the client and the server

Instead of
Comparing recognised text against the expected string
Because
Speech gives you "twenty one", "21" and "twenty-one" for one answer. If the rule for what counts as correct exists twice, players eventually watch the judge disagree with itself - and that ends the game more effectively than any bug.
Costs me
That file can never diverge, so it lives in shared/ and is the most heavily tested thing in the project.

Stack

  • Split by how often I ship with it, not by how it looks on a CV.

What I actually reach for

Ship with it regularly
  • Python
  • FastAPI
  • PostgreSQL
  • SQLite
  • aiogram
  • JavaScript
  • TypeScript
  • React
  • Node.js
  • Linux
  • systemd
  • nginx

Everything here is behind something currently serving requests.

Comfortable, used in production
  • C#
  • Unity
  • Photon Fusion
  • SQLAlchemy
  • Alembic
  • Docker
  • Astro
  • Tailwind
  • Vertex AI
  • S3 / object storage
  • Telegram Bot API
  • Web Speech API

Shipped with each of these at least once, and I know where they hurt.

Touched, would not claim depth
  • Unreal Engine 5
  • C++
  • Blender

Opened, built something small, decided it was not my tool. Ask me about UE5 and you will get an honest shrug, not a rehearsed answer.

Fit

  • two ways to start

Working together

Two ways this usually goes: you need a product built end to end, or you need an extra engineer who does not need supervision. Both start with the same conversation.

  • Build the product

    You have a thing that needs to exist and reach real users. I take it from schema and API design through the interface to a server that runs it, and I stay on for the part everyone forgets: deploys, backups, the runbook and the first month of things going wrong.

  • Join as an engineer

    An extra pair of hands that does not need supervision: picks up a service, reads the code, asks the two questions that matter and then ships. Comfortable owning the unglamorous half - migrations, deployment, the on-call document nobody wrote.

Working together →

Contact

  • Full-cycle software engineer

Start a conversation

Tell me what you are building and what is in the way. I answer personally, usually the same day.