Hi, I'm

Štěpán Zrník

PHP Oracle && AI Operator

AI is part of my workflow — bugs start sweating, and I pretend this was the plan all along. (It usually was.)

What I do

Backend

PHP 8+, Symfony, Nette, Doctrine ORM, MySQL, PostgreSQL — the part I actually know.

Frontend

React, Vue, TypeScript, Bootstrap, Tailwind CSS — I survive, but don't expect a UI designer.

Tools

Git, Docker, CI/CD, Linux, PHPStan MAX, nginx, React Native.

What about AI?

I treat AI as a normal part of the workflow, not as a LinkedIn sticker. I use Claude, Codex, and other tools for research, solution drafts, code review, writing, automation, and AI API work. The code and decisions still stay with me — AI is a faster teammate, not an unsupervised autopilot.

Where I left fingerprints

Recruitis

ATS — complete solution for managing candidates and the entire recruitment process.

Where exports have moods, integrations have egos, and bugs prefer Fridays.

recruitis.io

Datixo

Campaign aggregation and evaluation in one place.

Lots of code, lots of Docker, lots of OpenAPI — surprisingly few reasons to cry under the desk.

datixo.com

Tescoma

ShopSys e-shop — first time working in a larger team on a shared codebase.

Big team, big e-shop, big monolith — excellent training for humility and code review faces.

Receptoid.cz

Recipe website — vibe coded from scratch, because I wanted to see how far I'd get.

A “what’s the worst that could happen?” experiment that somehow became a public website.

receptoid.cz

XeMeL

E-shop XML feed management and conversion — XML hurts, but I survived.

XML feeds: proof that brackets can have trauma and pass it on.

BiddingTools

Bidding tools for Heureka and Zboží.cz — project is dead, the code lives on.

Bidding, prices, and e-shops — math where a mistake is not a bug, it’s an invoice.

Code Samples

Things born from laziness, stubbornness, and the sentence: “fine, I’ll write it myself”.

zweist

OpenAPI routing for Slim 4 — self generating router from OpenAPI attributes on Slim controller methods.

Because writing routes twice is exactly the kind of activity robots were invented for.

View on GitHub

CNB-Exchange

Production tool for fetching and parsing CNB (Czech National Bank) text files for moneyphp/money exchange rates.

CNB has a text file. I have a parser. We all pretend this is a normal way to distribute rates.

View on GitHub

php-attribute-reflection

PHP 8 attributes are cool — reading them? Not so much. This wrapper makes it a little bit less painful.

Reflection API with a reduced urge to throw the laptop out the window.

View on GitHub

PHPUnit-Exceptions

Trait that saves you from rewriting assertThrows over and over. Nothing more, nothing less.

A tiny trait against repetition. Copy-paste is a gateway drug to suffering.

View on GitHub

toggl-to-clickup-time-tracking-sync

Toggl → ClickUp sync — ClickUp UI sucks, so I track time in Toggl and let this handle the rest.

ClickUp UI failed to convince me, so I routed around it. Diplomatically speaking.

View on GitHub

claude-usage-windows-taskbar-widget

Vibe coded C# taskbar widget tracking Claude API usage — so the invoice doesn't surprise me.

A widget watching the Claude bill before the Claude bill starts watching me.

View on GitHub

Contact

A project, a bug report, hello, or a ritual stacktrace sacrifice?