Download videos from YouTube, Vimeo, Twitter/X, Instagram, and 1000+ sites.
videotolink/
├── frontend/ React + Vite frontend (deploy to Netlify)
├── backend/ Python FastAPI backend (deploy to Render)
└── netlify.toml Netlify build config
cd backend
# Create a virtual environment
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Install dependencies (requires Python 3.10+)
pip install -r requirements.txt
# Start the server
uvicorn main:app --reload --port 8000Requires:
ffmpeginstalled and on your PATH.
- Windows:
winget install Gyan.FFmpegor download from https://ffmpeg.org/download.html- macOS:
brew install ffmpeg- Linux:
sudo apt install ffmpeg
The backend runs at http://localhost:8000
cd frontend
# Copy env file and set API URL
cp .env.example .env
# .env already points to http://localhost:8000 — no changes needed for local dev
npm install
npm run devThe frontend runs at http://localhost:5173
- Push this repo to GitHub.
- Go to https://render.com → New Web Service.
- Connect your GitHub repo.
- Set these values:
- Root directory:
backend - Runtime: Python 3
- Build command:
pip install -r requirements.txt - Start command:
uvicorn main:app --host 0.0.0.0 --port $PORT
- Root directory:
- Add environment variable:
ALLOWED_ORIGINS→https://videotolink.netlify.app(or your Netlify URL)
- Click Deploy. Copy the URL (e.g.
https://videotolink-api.onrender.com).
Render's free tier includes FFmpeg. If it's missing on a custom plan, add a build step:
apt-get install -y ffmpeg && pip install -r requirements.txt
- Go to https://netlify.com → Add new site → Import an existing project.
- Connect your GitHub repo.
- Netlify auto-detects the
netlify.toml— no extra config needed. - Add environment variable:
VITE_API_URL→ your Render backend URL (e.g.https://videotolink-api.onrender.com)
- Click Deploy site.
- (Optional) Claim a custom subdomain: Site settings → Domain management → Edit site name → type
videotolink.
| Method | Path | Description |
|---|---|---|
| GET | /health |
Health check |
| POST | /api/info |
Fetch video title, thumbnail, duration |
| POST | /api/download/start |
Start download job, returns job_id |
| GET | /api/download/status/{job_id} |
Poll download progress |
| GET | /api/download/file/{job_id} |
Download the finished file |
{ "url": "https://www.youtube.com/watch?v=..." }