[{"data":1,"prerenderedAt":227},["ShallowReactive",2],{"work-en":3},[4,38,61,89,112,135,158,171,192,200,209],{"locale":5,"slug":6,"title":7,"description":8,"category":9,"year":10,"context":11,"stack":12,"results":25},"en","product-image-editor","A product image editor inside the inSales admin, built in Vue","A full-screen Vue editor where merchants build product infographics with templates and AI tools. Used by 3,000+ active inSales clients, with 800+ AI operations a day.","Browser editors","Mar 2025 – Sep 2026","inSales",[13,14,15,16,17,18,19,20,21,22,23,24],"Vue 3","TypeScript","FabricJS","Complex UI","Composition API","E-Commerce Development","Frontend Architecture","SCSS","Web Application Development","API Integration","AI-Powered Image Editing","Front-End Development",[26,29,32,35],{"value":27,"label":28},"3,000+","active inSales clients use the editor, according to product analytics",{"value":30,"label":31},"800+","AI operations a day in the editor, including background removal and text generation",{"value":33,"label":34},"2–3 min","to apply one set of edits to 10 product images with bulk transfer, instead of 5–10 min by hand",{"value":36,"label":37},"2","production contexts for one editor component, product images and the visual site editor",{"locale":5,"slug":39,"title":40,"description":41,"category":9,"year":42,"context":11,"stack":43,"results":51},"visual-storefront","Visual site editor redesign for inSales storefronts","I implemented the frontend of a redesigned no-code site editor now used by more than 90% of inSales stores, and added a recovery mode for pages broken by custom widget code.","May 2024 – Aug 2024",[44,14,16,24,19,45,20,46,47,22,48,21,18,49,50],"Vue.js","JavaScript","Vuetify","Mixpanel","State Management","Customer Onboarding","E-commerce Optimization",[52,55,58],{"value":53,"label":54},"90%+","of inSales stores use the redesigned editor",{"value":56,"label":57},"60% → 80%","new users who changed and saved a template or widget setting on their own in the first session",{"value":59,"label":60},"≈17%","wider storefront preview on a 1920 px screen with the controls closed",{"locale":5,"slug":62,"title":63,"description":64,"category":65,"year":66,"context":65,"stack":67,"results":82},"image-editor","An open-source image editor core in TypeScript and FabricJS","A browser image editor library with a public API, full state serialization, templates, snapping and export to four formats. Image loading became more than 2× faster after I reworked how image data is stored.","Open source","Mar 2025 – present",[14,15,68,45,69,70,71,72,73,74,75,48,24,76,77,78,19,79,80,81],"HTML Canvas","Vite","Technical Documentation","Playwright","Problem Solving","E2E","Web Workers","Web Performance","AI-Assisted Software Development","Jest","npm","End-to-end Testing","CI\u002FCD","Git",[83,86],{"value":84,"label":85},">2×","faster image loading after replacing base64 image data with Blob and Object URLs",{"value":87,"label":88},"4","export formats from one composition, PNG, JPEG, SVG and PDF",{"locale":5,"slug":90,"title":91,"description":92,"category":93,"year":94,"context":95,"stack":96,"results":102},"frontend-jobs-radar","Frontend Jobs Radar: a job channel with a cheap AI check before every post","A TypeScript service on Cloudflare Workers that collects frontend vacancies, checks each one with JEV and posts short English summaries to a public Telegram channel. New roles went out on 32 of 34 days since launch.","Side projects","Sep 2026 – present","Side project",[14,97,98,99,100,101],"Cloudflare Workers","Cloudflare D1","JEV","AI Integration","Telegram Bot API",[103,106,109],{"value":104,"label":105},"32 of 34","days with new vacancies in the public channel, 20 Sep – 23 Oct 2026",{"value":107,"label":108},"≈$0.00008","per JEV relevance check of about 2,000 input tokens",{"value":110,"label":111},"20","Telegram channels in the collector, next to career pages, ATS platforms and job boards",{"locale":5,"slug":113,"title":114,"description":115,"category":116,"year":117,"context":11,"stack":118,"results":128},"abandoned-carts","Abandoned carts: a paid inSales product for merchants","Analytics, cart history, filters and manual, bulk and automatic reminders in the inSales admin. I was the sole frontend developer; the product has 200+ active paid subscribers.","Merchant tools","Oct 2024 – Apr 2025",[44,45,119,120,24,48,121,122,70,123,124,18,125,126,127],"Data Visualization","REST APIs","Responsive Web Design","Requirements Analysis","Vue Router","Monaco Editor","Software Architecture","ApexCharts","Software as a Service (SaaS)",[129,132],{"value":130,"label":131},"200+","active paid subscribers by September 2026",{"value":133,"label":134},"15%","of one merchant's customers returned to complete a purchase, per an inSales case study (May 2025)",{"locale":5,"slug":136,"title":137,"description":138,"category":139,"year":140,"context":11,"stack":141,"results":148},"storefront-product-loading","Faster product loading and caching for storefronts","I rebuilt how the inSales storefront library loads and caches products. Product-data requests fell by about 70%, and product-heavy pages loaded in 2–3 seconds instead of over 5.","Storefront platform","Dec 2024 – May 2025",[45,142,75,143,144,145,22,70,146,147],"IndexedDB","AJAX","Web Caching","Debugging","Cross-browser Compatibility","Liquid",[149,152,155],{"value":150,"label":151},"≈70%","fewer product-data requests in a before\u002Fafter comparison of request counts",{"value":153,"label":154},"2–3 s","load time of product-heavy pages that took over 5 s, in representative measurements",{"value":156,"label":157},"10+","standard templates checked, plus real client pages",{"locale":5,"slug":159,"title":160,"description":161,"category":139,"year":162,"context":11,"stack":163,"results":167},"commonjs-storefront-library","Maintaining the JavaScript library behind every inSales storefront","I took over CommonJS, the neglected library that runs product pages, carts and forms on inSales storefronts. I cut its compressed bundle from over 300 KB to 168 KB and kept extending it for several years.","Oct 2021 – Sep 2026",[45,75,164,165,143,142,144,70,145,166],"Webpack","Code Refactoring","E-Commerce",[168],{"value":169,"label":170},"300+ KB → 168 KB","compressed production bundle after the build and dependency rework",{"locale":5,"slug":172,"title":173,"description":174,"category":9,"year":175,"context":11,"stack":176,"results":185},"monaco-editor","Custom Monaco code editor for Liquid templates","A shared Monaco-based editor for mixed HTML, Liquid, CSS and JavaScript, used in five inSales product interfaces. I built the first integration and maintained it for more than three years.","Jul 2022 – Nov 2025",[124,14,147,45,177,44,164,22,80,178,179,20,180,181,182,183,184],"Front-End Architecture","Gitlab","Ruby on Rails","HTML","Developer Tools","Software Maintenance","Syntax Highlighting","Autocomplete",[186,189],{"value":187,"label":188},"5","inSales product interfaces run on the same editor build",{"value":190,"label":191},"3+ years","as primary maintainer, from July 2022 to October 2025",{"locale":5,"slug":193,"title":194,"description":195,"category":139,"year":196,"context":11,"stack":197,"results":199},"multi-warehouse-carts","Multi-warehouse carts for wholesale buyers","Warehouse-specific carts for inSales wholesale storefronts. Buyers set quantities per warehouse, and the shared storefront library sends changes for several warehouses in one request. In production by November 2023.","Aug 2023 – Nov 2023",[45,198,143,48,166,145,24,22,122],"API Development",[],{"locale":5,"slug":201,"title":202,"description":203,"category":139,"year":204,"context":11,"stack":205,"results":208},"product-options","Product options and add-ons in storefront carts","I built product options for the inSales storefront library, from the selection component and pricing to cart operations, so shoppers can buy the same variant with different extras as separate cart lines.","Jan 2025 – Apr 2025",[45,198,143,24,166,70,206,207,145],"HTML5","CSS",[],{"locale":5,"slug":210,"title":211,"description":212,"category":139,"year":213,"context":11,"stack":214,"results":219},"form-protection","Bot protection for checkout and customer forms","Invisible CAPTCHA built into the submit flow of inSales checkout, customer accounts and store forms, followed by a choice between Google reCAPTCHA and Yandex SmartCaptcha through one store setting.","Oct 2023 – Jul 2026",[45,215,216,147,217,218],"Vue","Slim","Google reCAPTCHA","Yandex SmartCaptcha",[220,222,225],{"value":36,"label":221},"CAPTCHA providers, Google and Yandex, available for supported store forms",{"value":223,"label":224},"3","checkout generations integrated: 1.0, 2.0 and 3.0",{"value":87,"label":226},"storefront form families in the shared JavaScript library",1793195987814]