Skip to content
Selected work

Executive control center

The owner was running €4.5M from spreadsheets.

Client
Maxime · French industrial group
Sector
Industry · LED displays · €4.5M revenue
Duration
Full design and development

The problem

A French manufacturer of large-format LED displays turning over €4.5M was running the business from several Excel workbooks updated by hand. The sales CRM, the bank accounts, customer and supplier invoices, field operations and warranties each lived in their own corner. Answering a simple question — how much is still due to come in this month — meant opening four files and trusting whoever updated them last.

The architecture

  1. 01

    eWay CRM

    sales pipeline

  2. 02

    Qonto API

    read-only, balances + transactions

  3. 03

    Invoicing

    customers and suppliers

  4. 04

    Supabase

    8 tables, RLS, daily job

  5. 05

    AI assistants

    sales + after-sales, validated output

The three integrations feed a single database, refreshed by a daily scheduled job. The cockpit reads that database, never the APIs directly: a provider outage doesn't stop the owner from seeing his figures, it simply surfaces as stale data. API keys stay strictly server-side.

The product

Anonymised screenshots — client names masked, amounts and volumes fictional

A security constraint honoured to the letter

The client's IT lead required strictly read-only banking access: balances and transactions, no transfer capability, ever. The scope was held without negotiation. API keys live server-side only, the browser never sees them, and no write route to the bank exists in the codebase — the absence of the feature is the guarantee, not a checkbox somewhere.

Zero dependencies added

Three requests could each have been solved with an npm install. Each was solved differently, and every time for a reason that holds up technically.

  • PDF export — an @media print stylesheet and the browser's native print engine instead of a generation library. Vector output, selectable text, no dependency to maintain.
  • Animations — native CSS instead of Framer Motion. 120 kB saved on the bundle, and prefers-reduced-motion handled properly.
  • Dashboard components — an in-house design system instead of Tremor, which requires React 18 while the project runs on React 19.

A light mode that can't structurally break

The codebase uses inline styles. Rather than adding thousands of conditional classes, every colour resolves through CSS variables declined per theme. Background and text always come from the same palette: light-text-on-light-background becomes structurally impossible, not merely avoided case by case. An automated contrast audit across 233 elements confirmed the result, with the grey scale adjusted to reach WCAG AA.

Errors you can actually see

The initial code silently swallowed database errors. During a network outage the owner saw €0 displayed with no warning at all — and could make a decision on false figures. That's the kind of flaw you only notice once it has cost something. Replaced with an explicit error state, distinct from a zero value, with a retry path.

Two AI assistants under business constraints

A sales-reply generator applies a five-step reasoning sequence before writing, which makes its reasoning inspectable rather than magical. An after-sales assistant is constrained by strict vocabulary rules, including a ban on admitting liability before technical analysis — one badly chosen sentence in an after-sales exchange can cost a warranty claim. Outputs are structured JSON, validated before display.

Stack

  • Next.js 16
  • React 19
  • TypeScript strict
  • Recharts
  • Supabase
  • PostgreSQL
  • Row Level Security
  • Anthropic API
  • eWay CRM
  • Qonto API
  • Vercel

The outcome

  • 6

    modules: cockpit, sales, finance, property, operations, AI

  • 8

    PostgreSQL tables protected by Row Level Security

  • 233

    elements contrast-audited, WCAG AA reached

  • 0

    npm dependencies added across the last six features

Upwork · 5.0

« Osama guided us, advised us and met our needs with great efficiency. Thank you again! »

Need something similar?

I read every message myself and reply within 24 hours. No automated quote, no form disappearing into a void.

Start a project

Other work