[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"\u002Fapi\u002Fabout-en":3,"site-settings":6,"\u002Fapi\u002Fresume\u002Fexperience-en":12,"\u002Fapi\u002Fresume\u002Feducation-en":72,"\u002Fapi\u002Fskills-en":78},{"id":4,"text":5},1,"Frontend developer, 4+ years in enterprise fintech (SberSpasibo, Pochta Bank). Core stack — Vue.js 3 and Nuxt.js (2, 3, 4) with TypeScript: SSR, SSG, ISR, Pinia, design systems, Core Web Vitals. Second language — Rust: apps on Tauri 2 and ETL pipelines, with a crate of my own published on crates.io. \u003Cbr \u002F>\u003Cbr \u002F> Results: CRM request handling −50%, report generation ×3, form completion −35%, validation errors −40%, page load speed +40%. \u003Cbr \u002F>\u003Cbr \u002F> I own a task end to end: spec → review → TDD → production → monitoring. Autonomous in distributed teams; I run code reviews and mentor juniors. \u003Cbr \u002F>\u003Cbr \u002F> Open source — github.com\u002FWhoStoleMySleep: Vestibule (Rust, 4 crates, 196 tests), GitSpace and freel (Tauri 2, desktop and Android), attractions42 (Nuxt 4), the @wsms\u002Flogger npm packages and the tauri-plugin-timer crate on crates.io. \u003Cbr \u002F>\u003Cbr \u002F> Remote or hybrid, open to relocation including offers abroad. English — B1.",{"open_to_work":7,"show_search":7,"github_url":8,"telegram_url":9,"email":10,"years_experience":11},true,"https:\u002F\u002Fgithub.com\u002FWhoStoleMySleepDev","https:\u002F\u002Ft.me\u002FWhoStoleMySleep","whostolemysleep@gmail.com",4,[13,37,52],{"id":14,"company":15,"position":16,"date_from":17,"date_to":18,"order":19,"bullets":20},2,"СберСпасибо","Senior Frontend Developer (Vue 3 \u002F Nuxt 3, TypeScript)","2023-04-01",null,0,[21,24,27,30,34],{"id":22,"text":23,"order":19},54,"Request handling time −50%, operator errors −30%: a CRM interface with template scenarios for operators — Nuxt 3 (SSR), TypeScript, TanStack Query, WebSocket.",{"id":25,"text":26,"order":4},55,"Form completion −35%, validation errors −40%: a dynamic forms system on Nuxt 3 with advanced validation and state management (Composition API, Pinia).",{"id":28,"text":29,"order":14},56,"Report generation ×3: an analytics dashboard on Vue 3 — large-dataset visualisation, list virtualisation, render optimisation.",{"id":31,"text":32,"order":33},57,"Repeat visits +28%, conversion into completed tasks +45%: a personalised missions module with a progress tracker.",3,{"id":35,"text":36,"order":11},58,"Grew the design system and shared component library, optimised Core Web Vitals (LCP, INP, CLS) and Sentry monitoring, introduced a TDD process (Vitest, Playwright), ran code reviews and mentored juniors.",{"id":4,"company":38,"position":39,"date_from":40,"date_to":41,"order":4,"bullets":42},"Почта Банк","Frontend Developer (Vue 2 \u002F Nuxt 2, JavaScript)","2022-02-01","2023-03-01",[43,46,49],{"id":44,"text":45,"order":19},59,"Page load speed +40%: lazy-loading, caching, code splitting, bundle-size work; server load reduced.",{"id":47,"text":48,"order":4},60,"Input errors −25%: adaptive cross-browser forms with validation on Nuxt 2 and Vuex.",{"id":50,"text":51,"order":14},61,"Real-time interfaces over WebSocket, Sentry monitoring, migration of legacy components from the Options API to the Composition API, unit tests (Jest).",{"id":33,"company":53,"position":54,"date_from":55,"date_to":18,"order":14,"bullets":56},"Open Source и собственные продукты","Full-stack Developer (Nuxt 4 \u002F Vue 3 \u002F Rust)","2024-05-01",[57,60,63,66,69],{"id":58,"text":59,"order":19},62,"Vestibule — a desktop focus tracker in Rust: a 4-crate cargo workspace, a background worker, a privileged helper over a Unix socket, SQLite. 196 tests.",{"id":61,"text":62,"order":4},63,"freel — a time and invoicing tracker, one codebase for desktop and Android: Tauri 2, React 19, SQLite, transactional sync. The Android timer is a separate crate, tauri-plugin-timer (Rust + Kotlin), published on crates.io.",{"id":64,"text":65,"order":14},64,"GitSpace — a macOS app for git projects: Tauri 2 + Nuxt 4 + TypeScript, batched parallel git status, tokens in the system Keychain. 54 Vitest tests and 30 cargo tests.",{"id":67,"text":68,"order":33},65,"Nuxt 4: attractions42 — fully prerendered with zero runtime network calls, data prepared by a Rust pipeline of my own (tokio, reqwest); whostolemysleep.ru — a portfolio with a built-in CMS, Drizzle ORM, PostgreSQL, ISR, EN\u002FRU.",{"id":70,"text":71,"order":11},66,"@wsms\u002Flogger and @wsms\u002Flogger-connect-nuxt — npm packages: a zero-dependency structured logger for Node.js and a Nuxt module with an auto-imported useLogger().",[73],{"id":4,"institution":74,"specialization":75,"date_from":76,"date_to":77,"order":19},"Национальный исследовательский Томский политехнический университет","Information Systems and Technologies — incomplete higher education","2021-09-01","2023-05-20",[79,110,182,231,257,285,316],{"id":4,"slug":80,"name":81,"skills":82},"languages","Languages",[83,86,89,92,95,98,102,106],{"id":84,"name":85,"order":19},157,"TypeScript",{"id":87,"name":88,"order":4},158,"JavaScript (ES6+)",{"id":90,"name":91,"order":14},159,"Rust",{"id":93,"name":94,"order":33},160,"SQL",{"id":96,"name":97,"order":11},161,"HTML5",{"id":99,"name":100,"order":101},162,"CSS3",5,{"id":103,"name":104,"order":105},163,"SCSS \u002F SASS",6,{"id":107,"name":108,"order":109},164,"Английский — B1",7,{"id":14,"slug":111,"name":112,"skills":113},"frameworks","Vue & Nuxt",[114,117,120,123,126,129,132,135,138,142,146,150,154,158,162,166,170,174,178],{"id":115,"name":116,"order":19},138,"Vue.js",{"id":118,"name":119,"order":4},139,"Vue 3",{"id":121,"name":122,"order":14},140,"Vue 2",{"id":124,"name":125,"order":33},141,"Nuxt.js",{"id":127,"name":128,"order":11},142,"Nuxt 4",{"id":130,"name":131,"order":101},143,"Nuxt 3",{"id":133,"name":134,"order":105},144,"Nuxt 2",{"id":136,"name":137,"order":109},145,"Composition API",{"id":139,"name":140,"order":141},146,"Options API",8,{"id":143,"name":144,"order":145},147,"Pinia",9,{"id":147,"name":148,"order":149},148,"Vuex",10,{"id":151,"name":152,"order":153},149,"Vue Router",11,{"id":155,"name":156,"order":157},150,"TanStack Query",12,{"id":159,"name":160,"order":161},151,"nuxt-i18n",13,{"id":163,"name":164,"order":165},152,"Nitro",14,{"id":167,"name":168,"order":169},153,"SSR",15,{"id":171,"name":172,"order":173},154,"SSG",16,{"id":175,"name":176,"order":177},155,"ISR",17,{"id":179,"name":180,"order":181},156,"SPA",18,{"id":11,"slug":183,"name":184,"skills":185},"instruments","Tools & processes",[186,189,192,195,198,201,204,207,210,213,216,219,222,225,228],{"id":187,"name":188,"order":19},190,"Git",{"id":190,"name":191,"order":4},191,"GitLab",{"id":193,"name":194,"order":14},192,"Docker",{"id":196,"name":197,"order":33},193,"CI\u002FCD",{"id":199,"name":200,"order":11},194,"GitHub Actions",{"id":202,"name":203,"order":101},195,"GitLab CI",{"id":205,"name":206,"order":105},196,"Vercel",{"id":208,"name":209,"order":109},197,"Vite",{"id":211,"name":212,"order":141},198,"Webpack",{"id":214,"name":215,"order":145},199,"Tailwind CSS",{"id":217,"name":218,"order":149},200,"Figma",{"id":220,"name":221,"order":153},201,"Jira",{"id":223,"name":224,"order":157},202,"Agile \u002F Scrum",{"id":226,"name":227,"order":161},203,"Дизайн-системы",{"id":229,"name":230,"order":165},204,"Feature-Sliced Design",{"id":105,"slug":232,"name":91,"skills":233},"rust",[234,236,239,242,245,248,251,254],{"id":235,"name":91,"order":19},165,{"id":237,"name":238,"order":4},166,"Tauri 2",{"id":240,"name":241,"order":14},167,"tokio",{"id":243,"name":244,"order":33},168,"serde",{"id":246,"name":247,"order":11},169,"SQLite (rusqlite)",{"id":249,"name":250,"order":101},170,"reqwest",{"id":252,"name":253,"order":105},171,"cargo test",{"id":255,"name":256,"order":109},172,"crates.io",{"id":109,"slug":258,"name":259,"skills":260},"backend","Backend & data",[261,264,267,270,273,276,279,282],{"id":262,"name":263,"order":19},173,"Node.js",{"id":265,"name":266,"order":4},174,"REST API",{"id":268,"name":269,"order":14},175,"GraphQL",{"id":271,"name":272,"order":33},176,"WebSocket",{"id":274,"name":275,"order":11},177,"PostgreSQL",{"id":277,"name":278,"order":101},178,"Drizzle ORM",{"id":280,"name":281,"order":105},179,"Prisma",{"id":283,"name":284,"order":109},180,"JWT \u002F OAuth",{"id":141,"slug":286,"name":287,"skills":288},"testing","Testing & performance",[289,292,295,298,301,304,307,310,313],{"id":290,"name":291,"order":19},181,"Vitest",{"id":293,"name":294,"order":4},182,"Jest",{"id":296,"name":297,"order":14},183,"Playwright",{"id":299,"name":300,"order":33},184,"Cypress",{"id":302,"name":303,"order":11},185,"TDD",{"id":305,"name":306,"order":101},186,"Code review",{"id":308,"name":309,"order":105},187,"Core Web Vitals (LCP, INP, CLS)",{"id":311,"name":312,"order":109},188,"Lighthouse",{"id":314,"name":315,"order":141},189,"Sentry",{"id":145,"slug":317,"name":318,"skills":319},"adjacent","Adjacent stack",[320,323,326,329,332,335,338],{"id":321,"name":322,"order":19},205,"React",{"id":324,"name":325,"order":4},206,"Next.js",{"id":327,"name":328,"order":14},207,"Redux \u002F Zustand",{"id":330,"name":331,"order":33},208,"React Native",{"id":333,"name":334,"order":11},209,"Expo",{"id":336,"name":337,"order":101},210,"Nest.js",{"id":339,"name":340,"order":105},211,"Express"]