[{"data":1,"prerenderedAt":1598},["ShallowReactive",2],{"projects:en:all:":3,"project:en:power-yoga":1571},[4,224,399,529,624,765,905,1013,1114,1187,1262,1397,1443,1490,1531],{"id":5,"title":6,"body":7,"company":176,"confidential":177,"cover":178,"description":179,"extension":180,"featured":177,"gallery":181,"links":191,"meta":192,"metrics":193,"navigation":177,"order":203,"path":204,"role":205,"seo":206,"stack":207,"stem":221,"year":222,"__hash__":223},"projects_en\u002Fwork\u002Fdyzlix.md","Dyzlix — Smart Fuel System",{"type":8,"value":9,"toc":168},"minimark",[10,15,19,23,30,80,83,86,128,132],[11,12,14],"h2",{"id":13},"the-product","The product",[16,17,18],"p",{},"Fuel is one of the biggest costs for a trucking company. Dyzlix suggests the best fuel stops by route, price and availability. Bookers assign stops to drivers, card transactions (EFS \u002F Relay) are matched back to bookings, and managers see savings, MPG and idling on one dashboard.",[11,20,22],{"id":21},"my-role","My role",[16,24,25,29],{},[26,27,28],"strong",{},"I built the Dyzlix frontend from scratch and own it end to end."," I started the codebase in October 2024 and set up everything around it myself:",[31,32,33,45,62,68,74],"ul",{},[34,35,36,39,40,44],"li",{},[26,37,38],{},"Architecture"," — the layered ",[41,42,43],"code",{},"app → pages → modules → shared"," structure, the data-flow conventions and the module template every feature follows.",[34,46,47,54,55],{},[48,49,50,53],"if-backend",{},[26,51,52],{},"Infrastructure"," — Vite build, TypeScript configuration, multi-stage Docker images for staging and production served by nginx, environment handling and release versioning."," ",[48,56,58,61],{":off":57},"true",[26,59,60],{},"Build setup"," — Vite build, TypeScript configuration, environment handling and release versioning.",[34,63,64,67],{},[26,65,66],{},"Developer experience & quality"," — ESLint and Prettier, Conventional Commits, git hooks with type-check, design-token, import-boundary and bundle-budget gates, unit tests and the Playwright smoke harness.",[34,69,70,73],{},[26,71,72],{},"Design system"," — the shared UI kit, design tokens and dark mode.",[34,75,76,79],{},[26,77,78],{},"Features"," — most of the product: dashboard, Fuel Book, live tracking board, cards, transactions, idling, permissions and settings.",[16,81,82],{},"Today I am the main author of the codebase (1,100+ commits) and the reference for how new features are built.",[11,84,38],{"id":85},"architecture",[31,87,88,102,112,122],{},[34,89,90,93,94,96,97,101],{},[26,91,92],{},"Layered structure"," — ",[41,95,43],{},", close to Feature-Sliced Design. A boundaries script enforces import direction with a ratchet that only fails on ",[98,99,100],"em",{},"new"," violations.",[34,103,104,107,108,111],{},[26,105,106],{},"One data flow everywhere"," — page → view → composable → typed query hook in ",[41,109,110],{},"shared\u002Fapi",", with TanStack Query for server state.",[34,113,114,117,118,121],{},[26,115,116],{},"Permission-aware UI"," — ~65 fine-grained ",[41,119,120],{},"CAN_*"," permissions and provider access (EFS vs Relay) gate every view.",[34,123,124,127],{},[26,125,126],{},"Realtime"," — STOMP over WebSocket for fuel notifications and card events.",[11,129,131],{"id":130},"highlights","Highlights",[31,133,134,140,150,156,162],{},[34,135,136,139],{},[26,137,138],{},"Live tracking board"," — a virtualized vehicle list, HERE Maps markers and routes, route replay and D3 fuel-level timelines.",[34,141,142,145,146,149],{},[26,143,144],{},"Ratcheted quality gates"," in the pre-push hook: type-check, design-token gate (no new raw colours), import boundaries, a ~200 KB gzip bundle budget, licence allowlist and ",[41,147,148],{},"pnpm audit",".",[34,151,152,155],{},[26,153,154],{},"Zero-downtime releases"," — builds are stamped with a content hash; open tabs pick up a new release on the next navigation and recover from stale chunks automatically.",[34,157,158,161],{},[26,159,160],{},"Smoke harness"," — every route is tested at 2 viewports × 2 themes, checking console errors, failed requests and screenshot diffs.",[34,163,164,167],{},[26,165,166],{},"17 ADRs"," document the key architectural decisions.",{"title":169,"searchDepth":170,"depth":170,"links":171},"",2,[172,173,174,175],{"id":13,"depth":170,"text":14},{"id":21,"depth":170,"text":22},{"id":85,"depth":170,"text":38},{"id":130,"depth":170,"text":131},"Longhorn Logistics Group",true,"\u002Fimages\u002Fprojects\u002Fdyzlix\u002Fcover.jpg","A fuel management platform for US trucking fleets: suggested fuel stops, bookings, card transactions, live fleet tracking and savings analytics.","md",[182,185,188],{"src":183,"alt":184,"caption":184},"\u002Fimages\u002Fprojects\u002Fdyzlix\u002Ftracking.jpg","Live tracking board: virtualized vehicle list and HERE Maps clusters",{"src":186,"alt":187,"caption":187},"\u002Fimages\u002Fprojects\u002Fdyzlix\u002Ffuel-book.jpg","Fuel Book: suggested stops, fuel levels and booking actions",{"src":189,"alt":190,"caption":190},"\u002Fimages\u002Fprojects\u002Fdyzlix\u002Fdashboard.jpg","Analytics dashboard: spend, savings, MPG and idling",{},{},[194,197,200],{"label":195,"value":196},"My commits","1,100+",{"label":198,"value":199},"Share of history","52%",{"label":201,"value":202},"Unit tests","320+",1,"\u002Fwork\u002Fdyzlix","Frontend lead · built from scratch",{"title":6,"description":179},[208,209,210,211,212,213,214,215,216,217,218,219,220],"Vue 3.5","TypeScript","Vite","Pinia","TanStack Query","TanStack Table","TanStack Virtual","HERE Maps","D3","STOMP\u002FWebSocket","Tailwind CSS 4","Vitest","Playwright","work\u002Fdyzlix",2024,"X5fXW0KKQmznX6YUDAva5bBpGRKHrsQ5AxZLi--pWxc",{"id":225,"title":226,"body":227,"company":176,"confidential":177,"cover":365,"description":366,"extension":180,"featured":177,"gallery":367,"links":380,"meta":381,"metrics":382,"navigation":177,"order":170,"path":390,"role":205,"seo":391,"stack":392,"stem":397,"year":222,"__hash__":398},"projects_en\u002Fwork\u002Fbot-manager.md","Bot Manager — Telegram & fleet operations",{"type":8,"value":228,"toc":359},[229,231,234,236,249,298,301,303,325,327],[11,230,14],{"id":13},[16,232,233],{},"Dispatch, safety and maintenance teams talk to hundreds of truck drivers through Telegram groups. Bot Manager is the panel they work in every day: it mirrors those chats, automates posts and alerts, and connects them with fleet data — drivers, units, inspections (PTI), work orders and risk zones.",[11,235,22],{"id":21},[16,237,238,241,242,54,245,248],{},[26,239,240],{},"Bot Manager is my project from the very first commit."," I created the repository in December 2024 and ",[48,243,244],{},"built the whole frontend and its infrastructure myself",[48,246,247],{":off":57},"built the whole frontend myself",":",[31,250,251,260,280,286,292],{},[34,252,253,255,256,259],{},[26,254,38],{}," — the ",[41,257,258],{},"app \u002F pages \u002F modules \u002F shared"," layering, isolated feature modules, the typed API layer and the lazy-loaded route registry with feature flags.",[34,261,262,54,275],{},[48,263,264,266,267,270,271,274],{},[26,265,52],{}," — Vite and TypeScript setup, Docker images for staging and production, automatic deploys from ",[41,268,269],{},"dev"," and ",[41,272,273],{},"main",", and release detection that prompts users to refresh after a deploy.",[48,276,277,279],{":off":57},[26,278,60],{}," — Vite and TypeScript setup, and release detection that prompts users to refresh after a deploy.",[34,281,282,285],{},[26,283,284],{},"Realtime & resilience"," — the app-wide STOMP client, reconnect strategy and graceful handling of server restarts and expired sessions.",[34,287,288,291],{},[26,289,290],{},"Developer experience"," — ESLint, Prettier, husky, lint-staged, commitlint with module-based scopes and a pre-push hook running type-check, tests and a staging build.",[34,293,294,297],{},[26,295,296],{},"Product"," — the shared UI kit and most of the 41 feature modules, including Telegram Mirror, posts, risk zones, PTI and RBAC.",[16,299,300],{},"I wrote ~80% of the codebase history (1,700+ commits) and remain its lead.",[11,302,38],{"id":85},[31,304,305,313,319],{},[34,306,307,93,310,312],{},[26,308,309],{},"Layers",[41,311,258],{},"; thin route pages, isolated feature modules that never import each other, and 35 typed API domains with queries and mutations (TanStack Query) plus Pinia for client state.",[34,314,315,318],{},[26,316,317],{},"Lazy-loaded route registry"," with build-time feature flags.",[34,320,321,324],{},[26,322,323],{},"RBAC"," — ~20 permission groups enforced on routes and down to individual chat folders.",[11,326,131],{"id":130},[31,328,329,335,341,347,353],{},[34,330,331,334],{},[26,332,333],{},"Telegram Mirror"," — a Telegram-like client with chat folders, pinned messages, media and voice, deleted-message history and search. The message list is a bidirectional, jump-capable window that loads around the viewport and re-centres on a reply or search hit.",[34,336,337,340],{},[26,338,339],{},"Resilient realtime"," — one app-wide STOMP client that keeps handlers across reconnects, queues subscriptions made before connect and resumes when the network or tab returns.",[34,342,343,346],{},[26,344,345],{},"Graceful failure"," — 502\u002F503\u002F504 shows a “server restarting” banner with backoff and refetch; only 401 signs out and returns the user to the same page; a toast offers refresh when a new deploy is live.",[34,348,349,352],{},[26,350,351],{},"Scheduling across time zones"," — multi-group posts with CT\u002FET\u002FMT\u002FPT previews, state targeting, pinning and auto-delete.",[34,354,355,358],{},[26,356,357],{},"Quality bar"," — zero type errors enforced, Conventional Commits with module-based scopes, and a pre-push hook running type-check, tests and a staging build.",{"title":169,"searchDepth":170,"depth":170,"links":360},[361,362,363,364],{"id":13,"depth":170,"text":14},{"id":21,"depth":170,"text":22},{"id":85,"depth":170,"text":38},{"id":130,"depth":170,"text":131},"\u002Fimages\u002Fprojects\u002Fbot-manager\u002Fcover.jpg","The internal operations panel of a US fleet company: a Telegram-style chat client for driver groups, scheduled posts, risk zones, inspections and role-based access.",[368,371,374,377],{"src":369,"alt":370,"caption":370},"\u002Fimages\u002Fprojects\u002Fbot-manager\u002Fmulti-post.jpg","Multi-group post scheduling across US time zones",{"src":372,"alt":373,"caption":373},"\u002Fimages\u002Fprojects\u002Fbot-manager\u002Ftelegram-mirror.jpg","Telegram Mirror: chat folders and mirrored driver groups",{"src":375,"alt":376,"caption":376},"\u002Fimages\u002Fprojects\u002Fbot-manager\u002Fcustomers.jpg","Customers: subscriptions, connected events and billing status",{"src":378,"alt":379,"caption":379},"\u002Fimages\u002Fprojects\u002Fbot-manager\u002Froles.jpg","Role-based access control",{},{},[383,385,387],{"label":195,"value":384},"1,700+",{"label":198,"value":386},"79%",{"label":388,"value":389},"Feature modules","41","\u002Fwork\u002Fbot-manager",{"title":226,"description":366},[393,209,210,211,212,217,394,215,395,396,219],"Vue 3","Leaflet","vue-i18n","Tailwind CSS","work\u002Fbot-manager","0Y_Gsyh8T9oDvOlO_fRp5_YSWlASfnV_A8dBZAkTFNc",{"id":400,"title":401,"body":402,"company":176,"confidential":177,"cover":490,"description":491,"extension":180,"featured":177,"gallery":492,"links":505,"meta":506,"metrics":507,"navigation":177,"order":515,"path":516,"role":517,"seo":518,"stack":519,"stem":526,"year":527,"__hash__":528},"projects_en\u002Fwork\u002Fload-up.md","Load Up — TMS & dispatch board",{"type":8,"value":403,"toc":484},[404,406,409,411,414,416,456,458],[11,405,14],{"id":13},[16,407,408],{},"Load Up runs a freight company end to end. Dispatchers book and track loads on a live board; fleet and maintenance teams manage vehicles, work orders and inspections; safety monitors incidents with video; accounting runs settlements and payroll — all in a single web application used every day by many departments.",[11,410,22],{"id":21},[16,412,413],{},"I joined the team in June 2026 and ship features across the board, fleet and safety modules, working inside a large, fast-moving codebase with strict conventions.",[11,415,38],{"id":85},[31,417,418,424,444,450],{},[34,419,420,423],{},[26,421,422],{},"React 19 + TanStack Router"," with file-based routes and automatic code splitting (~210 route files).",[34,425,426,429,430,433,434,433,437,433,440,443],{},[26,427,428],{},"Feature-sliced domains"," — each of the 24 modules owns its ",[41,431,432],{},"api",", ",[41,435,436],{},"components",[41,438,439],{},"hooks",[41,441,442],{},"schemas"," and store.",[34,445,446,449],{},[26,447,448],{},"Server state"," with TanStack Query and optimistic updates; client state with Zustand; forms with react-hook-form and Zod.",[34,451,452,455],{},[26,453,454],{},"Fine-grained permissions"," — a central permission catalog referenced across hundreds of components.",[11,457,131],{"id":130},[31,459,460,466,472,478],{},[34,461,462,465],{},[26,463,464],{},"Live everything"," — STOMP\u002FWebSocket channels keep the load board, loads, notifications and safety data in sync; RingCentral WebRTC calling is built into the app.",[34,467,468,471],{},[26,469,470],{},"Big data, smooth UI"," — a shared virtualized table (TanStack Table + Virtual) and map views with clustering and spatial indexing.",[34,473,474,477],{},[26,475,476],{},"Multi-tab correctness"," — operator activity is reported from a single tab using Web Locks and BroadcastChannel.",[34,479,480,483],{},[26,481,482],{},"Fast feedback"," — the Vitest setup is split into node and jsdom projects, cutting the suite from 8.5 s to 3.65 s.",{"title":169,"searchDepth":170,"depth":170,"links":485},[486,487,488,489],{"id":13,"depth":170,"text":14},{"id":21,"depth":170,"text":22},{"id":85,"depth":170,"text":38},{"id":130,"depth":170,"text":131},"\u002Fimages\u002Fprojects\u002Fload-up\u002Fcover.jpg","A large transportation management system for a freight company: live load board, trips, fleet maintenance, safety monitoring, accounting and HR in one React app.",[493,496,499,502],{"src":494,"alt":495,"caption":495},"\u002Fimages\u002Fprojects\u002Fload-up\u002Fdashboard.jpg","Operations dashboard: KPIs and a live map of 600+ drivers",{"src":497,"alt":498,"caption":498},"\u002Fimages\u002Fprojects\u002Fload-up\u002Fupdate-board.jpg","Update Board: fleet status, trailers and locations in one virtualized table",{"src":500,"alt":501,"caption":501},"\u002Fimages\u002Fprojects\u002Fload-up\u002Ftrips.jpg","Trips: pickups, deliveries and dispatch status",{"src":503,"alt":504,"caption":504},"\u002Fimages\u002Fprojects\u002Fload-up\u002Froute-planner.jpg","Truck route planner on HERE Maps with weigh stations",{},{},[508,511,513],{"label":509,"value":510},"Codebase","~3,100 files",{"label":388,"value":512},"24",{"label":195,"value":514},"250+",3,"\u002Fwork\u002Fload-up","Frontend engineer",{"title":401,"description":491},[520,209,521,522,212,213,214,523,217,524,525,394,218,219],"React 19","Vite 8","TanStack Router","Zustand","WebRTC","MapLibre","work\u002Fload-up",2026,"4GIReWmMg6m5q_t3Idd6N5MxDngjyVjRqwzbIVzXhXU",{"id":530,"title":531,"body":532,"company":594,"confidential":595,"cover":596,"description":597,"extension":180,"featured":177,"gallery":598,"links":599,"meta":602,"metrics":603,"navigation":177,"order":613,"path":614,"role":615,"seo":616,"stack":617,"stem":622,"year":527,"__hash__":623},"projects_en\u002Fwork\u002Fexpensify.md","Expensify — open-source contributions",{"type":8,"value":533,"toc":589},[534,538,548,552,582,586],[11,535,537],{"id":536},"context","Context",[16,539,540,547],{},[541,542,546],"a",{"href":543,"rel":544},"https:\u002F\u002Fgithub.com\u002FExpensify\u002FApp",[545],"nofollow","Expensify"," is an open-source expense management and chat app built with React Native and React Native Web, shipped to millions of users on web, iOS and Android. Contributors pick up issues from a public queue, write a proposal and ship the fix through a strict review and QA process.",[11,549,551],{"id":550},"what-i-worked-on","What I worked on",[31,553,554,560,566,572],{},[34,555,556,559],{},[26,557,558],{},"Expense reports & duplicates"," — hid duplicate violations on IOU reports, fixed “Keep selected” for duplicates in transaction threads, kept multi-expense drafts submittable.",[34,561,562,565],{},[26,563,564],{},"Search & optimistic updates"," — seeded modified keys in the optimistic Search snapshot so SmartScan results stay consistent, fixed scan-failed moves and expense row flicker.",[34,567,568,571],{},[26,569,570],{},"Workspaces & Expensify Card"," — blocked removing members who hold an active Expensify Card, disabled payment actions when workspace payments are off, showed GL codes for categories.",[34,573,574,577,578,581],{},[26,575,576],{},"Navigation & UX"," — fixed a back-button loop after copiloting into an agent, kept the current tab for ",[41,579,580],{},"exitTo"," links, fixed offline indicator and safe-area overlaps.",[11,583,585],{"id":584},"what-it-taught-me","What it taught me",[16,587,588],{},"Working in a large, mature codebase means respecting its patterns: optimistic data with Onyx, offline-first behaviour, strict typing and tests for every change — and writing proposals that reviewers can approve quickly.",{"title":169,"searchDepth":170,"depth":170,"links":590},[591,592,593],{"id":536,"depth":170,"text":537},{"id":550,"depth":170,"text":551},{"id":584,"depth":170,"text":585},null,false,"\u002Fimages\u002Fprojects\u002Fexpensify.jpg","25 merged pull requests to Expensify’s production React Native app — fixes and features across expense reports, search, offline flows and workspace management.",[],{"live":600,"source":601},"https:\u002F\u002Fnew.expensify.com","https:\u002F\u002Fgithub.com\u002FExpensify\u002FApp\u002Fpulls?q=is%3Apr+author%3Ayusufdeveloper2903",{},[604,607,610],{"label":605,"value":606},"Merged pull requests","25",{"label":608,"value":609},"Platforms","Web · iOS · Android",{"label":611,"value":612},"Contributing since","May 2026",4,"\u002Fwork\u002Fexpensify","Open-source contributor",{"title":531,"description":597},[209,618,619,620,621],"React Native","React Native Web","Onyx","Jest","work\u002Fexpensify","t65eySOm3alOkROXeOyhQn0vkW6CfJfL2TFrk7vy5Ik",{"id":625,"title":626,"body":627,"company":713,"confidential":177,"cover":714,"description":715,"extension":180,"featured":595,"gallery":716,"links":741,"meta":742,"metrics":743,"navigation":177,"order":753,"path":754,"role":755,"seo":756,"stack":757,"stem":763,"year":222,"__hash__":764},"projects_en\u002Fwork\u002Fhunarda.md","Hunarda — online education platform",{"type":8,"value":628,"toc":709},[629,631,638,658,662,665],[11,630,14],{"id":13},[16,632,633,634,637],{},"Hunarda is an innovative education platform designed to transform the traditional learning experience. With three key roles — ",[26,635,636],{},"administrator, teacher and student"," — it simplifies educational processes and promotes collaboration.",[31,639,640,646,652],{},[34,641,642,645],{},[26,643,644],{},"Administrators"," have full control over the platform: they manage user accounts and system settings to keep access secure.",[34,647,648,651],{},[26,649,650],{},"Teachers"," create and manage courses, upload materials and engage with students through discussions and feedback.",[34,653,654,657],{},[26,655,656],{},"Students"," enroll in courses, access materials and interact with teachers and peers.",[11,659,661],{"id":660},"what-i-built","What I built",[16,663,664],{},"I developed the admin panel in Vue.js:",[31,666,667,673,679,685,691,697,703],{},[34,668,669,672],{},[26,670,671],{},"Dashboard & statistics"," — platform totals and monthly charts for income, sales, courses and students, filterable by category, course and date.",[34,674,675,678],{},[26,676,677],{},"Users"," — staff with roles and students with points, filters by category and course, and Excel export.",[34,680,681,684],{},[26,682,683],{},"Course management"," — a directory of categories, courses, archive, tags and promo codes, plus tariffs.",[34,686,687,690],{},[26,688,689],{},"Finance"," — payments through Click, Payme, Uzum, Paynet and cash, filtered by method, status, date, course and promo code.",[34,692,693,696],{},[26,694,695],{},"Chat"," — teacher–student conversations the administrator can review.",[34,698,699,702],{},[26,700,701],{},"Content"," — an “About us” section with FAQ, project pitch, terms and contact pages.",[34,704,705,708],{},[26,706,707],{},"UX"," — light and dark themes, a multilingual interface and paginated tables throughout.",{"title":169,"searchDepth":170,"depth":170,"links":710},[711,712],{"id":13,"depth":170,"text":14},{"id":660,"depth":170,"text":661},"ZK (Zamonaviy Kommunikatsiyalar)","\u002Fimages\u002Fprojects\u002Fhunarda\u002Fcover.jpg","An education platform with three roles — administrator, teacher and student — for courses, materials, payments, chat and analytics.",[717,720,723,726,729,732,735,738],{"src":718,"alt":719,"caption":719},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Fstatistics.jpg","Statistics: income, sales, courses and students by month",{"src":721,"alt":722,"caption":722},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Fdashboard.jpg","Admin dashboard with profile and platform totals",{"src":724,"alt":725,"caption":725},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Fstudents.jpg","Students with points, course filters and Excel export (personal data blurred)",{"src":727,"alt":728,"caption":728},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Ffinance.jpg","Finance: payments via Click, Payme, Uzum, Paynet and cash, with promo codes",{"src":730,"alt":731,"caption":731},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Fstaff.jpg","Staff management with roles (teacher, admin)",{"src":733,"alt":734,"caption":734},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Fdirectory.jpg","Course directory: categories, courses, archive, tags and promo codes",{"src":736,"alt":737,"caption":737},"\u002Fimages\u002Fprojects\u002Fhunarda\u002Flogin.jpg","Sign-in screen",{"src":739,"alt":740,"caption":740},"\u002Fimages\u002Fprojects\u002Fzk\u002Fpartners.jpg","ZK (Zamonaviy Kommunikatsiyalar) — partners: banks, telecom and government organisations",{},{},[744,747,750],{"label":745,"value":746},"Roles","Admin · Teacher · Student",{"label":748,"value":749},"Payment providers","5",{"label":751,"value":752},"Interface","Light & dark theme",5,"\u002Fwork\u002Fhunarda","Frontend developer (Vue.js)",{"title":626,"description":715},[758,759,760,761,762],"Vue.js","JavaScript","REST API","Excel export","i18n","work\u002Fhunarda","biRqg3dwAhNM7_x2eUx-87KnZaRHmI5YOw5Fv0LUNEg",{"id":766,"title":767,"body":768,"company":713,"confidential":177,"cover":862,"description":863,"extension":180,"featured":595,"gallery":864,"links":886,"meta":887,"metrics":888,"navigation":177,"order":898,"path":899,"role":755,"seo":900,"stack":901,"stem":903,"year":222,"__hash__":904},"projects_en\u002Fwork\u002Fecology-check.md","Ecology Check — national environmental data platform",{"type":8,"value":769,"toc":858},[770,772,775,817,820,822],[11,771,14],{"id":13},[16,773,774],{},"Ecology Check is a project designed to help assess the ecology of a country. It offers various features to work easily with ecological data:",[31,776,777,784,791,798,804,810],{},[34,778,779,780,783],{},"Users ",[26,781,782],{},"collect data"," on biodiversity, air and water quality, and land use.",[34,785,786,787,790],{},"The project ",[26,788,789],{},"analyses"," this data to identify patterns and trends.",[34,792,793,794,797],{},"The data is ",[26,795,796],{},"visualised"," through maps, charts and graphs.",[34,799,779,800,803],{},[26,801,802],{},"generate reports"," summarising key findings and collaborate with others.",[34,805,806,809],{},[26,807,808],{},"Alerts and notifications"," help identify ecological issues in time.",[34,811,812,813,816],{},"An ",[26,814,815],{},"integration gateway"," connects other data sources for seamless data sharing.",[16,818,819],{},"The platform brings together state agencies — the ecology committee, forestry, geology, hydrometeorology, agriculture, water management, health, emergencies and environmental laboratories — each with its own workspace.",[11,821,661],{"id":660},[31,823,824,830,840,846,852],{},[34,825,826,829],{},[26,827,828],{},"Agency workspaces"," — a dashboard of agencies, each with its own results, statistics and data entry.",[34,831,832,835,836,839],{},[26,833,834],{},"Maps"," — an interactive map of Uzbekistan and thematic maps (concentrations, water resources, flora and fauna, protected areas, air quality) with a ",[26,837,838],{},"heatmap of pollution sources"," that animates indicators over time.",[34,841,842,845],{},[26,843,844],{},"Analytics & statistics"," — indicator tables with date and indicator filters and bar charts by year.",[34,847,848,851],{},[26,849,850],{},"Data entry"," — monitoring objects and laboratory indicators by region for air, water and land, with CSV export.",[34,853,854,857],{},[26,855,856],{},"Reference data"," — classifiers for groups, units, ownership forms, pollutant types, regions and parameters, plus settings and a knowledge base.",{"title":169,"searchDepth":170,"depth":170,"links":859},[860,861],{"id":13,"depth":170,"text":14},{"id":660,"depth":170,"text":661},"\u002Fimages\u002Fprojects\u002Fecology\u002Fcover.jpg","A platform to assess a country’s ecology: data on air and water quality, biodiversity and land use from many agencies, analysed and visualised on maps, charts and reports.",[865,868,871,874,877,880,883],{"src":866,"alt":867,"caption":867},"\u002Fimages\u002Fprojects\u002Fecology\u002Fpollution-heatmap.jpg","Analytics: heatmap of pollution sources over time",{"src":869,"alt":870,"caption":870},"\u002Fimages\u002Fprojects\u002Fecology\u002Fregions.jpg","Monitoring objects and sources by region: air, water and land",{"src":872,"alt":873,"caption":873},"\u002Fimages\u002Fprojects\u002Fecology\u002Fanalytics.jpg","Indicator results with date filters and charts",{"src":875,"alt":876,"caption":876},"\u002Fimages\u002Fprojects\u002Fecology\u002Fmap.jpg","Interactive map of Uzbekistan",{"src":878,"alt":879,"caption":879},"\u002Fimages\u002Fprojects\u002Fecology\u002Fagencies.jpg","Workspaces for each government agency",{"src":881,"alt":882,"caption":882},"\u002Fimages\u002Fprojects\u002Fecology\u002Fclassifiers.jpg","Classifiers: groups, units and pollutant types",{"src":884,"alt":885,"caption":885},"\u002Fimages\u002Fprojects\u002Fzk\u002Fnumbers.jpg","ZK in numbers: 100+ projects, 10+ years, 20+ developers",{},{},[889,892,895],{"label":890,"value":891},"Data domains","Air · Water · Land · Biodiversity",{"label":893,"value":894},"Agencies connected","10+",{"label":896,"value":897},"Regions covered","14",6,"\u002Fwork\u002Fecology-check",{"title":767,"description":863},[758,759,394,902,760],"Charts","work\u002Fecology-check","MUyAIqk4AMC8fbSN6ldD0YCcf8i-c51uwTGTQj6nzlI",{"id":906,"title":907,"body":908,"company":970,"confidential":177,"cover":971,"description":972,"extension":180,"featured":595,"gallery":973,"links":991,"meta":992,"metrics":993,"navigation":177,"order":1000,"path":1001,"role":755,"seo":1002,"stack":1003,"stem":1010,"year":1011,"__hash__":1012},"projects_en\u002Fwork\u002Finvan.md","Invan — retail automation for tiin",{"type":8,"value":909,"toc":964},[910,912,922,924,950,954,957,961],[11,911,537],{"id":536},[16,913,914,917,918,921],{},[26,915,916],{},"tiin"," is a supermarket chain in Tashkent. Its in-house IT department built ",[26,919,920],{},"Invan"," — a retail automation platform used in tiin stores and sold to other businesses: point-of-sale, warehouse stock, customer and supplier records, receipts and labels, with integrations for Payme, Uzum, the OFD.uz virtual cash register and product labelling (Markirovka). According to invan.uz, more than 100 companies use it.",[11,923,551],{"id":550},[31,925,926,932,944],{},[34,927,928,931],{},[26,929,930],{},"Admin panel"," — modules of the large back-office app that store managers use every day: orders, products, warehouse stock, clients, analytics charts, notifications and settings, plus Excel export for reports.",[34,933,934,937,938,943],{},[26,935,936],{},"Landing pages"," — the public ",[541,939,942],{"href":940,"rel":941},"https:\u002F\u002Finvan.uz\u002F",[545],"invan.uz"," site: hero, POS hardware, integrations, blog, pricing and contact sections, fully responsive.",[34,945,946,949],{},[26,947,948],{},"Maintenance"," — fixing bugs in production projects and adding new modules on request from the business.",[11,951,953],{"id":952},"stack","Stack",[16,955,956],{},"Vue.js, Vuex, Vue Router, Axios, Bootstrap-Vue, Chart.js, Sass.",[11,958,960],{"id":959},"what-i-learned","What I learned",[16,962,963],{},"Building software for a business that uses it in its own stores gives very short feedback loops — cashiers and managers report problems the same day, so reliability and simple UI matter more than anything else.",{"title":169,"searchDepth":170,"depth":170,"links":965},[966,967,968,969],{"id":536,"depth":170,"text":537},{"id":550,"depth":170,"text":551},{"id":952,"depth":170,"text":953},{"id":959,"depth":170,"text":960},"Invan · IT department of tiin","\u002Fimages\u002Fprojects\u002Finvan\u002Flanding-hero.jpg","Admin panels and marketing landing pages for Invan, the retail automation platform built by the IT department of tiin, a supermarket chain in Tashkent.",[974,976,979,982,985,988],{"src":971,"alt":975,"caption":975},"invan.uz landing: hero",{"src":977,"alt":978,"caption":978},"\u002Fimages\u002Fprojects\u002Finvan\u002Flanding-pos.jpg","POS hardware section: touchscreen terminal, cash drawer, printer and scanner",{"src":980,"alt":981,"caption":981},"\u002Fimages\u002Fprojects\u002Finvan\u002Flanding-integrations.jpg","Integrations: Payme, Uzum, OFD.uz and Markirovka",{"src":983,"alt":984,"caption":984},"\u002Fimages\u002Fprojects\u002Finvan\u002Flanding-pricing.jpg","Pricing plans — the admin panel is part of every plan",{"src":986,"alt":987,"caption":987,"portrait":177},"\u002Fimages\u002Fprojects\u002Finvan\u002Flanding-mobile.jpg","Responsive landing on mobile",{"src":989,"alt":990,"caption":990,"portrait":177},"\u002Fimages\u002Fprojects\u002Finvan\u002Ftiin-store.jpg","A tiin supermarket in Tashkent — Invan was the chain’s IT department",{"live":940},{},[994,997],{"label":995,"value":996},"Businesses on the platform","100+",{"label":998,"value":999},"Products","Admin panel · Landing",7,"\u002Fwork\u002Finvan",{"title":907,"description":972},[758,1004,1005,1006,1007,1008,1009],"Vuex","Vue Router","Axios","Bootstrap-Vue","Chart.js","Sass","work\u002Finvan",2022,"Mz2HiRvQWi5Vot88GYzPuNF6qRlEEMkcLemcQorxCRU",{"id":1014,"title":1015,"body":1016,"company":1073,"confidential":177,"cover":1074,"description":1075,"extension":180,"featured":595,"gallery":1076,"links":1094,"meta":1096,"metrics":1097,"navigation":177,"order":1103,"path":1104,"role":1105,"seo":1106,"stack":1107,"stem":1111,"year":1112,"__hash__":1113},"projects_en\u002Fwork\u002Fquramiz.md","Quramiz — construction materials marketplace",{"type":8,"value":1017,"toc":1067},[1018,1020,1026,1028,1031,1057,1059,1062,1064],[11,1019,14],{"id":13},[16,1021,1022,1025],{},[26,1023,1024],{},"Quramiz.uz"," is SQB bank’s marketplace for construction and renovation materials in Uzbekistan: building materials, tools, electrics, plumbing, interior finishing and more, with delivery across Tashkent and the regions and the option to buy on credit. It is backed by a mobile app for iOS and Android.",[11,1027,22],{"id":21},[16,1029,1030],{},"Together with a teammate I built the user interface of the web store and took it live — this was my first production project, as an intern on SQB’s team.",[31,1032,1033,1039,1045,1051],{},[34,1034,1035,1038],{},[26,1036,1037],{},"Catalog & navigation"," — a mega-menu of categories, category pages with price and brand filters and sorting, brand pages and search.",[34,1040,1041,1044],{},[26,1042,1043],{},"Product experience"," — product cards with stock and unit pricing, a product page with description, specifications, reviews and offers from different suppliers, plus favourites and cart.",[34,1046,1047,1050],{},[26,1048,1049],{},"Home page"," — promo banners, “season”, “new” and “you may need” carousels, brands and the mobile app section.",[34,1052,1053,1056],{},[26,1054,1055],{},"Responsive UI"," — a dedicated mobile layout with bottom navigation.",[11,1058,953],{"id":952},[16,1060,1061],{},"Vue 2, Vuex, Vue Router, Axios and Yandex Maps, on top of a Laravel backend.",[11,1063,960],{"id":959},[16,1065,1066],{},"Shipping a real e-commerce UI taught me component thinking — the same product card powers carousels, category grids and search — and how much small details like stock, units and prices matter to buyers.",{"title":169,"searchDepth":170,"depth":170,"links":1068},[1069,1070,1071,1072],{"id":13,"depth":170,"text":14},{"id":21,"depth":170,"text":22},{"id":952,"depth":170,"text":953},{"id":959,"depth":170,"text":960},"SQB Bank","\u002Fimages\u002Fprojects\u002Fquramiz\u002Fhome-hero.jpg","The first marketplace for construction and renovation materials in Uzbekistan, launched by SQB bank — catalog, search, filters, cart and supplier offers.",[1077,1079,1082,1085,1088,1091],{"src":1074,"alt":1078,"caption":1078},"Home page: catalog menu, promo banner and delivery, payment and credit benefits",{"src":1080,"alt":1081,"caption":1081},"\u002Fimages\u002Fprojects\u002Fquramiz\u002Fhome-products.jpg","Product carousels and the mobile app promo",{"src":1083,"alt":1084,"caption":1084},"\u002Fimages\u002Fprojects\u002Fquramiz\u002Fcategory.jpg","Category page with price and brand filters",{"src":1086,"alt":1087,"caption":1087},"\u002Fimages\u002Fprojects\u002Fquramiz\u002Fproduct.jpg","Product page: description, specs, reviews and supplier offers",{"src":1089,"alt":1090,"caption":1090},"\u002Fimages\u002Fprojects\u002Fquramiz\u002Fhome-catalog-brands.jpg","Category tabs, brands and the full catalog",{"src":1092,"alt":1093,"caption":1093,"portrait":177},"\u002Fimages\u002Fprojects\u002Fquramiz\u002Fmobile.jpg","Mobile layout with bottom navigation",{"live":1095},"https:\u002F\u002Fquramiz.uz\u002F",{},[1098,1101],{"label":1099,"value":1100},"Team","2 frontend developers",{"label":608,"value":1102},"Web · iOS · Android app",8,"\u002Fwork\u002Fquramiz","Frontend developer (UI), with a teammate",{"title":1015,"description":1075},[1108,1004,1005,1006,1109,1110],"Vue 2","Yandex Maps","Laravel","work\u002Fquramiz",2021,"hXCsXmkn8NXLrvEpbpUv7Z9196PP_dvSGqLIBSa_KVM",{"id":1115,"title":1116,"body":1117,"company":594,"confidential":595,"cover":1170,"description":1171,"extension":180,"featured":595,"gallery":1172,"links":1173,"meta":1175,"metrics":1176,"navigation":177,"order":1177,"path":1178,"role":1179,"seo":1180,"stack":1181,"stem":1185,"year":222,"__hash__":1186},"projects_en\u002Fwork\u002Fcustomer-platform.md","Customer Management Platform",{"type":8,"value":1118,"toc":1165},[1119,1123,1126,1128,1160,1162],[11,1120,1122],{"id":1121},"problem","Problem",[16,1124,1125],{},"Businesses such as banks and retailers need one admin panel for customers, schedules and analytics — with different permissions for different staff.",[11,1127,661],{"id":660},[31,1129,1130,1136,1142,1148,1154],{},[34,1131,1132,1135],{},[26,1133,1134],{},"Modular architecture"," — each domain lives in its own module with its own routes, plugged into the app router.",[34,1137,1138,1141],{},[26,1139,1140],{},"Authentication & permissions"," — JWT auth service with role-based access control powered by CASL.",[34,1143,1144,1147],{},[26,1145,1146],{},"Rich UI"," — data tables with pagination, calendars (FullCalendar), charts (ApexCharts, ECharts), maps (Leaflet), rich-text editing and validated forms (Vuelidate).",[34,1149,1150,1153],{},[26,1151,1152],{},"Layouts"," — vertical and horizontal navigation, collapsible sidebar, light\u002Fdark theme and i18n.",[34,1155,1156,1159],{},[26,1157,1158],{},"Quality"," — TypeScript, Pinia stores with tests (Vitest, Pinia testing), strict ESLint rules.",[11,1161,953],{"id":952},[16,1163,1164],{},"Vue 3 (Composition API), TypeScript, Pinia, Vite, PrimeVue, Tailwind CSS.",{"title":169,"searchDepth":170,"depth":170,"links":1166},[1167,1168,1169],{"id":1121,"depth":170,"text":1122},{"id":660,"depth":170,"text":661},{"id":952,"depth":170,"text":953},"\u002Fimages\u002Fprojects\u002Fcustomer-platform.jpg","A modular admin platform for managing customers — role-based access, calendars, charts, maps and multilingual UI on Vue 3 and TypeScript.",[],{"source":1174},"https:\u002F\u002Fgithub.com\u002Fyusufdeveloper2903\u002FCustomer-Management-Platform",{},[],9,"\u002Fwork\u002Fcustomer-platform","Frontend development",{"title":1116,"description":1171},[393,209,211,1182,1183,396,1184,394,219],"CASL","PrimeVue","ECharts","work\u002Fcustomer-platform","XEom2NtqCPmMn_I7b1AJ4Tq-14NSubkfM9DJUoKAgMw",{"id":1188,"title":1189,"body":1190,"company":594,"confidential":595,"cover":1245,"description":1246,"extension":180,"featured":595,"gallery":1247,"links":1248,"meta":1250,"metrics":1251,"navigation":177,"order":1252,"path":1253,"role":1254,"seo":1255,"stack":1256,"stem":1260,"year":527,"__hash__":1261},"projects_en\u002Fwork\u002Ftasker.md","Tasker — GitHub issue workflow",{"type":8,"value":1191,"toc":1240},[1192,1194,1197,1199,1225,1227],[11,1193,1122],{"id":1121},[16,1195,1196],{},"Contributing to a large open-source project means tracking dozens of issues at once: new “Help Wanted” issues, mentions, assignments and work in progress. GitHub’s notifications alone don’t give a clear picture.",[11,1198,661],{"id":660},[31,1200,1201,1207,1213,1219],{},[34,1202,1203,1206],{},[26,1204,1205],{},"Issue lanes"," — Help Wanted, Mentioned, To-do, Assigned, In Progress and Complete tabs, each backed by its own GitHub query.",[34,1208,1209,1212],{},[26,1210,1211],{},"Personal layer"," — private notes and custom statuses for every issue, stored in Supabase and synced across devices.",[34,1214,1215,1218],{},[26,1216,1217],{},"Signals"," — unread markers, notification and mention tracking so nothing important gets missed.",[34,1220,1221,1224],{},[26,1222,1223],{},"Profile & theme"," — per-user GitHub username settings and a light\u002Fdark theme.",[11,1226,38],{"id":85},[16,1228,1229,1230,433,1233,433,1236,1239],{},"A feature-based React structure (",[41,1231,1232],{},"features\u002Fissues",[41,1234,1235],{},"features\u002Fprofile",[41,1237,1238],{},"features\u002Ftheme",") where every data concern is its own hook — easy to extend with new lanes without touching existing ones.",{"title":169,"searchDepth":170,"depth":170,"links":1241},[1242,1243,1244],{"id":1121,"depth":170,"text":1122},{"id":660,"depth":170,"text":661},{"id":85,"depth":170,"text":38},"\u002Fimages\u002Fprojects\u002Ftasker.jpg","A dashboard that turns a busy open-source issue queue into a personal workflow — help wanted, mentions, assigned and in-progress lanes with notes and statuses.",[],{"live":1249},"https:\u002F\u002Ftodo-tasker-one.vercel.app",{},[],10,"\u002Fwork\u002Ftasker","Design & development",{"title":1189,"description":1246},[1257,210,1258,1259],"React","Supabase","GitHub API","work\u002Ftasker","4YqMpgPmISNEwWKIYE1YZk54NUmL-MHAlrZ74rcuowA",{"id":1263,"title":1264,"body":1265,"company":594,"confidential":595,"cover":1381,"description":1382,"extension":180,"featured":595,"gallery":1383,"links":1384,"meta":1386,"metrics":1387,"navigation":177,"order":1388,"path":1389,"role":1254,"seo":1390,"stack":1391,"stem":1395,"year":527,"__hash__":1396},"projects_en\u002Fwork\u002Fportfolio.md","Portfolio Platform",{"type":8,"value":1266,"toc":1375},[1267,1269,1272,1276,1327,1329,1364,1368,1371],[11,1268,1122],{"id":1121},[16,1270,1271],{},"My previous portfolio was a single Vue 2 page: content hard-coded in templates, no SEO, no way to describe real projects in detail, and a build that no longer ran on modern Node.",[11,1273,1275],{"id":1274},"approach","Approach",[31,1277,1278,1284,1290,1296,1306,1311,1317],{},[34,1279,1280,1283],{},[26,1281,1282],{},"Static generation with Nuxt 4"," — every page in three languages is pre-rendered to HTML, so it loads instantly and is fully indexable.",[34,1285,1286,1289],{},[26,1287,1288],{},"Content as data"," — projects and experience are Markdown\u002FYAML files validated by Zod schemas in Nuxt Content. Adding a case study never touches a component.",[34,1291,1292,1295],{},[26,1293,1294],{},"Honest case studies"," — commercial projects are marked as private, with a note that company policy keeps the code closed, and screenshot galleries with personal data blurred.",[34,1297,1298,1301,1302,1305],{},[26,1299,1300],{},"Three languages"," — English, Uzbek and Russian with locale-prefixed routes, ",[41,1303,1304],{},"hreflang"," tags and an English fallback for untranslated entries.",[34,1307,1308,1310],{},[26,1309,72],{}," — semantic color tokens on Tailwind CSS v4, automatic light\u002Fdark theme and reduced-motion friendly animations.",[34,1312,1313,1316],{},[26,1314,1315],{},"Contact that always works"," — a short form that composes the email in Gmail or the visitor’s mail app, plus phone and copy-to-clipboard.",[34,1318,1319,1322,1323,1326],{},[26,1320,1321],{},"Keyboard first"," — a ",[41,1324,1325],{},"⌘K"," command palette to jump to any page, project or action.",[11,1328,38],{"id":85},[1330,1331,1335],"pre",{"className":1332,"code":1333,"language":1334,"meta":169,"style":169},"language-txt shiki shiki-themes github-light github-dark","content\u002F\u003Clocale>\u002F{projects,experience}   →  typed collections\napp\u002Fcomposables\u002FuseLocalizedContent.ts   →  locale-aware queries with fallback\napp\u002Fpages\u002F*                              →  fetch data, compose sections\napp\u002Fcomponents\u002F{home,project,site,ui}    →  presentational components\nserver\u002Froutes\u002F{sitemap.xml,robots.txt}   →  pre-rendered SEO files\n","txt",[41,1336,1337,1344,1349,1354,1359],{"__ignoreMap":169},[1338,1339,1341],"span",{"class":1340,"line":203},"line",[1338,1342,1343],{},"content\u002F\u003Clocale>\u002F{projects,experience}   →  typed collections\n",[1338,1345,1346],{"class":1340,"line":170},[1338,1347,1348],{},"app\u002Fcomposables\u002FuseLocalizedContent.ts   →  locale-aware queries with fallback\n",[1338,1350,1351],{"class":1340,"line":515},[1338,1352,1353],{},"app\u002Fpages\u002F*                              →  fetch data, compose sections\n",[1338,1355,1356],{"class":1340,"line":613},[1338,1357,1358],{},"app\u002Fcomponents\u002F{home,project,site,ui}    →  presentational components\n",[1338,1360,1361],{"class":1340,"line":753},[1338,1362,1363],{},"server\u002Froutes\u002F{sitemap.xml,robots.txt}   →  pre-rendered SEO files\n",[11,1365,1367],{"id":1366},"outcome","Outcome",[16,1369,1370],{},"A fast, accessible site that is easy to keep up to date — publishing a new project is a single Markdown file per language.",[1372,1373,1374],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":169,"searchDepth":170,"depth":170,"links":1376},[1377,1378,1379,1380],{"id":1121,"depth":170,"text":1122},{"id":1274,"depth":170,"text":1275},{"id":85,"depth":170,"text":38},{"id":1366,"depth":170,"text":1367},"\u002Fimages\u002Fprojects\u002Fportfolio.jpg","A multilingual, statically generated portfolio with detailed case studies, screenshot galleries, a contact form and a ⌘K command palette — built as a small product, not a landing page.",[],{"source":1385},"https:\u002F\u002Fgithub.com\u002Fyusufdeveloper2903\u002Fmyportfolio",{},[],11,"\u002Fwork\u002Fportfolio",{"title":1264,"description":1382},[1392,209,1393,1394,762,219],"Nuxt 4","Nuxt Content","Tailwind CSS v4","work\u002Fportfolio","u4USOKSmsoZNoRRUPH0buaWcLtVn2qpzpw_ncjmRwzM",{"id":1398,"title":1399,"body":1400,"company":594,"confidential":595,"cover":1430,"description":1431,"extension":180,"featured":595,"gallery":1432,"links":1433,"meta":1435,"metrics":1436,"navigation":177,"order":1437,"path":1438,"role":1179,"seo":1439,"stack":1440,"stem":1441,"year":1011,"__hash__":1442},"projects_en\u002Fwork\u002Ffendos.md","Fendos",{"type":8,"value":1401,"toc":1425},[1402,1404,1407,1409,1420,1422],[11,1403,1122],{"id":1121},[16,1405,1406],{},"True movie lovers are rarely satisfied with just watching a film. They want to know everything\naround it — the cast, the inspiration behind the story and the latest news.",[11,1408,661],{"id":660},[31,1410,1411,1414,1417],{},[34,1412,1413],{},"A catalogue of movies with posters, ratings and release dates.",[34,1415,1416],{},"Detail pages with cast and story information.",[34,1418,1419],{},"A responsive layout that works from small phones to wide desktop screens.",[11,1421,960],{"id":959},[16,1423,1424],{},"Working with an external movie API taught me to design around loading and error states and to keep\ndata fetching separate from presentation.",{"title":169,"searchDepth":170,"depth":170,"links":1426},[1427,1428,1429],{"id":1121,"depth":170,"text":1122},{"id":660,"depth":170,"text":661},{"id":959,"depth":170,"text":960},"\u002Fimages\u002Fprojects\u002Ffendos.jpg","A movie discovery website where film lovers can explore titles, cast details and the stories behind their favourite movies.",[],{"live":1434},"https:\u002F\u002Fnetfmovies.netlify.app",{},[],12,"\u002Fwork\u002Ffendos",{"title":1399,"description":1431},[758,759,1009,760],"work\u002Ffendos","oCPKMDs8-90unjHT3WtYpefA3viFai_PNB7cVRxcris",{"id":1444,"title":1445,"body":1446,"company":594,"confidential":595,"cover":1476,"description":1477,"extension":180,"featured":595,"gallery":1478,"links":1479,"meta":1482,"metrics":1483,"navigation":177,"order":1484,"path":1485,"role":1179,"seo":1486,"stack":1487,"stem":1488,"year":1011,"__hash__":1489},"projects_en\u002Fwork\u002Fmanual.md","Manual",{"type":8,"value":1447,"toc":1471},[1448,1450,1453,1455,1466,1468],[11,1449,1122],{"id":1121},[16,1451,1452],{},"Medical information online is often hard to read and hard to trust. The goal was a calm, clear\ninterface that makes complex drug and health information approachable.",[11,1454,661],{"id":660},[31,1456,1457,1460,1463],{},[34,1458,1459],{},"A content-focused layout with strong typography and clear hierarchy.",[34,1461,1462],{},"Reusable sections for treatments, articles and calls to action.",[34,1464,1465],{},"A fully responsive design.",[11,1467,960],{"id":959},[16,1469,1470],{},"Readability is a feature: spacing, line length and contrast matter as much as functionality.",{"title":169,"searchDepth":170,"depth":170,"links":1472},[1473,1474,1475],{"id":1121,"depth":170,"text":1122},{"id":660,"depth":170,"text":661},{"id":959,"depth":170,"text":960},"\u002Fimages\u002Fprojects\u002Fmanual.jpg","A health information website presenting independent, up-to-date medicine information in a clear format for consumers and professionals.",[],{"live":1480,"source":1481},"https:\u002F\u002Fthemanual.netlify.app","https:\u002F\u002Fgithub.com\u002Fyusufdeveloper2903\u002Fmanual",{},[],13,"\u002Fwork\u002Fmanual",{"title":1445,"description":1477},[758,759,1009],"work\u002Fmanual","ZNHVPa_qJ3meumdDXJeahcGtNkjVLxYadWswPu5lgik",{"id":1491,"title":1492,"body":1493,"company":594,"confidential":595,"cover":1517,"description":1518,"extension":180,"featured":595,"gallery":1519,"links":1520,"meta":1522,"metrics":1523,"navigation":177,"order":1524,"path":1525,"role":1179,"seo":1526,"stack":1527,"stem":1529,"year":1011,"__hash__":1530},"projects_en\u002Fwork\u002Fpower-yoga.md","Power Yoga",{"type":8,"value":1494,"toc":1513},[1495,1497,1500,1502],[11,1496,1122],{"id":1121},[16,1498,1499],{},"Power Yoga offers many courses — back care, core, morning practice and more. Visitors needed to\nunderstand the offering quickly and pick the right class.",[11,1501,661],{"id":660},[31,1503,1504,1507,1510],{},[34,1505,1506],{},"A landing page that presents courses by theme.",[34,1508,1509],{},"Clear schedules and calls to action for recurring classes and single sessions.",[34,1511,1512],{},"A responsive, lightweight layout.",{"title":169,"searchDepth":170,"depth":170,"links":1514},[1515,1516],{"id":1121,"depth":170,"text":1122},{"id":660,"depth":170,"text":661},"\u002Fimages\u002Fprojects\u002Fpower-yoga.jpg","A website for an online yoga service offering themed courses as recurring classes or single sessions.",[],{"live":1521},"https:\u002F\u002Fyoga11.netlify.app",{},[],14,"\u002Fwork\u002Fpower-yoga",{"title":1492,"description":1518},[1528,1009,759],"HTML","work\u002Fpower-yoga","BAA_2Rwuzw8zbPeQcA11wDaHMpaGzAHGlIcBbusG5w8",{"id":1532,"title":1533,"body":1534,"company":594,"confidential":595,"cover":1558,"description":1559,"extension":180,"featured":595,"gallery":1560,"links":1561,"meta":1563,"metrics":1564,"navigation":177,"order":1565,"path":1566,"role":1179,"seo":1567,"stack":1568,"stem":1569,"year":1011,"__hash__":1570},"projects_en\u002Fwork\u002Fonline-shop.md","Online Shop",{"type":8,"value":1535,"toc":1554},[1536,1538,1541,1543],[11,1537,1122],{"id":1121},[16,1539,1540],{},"A fashion store with frequent new arrivals needs a storefront where customers can browse\ncollections quickly on any device.",[11,1542,661],{"id":660},[31,1544,1545,1548,1551],{},[34,1546,1547],{},"Product listing and collection pages.",[34,1549,1550],{},"Reusable product cards and layout components.",[34,1552,1553],{},"A responsive design optimised for mobile shoppers.",{"title":169,"searchDepth":170,"depth":170,"links":1555},[1556,1557],{"id":1121,"depth":170,"text":1122},{"id":660,"depth":170,"text":661},"\u002Fimages\u002Fprojects\u002Fonline-shop.jpg","An e-commerce storefront for on-trend fashion with product listings and collection pages.",[],{"live":1562},"https:\u002F\u002Fshops-online.netlify.app\u002F",{},[],15,"\u002Fwork\u002Fonline-shop",{"title":1533,"description":1559},[758,759,1009],"work\u002Fonline-shop","csjfHnb-J-wFR8jGqwTWfQIpxaiBSZwX2Tnb5ObBQls",{"id":1491,"title":1492,"body":1572,"company":594,"confidential":595,"cover":1517,"description":1518,"extension":180,"featured":595,"gallery":1592,"links":1593,"meta":1594,"metrics":1595,"navigation":177,"order":1524,"path":1525,"role":1179,"seo":1596,"stack":1597,"stem":1529,"year":1011,"__hash__":1530},{"type":8,"value":1573,"toc":1588},[1574,1576,1578,1580],[11,1575,1122],{"id":1121},[16,1577,1499],{},[11,1579,661],{"id":660},[31,1581,1582,1584,1586],{},[34,1583,1506],{},[34,1585,1509],{},[34,1587,1512],{},{"title":169,"searchDepth":170,"depth":170,"links":1589},[1590,1591],{"id":1121,"depth":170,"text":1122},{"id":660,"depth":170,"text":661},[],{"live":1521},{},[],{"title":1492,"description":1518},[1528,1009,759],1791207293497]