Live stats

Open to offers Middle+ Frontend / Fullstack · Moscow or remote

Qwern_9876r

Sotnikov
Dmitry

React · Go · TypeScript · PostgreSQL · MongoDB

I make complex systems stable and fast and scalable

01

About me

BIO

I started programming at 14, and at 15 graduated from Yandex School of Interface Development — its youngest student in 12 years — before starting my career at Yandex as a frontend developer at 16. I handled complex technical challenges — from optimizing interface performance to designing large-scale projects. I write high-performance, maintainable code and always look beyond the immediate task: I think about how a solution affects the product and the business as a whole. I take initiative, see work through to completion, and do not wait to be told what to do. In my spare time I build Rook, my own programming language that compiles to JavaScript and runs it on every CPU core.

02

Why me

PERFORMANCE

High performance

I write code that does not just work — it works fast. I optimize rendering, bundle size, network requests, and response time. Lighthouse metrics, Core Web Vitals, and profiling are a required part of the work, not an option.

This page, in your browser
LCP
—
full load
—
JS on load
—
fps at rest
—
All live stats
INITIATIVE

Initiative

I do not wait for tasks to be assigned — I find problems and propose solutions myself. I take on complex, uncertain tasks and see them through without constant supervision. I work autonomously and take responsibility for the result.

PRODUCT FOCUS

Business mindset

I look at tasks through a business lens: I assess the long-term impact of technical decisions, avoid overengineering, and focus on what creates real value for the product and its users.

+32.5% Profit

+31% E-REACH

Case «Better than anyone expected»
03

Frontend foundation

TypeScript · HTML5 · CSS3 · SCSS

04

React ecosystem

React 19 · Next.js 16 · MUI · TanStack Query

05

Graphics

Pixi · Three.js · Rive · Lottie

06

Web Components

Lit · Custom Elements

07

Quality and testing

Storybook · Jest · Playwright

08

Backend

Go · Node.js · Echo 4 · Fastify

09

Data Bases

MongoDB · PostgreSQL

10

Backend infrastructure

Docker · Kubernetes · Nginx · Kafka

11

Technologies

Click an icon to visit the technology website

12

Experience

Yandex and MTS

Moscow

MTS

Fullstack Developer

05.2026 – present now
  • Designed and built an admin panel and modules for creating games
  • Building browser games with WebGL: game mechanics and server APIs
  • Optimizing game performance in the browser
4 days to build−87% 3D model weight Case «Tested a new stack with a game»
This site runs on the same stack WebGL · Three.js · Pixi.js · Svelte · Threlte
TypeScriptGoReactViteFastify +1 More: PostgreSQL

Yandex

Frontend Developer

08.2024 – 03.2026
  • Built and supported high-load interfaces: new features and performance optimization
  • On my own initiative, created new pages and extended the frontend admin panel
  • Supported neighboring teams and mentored an intern
+38% MAU+15% E-REACH Case «One person against a huge project»
TypeScriptReactNextSCSSGraphQL +3 More: REST API, Jest, Storybook

Promoted in 3 months

Frontend Developer Intern

05.2024 – 08.2024
  • Developed new features for a product with millions of users
  • Built optimized animations and introduced new technologies and approaches
+53% DAU+31% E-REACH Case «Better than anyone expected»
TypeScriptReactNextSCSSJest +2 More: Storybook, GraphQL
13
Case 1 of 5

Better than anyone expected

Yandex

05.2024 - 06.2024

While working as: Frontend Developer Intern ↗
+53% DAU daily active users
+31% E-REACH
+32.5% Profit

Summer 2024 campaign · a product with millions of users

Role and constraints
  • The task: a small home page animation, no designs
  • The reward mechanic was my idea
Problem

The task was to add a small animation to the home page without any designs.

Solution
  1. 1

    Turned the animation into a mini-game

    Significantly improved the animation and added interaction

  2. 2

    Optimized it

    Lazy loading and animation-level performance work: it ran smoothly even on older phones

  3. 3

    Came up with a reward mechanic

    Interacting with the animation earned a symbolic reward

  4. 4

    Marketing picked it up

    The mini-game attracted many daily users, and a summer campaign with bloggers was built around it

