| backend | ||
| frontend | ||
| .dockerignore | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
🎵 PureStream
Distraction-free TikTok viewing - A clean, ad-free TikTok client with a beautiful minimal interface.
✨ Features
- 🎬 Clean Video Feed - No ads, no distractions, just content
- 🔍 Powerful Search - Search by username, video URL, or keywords
- 👥 Follow System - Keep track of your favorite creators
- 💾 Tab Persistence - Switch tabs without losing your place
- 👆 Swipe Navigation - Swipe left/right to switch tabs (mobile)
- ⌨️ Keyboard Controls - Arrow keys for tabs, Space for pause, Up/Down for scroll
- ❤️ Heart Animations - Double-tap to show love
- 🔇 Smart Autoplay - Videos autoplay muted (tap to unmute)
- 📱 Responsive Design - Works on desktop and mobile
- 🐳 Docker Ready - Easy deployment on any platform
🚀 Quick Start
Option 1: Docker Compose (Recommended)
The easiest way to run PureStream on your server or Synology NAS.
# Create a directory
mkdir purestream && cd purestream
# Download docker-compose.yml
curl -O https://raw.githubusercontent.com/YOUR_USERNAME/purestream/main/docker-compose.yml
# Start the application
docker-compose up -d
# View logs
docker-compose logs -f
Access the app at: http://your-server-ip:8002
Option 2: Docker Run
docker run -d \
--name purestream \
-p 8002:8002 \
--shm-size=2g \
-v purestream_cache:/app/cache \
-v purestream_session:/app/backend/session \
vndangkhoa/purestream:latest
Option 3: Development Setup
# Clone the repository
git clone https://github.com/YOUR_USERNAME/purestream.git
cd purestream
# Backend setup
cd backend
python -m venv venv
source venv/bin/activate # or `venv\Scripts\activate` on Windows
pip install -r requirements.txt
playwright install chromium
# Start backend
uvicorn main:app --host 0.0.0.0 --port 8002 --reload
# Frontend setup (new terminal)
cd frontend
npm install
npm run dev
🖥️ Synology NAS Deployment
Using Container Manager (Docker)
- Open Container Manager → Registry
- Search for
vndangkhoa/purestreamand download thelatesttag - Go to Container → Create
- Configure:
- Port Settings: Local
8002→ Container8002 - Volume: Create a folder for cache and map to
/app/cache - Environment: Add
PYTHONUNBUFFERED=1 - Resources: Allocate at least 2GB RAM (for browser)
- Port Settings: Local
- Apply and start the container
Using docker-compose on Synology
# SSH into your NAS
ssh admin@your-nas-ip
# Create directory
mkdir -p /volume1/docker/purestream
cd /volume1/docker/purestream
# Create docker-compose.yml (paste the content from this repo)
nano docker-compose.yml
# Start
docker-compose up -d
⌨️ Keyboard Shortcuts
| Key | Action |
|---|---|
← → |
Switch tabs |
↑ ↓ |
Scroll videos |
Space |
Play/Pause |
M |
Mute/Unmute |
🔧 Environment Variables
| Variable | Default | Description |
|---|---|---|
CACHE_DIR |
/app/cache |
Video cache directory |
MAX_CACHE_SIZE_MB |
500 |
Maximum cache size in MB |
CACHE_TTL_HOURS |
24 |
Cache expiration time |
📁 Project Structure
purestream/
├── backend/
│ ├── api/
│ │ └── routes/
│ │ ├── auth.py # Authentication endpoints
│ │ └── feed.py # Feed & video proxy endpoints
│ ├── core/
│ │ └── playwright_manager.py # Browser automation
│ └── main.py # FastAPI application
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ │ ├── Feed.tsx # Main feed component
│ │ │ └── VideoPlayer.tsx # Video player
│ │ └── App.tsx
│ └── package.json
├── Dockerfile
├── docker-compose.yml
└── README.md
🔐 Authentication (Admin Setup)
PureStream uses your TikTok session cookies. Once configured by the admin, all users can access the feed without logging in - on desktop or mobile.
Important: Admin setup should be done from a desktop/laptop computer (not a phone) because you need a browser extension to export cookies.
First-Time Setup (Desktop Required)
-
Set your admin password in
docker-compose.yml:environment: - ADMIN_PASSWORD=your_secure_password -
Start/restart the container:
docker-compose up -d --force-recreate -
Access the admin page:
http://your-server-ip:8002/admin- Enter your admin password (default:
admin123)
- Enter your admin password (default:
-
Get your TikTok cookies (from a desktop browser):
- Install Cookie-Editor browser extension
- Go to tiktok.com and login to your account
- Click Cookie-Editor icon → Export → Copy
-
Paste cookies in the admin page text area and click Save Cookies
-
✅ Done! Now anyone can access
http://your-server-ip:8002/on any device (including phones)
Getting Cookies on Mobile (If No Desktop Available)
📱 Android Phone
-
Install Kiwi Browser from Google Play Store
- Kiwi Browser supports Chrome extensions on Android
-
Install Cookie-Editor extension:
- In Kiwi, go to:
chrome://extensions - Enable "Developer mode" (toggle in top right)
- Go to Cookie-Editor on Chrome Web Store
- Click "Add to Chrome"
- In Kiwi, go to:
-
Get cookies:
- Go to tiktok.com in Kiwi Browser
- Login to your TikTok account
- Tap the 3-dot menu → Extensions → Cookie-Editor
- Tap Export → Copy
-
Paste in admin page:
- Go to
http://your-server-ip:8002/admin - Login with admin password
- Paste cookies and save
- Go to
🍎 iOS/iPhone
Unfortunately, iOS Safari doesn't support browser extensions. Options:
-
Use a desktop computer (recommended) - borrow a friend's laptop for 5 minutes
-
Use Orion Browser (limited):
- Install Orion Browser from App Store
- It has some extension support, but Cookie-Editor may not work perfectly
-
Manual method (advanced):
- On iOS Safari, go to tiktok.com and login
- In Safari: Settings → Safari → Advanced → Web Inspector (enable)
- Connect to Mac with Safari → Develop menu → your phone
- In console:
document.cookie- copy the sessionid value - Format as:
[{"name":"sessionid","value":"YOUR_VALUE_HERE"}]
Tip: The easiest option for iOS users is to use any desktop/laptop computer (Windows, Mac, Linux, Chromebook) to do the one-time cookie setup.
Environment Variables
| Variable | Default | Description |
|---|---|---|
ADMIN_PASSWORD |
admin123 |
Password for /admin page |
CACHE_DIR |
/app/cache |
Video cache directory |
MAX_CACHE_SIZE_MB |
500 |
Maximum cache size |
CACHE_TTL_HOURS |
24 |
Cache expiration |
Security Note: Cookies are stored locally in the
session/volume. Anyone with the admin password can view/update them.
🐛 Troubleshooting
Videos not loading?
- Check if the backend is running:
curl http://localhost:8002/health - Check logs:
docker-compose logs -f - Try re-logging in (sessions can expire)
Browser errors on headless server?
- Ensure
shm_size: '2gb'is set in docker-compose - Xvfb is included in the Docker image for virtual display
Cache issues?
- Clear cache:
docker exec purestream rm -rf /app/cache/* - Restart container:
docker-compose restart
📄 License
MIT License - feel free to use, modify, and distribute.
🙏 Acknowledgments
- Built with FastAPI & React
- Browser automation by Playwright
- Video extraction by yt-dlp
Made with ❤️ for distraction-free viewing