rotogod/web/index.html
m3ultra 874aaaefa3 feat: ROTOGOD v0 — SAM-2 rotoscoping web app (load/scrub/trim → click actor → track → alpha export)
FastAPI + PyAV + transformers SAM2.1 on MPS. Relative-URL frontend (works
bare or behind digalot.fyi/rotogod/), ROTOGOD_ROOTS clip-path allowlist,
fwd+rev propagation, ProRes 4444 / WebM / matte / greenscreen exports.
deploy/rotogod.launchd.plist = always-on tailnet-bound instance.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-26 22:02:20 +10:00

87 lines
2.9 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>ROTOGOD</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="static/style.css">
</head>
<body>
<header>
<h1>ROTO<span>GOD</span></h1>
<input id="path" placeholder="/absolute/path/to/clip.mp4" spellcheck="false">
<button id="load">Load</button>
<span id="engine" class="badge">engine: …</span>
<span id="toast"></span>
</header>
<main>
<div id="stage"><canvas id="cv" width="16" height="9"></canvas></div>
<aside>
<section>
<h2>Roto</h2>
<div id="rangeInfo" class="dim">range: </div>
<div class="row">
<button id="startRoto" class="wide">Start roto on in→out</button>
<button id="resetRoto" title="drop session"></button>
</div>
<div id="objects" class="row wrap"></div>
<div class="row">
<button id="addObj">+ object</button>
<span class="dim hint">L-click add · R/⌥-click subtract</span>
</div>
<div class="row">
<button id="track" class="wide">▶ Track range</button>
<button id="trackHere" title="re-propagate from current frame">▶ here</button>
</div>
<progress id="prog" value="0" max="1"></progress>
<div id="progText" class="dim"></div>
<label class="dim"><input type="checkbox" id="showOverlay" checked> show masks</label>
</section>
<section>
<h2>Export roto</h2>
<div class="row wrap">
<button class="exp" data-kind="prores">ProRes 4444 α</button>
<button class="exp" data-kind="webm">WebM α</button>
<button class="exp" data-kind="matte">Matte</button>
<button class="exp" data-kind="green">Greenscreen</button>
</div>
<label class="dim">feather <input id="feather" type="number" value="2" min="0" max="20"></label>
</section>
<section>
<h2>Scene cut</h2>
<div class="row">
<button id="trim" class="wide">Export in→out</button>
<label class="dim"><input type="checkbox" id="exactTrim" checked> exact</label>
</div>
</section>
<section>
<h2>Output</h2>
<div id="outlist" class="dim"></div>
</section>
</aside>
</main>
<footer>
<div id="transport">
<button id="prev10">«</button><button id="prev"></button>
<button id="play"></button>
<button id="next"></button><button id="next10">»</button>
<span class="gap"></span>
<button id="setIn">⇤ in <kbd>i</kbd></button>
<button id="setOut">out ⇥ <kbd>o</kbd></button>
<span id="frameLabel" class="dim"> / </span>
</div>
<div id="timeline">
<img id="thumbs" draggable="false" alt="">
<div id="shadeL" class="shade"></div>
<div id="shadeR" class="shade"></div>
<div id="playhead"></div>
</div>
<input id="scrub" type="range" min="0" max="0" value="0" step="1">
</footer>
<script src="static/app.js"></script>
</body>
</html>