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