YouTube Timestamp Search
Search across YouTube video transcripts and jump to specific timestamps. No API key required!
Live Demo
š Try it now: https://yt-timestamper.onrender.com/
Quick test:
- Paste this URL:
https://www.youtube.com/watch?v=79MZkur73c4
- Wait for it to load
- Search for:
CEO
- Click any timestamp to jump to that moment!
- For playlists paste
https://www.youtube.com/watch?v=V6Om-kymesc&list=PL3LrMc0CEvcarCS-yyI_lqLmMTd2ccUlt
Note: First load may take ~30s (free tier cold start). Duration may show as "0:00" on Render due to YouTube rate limiting - this is cosmetic only and doesn't affect functionality. Works perfectly when running locally.
Features
- š„ Multi-video support - Add multiple YouTube videos (regular, Shorts, various URL formats)
- š Playlist support - Add entire playlists at once
- š Full-text search - Search across all video transcripts simultaneously
- ā±ļø Instant playback - Click any result to jump to that exact timestamp
- š Export timestamps - Copy all matching timestamps as YouTube URLs to clipboard
- š Dark/light mode - Theme toggle with system preference detection
- š¾ Session persistence - Videos persist across page refreshes
- ā” Real-time feedback - Loading indicators and error notifications
- šØ Clean UI - Minimal, modern interface with smooth animations
Tech Stack
- Frontend: Svelte 5 + Vite + TypeScript
- Backend: Express + Node.js
- Transcript fetching: youtubei.js (no YouTube API key needed)
Setup
# Install root dependencies
npm install
# Install server dependencies
cd server
npm install
cd ..
Development
# Run both frontend and backend
npm run dev
This starts two dev servers:
Or run separately:
# Terminal 1 - Backend
cd server
npm run dev
# Terminal 2 - Frontend
npm run dev:client
Usage
- Add videos: Paste a YouTube URL or playlist and click "Add Video"
- Supports:
youtube.com/watch?v=..., youtu.be/..., youtube.com/shorts/..., youtube.com/playlist?list=...
- Wait for loading: Video thumbnail, title, and duration will appear
- Search: Type keywords in the search bar to find matches across all transcripts
- Play: Click any timestamp result to play the video at that exact moment
- Export: Click "Export" to copy all matching timestamps as YouTube URLs
- Manage: Remove individual videos or use "Clear All" to start fresh
Production Build
# Build frontend and backend
npm run build
# Test production build locally
npm start
Visit http://localhost:3001 to test the production build.
Testing
cd server
npm test
Tests verify:
- Video ID extraction from various URL formats
- Metadata fetching (title, duration)
- Transcript retrieval
Project Structure
yt-timestamper/
āāā src/ # Frontend (Svelte)
ā āāā lib/ # Svelte components
ā āāā App.svelte # Main app component
ā āāā types.ts # TypeScript types
āāā server/ # Backend (Express)
ā āāā api/
ā ā āāā youtube.ts # YouTube API integration
ā āāā tests/ # Unit tests
ā āāā server.ts # Express server
āāā README.md
Deployment
Deploy to Render (Free)
- Push your code to GitHub
- Go to render.com and sign up
- Click "New +" ā "Web Service"
- Connect your GitHub repository
- Render will auto-detect
render.yaml and deploy!
Your app will be live at https://your-app-name.onrender.com
How it works:
- Backend serves both API endpoints and the built frontend
- Single deployment for the entire app
- Free tier spins down after 15 minutes of inactivity (cold start ~30s on first request)
Architecture
Development:
- Frontend: Vite dev server on port 5173
- Backend: Express server on port 3001
- CORS enabled for local development
Production:
- Single Express server serves both frontend (static files) and backend (API)
- Frontend makes relative API calls (no CORS needed)
- Deployed as one unit to Render
Known Issues
- Duration shows 0:00 on Render: YouTube rate-limits duration fetching from datacenter IPs. This is cosmetic only - all core features (transcripts, search, playback) work perfectly. Duration displays correctly when running locally.
Notes
- Videos are stored in sessionStorage and persist across page refreshes
- Invalid or unavailable videos are automatically rejected with error notification
- Transcript fetching uses existing YouTube captions (auto-generated or manual)
- No YouTube API key required - uses youtubei.js library