Full story

I significantly improved the animation, added interaction, and optimized it with lazy loading and animation-level performance work. It ran smoothly even on older phones. I also introduced a symbolic reward for interacting with it. Although the product was not related to entertainment, the mini-game attracted many daily users and increased product engagement. Management and marketing built a summer campaign around this unexpected success, with many bloggers taking part. I turned a small animation into the summer's killer feature with millions of engaged users.

AnimationsInitiative
14
Case 2 of 5

One person against a huge project

Yandex

04.2025 - 05.2025

While working as: Frontend Developer ↗
+38% MAU monthly active users
+15% E-REACH

A new game page built solo by the deadline

Role and constraints
  • 1 frontend developer instead of 3
  • Part-time
  • First time with Rive and Server Components
Problem

One of three frontend developers moved to another team and another went on extended leave. The managers brought in a large project with a very tight deadline.

Solution
  1. 1

    A new page with game mechanics

    Game mechanics and rewards

  2. 2

    A new stack for the project

    Server Components and REST API instead of GraphQL

  3. 3

    Learned Rive from scratch

    An interactive layer on Rive, never used in the project before

  4. 4

    Delivered solo on time

    My Rive component became the foundation for the team and Yandex Plus

Full story

I built a new page with game mechanics and rewards, introduced Server Components and REST API, and used Rive for the interactive layer. I learned the unfamiliar tools while working part-time and delivered the project alone by the deadline. The resulting Rive example and reusable component became the foundation for future Rive integrations across the team and Yandex Plus.

TypeScriptRiveReactNext.jsServer Components
15
Case 3 of 5

Tested a new stack with a game

MTS

05.2026

While working as: Fullstack Developer ↗
4 days to build
−87% 3D model weight
9.7 MB loaded on start

May 2026, my first month at MTS. Model weight after compression in October 2026, gzip

Role and constraints
  • Solo
  • Learned the stack on the go
  • Outcome: the stack was adopted for new projects
Problem

For new projects at MTS we had to decide whether Svelte + Threlte + Pixi.js was the right stack: could it handle 3D, 2D effects and UI in one app, and how fast could we build with it.

Solution
  1. 1

    The task: choose a stack

    Would Svelte + Threlte + Pixi.js work for new MTS projects: 3D, 2D effects and UI in one app

  2. 2

    A game instead of a demo

    A browser 3D game in 4 days: a forest with mushrooms, a greenhouse with a cauldron, potions

  3. 3

    Three layers in one frame

    3D scenes on Threlte, Pixi.js particles on top, UI and state on Svelte 5

  4. 4

    The stack was adopted

    After the test, the stack was chosen for new projects

  5. 5

    Models 8× lighter

    gltf-transform and meshopt: 9.7 MB on start instead of 76.4

Full story

To test the stack on a real task rather than a demo, I built Alchemy Terrarium in 4 days: a browser 3D game where you gather mushrooms in a forest and brew potions from them in a cauldron in a greenhouse. The 3D scenes run on Threlte (three.js), particle effects on Pixi.js on top of the 3D, the UI and game state on Svelte 5 — all in TypeScript and SvelteKit with a static build. The stack proved itself and was adopted for new projects. Later I compressed the game's 3D models with gltf-transform and meshopt: it now loads 9.7 MB on start instead of 76.4 MB.

Svelte 5SvelteKitThrelteThree.jsPixi.jsTypeScriptGSAP
16
Case 4 of 5

This website

Personal project

09.2026

62 KB JS on the first screen
0 frames at rest
139 KB 3D, after the page loads

Build measurements, gzip

Role and constraints
  • Personal project
  • Speed is the main requirement
  • GitHub Pages and my own metrics service in Go
Problem

A portfolio of a developer whose main argument is performance. The site itself has to be the proof: 3D, animations, and interactivity — while still flying on any phone.

