
Self-hosted YouTube music streaming application built with Next.js.
Preview
Desktop

Mobile

Playlist

Features
- Stream music from YouTube without downloading files
- Beautiful dark mode interface
- Fully responsive design (mobile & desktop)
- Full playback controls (play, pause, next, previous, shuffle)
- Volume control with visual feedback
- Progress bar with seeking and time display
- Create and manage playlists
- Global player - music continues playing across page navigation
- Toast notifications for user feedback
- Simple JSON file storage - no database setup required
- Easy Docker deployment
- Smart search: Search YouTube directly from the app or paste URLs
Recent Updates
v1.2.0 - Latest Improvements
- ✅ YouTube search integration: Search for songs directly in the app without needing URLs
- ✅ Smart input detection: Automatically detects if input is a URL or search query
- ✅ Live search results: Real-time search with thumbnails, duration, and channel info
- ✅ Progress bar fix: Fixed playbar not advancing for single songs
v1.1.0 - Previous Updates
- ✅ Direct song deletion: Removed confirmation dialogs when deleting songs from home page for faster workflow
- ✅ Bulk playlist creation: Add entire playlists directly from YouTube playlist URLs
- ✅ Song tags: Display playlist tags on song cards in the home page for better organization
- ✅ Cross-playlist song movement: Move songs between different playlists with a single click
- ✅ Mobile UI improvements: Song action buttons now appear above the player bar on mobile devices
- ✅ Bulk song selection: Select and delete multiple songs at once from the home page for efficient management
Prerequisites
- Node.js 20+ (for local development)
- Docker & Docker Compose (for deployment)
- Python 3 & yt-dlp (installed automatically in Docker)
Local Development
-
Install dependencies:
bash
npm install
-
Create Python virtual environment:
bash
python -m venv .venv
-
Activate the virtual environment:
- Linux/macOS:
bash
source .venv/bin/activate
-
Windows:
bash
.venv\Scripts\activate
-
Install yt-dlp:
bash
pip install yt-dlp
-
Run the development server:
bash
npm run dev
-
Open your browser:
Navigate to http://localhost:3000
The database file (data/db.json) will be created automatically on first run.
Quick Start with Docker (Recommended)
-
Download the docker-compose.yml file:
bash
wget https://raw.githubusercontent.com/bitc0de/bitify/main/docker-compose.yml
Or on Windows PowerShell:
powershell
Invoke-WebRequest -Uri https://raw.githubusercontent.com/bitc0de/bitify/main/docker-compose.yml -OutFile docker-compose.yml
-
Start the application:
bash
docker-compose up -d
-
Access the application:
Navigate to http://localhost:3000
Your music library will be stored in ./data/db.json and persists across container restarts.
Updating to Latest Version
docker-compose down
docker-compose pull
docker-compose up -d
Complete Cleanup (removes all data)
docker-compose down -v
docker rmi ghcr.io/bitc0de/bitify:latest
rm -rf data/
The Docker image is automatically built and published to GitHub Container Registry on each release.
Build from Source
If you prefer to build the Docker image yourself:
-
Clone the repository:
bash
git clone https://github.com/bitc0de/bitify.git
cd bitify
-
Build and run:
bash
docker build -t bitify .
docker-compose up -d
Usage
- Add a song: Search for songs by artist/title or paste a YouTube URL in the input field
- Search: Type any song name or artist and select from the results dropdown
- Play a song: Click the play button on any song card
- Control playback: Use the player controls at the bottom of the page
- Create playlists: Navigate to Playlists and create your custom collections
- Shuffle mode: Toggle shuffle to randomize playback order
- Navigate freely: Music continues playing as you browse different pages
Data Storage
All data is stored in a simple JSON file at data/db.json:
{
"songs": [],
"playlists": [],
"playlistSongs": []
}
The file is created automatically on first run. To backup your library, simply copy the data/ folder.
Notes
- Audio files are never downloaded to the server
- Streaming URLs are dynamically generated using
yt-dlp -g -f bestaudio
- The application requires
yt-dlp and ffmpeg to be installed (included in Docker)
- All data is stored in a simple JSON file that's created automatically on first run
- Your music library persists in the
./data folder
License
MIT