{
  "schemaVersion": 1,
  "inspectedAt": "2026-10-23",
  "scope": "Source inventory from fetched default-branch revisions. Configuration and code presence do not establish store availability, successful builds or physical-device validation. Geometry uses each platform’s layout units; web uses CSS px/rem and print uses mm.",
  "adoption": "Product palettes and platform patterns are observed. Shared normalization is proposed; no native adapter migration is claimed.",
  "repositories": {
    "wifi": "1b0c2610ba1783e25fd629d977b02da7d0615550",
    "wifi-mobile": "60273a8b721cd08afd7053478d1337e05a17b332",
    "wifi-mobile-admin": "ec711adadd4638c5160de6037e5d54b0926cab9b",
    "wifi-cafe": "e30053f9aea157063d41b19329777b9794c243a7",
    "wifi-watch": "3fda236cd462a23328220ee83b4a80aaac9c34d0",
    "wifi-macos": "59fb1c7117221d34d05798919005ca0635fc85bf",
    "wifi-chrome-extension": "56dbda815469e06634a1638b3e9601f98badf2f7"
  },
  "products": [
    {
      "id": "web",
      "name": "WiFi.ee Web",
      "repository": "wifi",
      "frame": "desktop",
      "audience": {
        "en": "Visitors, contributors and workspace editors",
        "et": "Külastajad, kaastöölised ja haldajad"
      },
      "devices": {
        "en": "Phone, tablet and desktop browsers",
        "et": "Telefoni, tahvelarvuti ja arvuti brauserid"
      },
      "task": {
        "en": "Discover places, read details, join a network and maintain the directory through the web workspace.",
        "et": "Leia kohti, loe üksikasju, liitu võrguga ja halda kataloogi veebi töölaual."
      },
      "navigation": {
        "en": "Responsive site navigation, directory list/map, detail pages and authenticated workspace.",
        "et": "Kohanduv saidimenüü, kataloogi loend ja kaart, detaililehed ning sisselogitud töölaud."
      },
      "geometry": {
        "en": "72rem content shell; pill buttons; responsive content and scrollable data tables.",
        "et": "72rem sisuraam; pillikujulised nupud; kohanduv sisu ja keritavad andmetabelid."
      },
      "typography": {
        "en": "System sans stack; 14px semibold shared buttons.",
        "et": "Süsteemne sans-kiri; ühised 14px poolpaksus kirjas nupud."
      },
      "appearance": {
        "en": "Light and dark web themes; Tailwind action color references.",
        "et": "Hele ja tume veebiteema; Tailwindi tegevusvärvide viited."
      },
      "validation": {
        "en": "Validate keyboard navigation, zoom, reflow, focus and browser screen readers.",
        "et": "Kontrolli klaviatuuri, suumi, sisu ümberpaigutust, fookust ja brauseri ekraanilugejaid."
      },
      "sources": [
        {
          "path": "app/globals.css",
          "sha256": "c13b2a454c7a2f2245bf5e0e80e61a573f6f6e4a955597ec1976a86d5138b50a",
          "url": "https://github.com/krishaamer/wifi/blob/1b0c2610ba1783e25fd629d977b02da7d0615550/app/globals.css"
        },
        {
          "path": "app/layout.jsx",
          "sha256": "b1954706db8e6510c453dcfae049b126435ac74a12249ff45344464042cc6ea7",
          "url": "https://github.com/krishaamer/wifi/blob/1b0c2610ba1783e25fd629d977b02da7d0615550/app/layout.jsx"
        },
        {
          "path": "app/components/MainNav.jsx",
          "sha256": "55f2c08655ec06a2441a14d9bb829244ab31e8d71816d51dbf25b4786c598e3d",
          "url": "https://github.com/krishaamer/wifi/blob/1b0c2610ba1783e25fd629d977b02da7d0615550/app/components/MainNav.jsx"
        }
      ],
      "palettes": {
        "light": {
          "bg": "#f8fafc",
          "fg": "#0f172a",
          "surface": "#ffffff",
          "surface-muted": "#f1f5f9",
          "border": "#e2e8f0"
        },
        "dark": {
          "bg": "#030712",
          "fg": "#e2e8f0",
          "surface": "#0f172a",
          "surface-muted": "#1e293b",
          "border": "#334155"
        }
      }
    },
    {
      "id": "consumer",
      "name": "WiFi.ee Consumer",
      "repository": "wifi-mobile",
      "frame": "phone",
      "audience": {
        "en": "People looking for a place to connect",
        "et": "Inimesed, kes otsivad ühenduskohta"
      },
      "devices": {
        "en": "iPhone, iPad, Android phones and adaptive tablet layouts",
        "et": "iPhone, iPad, Androidi telefonid ja kohanduvad tahvelarvutivaated"
      },
      "task": {
        "en": "Find nearby Wi-Fi, explore a map, save places and read connection information while travelling.",
        "et": "Leia lähedal WiFi, uuri kaarti, salvesta kohti ja loe liikvel olles ühenduse teavet."
      },
      "navigation": {
        "en": "Native tabs and a right-side drawer; a persistent right sidebar on tablet-width layouts.",
        "et": "Natiivsed vahekaardid ja paremalt avanev menüü; tahvelarvuti laiuses püsiv parem külgriba."
      },
      "geometry": {
        "en": "Tablet threshold 768; 16/18/24 layout gutters; 1280 home and 1040 detail width caps. Area cards use radius 16 and padding 16.",
        "et": "Tahvelarvuti lävi 768; külgvahed 16/18/24; avalehe laius kuni 1280 ja detailil kuni 1040. Kohakaardi raadius ja polsterdus on 16."
      },
      "typography": {
        "en": "React Native system type; area titles 17/600, metadata 13. Platform icons adapt to Apple and Android.",
        "et": "React Native’i süsteemne kiri; koha pealkiri 17/600, lisateave 13. Ikoonid kohanduvad Apple’i ja Androidiga."
      },
      "appearance": {
        "en": "Blue/slate light and dark palettes; in-app light, dark or system preference. Native app configuration still sets light appearance.",
        "et": "Sinine ja hallikassinine hele/tume palett; rakenduses hele, tume või süsteemne eelistus. Natiivne rakenduse seadistus määrab endiselt heleda välimuse."
      },
      "validation": {
        "en": "Check VoiceOver and TalkBack, text scaling, safe areas, rotation, tablet resizing and permission-denied states on devices.",
        "et": "Kontrolli seadmetel VoiceOverit ja TalkBacki, teksti suurendamist, turvaalasid, pööramist, tahvelarvuti akna muutmist ja keelatud õiguste olekuid."
      },
      "sources": [
        {
          "path": "app.config.js",
          "sha256": "d9503a92d0dd792c42309723f88907526df9d87380f8d0f1ed288a4ec6495060",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/app.config.js"
        },
        {
          "path": "src/lib/theme.js",
          "sha256": "dc607b995261b7c6392d4b8678e9ad6e567411a9cf3b454e4a03ee2d7b8ee35d",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/src/lib/theme.js"
        },
        {
          "path": "src/lib/adaptiveLayout.js",
          "sha256": "6190a5f22643b648fabde324382f4dd76f5a9a7c9f59d53b48b6327794261731",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/src/lib/adaptiveLayout.js"
        },
        {
          "path": "app/native/_layout.tsx",
          "sha256": "3664fe2e5cbb472707193e8b24e257c8d82c2ea1efa1113f6d9e1eb674e1e5f8",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/app/native/_layout.tsx"
        },
        {
          "path": "src/components/WifiAreaCard.js",
          "sha256": "56c86c7192fd3256eeabbe8b93809e7e3ec656d40b2a33a4f132c137fbb5a0d1",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/src/components/WifiAreaCard.js"
        },
        {
          "path": "src/components/UnifiedHeader.js",
          "sha256": "0c14d4536acaa439ad710ec0e9bb2df8c85a430694b243d74d13281cba27e3af",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/src/components/UnifiedHeader.js"
        }
      ],
      "palettes": {
        "light": {
          "background": "#f8fafc",
          "backgroundInset": "#eff6ff",
          "card": "#ffffff",
          "cardMuted": "#f1f5f9",
          "textPrimary": "#0f172a",
          "textSecondary": "#475569",
          "textMuted": "#64748b",
          "textFaint": "#94a3b8",
          "accent": "#1d4ed8",
          "accentStrong": "#2563eb",
          "accentOn": "#ffffff",
          "accentBorder": "#bfdbfe",
          "accentSoftBackground": "#e0ecff",
          "accentSoftBorder": "#bfdbfe",
          "border": "#e2e8f0",
          "borderMuted": "#cbd5f5",
          "overlaySoft": "rgba(2,6,23,0.25)",
          "overlayStrong": "rgba(15,23,42,0.6)",
          "mapBorder": "#dbeafe",
          "mapBackground": "#e0f2fe",
          "highlight": "#eff6ff",
          "highlightMuted": "#f1f5f9",
          "warningBackground": "#fff7ed",
          "warningBorder": "#fed7aa",
          "warningText": "#9a3412",
          "warningAccent": "#fdba74",
          "toastBackground": "#0f172a",
          "toastErrorBackground": "#991b1b",
          "successBackground": "#f0fdf4",
          "successBorder": "#bbf7d0",
          "successText": "#166534",
          "disabledTint": "#e2e8f0",
          "skeleton": "#e2e8f0",
          "mapOverlayButton": "#ffffff",
          "mapOverlayBorder": "#bfdbfe",
          "modalSecondaryBackground": "#e2e8f0",
          "modalSecondaryText": "#0f172a",
          "buttonSecondaryBackground": "#e2e8f0",
          "buttonSecondaryText": "#0f172a",
          "countPillBackground": "#ffffff",
          "countPillBorder": "#e2e8f0",
          "mapEmptyBackground": "#f8fafc"
        },
        "dark": {
          "background": "#020617",
          "backgroundInset": "#0b1120",
          "card": "#0f172a",
          "cardMuted": "#0b1120",
          "textPrimary": "#f8fafc",
          "textSecondary": "#cbd5f5",
          "textMuted": "#94a3b8",
          "textFaint": "#64748b",
          "accent": "#93c5fd",
          "accentStrong": "#60a5fa",
          "accentOn": "#031424",
          "accentBorder": "#1d4ed8",
          "accentSoftBackground": "rgba(37,99,235,0.35)",
          "accentSoftBorder": "rgba(147,197,253,0.6)",
          "border": "#1f2937",
          "borderMuted": "#1f3b5b",
          "overlaySoft": "rgba(2,6,23,0.55)",
          "overlayStrong": "rgba(2,6,23,0.85)",
          "mapBorder": "#1f3b5b",
          "mapBackground": "#0b1730",
          "highlight": "rgba(59,130,246,0.2)",
          "highlightMuted": "rgba(148,163,184,0.16)",
          "warningBackground": "rgba(251, 191, 36, 0.15)",
          "warningBorder": "#9a3412",
          "warningText": "#fed7aa",
          "warningAccent": "#fb923c",
          "toastBackground": "#0f172a",
          "toastErrorBackground": "#7f1d1d",
          "successBackground": "rgba(34,197,94,0.18)",
          "successBorder": "#065f46",
          "successText": "#bbf7d0",
          "disabledTint": "#1f2937",
          "skeleton": "#1f2a3d",
          "mapOverlayButton": "#0f172a",
          "mapOverlayBorder": "#1f3b5b",
          "modalSecondaryBackground": "#1f2937",
          "modalSecondaryText": "#e2e8f0",
          "buttonSecondaryBackground": "#1f2937",
          "buttonSecondaryText": "#e2e8f0",
          "countPillBackground": "#0b1120",
          "countPillBorder": "#1f2937",
          "mapEmptyBackground": "#020617"
        }
      }
    },
    {
      "id": "admin",
      "name": "WiFi.ee Admin",
      "repository": "wifi-mobile-admin",
      "frame": "tablet",
      "audience": {
        "en": "Directory maintainers and field editors",
        "et": "Kataloogi haldajad ja välitööde tegijad"
      },
      "devices": {
        "en": "iPhone and iPad; Android and web targets configured",
        "et": "iPhone ja iPad; seadistatud Androidi ja veebi sihtplatvormid"
      },
      "task": {
        "en": "Review, create and edit areas and chains; maintain technical details, publication status, images and infrastructure records.",
        "et": "Vaata üle, loo ja muuda kohti ning kette; halda tehnilisi andmeid, avaldamise olekut, pilte ja taristu kirjeid."
      },
      "navigation": {
        "en": "Authenticated drawer workspace; drawer width follows the window, capped at 300.",
        "et": "Sisselogitud menüüga töölaud; menüü laius järgib akent, ülempiiriga 300."
      },
      "geometry": {
        "en": "Section cards: radius 24, padding 18. Inputs: radius 16. Primary actions: minimum height 50.",
        "et": "Jaotusekaardid: raadius 24, polsterdus 18. Sisendid: raadius 16. Põhitegevused: kõrgus vähemalt 50."
      },
      "typography": {
        "en": "System type; section titles 18/700, descriptions 14/20, field labels 14/600.",
        "et": "Süsteemne kiri; jaotuse pealkiri 18/700, kirjeldus 14/20, väljasilt 14/600."
      },
      "appearance": {
        "en": "Teal, warm off-white and dark green text. One source palette; a dark adapter is still an adoption task.",
        "et": "Sinakasroheline, soe valkjas taust ja tumeroheline tekst. Allikas on üks palett; tume adapter vajab veel teostamist."
      },
      "validation": {
        "en": "Check long forms with the keyboard open, resizable windows, validation errors, drafts, sync progress and unsaved edits.",
        "et": "Kontrolli pikki vorme avatud klaviatuuriga, muudetavaid aknaid, vormivigu, mustandeid, sünkroonimise edenemist ja salvestamata muudatusi."
      },
      "sources": [
        {
          "path": "app.config.js",
          "sha256": "042bfb75cf0bde8eb68106e1b3a9f3b19ae739651549cdcf784fa7c73132c723",
          "url": "https://github.com/krishaamer/wifi-mobile-admin/blob/ec711adadd4638c5160de6037e5d54b0926cab9b/app.config.js"
        },
        {
          "path": "src/lib/theme.ts",
          "sha256": "19ff28b86a7bcba9454ddef3bac852c1595dc8c38532364c9c37274004fbb08b",
          "url": "https://github.com/krishaamer/wifi-mobile-admin/blob/ec711adadd4638c5160de6037e5d54b0926cab9b/src/lib/theme.ts"
        },
        {
          "path": "src/components/SectionCard.tsx",
          "sha256": "6b1d870f26aeaa60a01b1e02f566e317eb246197086d76bc40d2550dc833dc14",
          "url": "https://github.com/krishaamer/wifi-mobile-admin/blob/ec711adadd4638c5160de6037e5d54b0926cab9b/src/components/SectionCard.tsx"
        },
        {
          "path": "src/components/FormControls.tsx",
          "sha256": "b553990455deda79f2975332d53260ab43c900d0b0d78f3b35fba33f1e882b4b",
          "url": "https://github.com/krishaamer/wifi-mobile-admin/blob/ec711adadd4638c5160de6037e5d54b0926cab9b/src/components/FormControls.tsx"
        },
        {
          "path": "app/(app)/_layout.tsx",
          "sha256": "a6e9970ded2f446a7ae5bb61ed558bafcd04dae15f04c02e8335a1ec902825d2",
          "url": "https://github.com/krishaamer/wifi-mobile-admin/blob/ec711adadd4638c5160de6037e5d54b0926cab9b/app/(app)/_layout.tsx"
        },
        {
          "path": "README.md",
          "sha256": "63142271f3ef5082038b581a75d0974c664bd5bafac33a4f128a2c46df54a54c",
          "url": "https://github.com/krishaamer/wifi-mobile-admin/blob/ec711adadd4638c5160de6037e5d54b0926cab9b/README.md"
        }
      ],
      "palettes": {
        "light": {
          "background": "#f3f4ed",
          "surface": "#fffdfa",
          "surfaceBright": "#fffefb",
          "surfaceMuted": "#eef1ea",
          "surfaceStrong": "#15211f",
          "text": "#10201b",
          "textMuted": "#5f6f69",
          "textOnDark": "#f7f7f1",
          "border": "#d5ddd5",
          "accent": "#0f766e",
          "accentMuted": "#d7f2ec",
          "accentBorder": "#b6e4db",
          "accentTrack": "#8ed3c5",
          "accentDeep": "#22534b",
          "success": "#166534",
          "successMuted": "#dcfce7",
          "warning": "#92400e",
          "warningMuted": "#fef3c7",
          "danger": "#b91c1c",
          "dangerMuted": "#fee2e2",
          "info": "#1d4ed8",
          "infoMuted": "#dbeafe"
        }
      }
    },
    {
      "id": "cafe",
      "name": "WiFi.ee Café",
      "repository": "wifi-cafe",
      "frame": "tablet",
      "audience": {
        "en": "Venue owners and café staff",
        "et": "Koha omanikud ja kohviku töötajad"
      },
      "devices": {
        "en": "iPhone and iPad; Android and web targets configured",
        "et": "iPhone ja iPad; seadistatud Androidi ja veebi sihtplatvormid"
      },
      "task": {
        "en": "Update guest Wi-Fi details, venue information and captive-portal posters, then share Quick Login with guests.",
        "et": "Uuenda külaliste WiFi andmeid, koha teavet ja portaali plakateid ning jaga külalistega kiirliitumist."
      },
      "navigation": {
        "en": "A focused owner workspace with a window-aware drawer capped at 300.",
        "et": "Omaniku ülesannetele keskenduv töölaud; akna laiust arvestav menüü kuni 300."
      },
      "geometry": {
        "en": "Section cards: radius 18, padding 20, a 7-unit ticket stripe. Inputs: radius 16. Primary actions: minimum height 50.",
        "et": "Jaotusekaardid: raadius 18, polsterdus 20, 7 ühiku piletitriip. Sisendid: raadius 16. Põhitegevused: kõrgus vähemalt 50."
      },
      "typography": {
        "en": "System type; section titles 18/800, descriptions 14/20, action labels 15/700.",
        "et": "Süsteemne kiri; jaotuse pealkiri 18/800, kirjeldus 14/20, tegevussilt 15/700."
      },
      "appearance": {
        "en": "Brown and cream, with coffee, sage and brass accents. One source palette; no implemented dark palette is recorded.",
        "et": "Pruun ja kreemikas, kohvi-, salvei- ja messingitooni aktsentidega. Allikas on üks palett; teostatud tumedat paletti ei ole talletatud."
      },
      "validation": {
        "en": "Check on-site photo and poster workflows, keyboard avoidance, guest credentials, ownership boundaries and failed saves.",
        "et": "Kontrolli kohapeal foto- ja plakatitoiminguid, klaviatuuri vältimist, külaliste võrguandmeid, omaniku õigusi ning ebaõnnestunud salvestamist."
      },
      "sources": [
        {
          "path": "app.config.js",
          "sha256": "584ed1f1510ef1bf902fbd948cfac10cc577673f298c5280f33d7a459f864bf3",
          "url": "https://github.com/krishaamer/wifi-cafe/blob/e30053f9aea157063d41b19329777b9794c243a7/app.config.js"
        },
        {
          "path": "src/lib/theme.ts",
          "sha256": "18e223b1a4034e036157e7e4a456fc7d644e474899b08be8d9a7e527f35e2764",
          "url": "https://github.com/krishaamer/wifi-cafe/blob/e30053f9aea157063d41b19329777b9794c243a7/src/lib/theme.ts"
        },
        {
          "path": "src/components/SectionCard.tsx",
          "sha256": "44ff6d80e81278689f0a2314f7850c4d2ecfa4c3f17992293e1eafab6526874c",
          "url": "https://github.com/krishaamer/wifi-cafe/blob/e30053f9aea157063d41b19329777b9794c243a7/src/components/SectionCard.tsx"
        },
        {
          "path": "src/components/FormControls.tsx",
          "sha256": "bf6f8c2ed56c3745d4897e5bcc254c9fc6bca92c4cfbffb74aa54b1abb1ba106",
          "url": "https://github.com/krishaamer/wifi-cafe/blob/e30053f9aea157063d41b19329777b9794c243a7/src/components/FormControls.tsx"
        },
        {
          "path": "app/(app)/_layout.tsx",
          "sha256": "672ad56e9ccb2ea23b6644b2997b059bd474cc47b4e7eaac3b2878eedff20bc0",
          "url": "https://github.com/krishaamer/wifi-cafe/blob/e30053f9aea157063d41b19329777b9794c243a7/app/(app)/_layout.tsx"
        },
        {
          "path": "README.md",
          "sha256": "2b745b666028f6e09f45c9b9bb0b9f8e2883a07e9585b47f38d1afecd777f23f",
          "url": "https://github.com/krishaamer/wifi-cafe/blob/e30053f9aea157063d41b19329777b9794c243a7/README.md"
        }
      ],
      "palettes": {
        "light": {
          "background": "#f7f0e6",
          "surface": "#fffaf2",
          "surfaceMuted": "#efe2d2",
          "surfaceStrong": "#30231b",
          "text": "#2a211c",
          "textMuted": "#78675b",
          "textOnDark": "#fff8ee",
          "border": "#dcc8b2",
          "accent": "#9f4f2d",
          "accentMuted": "#f5decc",
          "cafePanel": "#fff3df",
          "coffee": "#5b3826",
          "coffeeMuted": "#ead7c4",
          "sage": "#527365",
          "sageMuted": "#e0ebe3",
          "brass": "#b98532",
          "brassMuted": "#f5e7c8",
          "chalk": "#26343a",
          "success": "#527365",
          "successMuted": "#e0ebe3",
          "warning": "#a56b22",
          "warningMuted": "#f5e7c8",
          "danger": "#b44031",
          "dangerMuted": "#f9ddd8",
          "info": "#2f6479",
          "infoMuted": "#dcebf0"
        }
      }
    },
    {
      "id": "watch",
      "name": "WiFi.ee Watch",
      "repository": "wifi-watch",
      "frame": "watch",
      "audience": {
        "en": "People checking nearby places at a glance",
        "et": "Inimesed, kes vaatavad lähedasi kohti pilguga"
      },
      "devices": {
        "en": "Apple Watch / watchOS",
        "et": "Apple Watch / watchOS"
      },
      "task": {
        "en": "Read distance-ranked nearby places, refresh and open a place in Maps.",
        "et": "Vaata kauguse järgi järjestatud lähedasi kohti, värskenda ja ava koht kaardil."
      },
      "navigation": {
        "en": "SwiftUI NavigationStack and a carousel list; short location, radius and refresh controls.",
        "et": "SwiftUI NavigationStack ja karussell-loend; lühikesed asukoha, raadiuse ja värskendamise juhtelemendid."
      },
      "geometry": {
        "en": "Material cards with continuous radius 12 and padding 8; compact rows rather than a scaled phone screen.",
        "et": "Materjalipinnaga kaardid sujuva raadiusega 12 ja polsterdusega 8; kompaktsed read."
      },
      "typography": {
        "en": "Native headline, body and caption2 styles; rounded system text and monospaced distances.",
        "et": "Natiivsed headline-, body- ja caption2-stiilid; ümar süsteemne kiri ning monosammulised kaugused."
      },
      "appearance": {
        "en": "Semantic SwiftUI foregrounds, cyan/blue/black background and material surfaces. Preserve system rendering.",
        "et": "SwiftUI semantilised esiplaanivärvid, tsüaani/sinise/musta taust ja materjalipinnad. Säilita süsteemne renderdus."
      },
      "validation": {
        "en": "Check small and large watch sizes, Crown scrolling, VoiceOver, large text, denied location and stale cached results.",
        "et": "Kontrolli väikest ja suurt kella, Crowniga kerimist, VoiceOverit, suurt teksti, keelatud asukohta ning aegunud vahemälu tulemusi."
      },
      "sources": [
        {
          "path": "Sources/WifiWatchApp/ContentView.swift",
          "sha256": "fc2206e5137244c135a06d9cc3b620792103e115417160cfcf21e18dedefc6ec",
          "url": "https://github.com/krishaamer/wifi-watch/blob/3fda236cd462a23328220ee83b4a80aaac9c34d0/Sources/WifiWatchApp/ContentView.swift"
        },
        {
          "path": "README.md",
          "sha256": "115ef4368d879ec19c9cbac74d4b6597addaa40d56538306781800afbce694bc",
          "url": "https://github.com/krishaamer/wifi-watch/blob/3fda236cd462a23328220ee83b4a80aaac9c34d0/README.md"
        }
      ]
    },
    {
      "id": "macos",
      "name": "WiFi.ee for Mac",
      "repository": "wifi-macos",
      "frame": "desktop",
      "audience": {
        "en": "Desktop users and people switching networks",
        "et": "Arvutikasutajad ja võrkude vahetajad"
      },
      "devices": {
        "en": "Mac windows, menu bar and Settings",
        "et": "Maci aknad, menüüriba ja Settings"
      },
      "task": {
        "en": "Browse places with list/detail navigation, inspect network information and use the menu-bar companion.",
        "et": "Sirvi kohti loendi ja detailivaatega, vaata võrgu teavet ning kasuta menüüriba kaasrakendust."
      },
      "navigation": {
        "en": "Native split views, toolbar search, Settings and MenuBarExtra; refresh with Command–Shift–R.",
        "et": "Natiivsed jagatud vaated, tööriistariba otsing, Settings ja MenuBarExtra; värskenda Command–Shift–R abil."
      },
      "geometry": {
        "en": "Current main window minimum 1180 × 760; Settings 700 × 520. Area thumbnails 84 × 84 with radius 14.",
        "et": "Praeguse põhiakna alampiir 1180 × 760; Settings 700 × 520. Koha pisipilt 84 × 84, raadius 14."
      },
      "typography": {
        "en": "SwiftUI semantic text styles, native controls and SF Symbols.",
        "et": "SwiftUI semantilised tekstistiilid, natiivsed juhtelemendid ja SF Symbols."
      },
      "appearance": {
        "en": "System semantic foregrounds and materials, blue connected-network and yellow bookmark accents.",
        "et": "Süsteemsed semantilised esiplaanivärvid ja materjalid, sinine ühendatud võrgu ning kollane järjehoidja aktsent."
      },
      "validation": {
        "en": "Check full keyboard use, menu-bar popovers, VoiceOver, focus between panes and the actual minimum window size.",
        "et": "Kontrolli täielikku klaviatuurikasutust, menüüriba hüpikuid, VoiceOverit, paneelide vahelist fookust ja tegelikku minimaalset aknasuurust."
      },
      "sources": [
        {
          "path": "Sources/WifiMacOSApp/App/WifiMacOSApp.swift",
          "sha256": "6cf6b80a0660e57a1a935084a380d3d1c802e971acaf8279c9417c30783f2dac",
          "url": "https://github.com/krishaamer/wifi-macos/blob/59fb1c7117221d34d05798919005ca0635fc85bf/Sources/WifiMacOSApp/App/WifiMacOSApp.swift"
        },
        {
          "path": "Sources/WifiMacOSApp/Views/AreaBrowserView.swift",
          "sha256": "046b07921682845459361b700866891200868248e5283e836d2c86748ad21cb2",
          "url": "https://github.com/krishaamer/wifi-macos/blob/59fb1c7117221d34d05798919005ca0635fc85bf/Sources/WifiMacOSApp/Views/AreaBrowserView.swift"
        },
        {
          "path": "README.md",
          "sha256": "0571e88164b7f517a0bb9a45f2adcbf6f6e4e879c5d8f863810d116574638ce9",
          "url": "https://github.com/krishaamer/wifi-macos/blob/59fb1c7117221d34d05798919005ca0635fc85bf/README.md"
        }
      ]
    },
    {
      "id": "extension",
      "name": "WiFi.ee Browser Companion",
      "repository": "wifi-chrome-extension",
      "frame": "panel",
      "audience": {
        "en": "People researching places while browsing",
        "et": "Inimesed, kes otsivad kohti veebis sirvides"
      },
      "devices": {
        "en": "Chrome and Edge side panels, Firefox sidebar and Safari popup; browser options pages",
        "et": "Chrome’i ja Edge’i külgpaneelid, Firefoxi külgriba ja Safari hüpik; brauseri seadistuslehed"
      },
      "task": {
        "en": "Discover places, read Quick Login details, save bookmarks and hand off to the website or native apps.",
        "et": "Leia kohti, loe kiirliitumise andmeid, salvesta järjehoidjaid ja liigu veebilehele või natiivsesse rakendusse."
      },
      "navigation": {
        "en": "Discover, Saved, Suggest and Tools tabs. Chromium panel, Firefox sidebar and Safari popup adapters; separate account and optional Mac bridge states.",
        "et": "Discover-, Saved-, Suggest- ja Tools-vahekaardid. Chromiumi paneeli, Firefoxi külgriba ja Safari hüpiku adapterid; eraldi konto ning valikulise Maci silla olekud."
      },
      "geometry": {
        "en": "Minimum panel width 320px; 12px content gutters and radius 16px cards.",
        "et": "Paneeli alampiir 320px; sisu külgvahed 12px ja kaartide raadius 16px."
      },
      "typography": {
        "en": "System sans 13px/1.45; compact metadata and monospace credentials need legibility review.",
        "et": "Süsteemne sans-kiri 13px/1,45; kompaktne lisateave ja monosammulised võrguandmed vajavad loetavuse kontrolli."
      },
      "appearance": {
        "en": "Consumer-like light and dark palettes are copied into CSS, not imported from a shared package.",
        "et": "Tarbija omaga sarnane hele ja tume palett on kopeeritud CSS-i, mitte imporditud ühisest paketist."
      },
      "validation": {
        "en": "Check panel resize, keyboard focus, zoom, sign-in expiry, absent native bridge and permission-denied states. Browser packages require separate release checks.",
        "et": "Kontrolli paneeli suurust, klaviatuurifookust, suumi, sisselogimise aegumist, puuduvat natiivset silda ja keelatud õigusi. Brauseripaketid vajavad eraldi väljalaskekontrolli."
      },
      "sources": [
        {
          "path": "manifest.json",
          "sha256": "4559c573bebbf9802c73e6456031e57d163f083bd2d28cfb9dd0f8fb49ac0dd2",
          "url": "https://github.com/krishaamer/wifi-chrome-extension/blob/56dbda815469e06634a1638b3e9601f98badf2f7/manifest.json"
        },
        {
          "path": "scripts/manifest-targets.mjs",
          "sha256": "d400c3693dabc197b11761e13078cc60cf8e9600c8472b622b5a4a05267cf2eb",
          "url": "https://github.com/krishaamer/wifi-chrome-extension/blob/56dbda815469e06634a1638b3e9601f98badf2f7/scripts/manifest-targets.mjs"
        },
        {
          "path": "sidepanel.css",
          "sha256": "e936e93d2d200aa3fd8281a5717dcf67897e71369d334efad73da0f59c244ea0",
          "url": "https://github.com/krishaamer/wifi-chrome-extension/blob/56dbda815469e06634a1638b3e9601f98badf2f7/sidepanel.css"
        },
        {
          "path": "sidepanel.html",
          "sha256": "a38489b39c74365d6abb7932cd58a3d07918f5c8b52bcc2b93d6393a5e9e12a2",
          "url": "https://github.com/krishaamer/wifi-chrome-extension/blob/56dbda815469e06634a1638b3e9601f98badf2f7/sidepanel.html"
        },
        {
          "path": "README.md",
          "sha256": "4e39ac2f917693cca1d5ccaf1e5c462b013e2a975007502fae3094dacb3c2ad9",
          "url": "https://github.com/krishaamer/wifi-chrome-extension/blob/56dbda815469e06634a1638b3e9601f98badf2f7/README.md"
        }
      ],
      "palettes": {
        "light": {
          "bg": "#f8fafc",
          "bg-inset": "#eff6ff",
          "surface": "#ffffff",
          "surface-raised": "#ffffff",
          "surface-soft": "#f1f5f9",
          "text": "#0f172a",
          "text-secondary": "#475569",
          "muted": "#64748b",
          "border": "#e2e8f0",
          "border-strong": "#cbd5f5",
          "accent": "#1d4ed8",
          "accent-strong": "#2563eb",
          "accent-on": "#ffffff",
          "accent-soft": "#e0ecff",
          "accent-border": "#bfdbfe",
          "success": "#166534",
          "success-bg": "#f0fdf4",
          "warning": "#9a3412",
          "warning-bg": "#fff7ed",
          "danger": "#991b1b",
          "secondary-button": "#e2e8f0",
          "secondary-button-text": "#0f172a",
          "toast": "#0f172a"
        },
        "dark": {
          "bg": "#020617",
          "bg-inset": "#0b1120",
          "surface": "#0f172a",
          "surface-raised": "#0f172a",
          "surface-soft": "#0b1120",
          "text": "#f8fafc",
          "text-secondary": "#cbd5f5",
          "muted": "#94a3b8",
          "border": "#1f2937",
          "border-strong": "#1f3b5b",
          "accent": "#93c5fd",
          "accent-strong": "#60a5fa",
          "accent-on": "#031424",
          "accent-soft": "rgba(37, 99, 235, 0.35)",
          "accent-border": "rgba(147, 197, 253, 0.6)",
          "success": "#bbf7d0",
          "success-bg": "rgba(34, 197, 94, 0.18)",
          "warning": "#fed7aa",
          "warning-bg": "rgba(251, 191, 36, 0.15)",
          "danger": "#fecaca",
          "secondary-button": "#1f2937",
          "secondary-button-text": "#e2e8f0",
          "toast": "#0f172a"
        }
      }
    },
    {
      "id": "quick-login",
      "name": "Quick Login / App Clip",
      "repository": "wifi-mobile",
      "frame": "phone",
      "audience": {
        "en": "Guests arriving from a venue link or QR code",
        "et": "Külalised, kes saabuvad koha lingilt või QR-koodilt"
      },
      "devices": {
        "en": "iPhone App Clip; browser join-link fallback",
        "et": "iPhone’i App Clip; brauseri liitumislingi varuvariant"
      },
      "task": {
        "en": "Identify the venue and exact public network, choose a network if needed and request a connection.",
        "et": "Tuvasta koht ja täpne avalik võrk, vajadusel vali võrk ning taotle ühendust."
      },
      "navigation": {
        "en": "Focused join flow with network selection, connecting, already connected, success, unavailable and retry states.",
        "et": "Keskendunud liitumisvoog: võrgu valik, ühendamine, juba ühendatud, õnnestumine, puuduvad andmed ja kordamine."
      },
      "geometry": {
        "en": "SwiftUI join screen: 22 horizontal padding, radius 18 network card, primary join action minimum height 56.",
        "et": "SwiftUI liitumisvaade: rõhtne polsterdus 22, võrgukaardi raadius 18, liitumise põhitegevuse kõrgus vähemalt 56."
      },
      "typography": {
        "en": "System type with a prominent venue title and selectable SSID text.",
        "et": "Süsteemne kiri silmapaistva kohanime ja valitava SSID-tekstiga."
      },
      "appearance": {
        "en": "System background and secondary-system surfaces with native blue actions.",
        "et": "Süsteemne taust ja teisesed süsteemsed pinnad natiivsete siniste tegevustega."
      },
      "validation": {
        "en": "Check real invocation links, Unicode SSIDs, network permission prompts, cancelled joins and truthful connection feedback on an iPhone.",
        "et": "Kontrolli iPhone’il päris avamislinke, Unicode’i SSID-sid, võrguõiguste dialooge, katkestatud liitumist ja tõest ühenduse tagasisidet."
      },
      "sources": [
        {
          "path": "ios/wifimobileClip/ContentView.swift",
          "sha256": "e8334dbad55a83b17c8c94d22e3dd62f758f6063d0ec871f33ab50d4302248db",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/ios/wifimobileClip/ContentView.swift"
        },
        {
          "path": "plugins/withSwiftUIAppClip.js",
          "sha256": "3e7e2e0c01d35c4efc7a8086078fba8f86caf519e11c0b7f3db3f481a754d534",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/plugins/withSwiftUIAppClip.js"
        },
        {
          "path": "ios/wifimobile.xcodeproj/project.pbxproj",
          "sha256": "eaf5ac28365ec5413dbf8486f79b60af4999900d7e8df3cbd096480b9a2e51ee",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/ios/wifimobile.xcodeproj/project.pbxproj"
        }
      ]
    },
    {
      "id": "glance",
      "name": "Widgets / Live Activities",
      "repository": "wifi-mobile",
      "frame": "widget",
      "audience": {
        "en": "People checking nearby or connected Wi-Fi without opening the app",
        "et": "Inimesed, kes vaatavad lähedast või ühendatud WiFi-t rakendust avamata"
      },
      "devices": {
        "en": "iOS home and lock screens; Dynamic Island source variants",
        "et": "iOS-i ava- ja lukustusekraan; Dynamic Islandi lähtekoodivariandid"
      },
      "task": {
        "en": "Show a nearby place or recent connection context and link into the full app.",
        "et": "Näita lähedast kohta või hiljutise ühenduse konteksti ja ava täisrakendus."
      },
      "navigation": {
        "en": "Widget small, medium and rectangular accessory source variants; Live Activity compact, minimal and expanded layouts.",
        "et": "Vidina väike, keskmine ja ristkülikukujuline lisavaade; Live Activity kompaktne, minimaalne ja laiendatud vaade."
      },
      "geometry": {
        "en": "System-managed widget containers; concise content for each family. Live Activity uses capsule actions.",
        "et": "Süsteemi hallatavad vidinakonteinerid; iga pere jaoks lühike sisu. Live Activity kasutab kapslikujulisi tegevusi."
      },
      "typography": {
        "en": "SwiftUI headline, caption and footnote styles; lock-screen tinting can remove product colors.",
        "et": "SwiftUI headline-, caption- ja footnote-stiilid; lukustusekraani toonimine võib tootevärvid eemaldada."
      },
      "appearance": {
        "en": "Semantic system colors and explicit stale-connection text. Live Activity plugin is configured; Widget source presence does not establish target integration or distribution.",
        "et": "Semantilised süsteemivärvid ja selge aegunud ühenduse tekst. Live Activity plugin on seadistatud; vidina lähtekoodi olemasolu ei tõenda sihtmärgi ühendamist ega levitamist."
      },
      "validation": {
        "en": "Validate target wiring, entitlement/build integration, privacy, stale timelines, tinted rendering and supported devices before claiming release readiness.",
        "et": "Enne väljalaskevalmiduse väidet kontrolli sihtmärgi ühendamist, õigusi ja ehitust, privaatsust, aegunud ajajoont, toonitud renderdust ning toetatud seadmeid."
      },
      "sources": [
        {
          "path": "app.config.js",
          "sha256": "d9503a92d0dd792c42309723f88907526df9d87380f8d0f1ed288a4ec6495060",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/app.config.js"
        },
        {
          "path": "ios/WifiWidget/NearestWifiWidget.swift",
          "sha256": "9ababce6ee996ea3a9556355d1a0ea47703854d35fa9d77e3fe6ae765bf1942f",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/ios/WifiWidget/NearestWifiWidget.swift"
        },
        {
          "path": "ios/ConnectedWifiLiveActivityExtension/ConnectedWifiLiveActivityWidget.swift",
          "sha256": "0b7e66a87287e5e8d72e4ca6fa4d680b57fb0ae123a7b0088a484dd258ec3b9b",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/ios/ConnectedWifiLiveActivityExtension/ConnectedWifiLiveActivityWidget.swift"
        },
        {
          "path": "plugins/withConnectedWifiLiveActivity.js",
          "sha256": "256fd7548f62a69930e28628da166e61d22638d8c7a001d16f10297852fb3b40",
          "url": "https://github.com/krishaamer/wifi-mobile/blob/60273a8b721cd08afd7053478d1337e05a17b332/plugins/withConnectedWifiLiveActivity.js"
        }
      ]
    },
    {
      "id": "print",
      "name": "Quick Login print",
      "repository": "wifi",
      "frame": "paper",
      "audience": {
        "en": "Venue staff preparing signs and guests scanning them",
        "et": "Silte ettevalmistavad töötajad ja neid skannivad külalised"
      },
      "devices": {
        "en": "A6 portrait paper, camera and phone handoff",
        "et": "A6 püstine paber, kaamera ja üleandmine telefoni"
      },
      "task": {
        "en": "Make a printable network card with a Wi-Fi QR code and bilingual joining instructions.",
        "et": "Loo prinditav võrgukaart WiFi QR-koodi ja kakskeelsete liitumisjuhistega."
      },
      "navigation": {
        "en": "Physical scan into a connection flow; the paper itself has no interactive navigation.",
        "et": "Füüsiline skannimine ühendusvoogu; paberil puudub interaktiivne navigeerimine."
      },
      "geometry": {
        "en": "105 × 148mm PDF; dark QR modules on white. Keep the QR quiet zone, scale and print legibility.",
        "et": "105 × 148mm PDF; tume QR valgel. Säilita QR-i vaba serv, mõõtkava ja trüki loetavus."
      },
      "typography": {
        "en": "Helvetica / Helvetica Bold PDF text; special SSID text can be rasterized to retain its spelling.",
        "et": "PDF-is Helvetica / Helvetica Bold; erimärkidega SSID-teksti saab rasterdada kirjapildi säilitamiseks."
      },
      "appearance": {
        "en": "Print uses a white paper surface and retained logo, independent of the screen theme.",
        "et": "Trükk kasutab valget paberipinda ja säilitatud logo, sõltumatult ekraani teemast."
      },
      "validation": {
        "en": "Print at actual size, scan with multiple phones, check quiet zones and verify exact SSID and password encoding.",
        "et": "Prindi tegelikus suuruses, skanni mitme telefoniga, kontrolli vaba serva ning SSID ja parooli täpset kodeeringut."
      },
      "sources": [
        {
          "path": "app/haldus/tabs/PrintableWifiPosterCard.jsx",
          "sha256": "77ecf8bd628fbdb95fb52876c8e5806378fece781dfb2d37a47f2ba37cf30e15",
          "url": "https://github.com/krishaamer/wifi/blob/1b0c2610ba1783e25fd629d977b02da7d0615550/app/haldus/tabs/PrintableWifiPosterCard.jsx"
        }
      ]
    },
    {
      "id": "embed",
      "name": "WiFi.ee Embed",
      "repository": "wifi",
      "frame": "embed",
      "audience": {
        "en": "Venue website owners and their visitors",
        "et": "Koha veebilehe omanikud ja külastajad"
      },
      "devices": {
        "en": "Embedded badges inside third-party websites",
        "et": "Kolmanda osapoole veebilehtede märgised"
      },
      "task": {
        "en": "Present concise venue Wi-Fi information inside the host website.",
        "et": "Näita koha WiFi kohta lühikest teavet võõrustaval veebilehel."
      },
      "navigation": {
        "en": "A compact embedded badge with a link back to the venue information.",
        "et": "Kompaktne manustatud märgis lingiga koha teabe juurde."
      },
      "geometry": {
        "en": "10px corner radius; content must fit narrow host columns without inheriting unreadable styles.",
        "et": "Nurga raadius 10px; sisu peab mahtuma kitsasse veergu, pärimata loetamatuid stiile."
      },
      "typography": {
        "en": "System font with venue, access conditions, SSID and available speed information.",
        "et": "Süsteemne kiri kohanime, ligipääsutingimuste, SSID ja olemasoleva kiirusteabega."
      },
      "appearance": {
        "en": "Light/dark neutral surfaces and blue actions. Attribution is not a network security certificate.",
        "et": "Heledad/tumedad neutraalsed pinnad ja sinised tegevused. Allikamärge ei ole võrgu turvasertifikaat."
      },
      "validation": {
        "en": "Check narrow containers, host-page theme combinations, accessible links, missing fields and unavailable requests.",
        "et": "Kontrolli kitsaid konteinereid, võõrustava lehe teemakombinatsioone, ligipääsetavaid linke, puuduvaid välju ja ebaõnnestunud päringuid."
      },
      "sources": [
        {
          "path": "public/embed/badge.js",
          "sha256": "2de8e72086a533bc0bb5bac98a785b42009e1f97c4e234a8fdd0803febc1839e",
          "url": "https://github.com/krishaamer/wifi/blob/1b0c2610ba1783e25fd629d977b02da7d0615550/public/embed/badge.js"
        },
        {
          "path": "app/api/embed/badge/route.ts",
          "sha256": "e77e1ce92adb256f80e5598364a0d676e1335553867c0f2ea12e3e5456d5947d",
          "url": "https://github.com/krishaamer/wifi/blob/1b0c2610ba1783e25fd629d977b02da7d0615550/app/api/embed/badge/route.ts"
        }
      ]
    }
  ]
}