Solution
  1. 1

    SvelteKit with prerendering

    Every page is ready-made HTML; the first screen ships only the JS it needs

  2. 2

    3D with no weight at start

    The Threlte prism and Pixi scenes load after the page and render frames only while animating

  3. 3

    The site measures itself

    Live metrics in the visitor's browser via the Performance API, no libraries

  4. 4

    A PWA with no extra traffic

    The service worker caches only what the visitor has already downloaded

Full story

The site was rewritten from React to SvelteKit with prerendering: every page is ready-made HTML, and the first screen ships only the JS it needs. The Threlte prism and Pixi scenes load after the page and render frames only while animating, then fall asleep at rest. The metrics in “Why me” are live measurements in the visitor's browser via the Performance API. A service worker makes the site a PWA and caches only what the visitor has already downloaded.

SvelteKitSvelte 5ThrelteThree.jsPixi.jsWebGLPWA
17
Case 5 of 5

My own language: JavaScript on every core

Open source

10.2026

×8.1 faster with go for
×5.4 faster with goroutines counting primes: 10 goroutines vs one thread
1291 tests
30K lines of TypeScript

Numbers from the repository: go for as measured on the docs home page, goroutines from the docs example in Node; both on a 14-core Apple M4 Pro

Example
func isPrime(n number) bool {
    for let d = 2; d * d <= n; d++ {
        if n % d == 0 {
            return false
        }
    }
    return n > 1
}

const primes = make([]uint8, 10_000_000)

go for i, _ in primes {
    primes[i] = isPrime(i) ? 1 : 0
}

The same loop, one word longer: go for splits the array into parts, several per core, and runs them as goroutines on whichever cores are free. On the 14 cores of an Apple M4 Pro it is 8.1 times faster than one thread.

Role and constraints
  • Open source
  • Language, compiler and tooling from scratch
  • Published on npm
Problem

JavaScript runs on one thread: a heavy computation takes one core and blocks everything else, while Web Workers need separate files, postMessage and copying data by hand. I wanted to write parallel code as simply as in Go — with strict types and without paying for the convenience in the bundle.

Solution
  1. 1

    Goroutines on real threads

    go f(x) runs a function in a pool of workers, one per core, and gives a Promise of the result

  2. 2

    go for: a loop on every core

    The array is split into parts, several per core, and each runs on the first free one: ×8.1 on 14 cores

  3. 3

    Channels and select

    Goroutines on different threads pass values through channels, wait on several at once and time out, as in Go

  4. 4

    Types that know about threads

    The compiler moves the functions a worker needs by itself and checks before the run that the data can be copied to another thread

  5. 5

    TypeScript and npm interop

    Types of packages and the DOM come from .d.ts files, and the compiler writes .d.ts for its own modules

  6. 6

    Tooling around the language

    An npm package, a CLI, a Vite plugin, a VS Code extension and docs with a playground, written in Rook itself

Full story

I built Rook, a language with JavaScript semantics, Go syntax and static types, focused on speed and concurrency. go f(x) runs a function as a goroutine in a pool of Web Workers or worker threads, one thread per core, and gives a Promise of the result; channels, select, after and tick work as in Go. go for is the same loop over an array, one word longer: the array is split into parts, several per core, and each runs on the first free core. On the 14 cores of an Apple M4 Pro such a loop is 8.1 times faster than one thread. The compiler moves the function and everything it uses into the worker by itself and checks before the program runs that what goes to another thread can be copied there: a function, a class instance or a DOM element cannot be sent. The compiler is written in TypeScript: a lexer, a parser and a type checker with generics, union types, null safety and narrowing. It reads the types of npm packages and the DOM from .d.ts files and writes .d.ts files for Rook modules, so the language works with any npm library in both directions. Code compiles to readable JavaScript with a small runtime for channels and goroutines, imported by name; components compile to direct DOM calls, with no virtual DOM. Around the language there is the rooklang npm package, a CLI, a Vite plugin, a VS Code extension and documentation written in Rook itself, with a playground right in the browser.

TypeScriptCompilersConcurrencyWeb WorkersViteVS Code

Qwern_9876r

Dmitry Sotnikov

I make complex systems stable, fast and scalable

© 2026 Qwern_9876r · Dmitry Sotnikov