Skip to content

Layout — the launcher's home screen

Which apps appear on the Gerege App launcher's home screen, in what order and under which headings, is decided by the operator (a server-driven layout, a port of openpay's layout). Developers do not change the layout — agree with the operator where your app appears on the home screen. This page is meant to help developers understand what is shown, and for implementers on the host/operator side.

1. Versions

The layout is versioned: draft → published → archived. Only one is published at a time. Publishing makes the previous one archived; a rollback republishes an archived version as a new version — the history only grows, and "what did people see on Tuesday?" always has an answer.

2. Sections

type Meaning Fields
featured A strip of hand-picked apps, in the order given items (slugs)
grid A titled grid, in the order given title, items, columns (default 4)
category The apps of one category: those named in items first, the rest by name category, items?, limit?
categories A row of category tiles, each showing how many apps it has items (category codes)

Every section has an id (^[a-z0-9][a-z0-9-]{0,39}$). Limits: ≤ 30 sections, ≤ 24 items per section, title ≤ 80, body ≤ 64 KB. An unknown field → an error (a typo is not saved and silently ignored).

Slugs are checked at publish (and rollback) — a draft may name an app that is in review. After publishing, a suspended app drops out of everyone's reads by itself.

3. The person's side — GET /api/v1/miniapp/layout?channel=ios|android|web

With the person's session. Returns the published layout, filtered to the apps that person can open on that device (published + matching channel; the person's own drafts are not included). When no layout is published, default: true — a default layout containing every category that has apps.

{ "version": 7, "default": false, "sections": [
  { "id": "top", "type": "featured", "title": "Онцлох", "apps": [ { "slug": "esim", "name": "Аяллын eSIM", "…": "…" } ] },
  { "id": "cats", "type": "categories", "title": "Ангилал",
    "categories": [ { "category": "travel", "title": "Аялал", "count": 3 } ] } ] }

apps[] is the same publicApp as in the launcher's list (slug, name, icon, category, status, scopes, whether connected …). Cache-Control: private, no-cache.

4. The operator's side — /api/v1/miniapp/review/layouts

Only the MINIAPP_OPERATOR_TENANT_ID organisation (the same as review).

Method Path
GET /review/layouts Every version
POST /review/layouts {sections, note?} → a new draft
GET · PATCH · DELETE /review/layouts/{id} Read / edit / delete a draft
POST /review/layouts/{id}/publish Publish a draft (every slug a published app; those pinned in a category belong to that category)
POST /review/layouts/{id}/rollback Publish an archived version as a new version
GET /review/layouts/{id}/preview?channel= Any version (a draft too) as a person would see it