← Înapoi la blog
10 min citire
DevelopmentAI

Cum am construit colet.app — behind the scenes

Dacă ți-a trecut vreodată prin cap să construiești o aplicație SaaS de la zero, singur, probabil ai oscilat între „sigur pot" și „sunt nebun". Am trecut prin ambele faze. Asta e povestea reală a modului cum am construit colet.app — o platformă logistică multi-tenant pentru firme de curierat pe ruta România-UK. Fără echipă. Fără investitori. Cu mult Claude Code.

Problema: curierat pe hârtie în 2025

Firmele de curierat pe ruta RO-UK funcționează surprinzător de analog. Comenzi pe WhatsApp, evidență în Excel, rutare „din cap" și zero tracking real pentru clienți. Am văzut asta la Ami Tour, un client pentru care deja construisem site-ul și aplicația mobilă.

Problema nu era lipsa unor aplicații de curierat. Problema era că niciuna nu se potrivea nișei: transport internațional, curse regulate, depozite intermediare, decontări complexe. DHL și FedEx au sisteme enterprise de milioane. Firmele mici din România au Excel.

Am vrut să construiesc ceva la mijloc: un SaaS complet, dar accesibil pentru o firmă cu 5-15 angajați.

Alegerea stack-ului tehnic

Asta e partea care entuziasmează developerii și plictisește pe toți ceilalți. Dar e importantă, pentru că fiecare decizie tehnică la început se plătește sau se răsplătește luni mai târziu.

Frontend: React 18 + TypeScript + Vite

Am ales React pentru că îl știu cel mai bine. Vite în loc de Next.js pentru că colet.app nu are nevoie de SSR — e o aplicație autentificată, nu un site public. TypeScript strict de la prima zi. A meritat fiecare minut pierdut la tipuri — am prins zeci de buguri la compilare care altfel ajungeau la clienți.

Backend: Supabase (PostgreSQL + Edge Functions + RLS)

Asta a fost decizia care a definit proiectul. Supabase îți dă PostgreSQL, autentificare, funcții serverless, real-time subscriptions și storage — totul într-un singur loc. Pentru un developer solo, e ca și cum ai o echipă de backend fără să angajezi pe nimeni.

Row Level Security (RLS) a fost esențial pentru multi-tenancy. Fiecare organizație vede doar datele ei. Nu prin cod aplicativ (unde poți greși), ci la nivel de bază de date (unde PostgreSQL garantează izolarea).

Mobile: Capacitor

Aplicația pentru șoferi trebuia să fie nativă pe iOS. Capacitor mi-a permis să folosesc aceeași bază de cod React și să adaug GPS, notificări push și navigare turn-by-turn.

UI: Tailwind + shadcn/ui

Pentru un proiect SaaS unde viteza de livrare contează mai mult decât unicitatea vizuală, shadcn/ui a fost alegerea perfectă. Componente bine gândite, accesibile, ușor de customizat.

MVP-ul: de la idee la prima comandă procesată

Primele 4 săptămâni

Am început cu cea mai simplă versiune posibilă: un CRUD pentru comenzi, un formular de creare rută și un dashboard basic. Nimic spectaculos. Dar funcțional.

Secretul a fost să resist tentația de a construi „ca la carte" din prima. Prima versiune avea hardcodat tipul de vehicul. Prima versiune nu avea roluri. Prima versiune nu avea decontări. Și era ok. Pentru că prima versiune a ajuns în mâinile unui client real în 4 săptămâni, nu în 6 luni.

Rolul AI în development

Aici devine interesant. Am folosit Claude Code masiv pe tot parcursul proiectului. Nu ca un gimmick, ci ca un instrument real de productivitate.

Ce a făcut AI bine:

  • Boilerplate: Formulare, CRUD-uri, validări Zod — lucruri repetitive pe care le-am generat în minute, nu ore
  • Edge Functions Supabase: Funcții serverless cu logică de business, webhook-uri WhatsApp, procesare comenzi
  • Teste: Am ajuns la 274+ teste automate cu Vitest. Majoritatea structurii de test a fost generată de Claude, apoi ajustată manual
  • Debugging: „De ce nu merge RLS-ul pe tabela asta?" — răspunsuri instant cu context complet
  • Refactoring: Restructurări majore de cod fără teama că stric ceva

Ce NU a făcut AI:

  • Arhitectura multi-tenant — deciziile despre izolarea datelor, structura tabelelor, granularitatea permisiunilor au fost 100% ale mele
  • Înțelegerea domeniului — AI nu știe cum funcționează o firmă de curierat pe ruta RO-UK, ce înseamnă o „cursă", cum se decontează o rută
  • UX decisions — ce vede un șofer vs. ce vede un dispecer vs. ce vede un admin e o decizie de produs, nu de cod

