Browse by type
Your personal home media center — lightweight, self-hosted, NAS-friendly.
简体中文 • Quick Start • Features • Configuration • Desktop App
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

S01E01, 1x01, 第01集, EP01, Episode 01; movie collections from TMDbgit 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
Edit docker-compose.yml:
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:/app/data # database & config
- ./cache:/app/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 |
/app/data |
Data dir (DB + uploads) |
NOWEN_LOGGING_LEVEL |
info |
debug / info / warn / error |
/dev/dri device |
— | Pass through Intel/AMD GPU for hardware transcoding |
Requires Go 1.22+, Node.js 20+, FFmpeg.
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 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.
# 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 }
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
1093473044If 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"
Released under the GNU General Public License v3.0.
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.
$ claude mcp add nowen-video \
-- python -m otcore.mcp_server <graph>