A smart media organizer for home videos with Plex/Jellyfin compatible output. Kinarr automatically monitors folders, classifies media files using AI, and organizes them into a proper folder structure with metadata.
- Folder Monitoring - Watch directories for new media files
- AI Classification - Use Google Gemini AI to automatically identify and classify media
- Smart Matching - Regex patterns and fuzzy matching to identify content
- Jellyfin/Plex Compatible - Generates proper folder structure and NFO metadata files
- Screenshot Generation - Automatic thumbnail and backdrop extraction from videos
- Batch Processing - Process multiple files at once with intelligent grouping
- Directory Browser - Built-in file browser for easy path selection
- Authentication - Optional login protection with username/password
- Multi-language - English and Dutch interface
- Modern UI - Sleek dark theme with synthwave aesthetics
Create a docker-compose.yml file:
services:
kinarr:
image: ghcr.io/geertgk/kinarr:latest
container_name: kinarr
restart: unless-stopped
environment:
- TZ=Europe/Amsterdam
- DEFAULT_SOURCE_DIR=/data/incoming
- DEFAULT_DEST_DIR=/data/organized
volumes:
- ./config:/app/data
- /path/to/your/media:/data
ports:
- 8080:8000Then run:
docker compose up -dOpen your browser at http://localhost:8080
docker compose pull
docker compose up -dIf you're running Sonarr/Radarr, you can add Kinarr to your existing stack:
kinarr:
image: ghcr.io/geertgk/kinarr:latest
container_name: kinarr
restart: unless-stopped
environment:
- TZ=Europe/Amsterdam
- DEFAULT_SOURCE_DIR=/data/incoming
- DEFAULT_DEST_DIR=/data/organized
volumes:
- /etc/localtime:/etc/localtime:ro
- /docker/kinarr/config:/app/data
- /media:/data
ports:
- 8080:8000Click to expand
- Python 3.11+
- Node.js 20+
- FFmpeg
git clone https://github.com/GeertGK/Kinarr.git
cd Kinarr
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python -m uvicorn app.main:app --reloadcd frontend
npm install
npm run devAll configuration can be done via environment variables or the .env file.
| Variable | Description | Default |
|---|---|---|
SOURCE_DIR |
Directory to monitor for incoming files | ./media/source |
DEST_DIR |
Directory for organized output | ./media/organized |
Enable smart AI-powered file classification using Google Gemini:
| Variable | Description | Default |
|---|---|---|
GEMINI_ENABLED |
Enable AI classification | false |
GEMINI_API_KEY |
Your Gemini API key | - |
GEMINI_MODEL |
Model to use | gemini-2.0-flash |
GEMINI_CONTEXT_PROMPT |
Context about your media collection | - |
Get your API key at Google AI Studio.
| Variable | Description | Default |
|---|---|---|
FILE_STABILITY_SECONDS |
Wait time before processing | 3 |
SUPPORTED_EXTENSIONS |
Video extensions to process | .mp4,.mkv,.avi,.mov,.wmv,.m4v,.webm |
SCREENSHOT_COUNT |
Screenshots per video | 3 |
SCREENSHOT_FORMAT |
Screenshot format | jpg |
CONFIDENCE_HIGH |
Auto-process threshold | 0.90 |
CONFIDENCE_MEDIUM |
Notify threshold | 0.60 |
| Variable | Description |
|---|---|
SMTP_HOST |
SMTP server for email notifications |
WEBHOOK_DISCORD |
Discord webhook URL |
WEBHOOK_SLACK |
Slack webhook URL |
WEBHOOK_GENERIC |
Generic webhook URL |
Protect your Kinarr instance with login authentication:
| Variable | Description | Default |
|---|---|---|
AUTH_ENABLED |
Enable login protection | false |
SECRET_KEY |
JWT secret key (change in production!) | change-this-secret-key-in-production |
ACCESS_TOKEN_EXPIRE_MINUTES |
Token expiration time | 10080 (7 days) |
When authentication is enabled:
- First visit redirects to setup page to create admin account
- All routes require login
- Configure via Settings > Security
See .env.example for all available options.
Create TV Shows or Movies in the Library section. Each item can have:
- Custom regex patterns for matching files
- Season organization
- Auto-processing settings
Add folders to monitor in the Monitored Folders section:
- Optionally assign to a specific library item
- Enable recursive scanning for subdirectories
- Configure delete-after-processing
When files are detected:
- High confidence match: Automatically processed
- Medium confidence: Processed with notification
- Low confidence: Added to pending queue for manual review
In the Pending Files view:
- See AI suggestions with confidence scores
- Approve, edit, or reject suggestions
- Batch process related files together
Kinarr generates Jellyfin/Plex compatible folder structures:
TV Shows/
└── Show Name/
├── cover.jpg
├── backdrop.webp
├── tvshow.nfo
└── Season 01/
├── cover.jpg
├── Show Name - S01E01 - Episode Title.mp4
├── Show Name - S01E01 - Episode Title.nfo
└── Show Name - S01E01 - Episode Title-thumb.jpg
Movies/
└── Movie Name (2024)/
├── cover.jpg
├── backdrop.webp
├── Movie Name (2024).mp4
└── Movie Name (2024).nfo
Kinarr exposes a REST API at /api. Key endpoints:
GET /api/library- List library itemsGET /api/files- List processed filesGET /api/files/pending- List pending filesPOST /api/monitors/{id}/scan- Trigger folder scanGET /api/settings- Get current settings
Backend:
- FastAPI
- SQLAlchemy (async)
- SQLite
- Google Generative AI (Gemini)
- FFmpeg
Frontend:
- Vue 3 (Composition API)
- Vuetify 3
- Pinia
- Vue I18n
- TypeScript
Contributions are welcome! Please feel free to submit a Pull Request.
MIT License - see LICENSE for details.