<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="theme-color" content="#0b0a09" />
    <meta
      name="description"
      content="Let every guest snap photos with one QR code. No app download. Live gallery, morning reveal, and a keepsake website you keep for years. Start free with 100 photos."
    />
    <meta name="robots" content="index, follow, max-image-preview:large" />
    <link rel="canonical" href="https://albumkahwin.com/" />
    <meta property="og:type" content="website" />
    <meta property="og:site_name" content="Album Kahwin" />
    <meta property="og:url" content="https://albumkahwin.com/" />
    <meta
      property="og:title"
      content="Album Kahwin — Shared Wedding Photo Gallery &amp; Keepsakes"
    />
    <meta
      property="og:description"
      content="Every guest. One shared camera. Photos that outlive the night — QR upload, live gallery, and keepsake websites for Malaysian weddings."
    />
    <meta property="og:image" content="https://albumkahwin.com/assets/hero.webp" />
    <meta name="twitter:card" content="summary_large_image" />
    <meta
      name="twitter:title"
      content="Album Kahwin — Shared Wedding Photo Gallery &amp; Keepsakes"
    />
    <meta
      name="twitter:description"
      content="Guests scan a QR code and snap photos in their browser. No app. One live gallery and keepsakes that last for years."
    />
    <meta name="twitter:image" content="https://albumkahwin.com/assets/hero.webp" />
    <link
      rel="preload"
      href="/assets/ceremony-kiss.webp"
      as="image"
      type="image/webp"
      fetchpriority="high"
    />
    <script>
      // Apply the persisted / OS-preferred theme before first paint to avoid a flash.
      // Zustand persists `albumkahwin-theme` as JSON ({state:{theme}}); accept raw too.
      (function () {
        try {
          var t;
          try {
            var s = localStorage.getItem("albumkahwin-theme");
            if (s === "dark" || s === "light") t = s;
            else if (s) {
              var p = JSON.parse(s);
              if (p && p.state && (p.state.theme === "light" || p.state.theme === "dark"))
                t = p.state.theme;
            }
          } catch (e) {}
          if (!t && window.matchMedia && matchMedia("(prefers-color-scheme: light)").matches) {
            t = "light";
          }
          if (!t) t = "dark";
          document.documentElement.dataset.theme = t;
          document.documentElement.style.colorScheme = t;
          var m = document.querySelector('meta[name="theme-color"]');
          if (m) m.content = t === "light" ? "#f4ecdc" : "#0b0a09";
        } catch (e) {}
      })();
    </script>
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
    <link
      rel="icon"
      type="image/svg+xml"
      href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📷</text></svg>"
    />
    <title>Album Kahwin — Shared Wedding Photo Gallery &amp; Keepsakes</title>
    <script type="module" crossorigin src="/assets/index-C4yckGLs.js"></script>
    <link rel="modulepreload" crossorigin href="/assets/i18n-B3JwjJLG.js">
    <link rel="modulepreload" crossorigin href="/assets/editor-CvsHrXWw.js">
    <link rel="modulepreload" crossorigin href="/assets/three-CaDVkoE_.js">
    <link rel="modulepreload" crossorigin href="/assets/analytics-CF4XulLQ.js">
    <link rel="stylesheet" crossorigin href="/assets/index-BTqstPo7.css">
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>
