A small AI project that turns Travel reels into a searchable knowledge base.
My wife and I constantly share reels for:
- 🌍 travel destinations
- 🍜 restaurants
- 🏝 hidden beaches
- 🍣 food spots
They get buried across multiple WhatsApp groups, and after a while we forget things like:
“What was that Goa restaurant reel?”
“Didn't we save a Bali beach video?”
Scrolling through chat history becomes impossible.
Turn reels into a personal AI memory.
Paste a reel URL and the system will:
- Download the reel
- Extract frames from the video
- Analyze the frames with an AI vision model
- Generate a summary + tags
- Store embeddings in a vector database
Later you can search it using natural language.
Example queries:
- show restaurants we saved in Goa
- any reels about Bali beaches?
- cheap street food ideas
Backend
- FastAPI
AI
- OpenAI (vision summarization + embeddings)
Vector Database
- Pinecone
Frontend
- Streamlit
Video Processing
- yt-dlp (reel download)
- ffmpeg (frame extraction)
Reel URL
↓
Download reel (yt-dlp)
↓
Extract frames (ffmpeg)
↓
Vision model summary
↓
Embeddings
↓
Pinecone vector database
↓
Natural language search
Create a virtual environment:
cd "Whatsapp Reel Knowledge Base"
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtCreate .env file:
OPENAI_API_KEY=sk-...
PINECONE_API_KEY=...
REDIS_URL=redis://localhost:6379/0
CELERY_BROKER_URL=redis://localhost:6379/0
CELERY_RESULT_BACKEND=redis://localhost:6379/0.env is not committed to source control.
uvicorn backend.main:app --reload --port 8000API docs:
http://localhost:8000/docs
POST /reels now enqueues ingestion work in Celery.
FastAPI, Celery worker, and Redis run as separate processes.
Start Redis (if not already running):
redis-serverStart API:
uvicorn backend.main:app --reload --port 8000Start Celery worker (new terminal):
celery -A backend.celery_app:celery_app worker --loglevel=infoStart Celery beat only if you need scheduled jobs (optional):
celery -A backend.celery_app:celery_app beat --loglevel=infoCombined dev command (API + worker in one terminal):
uvicorn backend.main:app --reload --port 8000 & celery -A backend.celery_app:celery_app worker --loglevel=infostreamlit run ui/app.pyOpen in browser:
http://localhost:8501
If older Pinecone records do not have coordinates, they may not show up on the map.
Run this migration to backfill missing enrichment_lat / enrichment_lng (and legacy lat / lon when present).
Prerequisites:
PINECONE_API_KEYset in.envLOCATIONIQ_API_KEYset in.env(used for geocoding by place/city/country)- Optional but recommended:
TAVILY_API_KEYset in.envto recover missing place context from weak/empty metadata
Dry run first:
python scripts/migrate_backfill_coords.py --dry-runRun migration:
python scripts/migrate_backfill_coords.pyWhen place fields are missing, the script now:
- Tries to recover context from stored reel metadata (
enrichment_json,doc_text, summary) - For
instagram.com/instagr.amreel URLs, fetches public metadata with yt-dlp (same as the backend: title, description, hashtags, location tag) and geocodes those hints (state-level or city-level is fine) - Falls back to Tavily search (if
TAVILY_API_KEYis set) - Geocodes recovered candidates via LocationIQ
Useful options:
# Process only first 50 records safely
python scripts/migrate_backfill_coords.py --max-records 50
# Use a specific namespace
python scripts/migrate_backfill_coords.py --namespace my-namespace
# Skip Instagram metadata fetch (no yt-dlp / IG requests)
python scripts/migrate_backfill_coords.py --no-ig-fetch
# Slower delay between IG metadata calls (rate limits)
python scripts/migrate_backfill_coords.py --ig-sleep-seconds 2Paste a reel URL and optionally add tags like:
- goa
- restaurant
- street food
The backend will:
- download the reel
- extract frames
- generate an AI summary
- create embeddings
- store everything in Pinecone
Example queries:
- show restaurants we saved in Goa
- any reels about Bali?
- cheap street food ideas
The system embeds the query, searches Pinecone, and returns the most relevant reels.


