{
  "_lire_avant_de_toucher_a_id_ou_a_start_url": [
    "JSON n'a pas de commentaires, et ces deux champs ont besoin d'une raison ecrite.",
    "Ce membre n'est pas une cle de la specification : un navigateur ignore les membres",
    "qu'il ne connait pas. Il ne coute que ses octets, et il evite un nettoyage sincere.",
    "",
    "1. `id` N'EST PAS DECORATIF, ET IL NE DOIT PAS VALOIR `start_url`.",
    "   Quand `id` est absent, l'identite de l'application vaut `start_url`. Changer",
    "   `start_url` sans `id` ne produit donc PAS une mise a jour : le navigateur y voit",
    "   une AUTRE application. Les installations existantes cessent d'etre mises a jour,",
    "   continuent d'ouvrir l'ancienne adresse, et une reinstallation cree un doublon.",
    "",
    "2. `id` VAUT `/` PARCE QUE C'ETAIT L'ANCIEN `start_url`, PAS LE NOUVEAU.",
    "   C'est le point qui a l'air d'une incoherence et qui n'en est pas une. Jusqu'au",
    "   2026-08-09, `start_url` valait `/`, donc toute installation faite avant porte",
    "   l'identite implicite `/`. Poser `id: \"/\"` reprend cette identite a l'identique :",
    "   c'est ce qui permet aux installations existantes de RECEVOIR ce changement.",
    "   Le passer a `/login` pour « aligner les deux champs » casserait exactement ce",
    "   que ce champ protege, et le casserait en silence.",
    "",
    "3. POSE APRES, IL NE RATTRAPE PLUS RIEN. Un `id` n'a d'effet que s'il est present",
    "   AU MOMENT ou `start_url` change, ou avant. Ajoute plus tard, il nomme une",
    "   identite que plus aucune installation ne porte.",
    "",
    "4. POURQUOI `start_url` VAUT `/login` ET NON `/`. `/` etait la racine applicative",
    "   et redirigeait vers `/login`, qui renvoie lui-meme vers le tableau de bord du",
    "   role. Depuis l'ouverture de la vitrine publique, `/` est une page de vente,",
    "   statique et sans session : l'application installee s'ouvrait donc sur une",
    "   plaquette commerciale. `/login` restaure la chaine d'origine — le middleware y",
    "   redirige un utilisateur authentifie vers son espace, sans que ce fichier ait a",
    "   connaitre les roles.",
    "",
    "5. `scope` RESTE ABSENT, ET C'EST SUR. Un `scope` omis vaut le REPERTOIRE de",
    "   `start_url` : `/login` n'ayant pas de barre finale, le repertoire reste `/`, donc",
    "   les onze espaces restent dans la fenetre de l'application. Un `start_url` avec",
    "   barre finale (`/commercial/`) reduirait le scope a ce seul dossier et ejecterait",
    "   les dix autres espaces vers un onglet de navigateur. `check-frontiere-vitrine`",
    "   mesure cette arithmetique a chaque execution."
  ],

  "id": "/",
  "name": "Jokam — Le CRM terrain",
  "short_name": "Jokam",
  "description": "Le CRM terrain qui fait gagner du temps.",
  "start_url": "/login",
  "display": "standalone",
  "orientation": "portrait",
  "background_color": "#FFFFFF",
  "theme_color": "#1F2430",
  "categories": ["business", "productivity"],
  "icons": [
    { "src": "/brand/jokam-logo-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
    { "src": "/brand/jokam-logo-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
    { "src": "/brand/jokam-logo-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
  ]
}
