<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
    <!-- Matches --app-bg in the dark theme, which is now the default, so the
         browser/PWA chrome doesn't band against the top of the page. -->
    <meta name="theme-color" content="#14161a" />
    <meta name="description" content="Log every record you own, track the gigs you go to, and take the lot with you — offline. Free, unlimited, no card required." />

    <!-- Site ownership, for Impact (the affiliate network behind Ticketmaster's
         programme). Copied byte-for-byte from what they issued and it must stay
         that way: their crawler matches the exact string, so re-quoting it,
         reformatting it or regenerating the id breaks verification.

         Note `value=` rather than the standard `content=`. That is what Impact
         specifies and what they look for. It is not a typo, and "fixing" it to
         content= would silently fail the check. -->
    <meta name='impact-site-verification' value='fd9a0584-25cc-473a-8597-afdd3215ff0a'>

    <!-- Link previews. Posted to X, Facebook, Discord, Slack, WhatsApp or
         Reddit, a URL with none of this renders as a bare grey link; with it,
         a titled card. og:image must be an absolute URL — crawlers don't
         resolve relative paths — so it's hardcoded to the production origin;
         update both it and og:url together if the domain moves. That origin is
         `www.analog.rocks` and not the apex: Vercel 308-redirects `analog.rocks`
         to the www host, and declaring a canonical that redirects splits share
         counts between the two. The image
         wants to be 1200x630 (1.91:1) for `summary_large_image`: much narrower
         and X and Facebook crop it, much smaller than 600px wide and they fall
         back to the small card. -->
    <meta property="og:type" content="website" />
    <meta property="og:site_name" content="Analog" />
    <meta property="og:title" content="Analog — your record collection, in your pocket" />
    <meta property="og:description" content="Log every record you own, track the gigs you go to, and take the lot with you — offline. Free, unlimited, no card required." />
    <meta property="og:url" content="https://www.analog.rocks/" />
    <meta property="og:image" content="https://www.analog.rocks/link-header.png" />
    <meta property="og:image:alt" content="Analog — your record collection, in your pocket" />
    <meta name="twitter:card" content="summary_large_image" />
    <meta name="twitter:image" content="https://www.analog.rocks/link-header.png" />
    <meta name="twitter:title" content="Analog — your record collection, in your pocket" />
    <meta name="twitter:description" content="Log every record you own, track the gigs you go to, and take the lot with you — offline. Free, unlimited, no card required." />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
    <meta name="apple-mobile-web-app-title" content="ANALOG" />
    <link rel="manifest" href="/manifest.json" />
    <link rel="icon" href="/favicon.ico" />
    <link rel="apple-touch-icon" href="/icons/apple-touch-icon.png" />
    <title>Analog — your record collection, in your pocket</title>
    <script>
      // Apply the saved colour system before paint to avoid a flash of the
      // wrong theme on reload. Dark is the default, so only an explicitly
      // chosen "light" opts out — and a first visit (or unreadable storage)
      // lands on dark. analog_theme_choice holds presses of the toggle only;
      // the older analog_theme was written on every mount, so it can't tell a
      // choice from a default. Keep this in sync with App.jsx.
      (function () {
        try {
          var t = localStorage.getItem("analog_theme_choice") === "light" ? "light" : "dark";
          document.documentElement.setAttribute("data-theme", t);
        } catch (e) { document.documentElement.setAttribute("data-theme", "dark"); }
      })();
    </script>
    <script type="module" crossorigin src="/assets/index-4tWLCgG2.js"></script>
    <link rel="stylesheet" crossorigin href="/assets/index-B2N0W0l2.css">
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>
