Inspiration

Food stalls in Malaysia are busy, and orders come in fast and in a mix of Malay, English, and Manglish. Owners often keep track of orders, payments, and stock in their heads or on scraps of paper, so it's easy to forget who hasn't paid or to run out of an item without noticing. We wanted a simple tool that works the way stall owners actually talk, without making them fill in complicated forms.

What it does

Stall-Manager lets you type an order the way you'd say it, for example:

Nama Ali, 2 nasi lemak ayam and 1 teh ais, dah bayar

The app then:

  • Extracts the customer name, items, quantities, and payment claim
  • Checks the items against the menu and makes sure there is enough stock
  • Saves the order and deducts the stock automatically
  • Shows a dashboard with today's revenue, unpaid totals, best sellers, recent orders, and a 7-day sales chart
  • Flags low-stock items so the owner knows what to restock
  • Lets the owner manage the menu (add, edit, delete) and mark orders as paid once the money is received

How we built it

  • Backend: Python and Flask
  • Database: SQLite
  • Analytics: pandas, with Chart.js for the weekly sales chart
  • AI parsing: Ollama running qwen3.5:4b locally, with pydantic to validate the output

Parsing works in two steps. Simple orders like 1 nasi lemak go through our own fast rule-based parser. Longer or messier messages fall back to the local AI model. Because the model runs on the laptop, the app works without paying for an API, which suits a small business.

Challenges we ran into

  • Messy real-world input. People use short forms and typos (th tarik, nsi lm). We built a menu matcher that handles common abbreviations and close spellings, but rejects anything ambiguous instead of guessing the wrong item.
  • Speed. The AI model is slow for simple orders, so we added the fast parser to handle those instantly.
  • Trusting the AI. We didn't want the model inventing data. Total prices are always calculated from our own menu prices, and the AI's payment claim is only a claim. The owner confirms real payment with the Mark paid button.
  • Keeping data correct. Each order is saved in a single database transaction, so if anything fails, nothing is half-saved and stock never goes out of sync. Deleting a menu item also keeps its name and price in past orders so history doesn't break.

What we learned

We learned how to combine a local AI model with normal code and not rely on the AI for everything. Validating the AI's output, calculating prices ourselves, and keeping data consistent mattered as much as the AI itself. We also got more practice with Flask, SQLite, and working as a team on separate parts of one project.

What's next

  • Support for more languages and more casual phrasing
  • Order editing and cancellation
  • Monthly reports and profit tracking
  • Restock suggestions based on sales history
Share this project:

Updates

Submission history