A zero-install, draggable browser widget that supercharges HTML5 video players with circular progress tracking, granular speed control, micro-navigation, live captions, and a sleek dark/light theme.
- Open any webpage with an HTML5
<video>element (YouTube, LMS, Coursera, etc.). - Open DevTools Console (
F12→ Console). - Copy the entire contents of
floVid.jsand paste it into the console. PressEnter. - The widget appears in the top-right corner. Drag it anywhere.
| Feature | Description |
|---|---|
| Circular Progress Ring | SVG ring with gradient stroke showing % completion and speed-adjusted remaining time |
| Rotary Scrubbing | Click and drag on the circular progress ring in a clockwise/anti-clockwise motion to seek forward/backward |
| Dynamic Completion Time | Dynamic "Completes at" estimation above the circle that adjusts in real-time to your playback speed |
| Hover Volume Scroll | Hover over the widget and scroll your wheel up/down to adjust volume, featuring temporary circular feedback |
| Granular Speed Control | Slider from 0.5x to 3.0x in 0.05x steps, with + / − nudge buttons |
| Micro-Navigation | ⏪ / ⏩ ±5s seek buttons; click elapsed time to jump to any hh:mm:ss timestamp |
| Play / Pause Toggle | Reliable play/pause button that works even when native video click is intercepted |
| Theme Toggle | Instantly switch between dark and light modes |
| Window Fullscreen | CSS fake-fullscreen keeps the widget visible; native fullscreen auto-hides it |
| Live Captions | Web Speech API overlay (English) — experimental, Chrome only |
| SPA Adaptation | Automatically detects and rebinds to new <video> elements when navigating between videos |
| CSP-Safe | Built entirely with document.createElement / createElementNS — works on YouTube's Trusted Types CSP |
- Injection: A single IIFE pasted into the console injects a fixed-position
div(z-index: 99999) intodocument.body. - Video Binding: The script queries
document.querySelector('video')and attaches event listeners. AMutationObserverwatches for SPA video swaps and rebinds automatically. - Progress Math:
(currentTime / duration) * 100maps to SVGstroke-dashoffseton a 140×140px ring. - Speed-Aware Remaining Time:
remainingWallClock / playbackRategives real-world minutes left at the current speed. - DOM Construction: Every element is built programmatically via
createEl()andcreateSvgEl()helpers to bypass Trusted Types restrictions.
| File | Purpose |
|---|---|
floVid.js |
The complete widget script (paste this into the console) |
context.md |
Problem statement, goals, target users, and constraints |
architecture.md |
Component breakdown, data flow, and system boundaries |
decision.md |
Design decisions and trade-offs |
prompts.md |
Iterative prompt history that shaped the project |
- Chrome (recommended) — full feature set including SpeechRecognition captions
- Firefox / Edge / Safari — core widget works; captions may be limited
- Console-only: Must be re-pasted on every page reload (no extension persistence).
- Captions require mic access: The Web Speech API captures ambient audio via the device microphone; it cannot tap the system audio stream directly due to browser security sandboxing.
- Single video: Binds to the first
<video>element found. On pages with multiple videos, it targets the primary player.
Built by Varun Gautam — LinkedIn
Click the © 2026 Varun Gautam text inside the widget to visit the author's profile.
MIT © 2026 Varun Gautam