Fira Sys

v0.1.0 · MIT · self-hosted

A working POS, inventory and purchasing system for a café or a small franchise. It has rough edges. It's yours to fix.

Fira Sys started as a desktop application in Rust and was rebuilt for the web when a restaurant franchise needed multi-location, multi-user access. It was built for one real client; when the engagement ended, it was open-sourced in the state it was in — so the next person has a working base instead of a blank repository.

What this is, and what it isn't

This is not a finished enterprise product. It is a working system with real functionality, built under production pressure for a live franchise — so some parts are clean and others are experimental or unpolished. Treat it as a strong starting point to study, improve and reuse, not a drop-in solution. Said plainly here so you don't find the rough edges later and feel misled.

The Fira Sys dashboard: stock and revenue tiles across the top, then AI-generated stockout predictions and reorder suggestions
Dashboard — stock and revenue, then predictions generated on demand.

What's in it

The operations a small restaurant actually runs on

Fifteen screens over sixteen API modules. Nothing here is a placeholder — every feature was in daily use at a real franchise.

Point of sale

Order entry with receipt generation, built for one-handed use at a counter.

Inventory

Raw materials and finished products, with a minimum per item and inline below-minimum flags.

Stock movement

Transfers between locations with explicit draft / done states, not a checkbox.

Purchase orders

Supplier tracking, order status, and the receiving side of stock.

Analytics & reports

Sales dashboards and Excel-exportable reports.

AI insights

Stockout predictions and reorder suggestions from Groq (Llama 3.1) and Gemini — each one shows the threshold that fired it.

Invoice scanning

Tesseract OCR plus an LLM to pull line items out of a supplier invoice photo or PDF.

Multi-location

Inventory and movement scoped per location, for a small franchise rather than a single shop.

Screens

Five more of the fifteen

The ones that show how it was designed for the counter and the stockroom rather than for a demo.

Point of sale screen
The POS. Quantity steppers rather than a keypad, because the person using this is holding a coffee in the other hand. Running total in local currency, selected items outlined rather than moved to a separate cart panel.
AI insights detail view
Every prediction states the threshold that triggered it. “Low stock threshold of 5 reached” next to “current stock of 25.5 is below the minimum of 10” — an operator can disagree with the model because they can see its reasoning.
Raw materials inventory, bilingual by row
Raw materials, bilingual by row rather than by app locale — the Arabic name sits under the English one, because that is how the staff actually refer to stock. Below-minimum values go red inline; no separate alerts screen to remember to open.
Stock movements between locations
Stock movement across locations, with draft and done as distinct states rather than a boolean. A receipt that has been entered but not physically checked in is a real and different thing from one that has.
Invoice scanning with OCR and LLM line extraction
Invoice scanning — a supplier invoice goes in as a photo or PDF, OCR reads it, and an LLM extracts the line items. This is the feature that saved the most actual time, because the alternative is typing forty rows off a paper invoice.

Stack

A boring stack, on purpose

Frontend React 19 · TypeScript · Tailwind · Vite
Backend Node.js · Express
Database MySQL 8
AI Groq (Llama 3.1) · Google Gemini
OCR Tesseract
Runtime Docker Compose — db, server, client

Run it

Clone it, set four keys, docker compose up

Docker Compose brings up three containers: MySQL, the Express server on :5000, and the client on :80. The schema loads itself on first boot; there's seed data to populate it for a look around. The Groq and Gemini keys are only needed for the AI insights and invoice scanning — everything else runs without them.

git clone https://github.com/firaslamouchi21/RESTAURANT-CAFE-MANAGMENT-SYSTEM
cd RESTAURANT-CAFE-MANAGMENT-SYSTEM
cp .env.example .env    # set DB_PASSWORD, JWT_SECRET, GROQ_API_KEY, GEMINI_API_KEY
docker compose up

Then open localhost for the app. Full setup notes, environment variables and the manual (non-Docker) path are in the repository README.

Contact

Talk to Firas about Fira Sys

Forking it for your own café, stuck on setup, or you fixed something worth upstreaming — this goes straight to Firas's inbox and you'll get an auto-reply to confirm.