Skip to main content

Settings — Downloads

Audience: Sales · Support · QA · Management · Engineering · Where in app: Settings → Downloads (/settings/downloads) · Plan availability: All plans (no permission gate)

The Downloads screen provides links to install the {brand} apps: the Desktop app (Windows / macOS / Linux) and the Mobile companion apps (iOS / Android). It detects the visitor's OS and CPU architecture, fetches the latest desktop installers directly from the GitHub release for the current brand, highlights the matching platform, and offers a one-click "Download for Your System" button. All links are white-label aware — a white-labeled deployment points at the Next Level AI repo, asset prefix, and app-store listings instead of Knock Knock's.

What it does

  • Two tabs: Desktop (default) and Mobile.
  • Desktop: cards for Windows, macOS, Linux, each linking to the correct installer; auto-highlights the detected OS; an "auto download" banner with a direct link for the detected system.
  • Mobile: App Store (iOS) and Google Play (Android) buttons.
  • OS + architecture detection to pick the right asset (e.g. macOS arm64 vs x64).
  • White-label switching of repo, asset prefix, app-store URLs, and brand name.

How it works

The view (settings/downloads/Index.vue) detects the platform on mount and fetches the latest GitHub release.

OS detection and default tab

  • detectOS() parses navigator.userAgentwindows / mac / linux / ios / android / unknown.
  • On iOS/Android the screen auto-switches to the Mobile tab; otherwise it stays on Desktop and sets detectedOS ("Windows" / "macOS" / "Linux" / "your system").

Architecture detection

detectArch() prefers navigator.userAgentData.getHighEntropyValues(['architecture']), falling back to UA string sniffing. Returns arm64 or x64 (defaults macOS to arm64). Used to choose between macOS arm64 and x64 DMGs, preferring the detected arch and falling back to the other.

GitHub release fetching

fetchReleases() calls https://api.github.com/repos/KnockKnockAppLtd/<repo>/releases/latest (cache: 'no-store') and pickAsset() matches assets by regex against the brand's asset prefix:

PlatformAsset pattern (prefix = Knock-Knock-App or Next-Level-AI)
Windows<prefix>-Windows-x64-*-Setup.exe
macOS x64<prefix>-Mac-x64-*-Installer.dmg
macOS arm64<prefix>-Mac-arm64-*-Installer.dmg
Linux<prefix>-Linux-*.AppImage

If a matched asset can't be found, the card falls back to the releases-latest page (fallbackLink).

White-label awareness

Driven by appStore.isWhiteLabeled:

AspectDefault (Knock Knock)White-labeled (Next Level AI)
Release repoKnockKnockNextLevelAI (both under org KnockKnockAppLtd)
Asset prefixKnock-Knock-AppNext-Level-AI
iOS linkknock-knock-admin App Store listingnext-level-ai App Store listing
Android linkcom.knockknock.androidcom.nextlevelai.app
Brand name in copyappStore.brandingNameagency/white-label name

Configuration & options

This screen has no saved settings — it's a download surface. Behavior is driven by runtime detection and the brand:

ElementSource
Desktop installersLatest GitHub release assets for the brand repo
macOS arch choicedetectArch() (arm64/x64)
Highlighted platform / auto-downloaddetectedOS
Mobile app linksWhite-label-aware App Store / Play URLs
Platform support copyWindows 10+, macOS 10.15+, Linux AppImage, Android 8.0+ (UI copy)

Behaviors & edge cases

  • GitHub fetch failure: logged; cards fall back to the brand's releases-latest page so links still work.
  • Architecture fallback: if the detected macOS arch DMG is missing, the other arch DMG is offered.
  • Auto-download banner only appears for desktop OSes (isDesktopOS); its link resolves to the matched installer for the detected OS or the fallback page.
  • Mobile default tab: users on iOS/Android land on the Mobile tab automatically.
  • No-store cache: the release call bypasses cache to always reflect the latest version.
  • White-label correctness matters for QA: verify a white-labeled tenant shows Next Level AI repo/assets/app-store links and the agency name (never Knock Knock).

Plan & limits

Available on all plans, no permission gate. The desktop app's own feature gating (which features require a subscription) is governed elsewhere — this screen only distributes installers. White-label availability depends on the account being a white-labeled/agency deployment (verify with Agency / branding config).

Technical implementation

  • View: frontend/src/views/settings/downloads/Index.vue
  • Route: name settings-downloads, path /settings/downloads, meta { title: 'Downloads' } (no permission) — frontend/src/router/index.js
  • Release API: GET https://api.github.com/repos/KnockKnockAppLtd/{KnockKnock|NextLevelAI}/releases/latest
  • Asset matching: pickAsset() regexes against the brand asset prefix (see desktop/electron-builder.config.js for the producing side)
  • White-label flags: appStore.isWhiteLabeled, appStore.brandingName
  • Desktop app: built/published by the desktop service — see Desktop Overview and services/desktop.