Skip to content

Modes de lancement & manifeste (infos.json)

infos.json est le manifeste de l'appli : il décrit comment elle se lance, ses permissions, ses pages et ses ressources.

launch-mode

  • oneshot — l'appli est lancée, fait son travail, puis se termine (kapp.finish()). Ex. mini-jeu instantané, tirage au sort.
  • backtask — tourne en arrière-plan, sans UI obligatoire. Ex. bot de modération, compteur, agrégateur d'événements.
  • external — s'ouvre dans une fenêtre popout dédiée (séparée de l'overlay), comme une appli desktop. Ex. tableau de bord, interface debug.

externable: true ajoute un bouton « lancer en popout » en plus du mode classique (ignoré si launch-mode = external).

Champs clés

jsonc
{
  "textset": "textset.js",
  "launch-mode": "oneshot",       // oneshot | backtask | external
  "externable": false,
  "app-index": "index.html",
  "scopes": ["chat:read", "chat:write"],   // permissions Twitch requises
  "services": [],                  // services exposés par l'appli (cf. common/reference/services.md)
  "run-output": null,              // format de sortie pour apps.run (cf. reference/app-to-app.md)
  "kind": null,                    // contrat standard apps.run, ex. "pick-string"
  "window": { "width": 1920, "height": 1080, "x": 0, "y": 0 },
  "viewers-plugin": null,          // page viewers (cf. reference/plugins.md)
  "streamer-plugin": null,         // page streamer
  "viewers-readme": null,
  "viewers-optout": false,         // le viewer peut se retirer lui-même de l'appli
  "streamer-readme": null,
  "public-assets": null,
  "required": []
}

viewers-optout

À passer à true si ton appli peut cibler un viewer sans qu'il l'ait demandé (tirage au sort d'un adversaire, désignation d'une victime, etc.). Le viewer voit alors, sur sa page d'appli (/v/{channel}/{slug}), un bouton « ne plus me faire participer ».

Un viewer retiré devient invisible pour ton appli : kapp.users.get() ne le trouve plus, il n'apparaît plus dans kapp.chat.getActiveUsers(), tu ne reçois plus ses messages ni ses events (follow, sub, raid…), il ne peut plus lancer l'appli et ne peut plus être passé en argument de trigger. Écris donc ton code comme si ce viewer n'existait pas — c'est déjà le cas pour toi.

Le flag ne gouverne que le droit du viewer : le streamer, lui, peut interdire n'importe quelle appli à n'importe quel viewer depuis son dashboard, que le flag soit présent ou non.

Pièges

  • Choisis le launch-mode selon l'usage : une appli backtask n'appelle pas forcément display(), une oneshot doit penser à finish().
  • scopes doit couvrir les actions Twitch utilisées (ex. chat:write pour kapp.chat.say).
  • Déclare dans services uniquement si d'autres briques doivent piloter ton appli (voir common/reference/services.md).
  • viewers-optout : une liste de viewers peut revenir plus courte que demandée (kapp.users.get([...])) ou un getActiveUsers() vide — gère le cas au lieu de supposer que la cible existe.