Mobile Manifest Schema
The complete structure of the Sellrn Mobile Manifest JSON — the contract between the web platform and the Expo mobile app.
The Mobile Manifest is a JSON document that Sellrn publishes to Supabase Storage when you generate a mobile export. The Expo starter app fetches this URL at launch and renders your store natively. This page documents the full schema.
Manifest URL
https://[supabase-storage-url]/manifests/[store-id]/manifest.jsonThe URL is shown in Dashboard → Mobile app → Manifest URL after your first generate. The Expo starter reads it from the EXPO_PUBLIC_MANIFEST_URL environment variable.
Top-level structure
{
"version": 2,
"generatedAt": "2026-06-21T10:00:00Z",
"store": { ... },
"theme": { ... },
"navigation": [ ... ],
"pages": [ ... ],
"scriptEndpoints": { ... }
}store
{
"name": "Atem Goods",
"slug": "atem-goods",
"domain": "atemgoods.com",
"currency": "GBP",
"locale": "en-GB",
"logoUrl": "https://cdn.../logo.png",
"faviconUrl": "https://cdn.../favicon.png"
}theme
The theme object contains all design tokens serialised for React Native — plain numbers and hex strings only (no CSS units, no var(), no clamp()).
{
"colors": {
"background": "#ffffff",
"foreground": "#09090b",
"primary": "#6d28d9",
"primaryForeground": "#fafafa",
"secondary": "#f4f4f5",
"muted": "#f4f4f5",
"border": "#e4e4e7",
"card": "#ffffff"
},
"typography": {
"headingFamily": "Inter",
"bodyFamily": "Inter",
"baseSizePx": 16
},
"radiusPx": 8,
"spacing": {
"sectionPaddingPx": 24
}
}navigation
Array of top-level navigation items:
[
{ "label": "Home", "type": "page", "slug": "home" },
{ "label": "Shop", "type": "collection", "slug": "all-products" },
{ "label": "About", "type": "page", "slug": "about-us" }
]pages
Array of page objects. Each page contains an array of render nodes:
[
{
"slug": "home",
"title": "Home",
"nodes": [
{
"type": "Hero",
"props": {
"heading": "Welcome to Atem Goods",
"subheading": "Premium handcrafted goods.",
"ctaLabel": "Shop Now",
"ctaHref": "/collections/all-products",
"backgroundImageUrl": "https://cdn.../hero.jpg",
"backgroundOverlay": 0.3
}
},
{
"type": "ProductGrid",
"props": {
"collectionSlug": "new-arrivals",
"columns": 2,
"limit": 6
}
}
]
}
]Render node types
Each node's type corresponds to a universal brick. The Expo starter maps each type to a React Native component. Built-in types include:
| Type | React Native component |
|---|---|
Hero | Full-bleed image with overlaid text and CTA button |
ProductGrid | FlatList of product cards from a collection |
RichText | Markdown-rendered text block |
FeatureGrid | Icon + title + text grid |
Testimonials | Horizontal scroll of review cards |
ImageBanner | Full-width image with optional caption |
Spacer | Empty vertical space |
CTABanner | Colored band with headline and button |
scriptEndpoints
{
"baseUrl": "https://yourdomain.com/api/scripts/v1",
"token": "Bearer sk_live_...",
"endpoints": {
"getStock": "/get-stock-levels",
"submitForm": "/contact-form"
}
}The Expo app uses these to call your Script Endpoints without hardcoding URLs or tokens in the app bundle.
Versioning
The version field increments when breaking schema changes are introduced. The Expo starter checks this field on launch and alerts you if the app is out of date. Content-only updates (new pages, changed copy) do not increment the version.