83 lines
4.2 KiB
HTML
83 lines
4.2 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
<link rel="stylesheet" href="/caption-local/theme.css" />
|
|
<title>captions.coop — self-hosted live captions</title>
|
|
<meta name="description" content="Self-hosted live captions: speech-to-text, private relay and on-server translation." />
|
|
<style>
|
|
:root { color-scheme:dark; --accent:#2498Eb; --bg:#0f1420; --panel:#172338; --line:#2c3c58; --text:#eef3fb; --muted:#9fb0cb; }
|
|
* { box-sizing:border-box; }
|
|
body { margin:0; padding:0 16px 48px; background:var(--bg); color:var(--text); font:16px/1.55 system-ui,-apple-system,Segoe UI,Roboto,sans-serif; }
|
|
.wrap { max-width:820px; margin:0 auto; }
|
|
header { padding:40px 0 8px; }
|
|
h1 { font-size:30px; line-height:1.2; margin:0 0 8px; }
|
|
h1 .brand { color:var(--accent); }
|
|
header p { margin:0; color:var(--muted); max-width:64ch; }
|
|
h2 { font-size:18px; margin:0 0 12px; }
|
|
.panel { background:var(--panel); border:1px solid var(--line); border-radius:12px; padding:22px; margin-top:20px; }
|
|
label { display:block; margin:0 0 6px; color:var(--muted); }
|
|
input { width:100%; padding:10px; font:inherit; border-radius:8px; border:1px solid var(--line); background:#0c111c; color:var(--text); }
|
|
.row { display:flex; flex-wrap:wrap; gap:8px; align-items:center; margin-top:12px; }
|
|
.btn { display:inline-block; font:inherit; cursor:pointer; padding:9px 14px; border-radius:8px; border:1px solid var(--line); background:#0c111c; color:var(--text); text-decoration:none; }
|
|
.btn:hover { border-color:var(--accent); }
|
|
.btn.primary { background:var(--accent); border-color:var(--accent); color:#041018; font-weight:600; }
|
|
code { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; background:#0c111c; border:1px solid var(--line); border-radius:4px; padding:1px 6px; overflow-wrap:anywhere; }
|
|
.muted { color:var(--muted); }
|
|
#createResult { margin-top:16px; }
|
|
#createResult a { color:var(--accent); overflow-wrap:anywhere; }
|
|
.error { color:#ffd7d7; }
|
|
.steps { margin:12px 0 0; padding-left:22px; color:var(--muted); }
|
|
.steps li { margin:6px 0; }
|
|
footer { margin-top:32px; color:var(--muted); font-size:14px; }
|
|
footer a { color:var(--accent); }
|
|
@media (max-width:560px){ .row .btn{ width:100%; text-align:center; } }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="wrap">
|
|
<header>
|
|
<h1><span class="brand">captions.coop</span> — self-hosted live captions</h1>
|
|
<p>Create a private Caption Admin Room for a meeting, class or stream. Speech-to-text, the relay and translation run on this deployment.</p>
|
|
</header>
|
|
|
|
<section class="panel">
|
|
<h2>Create a Caption Admin Room</h2>
|
|
<form id="createForm">
|
|
<label for="label">Admin room name (optional)</label>
|
|
<input id="label" maxlength="128" autocomplete="off" placeholder="Sunday Performance" />
|
|
<div class="row"><button class="btn primary" type="submit" id="createButton">Create admin room</button></div>
|
|
</form>
|
|
<p id="createError" class="error" role="alert"></p>
|
|
<div id="createResult" hidden>
|
|
<h3>Save your private admin link</h3>
|
|
<p class="muted">This is the only time the full admin link is shown. Anyone with it can caption, edit and close the room. It stays valid until you replace it.</p>
|
|
<p><a id="adminUrl" target="_blank" rel="noopener noreferrer"></a></p>
|
|
<div class="row">
|
|
<button class="btn" id="copyAdmin" type="button">Copy admin link</button>
|
|
<a class="btn" id="openRoom">Open Caption Admin Room</a>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>How it works</h2>
|
|
<ol class="steps">
|
|
<li>Create a Caption Admin Room and keep the private admin link.</li>
|
|
<li>Press <strong>Start captioning</strong> and allow the microphone.</li>
|
|
<li>Open the caption editor to review text before it goes live.</li>
|
|
<li>Open the Caption Admin Room to copy the public audience link for OBS or viewers.</li>
|
|
</ol>
|
|
<p class="muted">Audio is transcribed on the server and is not saved. Caption Admin Rooms end when you close them.</p>
|
|
</section>
|
|
|
|
<footer>
|
|
<a href="https://captions.coop">captions.coop</a> — self-hosted live captions.
|
|
</footer>
|
|
</div>
|
|
<script src="/home.js"></script>
|
|
</body>
|
|
</html>
|