{
  "name": "Cliently",
  "short_name": "Cliently",
  "description": "Customer management that works offline and syncs across your devices.",

  "_note_scope": "Relative, not absolute. The same manifest then works at a domain root, on a subdomain and in a subfolder -- which matters when the deploy is an upload rather than a platform that knows about the app. An already-installed app also keeps its identity across a move.",
  "start_url": "./",
  "scope": "./",

  "display": "standalone",
  "display_override": ["standalone", "minimal-ui", "browser"],

  "_note_orientation": "There is deliberately no orientation key. An orientation lock applies to the INSTALLED app, so portrait-primary means the tablet rotates and the app does not -- which is wrong for any app with wide tables in it, and a CRM is mostly wide tables.",

  "background_color": "#f7f8fa",
  "theme_color": "#1f6fd6",
  "categories": ["business", "productivity"],
  "lang": "en",
  "dir": "ltr",

  "_note_icons": "The maskable icon is a separate entry rather than purpose 'any maskable'. A launcher crops a maskable icon to its own shape, commonly a circle, so that artwork has to sit inside the middle 80% -- and artwork drawn that way looks small and floating when used uncropped. One bitmap cannot be correct under both rules.",
  "icons": [
    { "src": "icons/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
    { "src": "icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
    { "src": "icons/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" },
    { "src": "icon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any" }
  ],

  "_note_shortcuts": "Hash routes, so the part after # never reaches the server and the navigation always matches the cached './'. PomoDone's shortcuts are query strings, which forced a special case into its service worker to stop them falling through to the browser's offline page.",
  "shortcuts": [
    { "name": "Contacts", "short_name": "Contacts", "url": "./#/w/last/contacts" },
    { "name": "New contact", "short_name": "New", "url": "./#/w/last/contacts?new=1" }
  ],

  "_note_launch": "Tapping a shortcut should come back to the window that is already open, not stack a second one over an app that may have unsaved editors in it.",
  "launch_handler": { "client_mode": "navigate-existing" }
}
