Work / ERP

NEXO

One ERP where there used to be nine separate apps. A food distribution company in Lima runs sales, stock, finance, HR, production and deliveries in it.

My part
Designed and built by me. I host it too.
When
June 2026 to now
Status
In production

A rebuilt screen with sample data. The real ones hold a client's numbers. A demo you can click through, with a made-up company, is in the works.

The problem

Every department had its own tool. I know, because I built most of them: a chatbot dashboard, a screening tool for applicants, a personal agenda, an app for meeting minutes, an attendance app, a delivery app, a stock app, a product catalog and a sign-in dashboard that tied them together.

Each one solved a real problem. Each one also had its own login, its own list of users and its own idea of what a customer is. Sales and stock sat in an older ERP that nobody could extend. When someone moved from the warehouse to sales, I changed their rights in every app separately.

What I built

One login, one permission system, one database. I did not rewrite everything in one go. The shell and the personal workspace went live first, in June 2026. After that the old apps moved in one at a time, as modules, while people kept working.

The customers and the sales history came over from the old ERP by import. Rights are set per role and per screen, and the company's own admin manages them. I do not get a message when someone changes jobs.

There is a test environment that is refreshed from production every night. Nothing reaches production without a full run on test first, by me, through the same screens the staff use.

How it fits together

  1. PeopleOffice staff in the browser, Drivers on an offline PWA, Field sales on Android
  2. Front doorCaddy, TLS, one sign-in for every module
  3. ApplicationNext.js, 594 API routes, role and screen permissions
  4. DataPostgres, self-hosted Supabase, 226 migrations, nightly backup
  5. Around itn8n for chat channels and notifications, test environment refreshed nightly

One VPS. The boring choice, on purpose: one place to back up, one place to look when something is slow.

What came out

Measured means counted in the code or the system. Estimated means my own estimate, with the assumption next to it.
Separate apps merged into one9measured, project plan
Pages320measured, Nov 2026
API routes594measured, Nov 2026
Database migrations226measured, Nov 2026
Commits in the repository1,338measured, Nov 2026
Lines of TypeScriptabout 310,000measured, Nov 2026
Customers in the CRM after import1,563measured, June 2026
Staff on the attendance clock75measured, Sept 2026
Clock-ins a day without paper or spreadsheetsabout 300estimated, 75 staff, 4 moments a day

Built with

  • Next.js 16
  • React 19
  • TypeScript
  • Postgres
  • Supabase (self-hosted)
  • TanStack Query
  • Zod
  • ExcelJS
  • jsPDF
  • Recharts
  • Leaflet
  • Dexie
  • Capacitor
  • Caddy
  • PM2

Tell me what goes wrong on a normal Tuesday.

Book a 30-minute call

Thirty minutes, video or phone. You describe one process that costs you time. I ask questions and tell you honestly whether I would automate it, fix it first, or leave it alone. No slides.

Lima time, UTC-5. I reply within one working day, in English, Dutch or Spanish.

Open to remote roles and to projects.