i99dash docs
API referencei99dashTypes

MiniAppManifest

The `manifest.json` schema every mini-app ships. Identity, locale, and the contract that lets the catalog filter pre-clear or dim your tile per car.

The full schema for a mini-app's manifest.json — the durable identity + metadata the catalog stores, the launcher uses, and the backend validates at publish time. Every field on the wire matches the field on disk; no auto-rewrite at install except for icon / coverImage / screenshots[] which the publish service rewrites to absolute CDN URLs.

Minimal valid manifest

{
  "id": "fuel-prices",
  "name": { "en": "Fuel Prices", "ar": "أسعار الوقود" },
  "icon": "./icon.svg",
  "url": "https://miniapps.i99dash.app/fuel-prices/",
  "version": "1.0.0",
  "category": "services"
}

That's the floor — every other field has a sane default. Most real-world manifests add description and safeWhileDriving.

Field-by-field

Identity

FieldRequiredNotes
idyesURL-safe, ≤ 64 chars, lowercase + alphanumeric / - / _, must not start with a separator. Lives forever in pinned home-screen shortcuts (/.../m/<id>) — never rotate post-publish. Bump version instead.
versionyesOpaque semver-shaped string. Bumped per release; busts the WebView cache.
minHostVersionnoHosts below this show an "update your app" card. Omit for "any".

Display

FieldRequiredNotes
nameyesLocale map — at least one entry. Fallback: requested locale → en → first entry.
descriptionnoSame shape as name. UI degrades gracefully when absent.
iconyesBundle-relative path (./...), PNG or SVG, 256×256, ≤ 100 KB. Publish rewrites to a CDN URL.
coverImageno16:9 hero banner, ≤ 1280×720, ≤ 500 KB.
screenshots[]noUp to 8 images, ≤ 1920×1080, ≤ 800 KB each. Order is publisher-chosen.

Catalog placement

FieldRequiredNotes
categoryyesClosed enum — see CATEGORY_SLUGS. Drives the Store grouping.
tags[]noLowercase + hyphen, ≤ 24 chars each, ≤ 8 tags. Search/filter only.

Runtime / launch

FieldRequiredNotes
urlyesHTTPS only, must live under an allow-listed origin (miniapps.i99dash.app in v1). Enforced at launch — a catalog row pointing off-allowlist is rejected.
safeWhileDrivingdefault falseWhether the app may render while the car is moving (>5 km/h). Default conservative. Only set true for read-only / glanceable / no text input / no video / no interactive map UIs.

Network egress

FieldRequiredNotes
networknoDeclared external-egress allow-list: the bare HTTPS origins (https://host[:port], no path / query / fragment / userinfo / wildcard / IP literal / localhost) this app may reach with normal fetch()/XHR. Max 10; lowercased, canonicalized, and de-duped at parse time. The car host enforces it as a per-app Content-Security-Policy response header — every undeclared origin is blocked. Unauthenticated: declared fetch() is raw browser egress with no i99dash credentials attached; it's a least-privilege control reviewed at publish, not a guarantee against a malicious author. Omit (or []) ⇒ no third-party egress (the app can still load its own bundle).

See Calling an external API for the mental model and Call a third-party API for a worked example.

Type signature

Prop

Type

Source

On this page