The engineering bottleneck with assembled stacks
Mobile teams inherit backends shaped by somebody else’s product: a general-purpose BaaS whose data model fights the feed, or a monolith API that returns desktop-shaped payloads over mobile networks. The app team’s real requirements are small and specific — session handling, a few keyed reads, uploads that do not melt on hotel wifi — and both extremes serve them badly.
Architecture on the Software Lifecycle Cloud
The BFF is a set of gateway routes to Go functions (or a nodejs worker for TypeScript teams), each returning exactly the shape one screen needs. Sessions are rows keyed by device with expiry the handler enforces. Media uploads go straight to buckets on presigned URLs, and the resulting keys join the feed items that reference them, so the API never proxies bytes.
Payload discipline is the performance feature
A screen that needs nine fields should not download ninety. Because each route exists for a screen, payload shaping happens at declaration time in code review, not in a client-side diet after the API ossified. Feed pagination keys on the sort key the table already has, so “load more” is a keyed read with a cursor, not an offset scan that degrades as users succeed.
- Uploads bypass the API on presigned URLs — resumable, cheap, and indifferent to file size
- Sessions expire as data (a timestamp on the row), not as server stickiness
- New app versions can add routes without versioning theatre; old routes stay until old builds drain
What the app still owns
Offline sync, conflict resolution, and push delivery are app-and-platform concerns this backend supports but does not pretend to solve: it stores the state sync reconciles against and records the events push systems consume. Stating that boundary keeps the BFF thin, which is the entire point of having one.
Frequently asked questions
The function issues a presigned bucket URL and the app uploads directly; afterwards it registers the object key against the user’s records. Bytes take the short path, bookkeeping takes the declared one.
Yes. Routes are declarations: add the v2 shape beside v1, watch both in the same project, retire v1 when the old build’s traffic reaches zero. There is no single global API version to negotiate.
The backend records the events that should notify — messages, mentions, completions — in tables your existing push path consumes. KERNSTACK does not claim to be your push provider; it keeps the trigger data beside the product data that caused it.
Related capabilities, architectures, and comparisons
Ship your stack on the Software Lifecycle Cloud.
Closed preview on dedicated European infrastructure. Bring a repository or start from a blueprint.