{
    "_comment": "The public page's manifest, and deliberately not manifest.webmanifest. That one describes the owner's dashboard: its start_url is the owner's address, so a stranger who installed it from the front door would get an icon that opens somebody else's traffic behind a sign-in wall. This one describes the front door, which is the only thing a stranger is looking at. Paths are relative to this file for the same reason manifest.webmanifest's are: the install root is / on the VPS and /misc/kestrel.host under MAMP, and Audience::shared is the same answer for the stylesheet.",
    "_display": "browser, not standalone, and that is the point of having a second file rather than a flag on the first. A manifest is what makes a site installable, and a landing page that asks a first-time reader to keep it on their home screen is asking for a commitment they have had ten seconds to form an opinion about. display:browser fails Chrome's installability test on purpose, so no prompt is ever raised here, while the name, the description and the icons below are still what a phone uses when somebody adds this to their home screen because they wanted to. The dashboard, which is a thing people open twice a day, is the page worth installing and is the one that says so.",
    "name": "Kestrel",
    "short_name": "Kestrel",
    "description": "Traffic stats and a live visitor badge for every site you run, from your server's logs or one small script. No cookies. An AI agent can install it end to end.",
    "lang": "en-GB",
    "dir": "ltr",
    "start_url": ".",
    "scope": ".",
    "display": "browser",
    "background_color": "#f4f1ea",
    "theme_color": "#f4f1ea",
    "icons": [
        { "src": "assets/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
        { "src": "assets/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
        { "src": "assets/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" },
        { "src": "assets/icon.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any" }
    ]
}
