A small local web app for practicing tango moves you find in Instagram Reels. Paste a reel link in, it downloads the video to your machine, and you get a simple player where you can loop a section of the clip and slow it down to drill the move. Give each saved move a nickname so you can find it again later.
Single-user, runs entirely on your own machine — no accounts, no cloud sync, no server to deploy.
- Paste an Instagram reel URL and it downloads the video locally (via
yt-dlp) and generates a thumbnail (viaffmpeg). - A library view of all your saved moves.
- A player view per move with:
- A dual-handle loop slider to pick the start/end of the section you want to drill — playback repeats that section automatically.
- Speed controls (1x / 0.75x / 0.5x / 0.25x).
- An editable nickname, separate from the original Instagram caption.
- Your loop range, speed, and nickname are saved automatically and restored next time you open that move.
- Delete moves you no longer need (removes the video file too).
-
Node.js (v18+)
-
yt-dlpandffmpeg, installed and on your machine. On macOS with Homebrew:brew install yt-dlp ffmpegBy default the app looks for these at
/opt/homebrew/bin/yt-dlpand/opt/homebrew/bin/ffmpeg(the standard Homebrew path on Apple Silicon Macs). If yours are installed somewhere else (Intel Mac, Linux, etc.), update the paths insrc/lib/paths.js. You can find your install paths withwhich yt-dlpandwhich ffmpeg.yt-dlpis updated frequently to keep up with Instagram's changes — if downloads start failing, trybrew upgrade yt-dlp(orpip3 install --upgrade yt-dlpif you installed it via pip) before assuming something else is wrong.
git clone [email protected]:a17levine/insta_tango.git
cd insta_tango
npm install
npm start
Then open http://localhost:3000 in your browser.
- On the library page, paste an Instagram reel URL (e.g.
https://www.instagram.com/p/DciOIgYOuqq/) and optionally give it a nickname, then click Save move. The download can take anywhere from a few seconds to about a minute. - Click into a saved move to open the player.
- Drag the two handles under the video to set the loop's start and end points — the video will play, hit the end point, and jump back to the start automatically, on repeat.
- Use the speed buttons to slow playback down while looping.
- Click the nickname text to rename the move.
- Your loop range and speed are saved automatically a moment after you stop adjusting them.
- Delete a move from either the library or the player view when you're done with it.
- Only public Instagram posts/reels are supported — private accounts or posts that require being logged in to view will fail to download. This is a deliberate v1 scope decision (no cookie/login support), not a bug.
- This is meant to run locally for a single person. There's no authentication and nothing is deployed anywhere.
server.js Express app entry point
src/routes/records.js API routes (create/list/get/update/delete a move)
src/lib/downloader.js Downloads via yt-dlp, transcodes to H.264/AAC mp4
src/lib/thumbnails.js Generates a thumbnail via ffmpeg
src/lib/db.js Simple JSON file store (data/db.json)
public/ Frontend: library view, player view, loop slider
data/ Downloaded videos, thumbnails, and the JSON db
(gitignored — created automatically on first run)