Skip to content
#02 Success case Industry · Manufacturing

DibAI: ML-powered production control for manufacturing plants

We built an area-based dashboard with linear regression time estimates in Python. Node.js backend + Flask ML service, React frontend. VITA HOME and AVVITE are running it in production with their workshop, design, warehouse, and sales teams.

Implementation: 12+ months (iterating) 8 technologies in the stack Live in production, multi-tenant
The pain

What running the plant on spreadsheets actually cost

  • · Excel sheets, paper printouts, and the supervisor's memory. With no single source of truth, there was no way to know in real time which task was on which operator, how much was left, or whether an order was going to ship on time. The actual state of the plant had to be reconstructed by hand every morning.
  • · Estimates lived in the foreman's head. Commitments were built on experience — knowledge that walked out the door every time someone quit or retired. The quality of the estimates depended on who happened to be in the role.
  • · Delays surfaced when the client called. There was no way to spot early that a task was running over a reasonable time. The first signal of a problem was the customer asking about their order.
The value

What DibAI changed

  • · Real-time visibility into every task's status. The supervisor sees who is doing what, since when, and in which state. The plant's picture updates itself — nobody has to report.
  • · Time estimates that get sharper with use. The regression model learns from every closed task. Next time a similar task comes up, it suggests a tighter estimate that matches the plant's real pace.
  • · Early delay detection, before the client sees it. The dashboard flags tasks that are running over their estimate. The supervisor can reassign or reschedule before it becomes a delivery problem.
Stack
Technologies we worked with during implementation
ReactNode.js + ExpressFlaskscikit-learnPostgreSQLRedisDockerAWS
DibAI dashboard showing task status by area with time estimates and progress bars
DibAI dashboard · Task status by area with time estimates and progress bars
The technical challenge

Two services, two languages, one source of truth

The product has to feel like a single app to the operator, but underneath Node.js (which handles the API and orchestration) lives alongside Flask (which only exposes the ML model). We designed the flow this way:

  • 1 Node.js is the only face the client sees. React talks to a single API. The app does not know — and does not care — what runs on the other side to resolve an estimate.
  • 2 Flask wakes up only when a prediction is needed. The ML service is isolated: it takes features over HTTP, returns a number. No shared state, no cascading locks.
  • 3 PostgreSQL holds everything transactional. Tasks, users, history, logs. The model trains by reading from the same database, so there is no drift between what the system sees and what it learns from.
  • 4 Retraining is triggered by hand, from an admin panel. The admin decides when the model is updated. Zero surprises in production from an automatic run that breaks something.
┌──────────────────┐
│  React WebApp    │  ◄── Views for operator and supervisor
│  (operator +     │
│   supervisor)    │
└────────┬─────────┘
         │ REST + JSON
         ▼
┌──────────────────┐
│  Node.js +       │  ◄── API, auth, task CRUD, orchestration
│  Express         │
└────┬─────────┬───┘
     │         │
     │         │ Called when an estimate is needed
     ▼         ▼
┌─────────┐  ┌────────────────┐
│Postgres │  │ Flask + scikit │  ◄── Linear regression
│  + Redis│  │   -learn       │      (isolated service)
└────┬────┘  └────────┬───────┘
     │                │
     │   Reads history│
     └────────►───────┘
                    │
                    ▼
        Admin panel triggers
        manual retraining
Lessons learned

What we took away from the project

  1. 01

    ML does not replace the supervisor — it empowers them

    The model suggests an estimate. The supervisor accepts, corrects, or discards it. AI is one more tool, not the one making the call. This cuts resistance to adoption and keeps a human in the loop.

  2. 02

    Manual retraining is a feature, not a limitation

    In production, a model that retrains itself can break itself. Giving the admin the retrain button means someone is reviewing the result before promoting it. Zero surprises.

  3. 03

    The area-based dashboard is what makes the app get used

    If the app were a glorified spreadsheet, the team would not use it. What brings the supervisor back every morning is seeing the state of their area at a glance — workshop, design, warehouse, sales. The UI is what closes the loop.

We went from running the plant on spreadsheets and the supervisor's memory to having real visibility into every task. And now when a client asks when their order is ready, the answer comes from the system, not from a back-of-the-envelope guess.

PM
Leadership team, manufacturing plant
VITA HOME / AVVITE

Paraphrased testimonial.

Is this your situation?

Got a plant still running on spreadsheets?

20 minutes on a call about your operation. We walk through scope, architecture, and where ML actually adds value. No commitment.