[{"data":1,"prerenderedAt":265},["ShallowReactive",2],{"i-lucide:chevron-down":3,"i-lucide:arrow-up-right":8,"i-simple-icons:github":10,"i-simple-icons:x":12,"i-brand:linkedin":14,"i-simple-icons:medium":18,"i-lucide:mail":20,"i-lucide:sun":22,"project:\u002Fprojects\u002Fworkshop-management":24,"project-more:\u002Fprojects\u002Fworkshop-management":239,"i-lucide:briefcase-business":261,"i-lucide:calendar":263},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m6 9l6 6l6-6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cpath fill=\"currentColor\" d=\"M14.234 10.162L22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299l-.929-1.329L3.076 1.56h3.182l5.965 8.532l.929 1.329l7.754 11.09h-3.182z\"\u002F>",{"left":4,"top":15,"width":16,"height":16,"rotate":4,"vFlip":6,"hFlip":6,"body":17},32,448,"\u003Cpath fill=\"currentColor\" d=\"M416 32L31.9 32C14.3 32 0 46.5 0 64.3L0 447.7C0 465.5 14.3 480 31.9 480L416 480c17.6 0 32-14.5 32-32.3l0-383.4C448 46.5 433.6 32 416 32zM135.4 416l-66.4 0 0-213.8 66.5 0 0 213.8-.1 0zM102.2 96a38.5 38.5 0 1 1 0 77 38.5 38.5 0 1 1 0-77zM384.3 416l-66.4 0 0-104c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9l0 105.8-66.4 0 0-213.8 63.7 0 0 29.2 .9 0c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9l0 117.2z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":19},"\u003Cpath fill=\"currentColor\" d=\"M4.21 0A4.2 4.2 0 0 0 0 4.21v15.58A4.2 4.2 0 0 0 4.21 24h15.58A4.2 4.2 0 0 0 24 19.79v-1.093a5 5 0 0 1-.422.02c-2.577 0-4.027-2.146-4.09-4.832a8 8 0 0 1 .022-.708c.093-1.186.475-2.241 1.105-3.022a3.9 3.9 0 0 1 1.395-1.1c.468-.237 1.127-.367 1.664-.367h.023q.151 0 .303.01V4.211A4.2 4.2 0 0 0 19.79 0Zm.198 5.583h4.165l3.588 8.435l3.59-8.435h3.864v.146l-.019.004c-.705.16-1.063.397-1.063 1.254h-.003l.003 10.274c.06.676.424.885 1.063 1.03l.02.004v.145h-4.923v-.145l.019-.005c.639-.144.994-.353 1.054-1.03V7.267l-4.745 11.15h-.261L6.15 7.569v9.445c0 .857.358 1.094 1.063 1.253l.02.004v.147H4.405v-.147l.019-.004c.705-.16 1.065-.397 1.065-1.253V6.987c0-.857-.358-1.094-1.064-1.254l-.018-.004zm19.25 3.668c-1.086.023-1.733 1.323-1.813 3.124H24V9.298a1.4 1.4 0 0 0-.342-.047m-1.862 3.632c-.1 1.756.86 3.239 2.204 3.634v-3.634z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":21},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\"\u002F>\u003Crect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":23},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003Cpath d=\"M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\u002F>\u003C\u002Fg>",{"page":25,"project":222},{"id":26,"title":27,"body":28,"description":213,"extension":214,"meta":215,"navigation":216,"path":217,"seo":218,"sitemap":219,"stem":220,"__hash__":221},"projectPages\u002Fprojects\u002Fworkshop-management.md","Workshop Management",{"type":29,"value":30,"toc":198},"minimark",[31,36,40,51,55,78,82,90,110,114,131,135,142,149,153,160,163,168,175,179,186,190],[32,33,35],"h2",{"id":34},"overview","Overview",[37,38,39],"p",{},"Faris Oil Center is Faris Petrol's chain of workshops for oil changes, filters and car checks, across several branches. Every car that comes in gets an inspection, and I designed and built the system each one runs through, from the bay app technicians use to the dashboards managers read.",[41,42,48],"project-shot",{":single":43,"alt":44,"height":45,"src":46,"width":47,":bare":43},"true","Three screens of the system. In front, the bay app's checklist, with the day's open checks along the top and services grouped into oils, filters, radiator and care, each with its condition and action. Tilted behind it, the dashboard's counters and charts on the left and the checks list with its filters on the right.",660,"\u002Fprojects\u002Fworkshop-management\u002Fapps.webp",1760,[37,49,50],{},"The bay app's checklist in front, with the dashboard and the checks list beside it.",[32,52,54],{"id":53},"the-problem","The problem",[56,57,58,66,72],"ul",{},[59,60,61,65],"li",{},[62,63,64],"strong",{},"One visit, four tools."," A paper form, a spreadsheet, an online form and a desktop database each kept part of a visit.",[59,67,68,71],{},[62,69,70],{},"A checklist that keeps changing."," Each new or reordered service would have needed a developer.",[59,73,74,77],{},[62,75,76],{},"No view of the workshops."," Managers couldn't see checks, services or technicians by branch.",[32,79,81],{"id":80},"the-solution","The solution",[83,84,87],"sketch-figure",{"alt":85,"name":86},"Before: a paper form, a spreadsheet, an online form and a desktop database follow one another, each keeping part of a visit: the form was filled in by hand, the spreadsheet held name, phone, car and date, the online form held the checks but not who did them. None kept the whole visit. Now: a technician uses the bay app with code sign-in, which writes one record per visit, highlighted, and a supervisor reads dashboards per branch. Notes say a check closes only when it is complete, the workshop edits the checklist itself, and only registered devices can reach the system.","workshop-management\u002Fbefore-after",[37,88,89],{},"Four tools that each kept part of a visit became one record per visit, filled in at the bay.",[56,91,92,98,104],{},[59,93,94,97],{},[62,95,96],{},"One record per visit,"," with the car, the customer and everyone who worked on it.",[59,99,100,103],{},[62,101,102],{},"A checklist the workshop edits itself,"," built from its services, with no release needed.",[59,105,106,109],{},[62,107,108],{},"A dashboard for every branch,"," refreshing on its own.",[32,111,113],{"id":112},"what-i-did","What I did",[56,115,116,119,122,125,128],{},[59,117,118],{},"Designed and built the back end, the dashboard and the bay app. The team helped early on with data models, demo data and tests.",[59,120,121],{},"Wrote the specification with the workshop: what a visit holds, and the rules for starting, completing and cancelling a check.",[59,123,124],{},"Designed the checklist and the life of a check, with a clear message for every refusal.",[59,126,127],{},"Built the dashboards and the report on customers who stopped coming.",[59,129,130],{},"Maintained and extended the system until I left the company.",[32,132,134],{"id":133},"what-it-offers","What it offers",[83,136,139],{"alt":137,"name":138},"Six areas of the system. At the bay, highlighted: sign in with a personal code, find a car by plate, phone or name, start, save and complete a check, one open check per car, cancel only with a reason. Records: personal and business accounts, drivers under each account, cars and their history, every check with who did the work. Set-up: services and their categories, checklist templates, branches and their bays, registered devices, car properties and tags. Access: users for every branch, roles and permissions, sessions that can be revoked, edits after a check by permission. Dashboards: live counters by status and action, checks per branch and day, filters by branch and date, refreshing on their own. Reports: technicians and supervisors, peak days in each branch, car types and models, customers who stopped coming.","workshop-management\u002Ffeatures",[37,140,141],{},"Six areas, from the bay to the reports.",[41,143,146],{":single":43,"alt":144,"height":45,"src":145,"width":47,":bare":43},"Three dashboard screens. In front, roles and permissions, with groups for accounts, cars, checks, checklist templates, services, branches and bays. Tilted behind it, the cars list on the left and the bays in each branch on the right.","\u002Fprojects\u002Fworkshop-management\u002Fscreens.webp",[37,147,148],{},"Roles and permissions in front, with the cars and the bays in each branch beside it.",[32,150,152],{"id":151},"system-design","System design",[83,154,157],{"alt":155,"name":156},"Architecture: technicians use the bay app, signing in with a code, to start, fill in and complete checks. Supervisors use the dashboard with a username and password to manage customers, cars, services and users and to read the dashboards and the churn report. Both apps call one back end, which answers registered devices only. It holds the workshop's records: accounts and drivers, cars, checks (highlighted), services, branches and bays, and users and roles. It builds the checklist from the services and gives every refusal a code. Behind it, a database keeps every visit with its answers, by car and customer.","workshop-management\u002Farchitecture",[37,158,159],{},"Two apps, one back end, and only the company's registered devices can reach it.",[37,161,162],{},"One back end serves both apps. Each registered device belongs to a branch, so every check knows where it was done without anyone choosing it.",[164,165,167],"h3",{"id":166},"a-checklist-defined-by-its-services","A checklist defined by its services",[83,169,172],{"alt":170,"name":171},"A supervisor sets up a service, highlighted, such as engine oil, with three fields: condition (good, fair, bad or a percentage), action (change, clean or top up) and a note. Services sit in a template, grouped into oils, filters, radiator, battery and care services, which can be reordered or switched off at any time. A technician's bay app builds the form from the template, the answers are kept as entered, and reports count every action, highlighted. A note says a new service is set up in the dashboard, not in a release.","workshop-management\u002Fchecklist",[37,173,174],{},"A new service is a setting in the dashboard, and the bay app's form follows it.",[164,176,178],{"id":177},"the-life-of-a-check","The life of a check",[83,180,183],{"alt":181,"name":182},"A technician finds the car by plate, phone or name, then starts a check, which is in progress; the branch comes from the device and a car can have only one open check. The check is saved as often as needed, then completed, highlighted, which needs a bay, technicians, a service and the odometer reading. A completed check stays editable for a short window, then only with a special permission. A dotted exit leads from in progress to cancelled, which needs a reason and is never edited again. Every refusal comes with a code and a message in Arabic.","workshop-management\u002Fcheck-lifecycle",[37,184,185],{},"A check can't be completed until it is whole, so the record a manager reads is the one the technician finished.",[164,187,189],{"id":188},"a-dashboard-for-every-branch","A dashboard for every branch",[41,191,195],{":single":43,"alt":192,"height":193,"src":194,"width":47},"The dashboard: counters for checks by status, services by action and customers along the top, then charts of checks and new accounts per day for each branch, work per technician, peak days in each branch, checks by city, work per supervisor, services per branch, and the top car models, transmissions and types.",1503,"\u002Fprojects\u002Fworkshop-management\u002Fdashboard.webp",[37,196,197],{},"Checks, services, technicians, supervisors and peak days, by branch and date.",{"title":199,"searchDepth":200,"depth":200,"links":201},"",2,[202,203,204,205,206,207],{"id":34,"depth":200,"text":35},{"id":53,"depth":200,"text":54},{"id":80,"depth":200,"text":81},{"id":112,"depth":200,"text":113},{"id":133,"depth":200,"text":134},{"id":151,"depth":200,"text":152,"children":208},[209,211,212],{"id":166,"depth":210,"text":167},3,{"id":177,"depth":210,"text":178},{"id":188,"depth":210,"text":189},"The system Faris Petrol’s workshops run on, which I designed and built: a bay app for technicians, a checklist the workshop edits itself, and dashboards for every branch.","md",{},true,"\u002Fprojects\u002Fworkshop-management",{"description":213},{"loc":217},"projects\u002Fworkshop-management","NQY0JSqih6uO1WSDLX3l0qviWFURO59NXwxnhuy7UmU",{"id":223,"title":224,"context":225,"description":226,"extension":227,"highlight":228,"links":232,"mark":233,"meta":235,"order":236,"stem":220,"year":237,"__hash__":238},"projects\u002Fprojects\u002Fworkshop-management.yml","Vehicle inspection & maintenance system","Faris Petrol · May 2021 – Dec 2022","The system Faris Petrol’s workshops run on: a bay app for technicians, a checklist the workshop edits itself and dashboards for every branch, for thousands of checks a month.","yml",{"title":224,"description":229,"period":230,"order":231},"Thousands of vehicle checks a month in Faris Petrol’s workshops, from the bay app to a dashboard for every branch.","2021 – 2022",4,[],{"logo":234},"faris-oil-center",{},1,2021,"_12WOp-0XLjbw3RXnYo_0TzWJ5Qpk2T1JGVh0HZ9JJY",[240,247,254],{"path":241,"title":242,"description":243,"mark":244,"year":246},"\u002Fprojects\u002Frunarks","Runarks · Governed access to production databases","My own product: every query against a production database is reviewed, approved, run once and logged, and nobody sees a password.",{"logo":245},"runarks",2026,{"path":248,"title":249,"description":250,"mark":251,"year":253},"\u002Fprojects\u002Fsanad","Sanad · Real-estate investment platform","The API and admin dashboard I built for a Saudi real-estate investment platform: verified investors, a wallet, investments and returns paid on a schedule.",{"logo":252},"sanad",2024,{"path":255,"title":256,"description":257,"mark":258,"year":260},"\u002Fprojects\u002Fwinch","WINCH · Saudi logistics platform","The back end of a Saudi logistics platform for businesses and carriers: more than 50 domains, and the integration engine I built for government services, payments and AI.",{"logo":259},"winch",2023,{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":262},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 12h.01M16 6V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v2m14 7a18.15 18.15 0 0 1-20 0\"\u002F>\u003Crect width=\"20\" height=\"14\" x=\"2\" y=\"6\" rx=\"2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":264},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M8 2v3m8-3v3\"\u002F>\u003Crect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"\u002F>\u003Cpath d=\"M3 9h18\"\u002F>\u003C\u002Fg>",1791781461145]