RobotWash – Automated Car Wash Kiosk System
RobotWash needed a fully integrated kiosk system for automated car wash stations: a customer-facing touchscreen terminal that accepts payments, controls the wash hardware and guides the user through the process, alongside an operator-facing cashier and admin mobile app. The system had to be reliable in an industrial environment with payment hardware in the loop.
The three-layer system
- Backend: Rust for payment hardware control – the core of the system is a Rust service that communicates directly with the payment terminal hardware and orchestrates the wash machine states. We chose Rust for its memory safety guarantees, deterministic performance and suitability for long-running embedded processes where a crash or memory leak would be unacceptable.
- Kiosk frontend: Angular – a full-screen Angular application running on the customer-facing touchscreen. It guides the user through wash programme selection, payment and status monitoring. Designed for outdoor/industrial use: large touch targets, high-contrast visuals, no reliance on a pointer device.
- Cashier and admin mobile app: Android – native Android app for the station operator. Handles session management, transaction history, hardware status monitoring and basic administration tasks. Works over the local network of the car wash station so operators can manage from anywhere on site.
Why Rust for hardware control?
Payment hardware integration is unforgiving: a crashed process mid-transaction means a confused customer and a potentially inconsistent cash-register state. Rust's ownership model eliminates entire classes of concurrency bugs and memory errors at compile time, giving us confidence in the long-term stability of a process that runs 24/7 without scheduled restarts.
The serial and protocol-level communication with physical payment terminals also benefits from Rust's low-level control – we can be precise about timing and byte-level message framing in ways that are awkward in higher-level languages.
Integration challenges
- Hardware state machine – the wash machine goes through a well-defined sequence of states (idle → accepting payment → washing → rinsing → done → error), but hardware events are asynchronous and can arrive out of order. The Rust backend models the state machine explicitly, making illegal transitions impossible at the type level.
- Payment certification – card payment terminals have strict certification requirements. Our integration layer was designed to be thin and auditable, touching the terminal API in only the ways required by the certification spec.
- Offline resilience – car wash stations are often in locations with unreliable connectivity. Transaction records are persisted locally first; the sync to a central backend happens opportunistically when a connection is available.
What we learned
This project reinforced that choosing the right tool for the right layer matters. Rust for the safety-critical hardware layer, Angular for the interactive kiosk UI, Android for the operator's mobile workflow – each choice was deliberate, not fashionable.
It also demonstrated our ability to deliver a full-stack product that spans embedded software, web frontend and mobile – the kind of breadth that is increasingly possible with smaller, AI-augmented teams.