FoneBox Bangladesh
One organisation needed sales pipeline, support ticketing, project delivery, billing and client self-service to live in a single system with genuinely different access for each kind of staff.
- Role
- Sole engineer
- Stack
- React · TypeScript · Vite
- Status
- No TLS

Reachable, but served over plain HTTP — so it is not linked from here.
An ICT solutions platform built around a 27-model PostgreSQL schema and a seven-value role enum, containerised and running under PM2 on a VPS I administer.
Seven roles is not one system with a flag
Super admin, CRM admin, internal staff, customer, sales executive, operations officer and corporate client each see a different product. Modelling that as a boolean on a user — the shortcut most projects take — produces a codebase where every query has an exception in it.
Relational, because the domain is relational
Organisations own contacts, contacts generate leads, leads become opportunities, opportunities become projects, projects produce invoices, and every one of those transitions is audited. Twenty-seven Prisma models against PostgreSQL, with the role enum enforced in the schema rather than checked in the UI.
Audit logging from the start
A system where staff act on a client's behalf needs to answer who changed what, and retrofitting that is painful because the history you most want is the history you did not record. The audit table went in with the first migration rather than after the first dispute.
What I would change
It currently answers on a bare IP over plain HTTP, bypassing the Traefik instance that terminates TLS for every other service on the same box. That is a deployment gap rather than an application one, and it is the next thing I fix.
- React
- TypeScript
- Vite
- Tailwind CSS
- Node.js
- Express
- PostgreSQL
- Prisma
- Docker
- PM2
- GitHub Actions
- Linux VPS