Backend engineer with 15+ years of commercial PHP. I design and build high-load services and APIs β and I publish the reusable parts as open source.
- 10 years in ad-tech: advertising networks with RTB (Real-Time Bidding) integrations, buying and selling traffic β MySQL for operational data, ClickHouse for impression analytics, Redis/Memcached for caching.
- Now: product development on Yii3 / PHP 8.5 with Clean Architecture (Domain / Application / Infrastructure / Endpoint, boundaries enforced statically by Deptrac), plus support and refactoring of large Yii2 legacy systems.
- LLM in production: the application acts as an MCP server β assistants connect over Model Context Protocol and call domain tools via tool-calling, guarded by per-user RBAC and an audit log.
- I care about the things that are invisible until they break: retries, idempotency, exactly-once delivery, backpressure, mutation-tested code.
Languages
Frameworks
Data
Infrastructure & Real-time
Quality
π¦ Open Source β 49 packages on Packagist
Reusable PHP 8.3+ libraries with hardened CI/CD, SemVer, backward-compatibility checks, and tests on Testo with mutation testing (MSI 85β100%).
| Package | What it does |
|---|---|
| bulkhead | Cross-process concurrency limiter for PHP-FPM β keeps one slow upstream from eating every worker. Atomic slot acquisition via Redis Lua scripts, APCu spinlocks; tested against real forked processes (pcntl). Needs nothing but PHP and Redis |
| rector-datetime-immutable | Rector rules migrating mutable DateTime β DateTimeImmutable β and auto-fixing the lost mutations the migration silently creates, where $date->modify('+1 day'); throws the new instance away. Static analysers report those; this fixes them in bulk |
| property-testing | Property-based testing with integrated shrinking (Hedgehog model) and stateful / model-based testing β the two things PHP's PBT libraries don't do. Generates inputs, finds a counterexample, shrinks it to the minimal one. A Testo plugin |
| yii3-outbox | Transactional outbox β events committed in the same transaction as the data, then relayed. No lost messages on crash, no dual-write. Yii3 had no such thing |
| yii3-feature-flags | Feature flags with percentage rollout and deterministic per-subject bucketing β same user, same variant, every time. Pluggable backends (DB, Redis) + a UI |
| yii3-mcp | MCP server for Yii3: expose CQRS handlers as LLM tools, auto-bridge OpenAPI β MCP, and β the part generic MCP servers skip β per-user RBAC and an audit log on everything the model touches |
The rest of the ecosystem β resilience, observability, Yii3 infrastructure
| Area | Packages |
|---|---|
| Resilience | retry Β· bulkhead Β· duration Β· result |
| Delivery | yii3-outbox (+ -db, -clickhouse) Β· yii3-webhooks (+ -db) Β· yii3-outbox-webhooks-bridge Β· yii3-idempotency (+ -db) β safe request retries via Idempotency-Key |
| Experiments | yii3-feature-flags (+ -db, -ui) Β· yii3-ab-testing (+ -db, -clickhouse, -web, -outbox) |
| Observability | yii3-telemetry (+ -otel) Β· yii3-metrics (+ -prometheus) Β· yii3-correlation-id Β· yii3-health-check Β· yii3-audit-log (+ -db) Β· domain-monitor |
| AI / LLM | yii3-mcp Β· yii3-mcp-rbac-bridge |
| Yii3 infrastructure | yii3-tenancy (+ -db) Β· yii3-settings (+ -db, -ui) Β· yii3-api-problem Β· yii3-maintenance-mode Β· yii3-seo Β· yii3-centrifugo Β· yii3-respect-validation Β· yii3-recaptcha Β· yii3-turnstile |
| Query & domain | specification β Specification pattern, composable type-safe query building |
| ClickHouse | clickhouse-toolkit Β· yii3-clickhouse-toolkit |
| Tooling | rector-named-literals Β· rector-datetime-immutable |
- A fitness / training platform backend (Yii3, PHP 8.5, PostgreSQL) β activity tracking with
.fitfile parsing, duels and leagues, JWT auth, S3 storage, real-time via Centrifugo, transactional outbox for event delivery. Strict Clean Architecture layering enforced by Deptrac; built on my own packages. - A Yii3 product backend (PHP 8.5, MySQL / ClickHouse / Memcached) β admin panel, REST API with OpenAPI, RBAC, multi-language, media pipeline, and an MCP server that lets LLM assistants operate the product safely.
- Low-latency, high-load services where milliseconds and correctness both matter
- Distributed patterns done properly: outbox, idempotency, retries with backoff, bulkheads
- Libraries other people can depend on β documented, versioned, mutation-tested
- Making LLMs a first-class, permission-aware part of a backend rather than a bolt-on

