A browser-based, gesture-controlled presentation player. It uses your webcam and MediaPipe's Gesture Recognizer (running entirely on-device, in JavaScript) to detect hand gestures and drive slide navigation — no backend, no uploads of your video anywhere.
Everything runs client-side. The only network calls at runtime are to fetch the MediaPipe model file and the pdf.js library from their public CDNs the first time the page loads (after that, browsers typically cache them).
smartslide-ai/
├── index.html ← page structure (slide viewer, camera panel, settings)
├── style.css ← all visual styling
├── script.js ← camera + gesture recognition + slide logic
└── README.md ← this file (also doubles as Hugging Face Space config)
That's it — three files make the app, and this README's top section (the part
between the --- lines) is what tells Hugging Face how to run the Space.
You do not need Node.js, Python, or any build step.
| Gesture | Icon | Action |
|---|---|---|
| Victory / V sign | ✌️ | Arm or disarm Smart Control (the master switch — nothing else works until this is on) |
| Swipe hand to the right | 👉 | Next slide |
| Swipe hand to the left | 👈 | Previous slide |
| Open palm | 🖐️ | Pause / resume gesture detection |
| Closed fist | ✊ | Start presentation mode. If presentation mode is already running, this asks for confirmation instead of stopping immediately |
| Point up (index finger) | ☝️ | Toggle the on-screen virtual laser pointer |
| Thumbs up | 👍 | Confirm a pending action (e.g. confirms stopping the presentation) |
Why a "master switch"? Requiring the ✌️ Victory gesture before any navigation gesture is armed means the app won't start flipping slides just because you're talking with your hands. Show ✌️ once to arm it, and again to disarm it. The on-screen "Smart Control" chip and manual buttons work as a backup at all times.
Every gesture needs to be held steady for a fraction of a second before it triggers (this is the "sensitivity" setting), and after any action there's a short cooldown before the next one can fire, so one motion can't skip multiple slides.
Browsers block camera access and ES module imports on file:// pages, so you
need a tiny local web server — no installation of frameworks required.
Option A — Python (already on most machines):
cd smartslide-ai
python3 -m http.server 8080
Then open http://localhost:8080 in Chrome or Edge.
Option B — Node.js:
cd smartslide-ai
npx serve .
Option C — VS Code:
Install the "Live Server" extension, right-click index.html, choose
"Open with Live Server."
⚠️ Use Chrome, Edge, or another Chromium-based browser for the most reliable WebGL/GPU support that MediaPixe's gesture model relies on. Safari and Firefox generally work too, but slightly slower (CPU delegate).
On first load, click "Enable Camera" and allow the browser's camera
permission prompt. Grant it over localhost or https:// — camera access is
blocked on plain http:// for any address other than localhost.
Hugging Face Spaces can host this as a Static Space — it just serves the files as-is, which is exactly what this project needs.
index.html, style.css, script.js, and README.md (this file —
its front matter is what tells the Space to use the static SDK; if you
already picked "Static" when creating the Space, Hugging Face will keep
using its own generated README config unless you overwrite it with this
one, which is fine either way).git clone https://huggingface.co/spaces/<your-username>/<your-space-name>
cd <your-space-name>
# copy index.html, style.css, script.js, README.md into this folder
git add .
git commit -m "Add SmartSlide AI"
git push
Hugging Face Spaces are served over HTTPS, so camera access works exactly like it does on any other secure website — no extra configuration needed. The first time a visitor opens your Space, their browser will ask them to allow camera access.
.jpg, .png, etc.) and/or a
.pdf deck. PDF pages are automatically rendered as individual slides,
in order.You don't need slides loaded to test gesture recognition — the camera panel, skeleton overlay, detected-gesture readout, and confidence bar all work as soon as the camera is on.
GestureRecognizer (from
@mediapipe/tasks-vision) runs on every video frame and returns 21 hand
landmarks plus a built-in gesture classification (Closed_Fist,
Open_Palm, Pointing_Up, Thumb_Up, Victory, etc.) with a confidence
score.| Problem | Likely fix |
|---|---|
| "Enable Camera" does nothing / permission denied | Check your browser's site settings and allow camera access, then reload. |
| Skeleton overlay doesn't appear | Make sure your hand is well-lit and fully in frame; try a plain background. |
| Gestures feel unresponsive | Raise "Gesture sensitivity" in Settings, and make sure "Smart Control" is armed (✌️ or the top-bar chip). |
| Slides change by themselves | Lower "Gesture sensitivity," raise "Gesture cooldown," or disarm Smart Control with ✌️ when you're not actively presenting. |
| PDF won't load | Confirm the file is a standard PDF and that you have an internet connection (pdf.js loads from a CDN). |
| Nothing loads at all | Make sure you're serving the files over http://localhost or https://, not opening index.html directly from disk. |