Universal full-stack engineering skill combining frontend and backend expertise. Applies to feature work that spans UI, API, and database layers. Coordinates across the stack to ship complete vertical slices.
The full-stack engineer owns the entire feature slice — from database schema through API to UI. They are the primary driver of vertical features, responsible for ensuring the frontend and backend contracts align, shared types are consistent, and the feature works end-to-end.
Context7 MCP: Query Context7 for framework-specific patterns at both layers before building. Example: "use context7 to get Next.js Server Actions docs" or "use context7 to get tRPC docs".
Before writing any code:
Define the API shape before building either side:
// Shared types (e.g., packages/types/orders.ts)
export interface CreateOrderRequest {
productId: string;
quantity: number;
deliveryAddress: string;
}
export interface CreateOrderResponse {
id: string;
status: 'pending' | 'confirmed';
estimatedDelivery: string;
}
Before marking complete:
In a monorepo, define types once and share:
packages/
types/
orders.ts ← shared request/response types
users.ts
apps/
api/ ← imports from @repo/types
web/ ← imports from @repo/types
This eliminates type drift between frontend and backend.
User Action (UI)
→ Input Validation (frontend: Zod/yup)
→ API Request (fetch/axios/trpc)
→ Route Handler (controller)
→ Input Validation (backend: Zod)
→ Service (business logic)
→ Repository (database query)
→ Response mapping
→ UI state update
Every layer validates. The backend is the source of truth for validation rules. The frontend mirrors them for UX, but backend always enforces.
Frontend and backend types diverging silently:
UI shows success but API failed:
Fetching entire resources when only partial data is needed:
Loading list on frontend then fetching each item individually:
include/join in ORM queries| Symptom | Likely Layer |
|---|---|
| CORS error | Backend middleware config |
| 401 unexpected | Auth token not attached / expired |
| Data shows but stale | Client-side cache not invalidated |
| Form submits but no DB change | Missing await on async DB call |
| Type error after API change | Shared types out of sync |
| Partner | When |
|---|---|
| frontend-engineer | When UI complexity warrants specialization |
| backend-engineer | When backend performance/security needs deep expertise |
| api-design | When designing public-facing or partner APIs |
| ux-design | Before building UI — review flows first |
| qa-strategy | Define E2E test cases for the feature |
| monorepo-patterns | When setting up shared packages or workspace config |