Evgenii Zakharov

Open to senior engineering roles available immediately

available immediatelyYerevan, UTC+4mostly EU hours

Evgenii Zakharov
YerevanUTC+4mostly EU hours

One engineer.
Every layer.

Full-stack and platform engineer. Eight years taking products from a blank plan to a running service, with interfaces people feel the quality of, and the numbers to prove it. In teams at X5 Group and SberEducation, on products at up to 7.5M monthly users. On my own, Tuned, a resume SaaS from first commit to payments in five weeks. And the original author of nestjs-zod, at 5.5M installs a month.

  • github.com/risenxxx
  • in/risenx
  • t.me/risenx
  • to@risen.dev

Looking for the next team

Open to senior engineering roles — remote worldwide as a contractor or through an employer of record, or hybrid in Yerevan. I work best owning a feature end to end, from the screen someone touches to the services behind it, alongside engineers who hold each other to a high bar. How fast and how clearly that screen answers is part of the feature. Contract work and one-off architecture reviews too.

updated 2026-11-03

lately

  • nowBuilding Tolkly on my own since October — an AI support chat for websites that answers from the site’s own rules with the quote behind every claim, and hands what they do not cover to a person.
  • nowRunning Tuned, my own product, live with payments — resume tailoring where every variant is a patch over one base document rather than a copy.
  • nowShipping Frame Player — a 4K HDR file cast to a television with no re-encode, on Windows and macOS.
  • nowKeeping two small Rust tools alive: dubsync, which lines a dub up with a release cut differently, and DeskVolt, battery levels for wireless peripherals.
  • 2024–2026Senior full-stack engineer at X5 Group, Russia’s largest food retailer — SSR Next.js and a BFF over FastAPI services for a recipe platform at 7.5M monthly active users: mobile pages 15–25 Lighthouse points faster, a third less JavaScript, cached pages in 100–200 ms instead of a 700–800 ms render.
  • 2025Launched Gift Fight, a real-time PvP Telegram game, to about 1,500 players. Later closed it on the funnel data rather than carrying it on; the cluster and the code are still the work.
  • 2024Handed nestjs-zod to a new maintainer. Still the ecosystem default at 5.5M installs a month.
  • 2023Sole engineer on Sigma Games, built with a business partner — an iGaming product built from scratch end to end: ten ASP.NET Core services for payments, wallets, affiliate, gaming and auth, a React Telegram Mini App for players, an admin panel for operators, and the Kubernetes cluster it ran on. Payment webhooks go through a transactional outbox into RabbitMQ, with retries, a dead-letter queue and no double crediting.
  • 2022–2024Full-stack at SberEducation — NestJS services over RabbitMQ, BFF contracts that stopped upstream changes reaching clients, schema-driven client generation in CI, and an accessibility-first payment widget at Lighthouse Accessibility 95+, with keyboard and focus behaving the same on every paid path.
  • 2021A shared UI kit at Haiku Dev that four product teams adopted, and @cardbox/editor shipped as a published library — a Slate-based WYSIWYG, sole engineer on it.
  • 2018Went freelance full time and started dealing with the client directly: scope, deploy, and the support after launch. Where the eight years start.

How I draw a system before any of it exists

Every product below is a subset of this, sized to the problem. Six steps take each one from a plan to a running service, whether it ships to a cluster or to an installer.

  1. 01 spec

    Acceptance cases first. Written down before implementation starts. It is what a reviewer checks the work against, and what an agent is held to.

  2. 02 contracts

    Types at every seam. One schema serves validation, types and the generated docs, so both sides of a seam can be built in parallel and a broken state is impossible to express.

  3. 03 ci gates

    Tested against the real thing. Unit, integration and contract tests, Testcontainers against real PostgreSQL, Redis and NATS. Security and performance are gates, not follow-ups.

  4. 04 delivery

    GitOps, not hands. FluxCD reconciles the cluster to the repository. Releases and rollbacks are the same operation, and both finish in under three minutes.

  5. 05 platform

    Written down, not clicked. Kubernetes on Talos Linux across bare metal and cloud, described in one Pulumi program that anyone on the team can read and change.

  6. 06 operation

    I hear about it first. Metrics, traces and structured logs on every service, and enough signal to know something is wrong before a user reports it.

runtime/ one request from edge to storage

clientsWeb and SSRTelegram Mini AppDesktop appBot and CLIOne typed contractserves all of themedgeCloudflareWAF, cache, bot rulesPer-route rate limitsapi gatewayTyped contractsOne schema, both sidesAuthn, idempotency keyshttp servicesStateless, scaled outreal-time layerWebSockets, reconnect-safework queueRabbitMQOutbox, retries, DLQpub/subNATSEvents, fan-outevent logKafka / RedpandaAnalytics topicsworkersQueues, schedulesworkflowsDurable stateRetry, compensateingestBatched, deduplicatedoltpPostgreSQLcache, blobRedis, S3olapClickHouse

Drag the figure sideways to follow the path

Selected work

Each taken from a blank plan to production, with a link to the source wherever the source is public.

