Mobile Manifest Schema

The complete structure of the Sellrn Mobile Manifest JSON — the contract between the web platform and the Expo mobile app.

Updated 2026-06-21
mobile manifest
schema
JSON
Expo
developer
API

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.json

The 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:

TypeReact Native component
HeroFull-bleed image with overlaid text and CTA button
ProductGridFlatList of product cards from a collection
RichTextMarkdown-rendered text block
FeatureGridIcon + title + text grid
TestimonialsHorizontal scroll of review cards
ImageBannerFull-width image with optional caption
SpacerEmpty vertical space
CTABannerColored 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.