A self-hosted media server and sharing platform
10K+
A self-hosted Media Server built with Laravel.
Core Features • Demo • Getting Started • Similar Projects
MediaServer is a lightweight, self-hosted media player for your home server (or NAS). It scans your folders, indexes your video and audio files, and serves them through a fast, minimalist web interface.
It was built for people who prefer a YouTube-like browsing experience for their collection of media files with metadata customisation.
Jellyfin is designed primarily for commercial media, is metadata-first and works great for large automatically downloaded libraries. MediaServer is naturally folder-oriented and great for mixed, personal, or highly customised libraries.
Both can serve shows, movies, and music but with different approaches.
| Feature | Jellyfin | MediaServer |
|---|---|---|
| Content Focus | Official metadata-first; built for movies/TV/Music | Folder-first; great for mixed/personal content and TV shows / music |
| Watch History | Only resume + watched flag | Full watch history with timestamps, re-watch counts, total view counts, per-user history, and playback heatmaps |
| Player Experience | Fullscreen; no browsing while playing | YouTube-style; browse folders while watching |
| Libraries | Unified global search | Library-scoped and account based access control |
| Sharing | No shareable URLs for videos/folders/shows | Direct and readable folder/video links with rich open graph previews |
k: Play/Pausej / ←: Rewind 10sl / →: Fast Forward 10sSHIFT+N: Play NextSHIFT+P: Play Previousm: Mutef: Toggle Fullscreent: Toggle Theatre Modec: Toggle Lyrics / Default Subtitle Trackp: Toggle playlist (autoplay)/library/folder?video={id} or /library/{folder-name})/media/library/folder/{filename}.{lang}.{extension})MediaServer automatically generates Open Graph images for media and folders, styled similarly to platforms like AniList.
These previews are embedded when sharing links on platforms like:
Each image includes:
The preview is rendered server-side using Browsershot and cached for performance.
Example:
Sharinghttps://yourserver.com/library/showwill show a rich preview card with folder art and metadata.
✅ Works even on private, self-hosted domains as long as your Open Graph routes are accessible.
See ROADMAP.md for planned features, ongoing improvements, and known bugs.
Note
The demo is running the latest beta image with static media. User accounts and edits are reset automatically every 15 minutes.
Take some time to explore the demo:
Below are screenshots of the current webpage on Desktop and Android.
MediaServer can be run via Docker (recommended) or a standard manual installation.
Warning
Use the beta image to get the latest features.
Download the latest or beta Docker release ZIP for your platform.
docker-compose.yaml file that automatically sets up the (latest by default) required images.Unzip it to a folder with generous read/write/execute permissions.
Run the startup script (with Docker running) and let it create/copy the required files:
startDocker.batsudo bash startDocker.shVisit https://app.test in your browser and follow the setup wizard.
Add your media to ./data/media/LIBRARY/FOLDER/VIDEO.MP4
More to come...Warning
This setup is probably outdated and may need some tinkering to get right. I have since moved to docker for production installations but still use this method on my main instance (Linux).
To set up MediaServer without Docker, you’ll need:
Tip
You can use [Laragon](https://laragon.org/) to simplify local setup. This will only be available on the host machine.
# 1. Clone the repository
git clone https://github.com/aminnausin/mediaServer.git
cd mediaServer
# 2. Install backend dependencies
composer install
# 3. Install frontend dependencies
npm install
# 4. Set up your database and .env
cp .env.example .env
# Edit the .env file with your PostgreSQL DB info
# Example:
# DB_CONNECTION=pgsql
# DB_HOST=127.0.0.1
# DB_PORT=5432
# DB_DATABASE=mediaServer
# DB_USERNAME=postgres
# DB_PASSWORD=
# 5. Generate Laravel app and reverb keys
php artisan key:generate
php artisan reverb:generate
# 6. Run database migrations
php artisan migrate
# 7. Link storage (for thumbnails, posters, etc.)
php artisan storage:link
# 9. Build frontend assets
npm run build
# 9. Set app domain in .env (required for Sanctum & WebSockets) (6001 for reverb)
# Example:
# APP_URL=https://app.test:8080
# SANCTUM_STATEFUL_DOMAINS=app.test:8080,0.0.0.0:6001,app.test:6001
# SESSION_DOMAIN=app.test
# REVERB_HOST=app.test
# 10. Run the app in development mode
npm run vite:php
MediaServer is intended for personal use only. It is designed to help users organise and access their own legally obtained media on a self-hosted server.
This project does not condone or support piracy, and I do not encourage the use of MediaServer for unauthorised distribution or consumption of copyrighted material.
Please respect local laws and content ownership rights when using this software.
Content type
Image
Digest
sha256:b011be341…
Size
457.6 MB
Last updated
about 15 hours ago
docker pull aminnausin/mediaserver:0.17.0-beta.78