Tolkly

Customer supportChat widget

A support chat for websites where an AI answers first, from the site’s own rules, and never makes an answer up.

  • Every answer links to the page it came from and quotes the line behind it. On twenty questions about GrowthBook’s docs it got all 15 they cover right and declined all 5 they do not.
  • What the rules do not cover goes to a person, in the inbox or the team’s Telegram, with the order number already attached.
  • Takes the site’s colours, font and corners by itself. Two lines to install, and the chat loads only when opened.
  • TypeScript
  • Bun
  • PostgreSQL + pgvector
  • React 19
  • oRPC
  • Web Components

Frame Player

Media playbackWindows and macOS

A video player that sends a 4K HDR film to the television exactly as it is, with no loss of quality, while the app on the computer stays a working remote. Torrents play while they are still downloading.

  • One interface for Windows and macOS, drawn as a web page over a native video engine. On macOS the engine (libmpv) could not sit inside another window at all, so I patched it.
  • Hovering the timeline shows the exact frame under the cursor. The usual shortcut showed the wrong scene 60% of the time; the player now measures each file and gets it right.
2 platforms
signed, updates itself
0 re-encodes
the television gets the original
60% 0
previews showing the wrong frame
  • Rust
  • Tauri 2
  • Svelte 5
  • TypeScript
  • FFmpeg
  • libmpv
  • Chromecast / DLNA

Tuned

Document toolingHosted SaaS

Tailors a resume to every job posting without losing the original: each version is a set of changes over one base resume, so a hundred applications never drift apart. Live with payments five weeks after the first commit.

  • The AI can reword but cannot invent: a claim that does not trace back to the base resume is refused.
  • The preview is drawn by the same PDF renderer as the download, so a page that fits on screen fits in the file, measured rather than estimated.
  • TypeScript
  • React 19
  • pdf.js
  • Bun
  • Elysia
  • oRPC
  • PostgreSQL
  • Drizzle
  • BullMQ
  • Kubernetes

Gift Fight

Real-time multiplayerTelegram Mini App

A real-time game inside Telegram where players bet collectible gifts against each other, and anyone who played a round can check afterwards that it was fair. Designed, built and run in production end to end.

  • No game is lost mid-round: a round in progress survives a server restart or a new release (Temporal).
  • Play is live, and crypto payments run through separate services that never settle the same bet twice.
  • Every game event reaches the analytics once, with no gaps or duplicates, even after a failure (Kafka into ClickHouse).
120 ms
to reach players, 300 at once
every round
survives a release
~1,500
players at launch

Closed in 2025 on purpose: the data showed free channels bringing players who did not pay, so it was shut down rather than kept going. The code and the cluster are still the work.

  • TypeScript
  • React
  • Hono
  • PostgreSQL
  • Temporal
  • Kafka (Redpanda)
  • Socket.IO
  • Kubernetes
  • Pulumi

Shipped and operated

Tools I have run in production, not ones I have read about.
Chosen per constraint rather than per fashion.

  • frontend/

    • TypeScript
    • React
    • Next.js
    • Svelte 5
    • Astro
    • Tailwind
    • Effector
    • TanStack
    • Core Web Vitals
    • WCAG
    • Design systems
  • backend-and-data/

    • .NET 9
    • Node.js
    • Bun
    • Hono
    • Elysia
    • PostgreSQL
    • ClickHouse
    • Redis
    • NATS
    • RabbitMQ
    • Kafka / Redpanda
    • Temporal
    • EF Core
    • OpenAPI
  • platform-and-ops/

    • Kubernetes
    • Talos Linux
    • Docker
    • Pulumi
    • Terraform
    • Ansible
    • FluxCD
    • Cloudflare
    • Hetzner
    • DigitalOcean
    • GCP
    • Prometheus
    • Grafana
    • Sentry
    • Actions
  • further-afield/

    • Rust
    • Tauri 2
    • FFmpeg
    • WebAssembly
    • Win32 / Direct2D
    • USB HID
    • libmpv
    • Audio DSP / FFT
    • HDR / Dolby Vision
    • Applied cryptography
    • Telegram Mini Apps

Open source

Two libraries other people's projects depend on.
I wrote both; one is now in another maintainer's hands.

  • nestjs-zod

    installs a month
    5.5M
    stars
    1.1k

    The standard way to use Zod with NestJS: one schema serves validation, TypeScript types and the generated OpenAPI docs, so the same data is never described twice. Written by me and transferred to another maintainer in 2024, still the ecosystem default.

    original authorTypeScriptMIT

  • eslint-kit

    stars
    130
    status
    archived

    Preset-based ESLint configuration: one short config instead of the usual sprawl of plugins, parsers and rules, across very different frontend and backend stacks. Archived: Biome now covers the same ground in one binary.

    authorTypeScriptMIT

Write to me

Senior product, full-stack or platform roles, contract work, and one-off architecture reviews. The terms are up at Looking for the next team.

Yerevan, UTC+4remote worldwide, contractor or through an employer of recordEnglish (full professional), Russian