Skip to Content
ReferenceTemplate Manifest Reference

Template Manifest Reference

Every template must include a template.manifest.json file at its root. This file describes your template to the Gymlium platform and marketplace.

Full example

{ "id": "my-awesome-template", "name": "My Awesome Template", "version": "1.0.0", "description": "A clean, modern design with bold typography and smooth animations.", "author": { "id": "dev-abc123", "name": "Jane Developer", "url": "https://janedev.com" }, "category": "bold", "tags": ["modern", "animation", "gradient"], "preview": { "thumbnail": "preview/thumbnail.png", "screenshots": [ "preview/screenshot-home.png", "preview/screenshot-about.png", "preview/screenshot-mobile.png" ] }, "pricing": { "type": "standard", "standard_price": 29.99, "currency": "GBP" }, "structure": { "styles": "template.css", "barrel": "index.ts", "pages": { "home": "pages/HomeContent.tsx", "about": "pages/AboutContent.tsx", "login": "pages/LoginContent.tsx" }, "components": { "header": "components/Header.tsx", "footer": "components/Footer.tsx", "loading": "components/Loading.tsx" } }, "navZones": [ { "id": "main", "label": "Main Navigation" }, { "id": "footer", "label": "Footer Links" } ], "i18n": { "rtlSupported": true, "testedLocales": ["en", "ar", "fr", "de"] } }

The manifest accepts only the fields listed below. The full schema is sdk/template.schema.json in the SDK.

Field reference

Required fields

FieldTypeDescription
idstringUnique identifier. Lowercase, hyphens only. Must match your directory name.
namestringDisplay name shown in the marketplace. 2 to 60 characters.
versionstringSemantic version (major.minor.patch). Start at 1.0.0.
descriptionstringShort description for the marketplace listing. 10 to 500 characters.
authorobjectAuthor information (see below).
categorystringOne of: bold, elegant, minimalist, vibrant, wellness.
tagsstring[]1 to 10 searchable tags for marketplace discovery, each up to 30 characters.
previewobjectThumbnail and screenshots (see below).
pricingobjectPricing configuration (see below).
structureobjectPaths to your stylesheet, barrel file, pages and components (see below).
navZonesobject[]Navigation areas trainers can fill with links (see below).
i18nobjectInternationalisation settings (see below).

Optional fields

FieldTypeDescription
brandingobjectHow your template handles trainer logos and the favicon (see below).
imageSlotsobject[]The photo spots your template shows (see below).

Author object

{ "id": "dev-abc123", "name": "Jane Developer", "url": "https://janedev.com" }
FieldRequiredDescription
idYesYour developer ID from the Gymlium developer portal.
nameYesYour display name on the marketplace.
urlNoLink to your portfolio or website. Shown on your marketplace profile.

Category values

CategoryDescription
boldStrong visual impact, large typography, dramatic layouts
elegantRefined aesthetics, serif fonts, subtle animations
minimalistClean, whitespace-focused, distraction-free
vibrantColourful, energetic, gradient-heavy
wellnessCalming, nature-inspired, soft colour palettes

Choose the category that best describes your template’s visual personality. This affects how trainers discover your template in the marketplace.

Preview object

{ "thumbnail": "preview/thumbnail.png", "screenshots": ["preview/screenshot-home.png", "preview/screenshot-mobile.png"] }
FieldRequiredDescription
thumbnailYesRelative path to the marketplace thumbnail. The file must exist.
screenshotsYesRelative paths to at least one screenshot for the template detail page.

See Creating Preview Images for sizes and what to capture.

Pricing object

{ "type": "standard", "standard_price": 29.99, "currency": "GBP" }
FieldRequiredDescription
typeYesOne of: free, free_with_attribution, standard, exclusive
standard_priceFor standardPrice of a standard licence.
exclusive_priceFor exclusivePrice of an exclusive licence (the template is delisted after purchase).
attribution_removal_priceFor free_with_attributionOne-time fee a trainer pays to remove the attribution link.
currencyNoISO 4217 currency code, e.g. "GBP". Defaults to "USD".

Pricing types explained:

TypeDescription
freeNo cost, no restrictions.
free_with_attributionFree to use, but includes a “Powered by [your name]” footer link. Trainers can pay a one-time fee to remove it.
standardPaid template. Multiple trainers can purchase and use it.
exclusivePaid template. Only one trainer can buy it — then it’s delisted. Premium pricing expected.

See Pricing Your Template for strategy advice.

Structure object

