DevFrame's API surface is small on purpose.
Most product work flows through server components, services, and one save action. API routes exist where JSON or direct upload handshakes are the right boundary.
DevFrame system map
The same App Router shell powers marketing, Studio, Builder, Dashboard, and public portfolio routes.
Templates
GET
/api/templates
Public data
GET
/api/portfolios/[slug]
Uploads
POST
/api/portfolio-uploads
Publishing
Action
savePortfolioAction
GET
/api/templates
Returns the current template catalog used by the template gallery and editing surfaces.
GET
/api/portfolios/[slug]
Fetches a public portfolio by slug for integrations or client-side previews that need JSON.
POST
/api/portfolio-uploads
Creates a signed Supabase Storage upload target for profile and gallery images.
Server Action
savePortfolioAction
Persists Studio and Builder submissions through the shared portfolio service.
Service
Portfolio loading
Studio, Builder, Dashboard, public pages, and API routes should reuse the portfolio service instead of creating new data paths.
Guardrails
Request and persistence boundaries
Mutation paths stay small and server-safe while public reads remain cacheable.