File size: 2,814 Bytes
b8cc2bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c783252
 
 
 
b8cc2bf
c783252
 
 
 
 
 
8a16cdb
c783252
8a16cdb
c783252
 
 
 
b8cc2bf
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="Content-Security-Policy"
    content="default-src 'self'; connect-src 'self' blob: https://huggingface.co https://*.huggingface.co https://*.hf.co https://fonts.googleapis.com https://fonts.gstatic.com; font-src 'self' https://fonts.gstatic.com; frame-src 'self'; img-src 'self' data:; object-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob:; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; worker-src 'self' blob:;" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta name="description" content="Keet - Privacy-first real-time transcription. Your audio stays on your device." />
  <meta name="theme-color" content="#6B705C" />
  <meta name="mobile-web-app-capable" content="yes" />
  <meta name="apple-mobile-web-app-capable" content="yes" />
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
  <title>Keet - Real-time Transcription</title>

  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link
    href="https://fonts.googleapis.com/css2?family=Crimson+Pro:ital,wght@0,400;0,500;0,600;1,400&family=Plus+Jakarta+Sans:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500&display=swap"
    rel="stylesheet">
  <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap"
    rel="stylesheet" />

  <!-- PWA Manifest -->
  <link rel="manifest" href="./manifest.json" />
</head>

<body>
  <div id="root"></div>
  <script type="module" src="/src/index.tsx"></script>

  <script>
    const isLocalDevHost = location.hostname === 'localhost' || location.hostname === '127.0.0.1';
    const isHfSpace = location.hostname.endsWith('.hf.space');

    if ('serviceWorker' in navigator && !isLocalDevHost) {
      window.addEventListener('load', () => {
        if (isHfSpace) {
          navigator.serviceWorker.getRegistrations()
            .then((regs) => Promise.all(regs.map((reg) => reg.unregister())))
            .then(() => {
              if (!('caches' in window)) return;
              return caches.keys()
                .then((keys) => Promise.all(keys.map((k) => caches.delete(k))));
            })
            .then(() => console.log('[App] SW disabled on HF Space (all caches cleared to avoid stale chunks).'))
            .catch((err) => console.warn('[App] SW cleanup on HF failed:', err));
          return;
        }

        navigator.serviceWorker.register('./sw.js')
          .then((reg) => console.log('[App] SW registered:', reg.scope))
          .catch((err) => console.warn('[App] SW registration failed:', err));
      });
    }
  </script>
</body>

</html>