
Productive Robotics
Welding UI Vue 3 Rewrite
Modernized the welding tablet interface to Vue 3 — pages, components, stores, services, and composables. Replaced legacy global state with modern state management, introduced composables in place of Options API mixins, and built a real-time service layer with auto-reconnect, bidirectional unit conversion, and a dark industrial theme tuned for welding-shop environments.
Architected the Vue 3 application with modern state management, composables, and a real-time service layer with auto-reconnect and configurable per-topic throttle. The program store handles the full lifecycle — CRUD, recipe management, clipboard with coordinate-transform paste, and undo history. Clean subscription lifecycle prevents the kind of leaked-listener pattern that has caused production issues elsewhere.
Built a bidirectional unit conversion pipeline at the service boundary: stores and components work in operator-facing display units while all messaging uses SI internally. Conversions cover speed and length, with user preference persisted locally. A bug in this pipeline would silently confuse units, so the translation layer is tested at the boundary rather than scattered through the entire codebase.
Implemented guided parameter selection — operators select base material, wire type/diameter, thickness, and joint type, and the system looks up recommended core parameters from the welder's data tables. Reduces weld setup from extended expert tuning to a fast guided selection accessible to any operator. Also built the base component library: button, modal, parameter input, switch, and tabs.
Designed the industrial dark theme tuned for welding-shop environments — dark backgrounds reduce glare, high-contrast text stays readable with welding helmets flipped up, and large touch targets accommodate operators wearing heavy welding gloves. Motion controls use press-and-hold with stop-on-release safety, with redundant release handlers ensuring the robot stops even if a Bluetooth disconnect, OS gesture, or tab switch causes the primary release event to be missed.