An event-driven system that centralizes inventory tracking, handles restock planning, and sends real-time alerts.
Instead of reacting to stockouts after they happen, the system forecasts demand ahead of time so staff can restock before it becomes a problem. With every inventory change, forecasts improve, ensuring accurate predictions and actionable suggestions.
Finalist at the UCF Senior Design showcase. I was the product manager for our four-person team and responsible for the entire design of the backend.

Mirai Arcade is a Japanese claw-cade located in Waterford Lakes, Orlando. The store operates over 80 claw machines where customers can win prizes like plushies, blind boxes, figurines, and trading cards.
What makes their inventory management particularly challenging is the scale: they track over 1,200 unique products across 11 different storage location types (racks, cabinets, boxes/bins, the claw machines themselves, etc). With more than 20 employees making hundreds of inventory updates daily and products sourced from multiple international suppliers, keeping accurate stock information is critical.
Employees used an internal tool accessible on phones and computers to make inventory updates, but their previous system wasn't designed to handle this complexity.

At the foundation, we chose Supabase to host our database. Its Postgres relational database provides ACID compliance and data integrity essential for inventory transactions, along with built-in authentication and file storage for product images.
The core backend service is built with Spring Boot in Java, chosen for its mature security stack and strong support for building RESTful APIs and microservices.
What makes this architecture event-driven is Kafka at the center. Every inventory change publishes an event, which flows to two downstream Python microservices: the Forecasting Service for demand calculations, and the Messaging Service for alerts via Slack, the main communication tool used by Mirai employees.

The Forecasting Service consumes inventory events from Kafka, validates and batches them, then feeds them into the forecasting engine. The engine loads historical sales data from Supabase, analyzes demand trends, and calculates reorder quantities. Forecasts are upserted back into the database and surfaced on the dashboard.
When stock drops below a threshold, the action layer triggers the Messaging Service, which sends restock alerts to staff through Slack.
We set out to rebuild the old system due to deep-rooted performance issues and scalability limitations. The new system responds 10x faster and reduced monthly costs by 45%.
With constant feedback from the Mirai team, we tailored the tool to how they actually operate: