[{"data":1,"prerenderedAt":90},["ShallowReactive",2],{"work-harbor-freight":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":7,"client":9,"year":10,"role":11,"summary":12,"result":13,"tech":14,"featured":19,"order":20,"cover":21,"body":22,"_type":84,"_id":85,"_source":86,"_file":87,"_stem":88,"_extension":89},"\u002Fwork\u002Fharbor-freight","work",false,"","The ops tool that retired the spreadsheet","Harbor Freight Co.",2025,"Web app","A regional freight shop was running the week from a shared workbook and a group chat. We built the board they already had in their heads.","Dispatch time cut from hours to a morning pass",[15,16,17,18],"Vue","NestJS","PostgreSQL","TypeScript",true,2,"harbor",{"type":23,"children":24,"toc":78},"root",[25,34,40,45,51,56,62,67,73],{"type":26,"tag":27,"props":28,"children":30},"element","h2",{"id":29},"the-problem",[31],{"type":32,"value":33},"text","The problem",{"type":26,"tag":35,"props":36,"children":37},"p",{},[38],{"type":32,"value":39},"Harbor moved freight well. The office did not. Jobs lived in a spreadsheet, driver notes lived in WhatsApp, and by Thursday nobody trusted the numbers. The owner was the integration layer.",{"type":26,"tag":35,"props":41,"children":42},{},[43],{"type":32,"value":44},"They didn’t want a “logistics platform.” They wanted Thursday to stop being a fire.",{"type":26,"tag":27,"props":46,"children":48},{"id":47},"the-approach",[49],{"type":32,"value":50},"The approach",{"type":26,"tag":35,"props":52,"children":53},{},[54],{"type":32,"value":55},"We mapped one real week — every status change, every phone call, every “just put it in the sheet.” Then we designed a board that matched their language, not a SaaS glossary. Drivers got a simple view. Dispatch got the truth.",{"type":26,"tag":27,"props":57,"children":59},{"id":58},"the-solution",[60],{"type":32,"value":61},"The solution",{"type":26,"tag":35,"props":63,"children":64},{},[65],{"type":32,"value":66},"A Vue and NestJS app: jobs, drivers, customers, and a live board with permissions that match the room. Exceptions are loud. The happy path is quiet. We migrated the old workbook in slices so the team never ran two systems for long.",{"type":26,"tag":27,"props":68,"children":70},{"id":69},"the-result",[71],{"type":32,"value":72},"The result",{"type":26,"tag":35,"props":74,"children":75},{},[76],{"type":32,"value":77},"Dispatch is a morning pass, not an afternoon scavenger hunt. The owner still checks the board. They don’t have to rebuild it from memory. Harbor’s words: “We came in with a messy ops spreadsheet and left with a tool the whole team actually opens.”",{"title":7,"searchDepth":20,"depth":20,"links":79},[80,81,82,83],{"id":29,"depth":20,"text":33},{"id":47,"depth":20,"text":50},{"id":58,"depth":20,"text":61},{"id":69,"depth":20,"text":72},"markdown","content:work:harbor-freight.md","content","work\u002Fharbor-freight.md","work\u002Fharbor-freight","md",1789256728632]