Estimarea mea onestă: AI a redus timpul de development cu 40-50%. Nu cu 10x, cum citești pe Twitter. Dar suficient ca un singur developer să construiască un SaaS complet.

Arhitectura multi-tenant: lecția cea mai grea

Multi-tenancy înseamnă că mai multe organizații folosesc aceeași aplicație, dar fiecare vede doar datele ei. Sună simplu. Nu e.

Ce am ales: Row Level Security

Fiecare tabel din PostgreSQL are politici RLS. Când un utilizator de la Ami Tour face o interogare, PostgreSQL filtrează automat rezultatele la organizația lui. Codul aplicativ nu trebuie să adauge WHERE org_id = ? peste tot — baza de date face asta singură.

De ce a meritat

Am 4 organizații active pe aceeași instanță: Ami Tour, Wir Spedition, BICORAS și încă una. Niciuna nu a văzut vreodată datele alteia. Zero incidente de securitate. Asta e puterea RLS — chiar dacă greșesc în codul frontend, datele sunt protejate la nivel de bază de date.

Unde m-a durut

RLS face debugging-ul infernal. Când o query nu returnează rezultate, trebuie să te gândești: e un bug în query sau o politică RLS care blochează accesul? Am pierdut ore pe asta. Soluția: un Super Admin cu capacitate de impersonare — pot vedea exact ce vede orice utilizator.

Numere reale, nu metrici inventate

După prima lună de funcționare (martie 2026):

  • 42 utilizatori activi (admini, dispeceri, șoferi)
  • 4 organizații pe platformă
  • 368 comenzi procesate
  • 250 comenzi livrate (68% rată de livrare)
  • 54 rute create cu 702 opriri
  • 819 clienți în baza de date
  • 274+ teste automate

Sunt numere mici comparat cu un startup finanțat. Dar sunt numere reale, cu clienți care plătesc, pe un produs construit de o singură persoană.

Funcționalități de care sunt mândru

WhatsApp AI Agent

Clienții finali pot crea comenzi prin WhatsApp. Un agent conversațional bazat pe Claude Haiku procesează mesajul, extrage adresa de ridicare, adresa de livrare, tipul coletului și creează comanda automat. Fără formular, fără aplicație, fără cont — doar un mesaj pe WhatsApp.

Rutare optimizată

Dispecerul adaugă opriri pe o rută, iar Google Directions API optimizează ordinea. Am avut rute cu 25+ opriri. Fără optimizare, un șofer pierde ore pe drum. Cu optimizare, economisește 15-20% din timp și combustibil.

Tracking public branduit

Fiecare organizație primește o pagină de tracking cu branding-ul ei. Clientul final primește un link pe WhatsApp și vede unde e coletul, fără să instaleze nimic. Simplu, dar face o diferență enormă în percepția de profesionalism.

Greșeli pe care le-aș evita

1. Prea multă flexibilitate prea devreme

Am construit un sistem de roluri și permisiuni complex înainte să am mai mult de 2 organizații. Am pierdut probabil 2 săptămâni pe asta. La început, admin/dispecer/șofer era suficient.

2. Nu am testat pe device-uri reale destul de devreme

Aplicația pentru șoferi a fost testată pe simulator luni de zile. Când a ajuns pe telefonul real al unui șofer — surpriză — GPS-ul se comporta diferit, bateria se consuma altfel, conexiunea era instabilă. Trebuia testat pe teren din săptămâna 2.

3. Am subestimat complexitatea decontărilor

Logica financiară (cât datorează clientul, cât e plătit, cât e restant pe o rută) a fost cel mai complex domeniu. Nu tehnic — ci ca reguli de business. Am refăcut modulul financiar de 3 ori.

Ce am învățat

Poți construi un SaaS complet singur în 2026. Nu era posibil acum 5 ani. Supabase, Claude Code, Capacitor, Vercel — stack-ul modern te duce incredibil de departe fără echipă.

Dar singur nu înseamnă fără ajutor. AI e co-pilot-ul. Clienții reali sunt compass-ul. Fără feedback de la Ami Tour din prima lună, produsul ar fi arătat complet diferit.

Cel mai greu nu e codul. E să înțelegi domeniul, să rezist tentația de a construi înainte de a întreba, și să livrezi ceva imperfect în loc de nimic perfect.

Dacă vrei să vezi rezultatul, case study-ul complet colet.app are detalii despre produs, screenshots și metrici. Iar dacă ai un proiect similar în minte, hai să vorbim.

Primul pas e simplu — vorbim.

Îmi explici afacerea ta. Eu mă ocup de restul.

Hai să vorbim