Full-stack developer and AI integrator, working mostly in TypeScript — Node.js services and APIs on the back end, Vue 3 on the front, and LLM pipelines wired into products rather than bolted on afterwards: embeddings and deduplication, classification, rewriting and translation, with the orchestration and the guardrails around them.
In open source I work across the Vue toolchain, layer by layer — the renderer (vuejs/core,
mostly Vapor mode), the linter (eslint-plugin-vue), the type tooling (language-tools) and
the test layer (test-utils). 180 merged PRs so far.
name: "Valentin Youshkevich"
handle: ValentinYoushkevich
focus:
- "Full-stack TypeScript — Node.js, Fastify, Express, Prisma / PostgreSQL"
- "Vue 3 · Vite · Tailwind on the client"
- "AI integrations — LLM pipelines, embeddings, local and hosted models"
open_source: "Vue ecosystem — core (Vapor mode), eslint-plugin-vue, test-utils, language-tools"
house_rules:
- "A failing test before the fix, always"
- "Smallest sufficient change — no drive-by cleanup"
- "If it claims a perf win, it ships with numbers"I don't wait for bug reports. I collected ~700k real-world Vue components from npm and run them
through the tool under test — the compiler, the Vapor renderer, the linter, the test utils — against
an oracle that says what should happen: the VDOM renderer for Vapor, plain createApp for
test-utils. Disagreements are clustered by root cause, and each cluster becomes a failing test
before it becomes a patch.
Merged — 180 PRs: 107 in vuejs/core · 60 in eslint-plugin-vue · 9 in test-utils · 3 in language-tools · 1 in typescript-eslint
In vuejs/core — 107 pull requests, mostly in Vapor mode:
| Area | What I fixed | PRs |
|---|---|---|
runtime-vapor — KeepAlive |
A cached VDOM child kept stale props; a component reactivated in a nested branch never unmounted; an include/exclude change dropped the current branch |
#15560, #15526, #15525 |
runtime-vapor — hydration |
Multi-root async components desynced the walk; empty text blocks were hydrated out of place; a null value binding crashed |
#15532, #15534, #15541 |
runtime-vapor — VDOM interop |
Nested VDOM content was not unmounted; a VDOM child rooted at a slot outlet resolved to the wrong nodes; slots never reached VDOM async components; a dynamic component remounted same-type vnodes instead of patching them; $el and other $ properties broke on exposed Vapor instances read from VDOM refs |
#15524, #15542, #15513, #15631, #15624 |
runtime-vapor — rendering |
v-for item order broke around empty nested branches; transition classes were wiped by a class update; deferred teleport children fired update hooks on mount; bound checked / selected were not mirrored to attributes, so a form reset undid them |
#15529, #15528, #15527, #15636 |
compiler-vapor — expressions |
Repeated expressions were replaced by text match instead of AST range; optional-chain prefixes and member expressions with unsupported keys were cached unsafely | #15538, #15530, #15540 |
compiler-vapor — output parity |
Raw values lost on v-model; number literals lost on slot outlet props; the leading newline of <pre> / <textarea> dropped; key wrongly honoured on <template> branches; static attribute values and comments decoded twice; nullish dynamic v-bind arguments were rendered instead of dropped |
#15553, #15539, #15543, #15514, #15509, #15563, #15620 |
Also merged: #16097, #16096, #16095, #16094, #16073, #15993, #15991, #15969, #15952, #15950, #15909, #15906, #15875, #15874, #15863, #15841, #15835, #15834, #15831, #15830, #15828, #15826, #15813, #15810, #15808, #15807, #15799, #15797, #15796, #15779, #15772, #15771, #15763, #15754, #15751, #15747, #15745, #15744, #15742, #15739, #15738, #15733, #15722, #15721, #15720, #15719, #15714, #15713, #15709, #15707, #15706, #15705, #15698, #15669, #15667, #15666, #15665, #15664, #15657, #15656, #15655, #15654, #15647, #15646, #15623, #15621, #15606, #15601, #15594, #15588, #15587, #15583, #15575, #15574, #15552, #15550, #15522, #15520, #15511, #15510, #15506, #15497 in vuejs/core, plus eslint-plugin-vue#3236, test-utils#2993, eslint-plugin-vue#3227, eslint-plugin-vue#3219, eslint-plugin-vue#3209, eslint-plugin-vue#3208, eslint-plugin-vue#3207, eslint-plugin-vue#3206, eslint-plugin-vue#3202, test-utils#2978, eslint-plugin-vue#3201, test-utils#2977, eslint-plugin-vue#3200, eslint-plugin-vue#3199, eslint-plugin-vue#3198, test-utils#2975, eslint-plugin-vue#3197, test-utils#2974, eslint-plugin-vue#3196, eslint-plugin-vue#3191, eslint-plugin-vue#3190, eslint-plugin-vue#3189, eslint-plugin-vue#3188, eslint-plugin-vue#3187, eslint-plugin-vue#3186, eslint-plugin-vue#3185, language-tools#6275, eslint-plugin-vue#3184, eslint-plugin-vue#3183, eslint-plugin-vue#3181, eslint-plugin-vue#3180, eslint-plugin-vue#3179, eslint-plugin-vue#3178, eslint-plugin-vue#3177, eslint-plugin-vue#3174, eslint-plugin-vue#3173, eslint-plugin-vue#3169, eslint-plugin-vue#3165, eslint-plugin-vue#3164, test-utils#2971, eslint-plugin-vue#3163, eslint-plugin-vue#3162, eslint-plugin-vue#3161, eslint-plugin-vue#3160, eslint-plugin-vue#3159, eslint-plugin-vue#3158, eslint-plugin-vue#3157, test-utils#2965, test-utils#2963, eslint-plugin-vue#3155, eslint-plugin-vue#3154, eslint-plugin-vue#3151, eslint-plugin-vue#3150, test-utils#2957, language-tools#6232, language-tools#6214, eslint-plugin-vue#3146, eslint-plugin-vue#3145, eslint-plugin-vue#3144, eslint-plugin-vue#3143, eslint-plugin-vue#3142, eslint-plugin-vue#3141, eslint-plugin-vue#3125, eslint-plugin-vue#3124, eslint-plugin-vue#3123, eslint-plugin-vue#3122, typescript-eslint#12697, eslint-plugin-vue#3119, eslint-plugin-vue#3118, eslint-plugin-vue#3116, eslint-plugin-vue#3115, eslint-plugin-vue#3114 and eslint-plugin-vue#3113.
In review — open pull requests in
eslint-plugin-vue (13),
vuejs/core (8),
element-plus (4),
vite (3),
language-tools (3),
test-utils (3),
vueuse (2),
eslint (1) and
vue-eslint-parser (1),
including two new eslint-plugin-vue rules.
| Project | What it is | Stack |
|---|---|---|
| clever-vibe | Tracks where AI assistants actually help in development: each use is logged in 20–30 seconds against a catalogue of ~41 approaches, scored for usefulness and trust, and rolled up into frequency × usefulness quadrants, stage coverage and per-approach spread — with averages muted below N = 5. | TypeScript · Fastify · Prisma/PostgreSQL · Vue 3 · PrimeVue · Vitest · Docker |
| news-poster | News pipeline for Telegram channels: RSS collection, embedding-based deduplication, local bucket classification, LLM rewrite and translation, preview and publishing from a Vue 3 admin panel. | TypeScript · Express · Prisma/PostgreSQL · Vue 3 · Ollama · OpenRouter · n8n · Docker |
| palisad | Offline-first PWA for plant nurseries: a QR-tagged plant registry, field operations log, movements and printable PDF labels — the whole workflow runs with no connection and reconciles when one returns. | Vue 3 · Dexie/IndexedDB · Workbox · Express 5 · PostgreSQL · Knex · pdfkit |
| cleverlog | Employee time-tracking system — per-project logging, roles, and validation rules, built from a written spec. | JavaScript · Node.js · Vue |
| patientDataCollector | Chrome/Edge extension (Manifest V3) that collects patient referral fields straight from EMR pages, lets the missing ones be filled in by hand, attaches saved provider data and posts the result as JSON to a configured endpoint. | JavaScript · Vue · Manifest V3 |

