# Backlog

Top unchecked item is picked up first. Keep items small and independently shippable.

- [ ] **Make top-of-funnel downloads visible.** Today "downloads" in the cloud DB only means landing-page CTA clicks (`landing_persons.set_props.downloaded_from`, values are button positions: `hero`/`header`/`outro`), which has no timestamp and misses every download that bypasses the landing page (direct GitHub/README links, auto-updater fetches). Result: the DB shows ~583 all-time "downloads" while GitHub's latest release alone has ~1,148 asset downloads, so real top-of-funnel is invisible. Three parts:
  - (1) Record a dated download event (e.g. write `first_download_at` into `set_once_props`, or emit a real dated row) when the CTA fires, so "downloads in the last N days" is a clean query instead of a `last_seen_at` approximation.
  - (2) Pull GitHub release `download_count` per tag into the metrics surface (separate source, no per-day timestamps from GitHub, so label it "all-time binary fetches" and don't conflate with landing clicks).
  - (3) **Stop the mobile/viewport drop from being invisible.** In `landing-page` `DownloadButton.tsx` the mobile branch is gated on `useMediaQuery(down('md'))`: narrow-viewport visitors are shown a `SignUpModal` and `trackDownload` is never called, so they cannot register as a download or an install. ~27% of landing traffic is mobile/touch (1,007 of 3,670 devices; 70 of 100 captured emails come from there). Since social virality (LinkedIn etc.) is overwhelmingly mobile, a large share of a viral spike lands on a desktop-only product and silently exits the funnel, making "went viral, got ~300 users" look like a flop when it's really mobile traffic hitting a Mac/Windows-only app. Fix surfaces the loss instead of hiding it: track a mobile `intent_to_download` / `mobile_signup` event distinct from desktop downloads, count it in the funnel, and (optionally) capture "email me the download link" so mobile interest can be re-activated on desktop later. Goal is a funnel that reads "X mobile interested (can't install) + Y desktop downloaded", not a single number that drops mobile on the floor.
  - Define the metric explicitly so 583 (landing clicks) vs 1,148 (binary fetches) vs mobile-interested stop being read as the same number.
  - **Status (cloud-side measurement done, not deployed):** in `openswarm-cloud`, `/api/landing/track` now stamps `first_download_at`/`last_download_at` server-side on any `downloaded_from` (no schema change, no client change needed), and `GET /api/admin/funnel` reports visitors (mobile vs desktop) -> downloads (dated) -> mobile signups -> installs + a live GitHub release-count pull. Remaining: (a) deploy it; (b) the heavier *capture* of mobile intent (a "text me the desktop link" flow, declined for now as a UX change); (c) surface the funnel in an actual dashboard instead of a raw JSON endpoint. Note: existing ~583 downloads predate the stamp, so they only show in `all_time`, not `in_window`.
