Loading...
Nicio unealtă de aici nu e aleasă ca să sune bine într-o ofertă. Fiecare rezolvă o problemă concretă, de la viteza site-ului până la sincronizarea dintre aplicația web și cea mobilă. Vrei mai multe detalii tehnice? Le discutăm la discovery, înainte să semnezi ceva.
Server Components trimit mai puțin JavaScript către browser, paginile se încarcă mai repede, iar Google citește conținutul din prima secundă. Pentru un site care trebuie să aducă clienți în fiecare lună, viteza asta se vede direct în numărul de cereri primite.
Fără `any` ascuns pe undeva. Strict mode prinde greșelile cât încă scriem codul, înainte să ajungă pe site-ul live. Așa rămâne codul ușor de modificat și peste un an, când altcineva adaugă o funcționalitate nouă.
Tailwind ne dă viteză la scris CSS, fără să inventăm mereu alte nume de clase. Radix vine cu componentele care trebuie să funcționeze corect din prima: dialog, dropdown, meniu, deja accesibile de la tastatură.
Pentru tot ce nu ține de pagini: integrări, joburi în fundal, logică de business mai complexă. FastAPI validează singur datele primite și scoate documentația API-ului direct din cod, pe măsură ce scriem codul.
FastAPI scrie o specificație OpenAPI pentru fiecare endpoint. Din ea generăm automat clientul TypeScript pentru site și clientul Dart pentru aplicația mobilă. Contractul se schimbă într-un singur loc, iar restul se regenerează de la sine.
Sesiuni semnate, reînnoire automată a tokenului, roluri și permisiuni ușor de citit dintr-o privire. Site-ul și aplicația mobilă folosesc aceeași logică de autentificare, scrisă o singură dată.
Un singur cod sursă acoperă iOS și Android. Funcționalitățile noi ajung în același timp pe ambele platforme, fără ca vreo versiune să rămână în urmă pe tăcute.
Fiecare modificare primește propriul link de preview, înainte să ajungă pe site-ul live. Dacă ceva se strică în producție, revenirea la versiunea anterioară durează câteva secunde.
Același mediu rulează pe laptop, în testare și în producție, ca să dispară scuza "la mine merge". La fiecare pull request pornesc automat testele, build-ul și deploy-ul.
Oricine poate copia o listă de tehnologii. Contează cum le pui împreună, iar diferența asta iese la iveală abia după săptămâni de folosit produsul zi de zi.
FastAPI generează specificația OpenAPI direct din codul Python. De acolo scoatem automat clientul TypeScript pentru site și clientul Dart pentru aplicația mobilă. Schimbi un câmp în backend, iar build-ul cade exact acolo unde trebuie corectat. Nimeni nu mai află peste trei luni, dintr-un bug raportat de client.
Site-ul Next.js și aplicația Flutter vorbesc cu același FastAPI. Regulile de business stau într-un singur loc: adaugi o regulă o dată și e activă imediat și pe web, și pe mobil. Nu mai umbli prin două codebase-uri ca să le ții sincronizate.
Acțiunile critice, cum e plasarea unei comenzi, folosesc actualizare optimistă și reîncearcă automat dacă rețeaua cade o clipă. Utilizatorul nu stă să se uite la un cerc care se învârte: interfața răspunde imediat, iar sincronizarea are loc în fundal. Contează mai ales într-un restaurant, unde WiFi-ul e mereu un pic nesigur.
# api/orders.py
from typing import Annotated
from fastapi import APIRouter, Depends, HTTPException, status
from pydantic import BaseModel, Field
router = APIRouter(prefix="/orders", tags=["orders"])
class OrderItem(BaseModel):
sku: str
quantity: int = Field(gt=0, le=99)
notes: str | None = None
class OrderCreate(BaseModel):
items: list[OrderItem] = Field(min_length=1)
table_label: str | None = None
class OrderRead(OrderCreate):
id: str
status: str
total_cents: int
@router.post("", response_model=OrderRead, status_code=status.HTTP_201_CREATED)
async def create_order(
payload: OrderCreate,
user: Annotated[CurrentUser, Depends(require_tenant)],
) -> OrderRead:
if not user.can("orders.create"):
raise HTTPException(status.HTTP_403_FORBIDDEN)
return await orders_service.create(tenant_id=user.tenant_id, payload=payload)
Tot ce e mai sus rulează pe contul tău, nu pe al nostru, ca să rămâi liber să continui cu altcineva dacă va fi vreodată cazul. Nu trebuie să înțelegi fiecare detaliu ca să lucrăm împreună: dacă apar întrebări tehnice pe parcurs, primești un răspuns direct la ele.
Vezi demo-ul live