18160c22f7
Pairs a phone to the desktop by QR code, then sends recordings over an iroh connection for Sona to transcribe, streaming the transcript back. The phone side is a PWA deployed alongside the website at /vibe/phone/. Browsers cannot hole-punch, so its traffic is relayed — end-to-end encrypted throughout, so the relay only ever sees ciphertext. Desktop: - iroh endpoint behind the `vibe/handoff/0` ALPN, off by default and restored on startup only when the user previously enabled it - pairing token compared in constant time; identity persisted so the QR survives restarts - incoming audio saved to ~/Documents/Vibe like any other recording, and written to the transcripts store so it lands in Recents - Settings -> Phone section with a self-contained QR encoder, reachable from a phone icon in the sidebar footer - launch-at-startup setting via tauri-plugin-autostart, default off Phone PWA: - React + Vite on the desktop app's UI stack - language list and model come from the desktop over the wire, never hardcoded, so the picker always matches the loaded model - MediaRecorder mime negotiation for Safari, screen wake lock, and an install-to-home-screen hint Analytics cover adoption and success rate without sending transcripts, filenames, paths, or the chosen language. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
22 lines
868 B
HTML
22 lines
868 B
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
|
<title>Vibe Phone</title>
|
|
<link rel="manifest" href="/manifest.webmanifest" />
|
|
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)" />
|
|
<meta name="theme-color" content="#181818" media="(prefers-color-scheme: dark)" />
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-title" content="Vibe Phone" />
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
<link rel="apple-touch-icon" href="/icons/icon-192.png" />
|
|
<link rel="icon" type="image/png" href="/icons/icon-192.png" />
|
|
</head>
|
|
|
|
<body>
|
|
<div id="root"></div>
|
|
<script type="module" src="/src/main.tsx"></script>
|
|
</body>
|
|
</html>
|