{ "styles": "template.css", "barrel": "index.ts", "pages": { "home": "pages/HomeContent.tsx", "about": "pages/AboutContent.tsx", "login": "pages/LoginContent.tsx" }, "components": { "header": "components/Header.tsx", "footer": "components/Footer.tsx", "loading": "components/Loading.tsx" } }
FieldRequiredDescription
stylesYesPath to the main template stylesheet.
barrelYesPath to the barrel export file.
pagesYesMap of page keys to file paths. Must include home, about and login.
componentsYesMap of component keys to file paths. Must include header, footer and loading.

Every path must point to a file that exists in your template.

[ { "id": "main", "label": "Main Navigation" }, { "id": "footer", "label": "Footer Links" } ]

At least one zone. Each needs a unique id and a human-readable label.

i18n object

{ "rtlSupported": true, "testedLocales": ["en", "ar", "fr", "de"] }
FieldRequiredDescription
rtlSupportedYesMust be true. All templates must support RTL layouts.
testedLocalesYesArray of locale codes you’ve tested. Must include at least "en".
notesNoNotes about i18n support or known limitations.

rtlSupported must be true. Templates that don’t support RTL will be rejected during review. See the RTL Layout Guide for implementation details.

Available locale codes:

en, ar, fa, fr, de, es, pt, it, nl, tr, ru, zh, ja, ko

branding object (optional)

Declares how your template integrates with per-trainer branding (logos and favicon) configured in Gymlium:

{ "branding": { "logo": { "supported": true, "headerHeightPx": 60, "footerHeightPx": 36, "fallback": "wordmark" }, "favicon": { "supported": true } } }
FieldRequiredDescription
logo.supportedYes (if branding present)Set true when Header/Footer use TemplateLogo.
logo.headerHeightPxNoDesign target for header logo height (platform default 60).
logo.footerHeightPxNoDesign target for footer logo height (platform default 36).
logo.fallbackNoMust be "wordmark" — text of the trainer’s business name when no logo is uploaded.
favicon.supportedYes (if favicon present)Set true to confirm your template is favicon-aware.

Favicons are handled by the platform. Trainers can upload an optional favicon in the signup wizard and in Dashboard → Appearance. Gymlium injects the trainer’s favicon (or the Gymlium default when none is set) into the document <head> automatically for every page. Your template must not ship its own favicon.ico or hard-code a <link rel="icon"> tag — doing so would compete with the trainer’s choice. Declaring favicon.supported: true simply confirms your template follows this rule.

imageSlots array (optional)

Lists the photo spots your template shows. During signup, Gymlium previews each spot at its shape, in light and dark, and a new site seeds it with a sample photo or the trainer’s own upload. Leave imageSlots out if your template shows no photos; the validator then warns that signup cannot preview them.

{ "imageSlots": [ { "id": "home-hero", "page": "home", "section": "home-hero", "field": "image_url", "ratio": "4:3" }, { "id": "home-about-teaser", "page": "home", "section": "home-about-teaser", "field": "image_url", "ratio": "4:5", "persona": true }, { "id": "about-hero", "page": "about", "section": "hero", "field": "image_url", "ratio": "3:1" }, { "id": "about-image-section", "page": "about", "section": "image-section", "field": "image_url", "ratio": "3:4", "persona": true } ] }
FieldRequiredDescription
idYesSample photo slot the spot is seeded from: home-hero, home-about-teaser, about-hero or about-image-section. Each id may appear once.
pageYesPage slug the spot appears on, e.g. home or about.
sectionYesPage section type that holds the image, e.g. home-hero or image-section.
fieldYesImage field in that section’s data, e.g. image_url. Its dark version is stored as image_url_dark.
ratioYesShape your template crops the image to, as width:height (e.g. 16:10). Trainers crop uploads to this shape.
personaNotrue when the sample photo follows the trainer’s “Sample photos show” choice (woman, man or no faces).

The two banners (home-hero and about-hero) always keep a generic sample photo when a trainer picks “Your own” at signup. The trainer’s photo goes into the spots about them (home-about-teaser and about-image-section), and each spot can still be changed on its own.

Validation

The manifest is validated against a JSON Schema during npm run validate. Common validation errors:

  • Missing required field — Ensure all required fields are present
  • Invalid category — Must be one of the five allowed values
  • Invalid pricing type — Must be one of the four allowed values
  • rtlSupported is false — Must be true
  • Version format — Must be valid semver (e.g. 1.0.0, not 1.0)
  • ID mismatch — The id field must match the template directory name
Last updated on