Înapoi la portofoliu
Platformă ⭐ Reprezentativ

Trade Container

Platformă B2B de tip freight exchange pentru matching transport containere, cu oferte în timp real via WebSockets, plăți Stripe și chat integrat între expeditori și transportatori.

Stack principal

Next.js 16
React 18
TypeScript
Tailwind CSS v4
shadcn/ui Radix UI Framer Motion Recharts Socket.IO Express PostgreSQL JWT bcrypt Stripe Resend React Email Google Maps API multer node-cron Zod

Provocarea

Migrarea de la Supabase BaaS (cu Realtime, Auth și Storage incluse) la un backend Express self-hosted fără downtime, păstrând toate datele existente și înlocuind fiecare serviciu Supabase cu echivalent propriu.

Soluția

Script de migrare Python care a exportat datele din Supabase PostgreSQL și le-a importat în instanța proprie. Supabase Auth a fost înlocuit cu JWT + bcrypt, Supabase Realtime cu Socket.IO, iar Supabase Storage cu multer + nginx static serving. RLS policies au fost replicate ca middleware Express cu verificare JWT per rută.

Complexitate notabilă

Trade Container este o platformă SaaS B2B care conectează expeditorii de containere cu transportatorii disponibili, funcționând ca un marketplace de tip freight exchange. Proiectul a pornit de la un MVP construit pe Supabase (Next.js + PostgreSQL hosted) și a fost migrat complet pe o arhitectură self-hosted cu backend Express propriu. Frontend-ul este construit cu Next.js 16 și React 18, folosind shadcn/ui (Radix UI) pentru componente și Tailwind CSS v4 pentru stilizare. Hărțile de rute sunt vizualizate cu Google Maps JS API Loader, iar graficele de statistici cu Recharts. Framer Motion asigură tranzițiile animate între stările de ofertă. Backend-ul Express TypeScript gestionează autentificarea cu JWT, logica de matching între oferte și cereri, și expune WebSockets prin Socket.IO pentru actualizări în timp real ale statusului ofertelor. Baza de date este PostgreSQL (pg driver), cu migrații SQL gestionate manual. Stripe este integrat pentru plăți și abonamente, cu webhook-uri procesate server-side. Emailurile tranzacționale (confirmare ofertă, notificare matching, factură) sunt trimise prin Resend SDK cu template-uri React Email. Un job cron (node-cron) verifică periodic ofertele expirate și le arhivează automat. Upload-ul documentelor de transport (CMR, facturi) se face prin multer cu stocare locală și servire statică.

Rezultate cheie

  • Migrare completă de la Supabase la self-hosted fără pierdere de date
  • Matching în timp real între oferte și cereri via Socket.IO
  • Plăți Stripe integrate cu webhook-uri pentru confirmare automată
  • Chat în timp real între expeditori și transportatori
  • Job cron pentru arhivare automată oferte expirate

Vrei ceva similar?

Începe cu wizard-ul de estimare — răspunzi la câteva întrebări și primești un range de preț + timeline realist.