---
A lightweight home media server built with **Go + React**, similar to Jellyfin / Emby, optimized for NAS deployment.
**Single binary + SQLite**, one-click Docker startup, zero configuration required.
> ๐ฅ๏ธ **Desktop client** is available with **MKV / HEVC / HDR / Dolby Vision / DTS / Atmos zero-transcode playback** โ see [desktop/README.md](./desktop/README.md)
## ๐ธ Screenshots


## โจ Features
- ๐ฌ **Media library** โ auto scan (MKV/MP4/AVI/MOV/WebM/TS/RMVB/...), FFprobe metadata, external subtitles, NFO compatibility (Kodi/Emby/Jellyfin), real-time file watching
- ๐บ **Smart playback** โ direct play for browser-compatible formats, on-demand HLS transcoding for the rest, ABR adaptive bitrate, keyboard shortcuts, Picture-in-Picture, bookmarks
- โก **Hardware acceleration** โ auto-detected Intel QSV / VAAPI / NVIDIA NVENC, software fallback, transcode cache reuse
- ๐จ **Multi-source scraping** โ Provider Chain: TMDb โ Douban โ TheTVDB โ Bangumi โ Fanart.tv โ AI fallback
- ๐ **Series & collections** โ auto detection of `S01E01`, `1x01`, `็ฌฌ01้`, `EP01`, `Episode 01`; movie collections from TMDb
- ๐ค **Subtitles** โ external (SRT/ASS/SSA/VTT/SUB/IDX/SUP) + embedded extraction, online search, AI ASR generation
- ๐จโ๐ฉโ๐งโ๐ฆ **Multi-user** โ JWT auth, per-user history & favorites, playlists, parental controls, daily watch quota, content rating
- ๐ง **AI assistant** โ natural language search, recommendation reasons, metadata enhancement, smart rename, scene detection (chapters/highlights)
- ๐ก **Emby API compatibility** โ Infuse / Kodi / Emby native clients work out of the box (140+ endpoints)
- ๐ป **Cast** โ DLNA / Chromecast device discovery and control
- ๐ **Analytics** โ watch time stats, daily charts, admin dashboard
- ๐ **File manager** โ browse / import / rename / batch scrape, AI-assisted rename, audit log
- ๐ **Sharing & tagging** โ share links with password & expiry, custom tags, bulk move, match rules
- ๐ก๏ธ **Security** โ JWT, bcrypt, CORS, security headers, rate limiting, access log
- ๐ **i18n** โ Chinese / English / Japanese
- ๐ชถ **Lightweight** โ single binary + SQLite (WAL), Alpine Docker image, healthcheck, PUID/PGID
## ๐ Quick Start
### 1. Docker (recommended)
```bash
git clone https://github.com/your-repo/nowen-video.git
cd nowen-video
docker-compose up -d
```
Visit `http://your-host:8080` โ default admin: `admin` / `admin123`
### 2. NAS deployment (Synology / QNAP / Unraid)
Edit `docker-compose.yml`:
```yaml
services:
nowen-video:
image: nowen-video:latest
container_name: nowen-video
ports:
- "8080:8080"
environment:
- PUID=1000 # match your host user
- PGID=1000
- NOWEN_SECRETS_JWT_SECRET=change-me-please # IMPORTANT
- TZ=Asia/Shanghai
volumes:
- ./data:/data # database & config
- ./cache:/cache # transcode cache
- /volume1/Media:/media:ro # YOUR media folder
devices:
- /dev/dri:/dev/dri # optional: HW accel
restart: unless-stopped
```
| Env / Param | Default | Description |
|---|---|---|
| `PUID` / `PGID` | `1000` | Run as this UID/GID (must match your media folder permissions) |
| `TZ` | `UTC` | Timezone |
| `NOWEN_APP_PORT` | `8080` | HTTP port |
| `NOWEN_SECRETS_JWT_SECRET` | *(required)* | JWT signing secret โ **must be changed** |
| `NOWEN_APP_DATA_DIR` | `/data` | Data dir (DB + uploads) |
| `NOWEN_LOGGING_LEVEL` | `info` | `debug` / `info` / `warn` / `error` |
| `/dev/dri` device | โ | Pass through Intel/AMD GPU for hardware transcoding |
### 3. Build from source
Requires **Go 1.22+**, **Node.js 20+**, **FFmpeg**.
```bash
go mod tidy
cd web && npm install && cd ..
# dev
make dev # backend
make dev-web # frontend (another terminal)
# production
make build
./bin/nowen-video
```
## โ๏ธ Configuration
Configuration is loaded in this order (later overrides earlier):
```
1. Built-in defaults โ run with zero config
2. config.yaml โ main file (legacy flat or new nested)
3. config/*.yaml โ per-module split files
4. NOWEN_* env vars โ e.g. NOWEN_APP_PORT=8080
```
Common split files under `config/`:
| File | Purpose |
|---|---|
| `app.yaml` | port, debug, paths, FFmpeg location |
| `database.yaml` | SQLite path, WAL, connection pool |
| `secrets.yaml` | JWT secret, third-party API keys (โ ๏ธ do **not** commit) |
| `logging.yaml` | level, format, rotation |
| `cache.yaml` | transcode cache directory & cleanup |
| `ai.yaml` | LLM provider config (OpenAI / DeepSeek / Qwen / Ollama) |
> **Note**: Hardware acceleration / concurrency / transcode preset / CPU limits are auto-tuned at startup and are **no longer exposed as config**.
### AI provider examples
```yaml
# OpenAI
ai: { provider: openai, api_base: https://api.openai.com/v1, model: gpt-4o-mini }
# DeepSeek
ai: { provider: deepseek, api_base: https://api.deepseek.com/v1, model: deepseek-chat }
# Qwen
ai: { provider: qwen, api_base: https://dashscope.aliyuncs.com/compatible-mode/v1, model: qwen-turbo }
# Ollama (local)
ai: { provider: ollama, api_base: http://localhost:11434/v1, model: llama3 }
```
## ๐๏ธ Tech Stack
**Backend** Go 1.22 ยท Gin ยท GORM + SQLite (WAL) ยท Zap ยท Viper ยท gorilla/websocket ยท fsnotify ยท FFmpeg
**Frontend** React 18 ยท TypeScript ยท Vite ยท Tailwind CSS ยท Zustand ยท HLS.js ยท React Router ยท Framer Motion
**Deploy** Docker (Alpine 3.19) ยท docker-compose
## ๐บ๏ธ Roadmap
- โ
**v0.1 โ v0.9** Core playback, scraping, multi-user, AI assistant, file manager, sharing, tags
- โ
**v0.9.5** Full Emby API compatibility layer (Infuse / Kodi / Emby native clients)
- ๐ **v1.0** ABR seamless bitrate switching, FFmpeg throttling, mobile responsive, PWA, test coverage > 60%, Prometheus metrics
- ๐ **v1.1+** Native mobile apps, 4K/HDR, WebDAV, distributed transcoding, AV1, plugin marketplace
## ๐ฌ Community
- **QQ group**: `1093473044`
- **Issues**: please open a GitHub issue
## โ Sponsor
If this project helps you, consider buying the author a coffee / keyboard / bug-fix ๐
Drug's WeChat sponsor QR โ "Buy the author a keyboard / fix a bug"
## ๐ License
Released under the [GNU General Public License v3.0](./LICENSE).
You may freely run, study, modify and distribute this software. Any derivative work distributed externally **must** also be released under GPL-3.0 with the original copyright notice preserved. The software is provided "as is", without warranty of any kind.