A metadata scraper and file organizer for Japanese Adult Videos (JAV), with CLI, TUI, REST API, and a web UI. A Go recreation of the original Javinizer.
The fastest way to try Javinizer is the desktop app — a one-liner downloads, verifies, and installs it:
macOS / Linux:
curl -sSL https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install-app.sh | bashWindows (PowerShell):
irm https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install-app.ps1 | iexLaunch Javinizer from your app launcher / Start Menu, create your admin login on first startup, and start scraping.
Prefer the terminal? Grab a CLI binary and start the web UI:
# 1. Download the latest stable binary for your platform:
curl -L -o javinizer https://github.com/javinizer/javinizer-go/releases/latest/download/javinizer-linux-amd64
chmod +x javinizer
# 2. Initialize a config + database, then start the web UI:
./javinizer init
./javinizer webOpen http://localhost:8765, create your admin login on first startup, and start scraping.
- On macOS, swap the asset for
javinizer-darwin-universal; on Windows, downloadjavinizer-windows-amd64.exeand run.\javinizer.exe web. - Prefer Docker, a one-shot installer, Homebrew, a binary, or build from source for other setups.
First time? Skim Features to see what it does, then jump to Usage or the Web UI section.
Prefer a container? One command gives you the web UI with no binary to install:
mkdir -p ./data
curl -o ./data/config.yaml \
https://raw.githubusercontent.com/javinizer/javinizer-go/main/configs/config.yaml.example
docker run --rm \
-e JAVINIZER_SETUP_TRUSTED_CIDRS=172.16.0.0/12 \
--user "$(id -u):$(id -g)" \
-p 8765:8765 \
-v "$(pwd)/data:/javinizer" \
-v "/path/to/your/media:/media" \
ghcr.io/javinizer/javinizer-go:latest- Replace
/path/to/your/mediawith your JAV library path. - On Unraid, use
--user 99:100.
| Feature | What it does | Why it helps |
|---|---|---|
| Multi-source scraping | Pulls metadata from R18.dev, DMM/Fanza, and 12+ more sources. | Better match quality and fewer missing fields. |
| Smart file organization | Renames and organizes files/folders using templates. | Keeps large libraries consistent and searchable. |
| Dry-run safety | Shows a full preview before making any changes. | Reduces risk when processing many files. |
| NFO generation | Creates Kodi/Plex-compatible NFO metadata files. | Improves media center indexing and display quality. |
| Media downloads | Downloads cover, poster, fanart, trailer, and actress images. | Produces complete, polished library entries. |
| Manual scrape | Per-file ID/URL overrides before a batch runs. | Handle files whose filenames have no usable JAV ID. |
| Multiple interfaces | Use CLI, interactive TUI, REST API, web UI, or a native desktop app. | Fast automation or manual review — your choice. |
| Scraper | Enabled by default | Languages | Notes |
|---|---|---|---|
r18dev |
Yes | en, ja |
JSON API scraper with rate-limit handling. |
dmm |
No | N/A | Optional browser mode for JS-rendered pages. |
libredmm |
No | N/A | Aggregates Fanza, MGStage, SOD, and FC2. |
mgstage |
No | N/A | Usually requires age-verification cookie (adc=1). |
javlibrary |
No | en, ja, cn, tw |
Can use FlareSolverr for Cloudflare challenges. |
javdb |
No | N/A | Can use FlareSolverr; proxy-friendly. |
javbus |
No | ja, en, zh |
Multi-language support. |
jav321 |
No | N/A | Alternative index source. |
tokyohot |
No | ja, en, zh |
Tokyo-Hot specific source. |
aventertainment |
No | en, ja |
Bonus screenshot scraping option. |
dlgetchu |
No | N/A | DLsite/Getchu-related source. |
caribbeancom |
No | ja, en |
Caribbeancom-specific source. |
fc2 |
No | N/A | FC2 source. |
javstash |
No | en, ja |
GraphQL API scraper; requires API key from javstash.org. |
See Quick Start above. For a complete setup with optional FlareSolverr support, use Docker Compose:
curl -o .env https://raw.githubusercontent.com/javinizer/javinizer-go/main/.env.example
curl -o docker-compose.yml https://raw.githubusercontent.com/javinizer/javinizer-go/main/docker-compose.yml
# Edit .env: MEDIA_PATH=/path/to/your/library, PUID, PGID, TZ
docker compose up -dThe compose file includes javinizer (API + web UI) and an optional flaresolverr (Cloudflare solver for JavDB/JavLibrary). See the Docker Deployment Guide for details.
Tag policy: latest tracks the most recent release; pin a tag (e.g. v1.0.0) for reproducible deployments.
Install via the Homebrew tap (recommended for macOS):
brew tap javinizer/homebrew-tap https://github.com/javinizer/homebrew-tap
brew trust --formula javinizer/tap/javinizer # required once on Homebrew 6.0+
brew install javinizer
brew upgrade javinizer # update to the latest stable release laterHomebrew 6.0+ requires explicitly trusting third-party taps before installing from them. The brew trust step is a one-time setup per tap; alternatively set HOMEBREW_NO_REQUIRE_TAP_TRUST=1 to skip the check. The formula installs a prebuilt binary (CGO/SQLite is statically linked into each release asset, so Homebrew does not build from source or pull a SQLite dependency). The tap is updated automatically on each stable release; prereleases never reach it, so brew upgrade never hands you a release candidate.
Install via the Scoop bucket (recommended for Windows):
scoop bucket add javinizer https://github.com/javinizer/scoop-javinizer
scoop install javinizer
scoop update javinizer # update to the latest stable release laterThe manifest installs the prebuilt javinizer-windows-amd64.exe and shims it as javinizer. The bucket is updated automatically on each stable release; prereleases never reach it, so scoop update never hands you a release candidate. Scoop downloads via a trusted process and verifies the hash from the manifest, making this the recommended Windows install path.
The desktop app is a single clickable application that opens a native window over the embedded API server and Web UI — the same surface as javinizer web, no browser needed. It is the same binary as the CLI: all CLI and TUI subcommands remain available (e.g. Javinizer.app/Contents/MacOS/Javinizer scrape IPX-123 — on macOS you must invoke the inner binary, since Javinizer.app is a directory bundle, not an executable). It is published as a separate distribution package from the CLI-only release so both can be installed alongside each other without conflict.
macOS / Linux — one-liner (detects OS + arch, verifies the SHA256, installs to /Applications or ~/Applications):
curl -sSL https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install-app.sh | bash
# install the newest release including prereleases:
curl -sSL https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install-app.sh | bash -s -- --pre-releaseWindows — one-liner (PowerShell; verifies SHA256, removes Mark-of-the-Web so Smart App Control won't block it, creates a Start Menu shortcut):
irm https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install-app.ps1 | iex
# install the newest release including prereleases:
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install-app.ps1))) -PreReleaseOr download javinizer-desktop-windows-amd64.exe from the Releases page.
Prefer a package manager or manual download?
# macOS — Homebrew Cask (installs Javinizer.app to /Applications)
brew tap javinizer/homebrew-tap https://github.com/javinizer/homebrew-tap
brew install --cask javinizer-app
# trust the tap first on Homebrew 6.0+ if you skipped it above:
# brew trust --cask javinizer/tap/javinizer-app# Windows — Scoop (creates Start Menu shortcut)
scoop bucket add javinizer https://github.com/javinizer/scoop-javinizer
scoop install javinizer-app# Linux — AppImage (direct download; self-contained, no package manager needed)
curl -L -o Javinizer.AppImage https://github.com/javinizer/javinizer-go/releases/latest/download/javinizer-desktop-linux-x86_64.AppImage
chmod +x Javinizer.AppImage
./Javinizer.AppImage
# For arm64 Linux, swap `x86_64` for `aarch64` in the asset name.The app is unsigned — see Desktop App (macOS / Windows / Linux) for first-launch Gatekeeper / Smart App Control notes. The cask and bucket are updated automatically on each stable release; prereleases never reach them.
The installers download the latest stable release, verify its SHA256 against checksums.txt, and put javinizer on your PATH. Prereleases are opt-in: pass --pre-release (Linux/macOS) or -PreRelease (Windows) to install the newest release including prereleases.
Linux / macOS:
curl -sSL https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install.sh | bash
# install the latest pre-release instead:
curl -sSL https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install.sh | bash -s -- --pre-releaseWindows (PowerShell) — installs to %LOCALAPPDATA%\javinizer\bin (no admin required):
irm https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install.ps1 | iex
# install the latest pre-release instead:
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install.ps1))) -PreReleaseThe Windows installer also runs Unblock-File on the downloaded binary, stripping the Mark-of-the-Web tag that can otherwise trigger an "Access is denied" error under Smart App Control.
Download from GitHub Releases — available for linux-amd64, linux-arm64, darwin-amd64, darwin-arm64, darwin-universal, and windows-amd64. Binaries include the CLI, TUI, API server, and embedded web UI.
Linux / macOS:
# 1. Download the asset matching your OS/arch from the Releases page:
# https://github.com/javinizer/javinizer-go/releases (e.g. javinizer-linux-amd64)
# 2. Make it executable and put it on your PATH:
chmod +x javinizer
sudo mv javinizer /usr/local/bin/
javinizer versionOne-shot download:
releases/latestresolves to the newest stable release, so you can fetch the latest binary directly — no version in the URL:curl -L -o javinizer https://github.com/javinizer/javinizer-go/releases/latest/download/javinizer-linux-amd64Prereleases can't be the “Latest” release on GitHub, so this permalink always points at a stable release.
Windows:
Download javinizer-windows-amd64.exe from the Releases page, then run in PowerShell:
# Optional: rename for ease of use
Rename-Item javinizer-windows-amd64.exe javinizer.exe
# Run from the same folder
.\javinizer.exe versionWindows 11 + Smart App Control: Windows release binaries are not yet Authenticode-signed. If Smart App Control is in enforcement mode it may block the unsigned binary with an "Access is denied" error. The one-shot
install.ps1above runsUnblock-Fileautomatically; for a manual download, unblock it by right-clicking the.exe→ Properties → check Unblock → OK (equivalentlyUnblock-File .\javinizer.exe), or build from source (below — locally-built binaries carry no Mark-of-the-Web and are not gated by SAC).
To run javinizer from anywhere, add its folder to your PATH (System Properties → Environment Variables → Path → New), or copy javinizer.exe into a folder that's already on your PATH.
# Start the web UI, then open http://localhost:8765
.\javinizer.exe init
.\javinizer.exe webWindows builds are CLI/TUI/API + embedded web UI, same as the other platforms. CGO/SQLite is statically linked, so no separate runtime is required.
Once installed from a binary or install.sh, update in place without re-downloading by hand:
javinizer upgrade # download + verify + replace the running binary
javinizer upgrade --check # just report whether an update is available
javinizer upgrade --force # reinstall even if already at the latest version
javinizer upgrade --prerelease # upgrade to the newest release, including prereleasesThe new binary is verified against the release checksums.txt before the swap. If javinizer was installed via Homebrew or Scoop, upgrade detects that and tells you to use brew upgrade javinizer / scoop update javinizer instead, so it never clobbers a package-manager install.
upgrade is also environment-aware: inside a Docker container it refuses the in-place swap (the image is read-only and a replace would be lost on the next recreate) and prints the docker pull ghcr.io/javinizer/javinizer-go:latest command instead; in the desktop app it points you to the in-app "Update & restart" button (a CLI process can't quit the running GUI or swap its own .app/.exe/.AppImage bundle — see Desktop App updates). The desktop app itself self-updates in place: the Web UI's update banner shows an "Update & restart" button that downloads, verifies, swaps, and relaunches the bundle with no terminal required. The banner's badge ("Running in Docker" / "Desktop app" / "CLI install") reflects which upgrade path applies.
By default upgrade targets the latest stable release. Add --prerelease to jump to a newer release candidate (e.g. v1.1.0-rc1) when you want to track prereleases.
Note:
javinizer upgradeupdates the program;javinizer updaterefreshes metadata for your existing files. They are different commands.
Requires Go 1.26+ and CGO (for SQLite). For the embedded web UI, Node.js 20+ is also required (Node 22 used in CI).
go install github.com/javinizer/javinizer-go/cmd/javinizer@latest
# Or clone and build a single binary with the embedded web UI:
git clone https://github.com/javinizer/javinizer-go.git
cd javinizer-go
make build
./bin/javinizer versionmake build compiles the frontend bundle and embeds it into the Go binary. For CLI-only builds without the frontend: go build -o bin/javinizer ./cmd/javinizer.
javinizer init # creates a default config.yaml + database
javinizer web # starts the server at http://localhost:8765
# Custom port/host:
javinizer web --host 0.0.0.0 --port 8081javinizer web starts the API server and embedded Web UI. On first startup, the web UI prompts you to create an admin login (stored in auth.credentials.json next to your config). Delete that file to reset the password.
javinizer sort ~/Videos --dry-run # preview renames/moves first
javinizer sort ~/Videos # scrape + organize for realjavinizer scrape IPX-535
javinizer scrape SSIS-123 --force # force-refresh cached metadataRe-scrape and merge into already-organized files (supports merge presets/strategies):
javinizer update ~/Videos/IPX-535
javinizer update ~/Videos --dry-runjavinizer tui ~/VideosSee the TUI Guide for keyboard shortcuts and workflows.
# Tags (written to NFO files)
javinizer tag add IPX-535 "favorite" "4K"
javinizer tag search "favorite"
# Genre / word replacement rules
javinizer genre add "Creampie" "Cream Pie"
javinizer word add "censored" "original"
# Actress database
javinizer actress merge --target <id> --source <id> # merge duplicates
javinizer actress export
# History & logs
javinizer history list
javinizer logs list
# API tokens (for programmatic access)
javinizer token create
javinizer token list --json
# Config & version
javinizer config migrate # upgrade an older config to the current schema
javinizer info # show config, scrapers, and DB status
javinizer version --check # show version + check for updatesSee the CLI Reference for every command and flag.
Available in Docker and in the binary (embedded), at http://localhost:8765.
| Page | What you do there |
|---|---|
| Dashboard | Quick stats and recent activity. |
| Browse | View organized movies with covers and metadata; send files to a manual scrape. |
| Manual | Per-file JAV ID/URL overrides before a batch runs (for files with no usable filename ID). |
| Review | Batch-scrape files, crop posters, and edit metadata before organizing. |
| Jobs | Monitor active batch jobs with real-time WebSocket progress. |
| Actresses | Browse the actress database with images. |
| History | View and roll back organization operations. |
| Settings | Configure scrapers, output templates, and proxy settings. |
API docs are served alongside the UI: Scalar UI and Swagger UI. See the API Reference for endpoint documentation.
Production build (single binary with embedded UI):
make build && javinizer webDev mode (hot reload):
javinizer web # terminal 1: backend
make web-dev # terminal 2: frontend at http://localhost:5174 (proxies API to :8765)See web/frontend/README.md for more.
Javinizer uses a YAML config file. Initialize one with javinizer init, then edit it.
Key sections:
- Scrapers — enable/disable sources, set priorities, configure proxies.
- Metadata — per-field scraper priorities, translation, genre filtering, word replacement.
- Output — folder/file naming templates, download options.
- File Matching — extensions, size filters, regex patterns.
- NFO — Kodi/Plex metadata format options.
Per-field priority semantics: a per-field scraper list is exclusive (no global fallback). An absent key or empty list [] inherits the global priority; ["__skip__"] leaves that field empty. See the Configuration Guide for the full schema and the example config.
Template tags can select a language for translated fields:
output:
folder_format: <ID> [<MAKER:JA>] - <TITLE:EN> (<YEAR>)
# → ROYD-191 [ROYD] - A Beautiful Day (2024)<TITLE:EN>— English title;<TITLE:JA|EN>— Japanese with English fallback.- Supported tags:
TITLE,MAKER,LABEL,SERIES,DIRECTOR,DESCRIPTION,ORIGINALTITLE,STUDIO(synonym forMAKER). - Language codes are lowercase 2-letter (
en,ja,zh, …); regional variants are normalized to the base language.
See the Template System for full syntax and functions.
Docker deployments support environment-variable overrides. Defaults shown are for Docker; outside Docker, paths resolve relative to your config/data directory.
| Variable | Description | Default |
|---|---|---|
PUID / PGID |
Runtime user/group ID for the container process | 1000 |
USER_ID / GROUP_ID |
Legacy aliases for PUID/PGID |
1000 |
JAVINIZER_CONFIG |
Path to config file | /javinizer/config.yaml |
JAVINIZER_DB |
Path to SQLite database | /javinizer/javinizer.db |
JAVINIZER_LOG_DIR |
Relocate file log targets to this directory | /javinizer/logs |
JAVINIZER_TEMP_DIR |
Temp directory for downloads | data/temp |
LOG_LEVEL |
Logging verbosity | info |
UMASK |
File permission mask | 002 |
TZ |
Timezone for logs | UTC |
| Variable | Purpose |
|---|---|
TRANSLATION_PROVIDER |
openai, deepl, google, or anthropic |
TRANSLATION_SOURCE_LANGUAGE / TRANSLATION_TARGET_LANGUAGE |
e.g. ja → en |
OPENAI_API_KEY / DEEPL_API_KEY / GOOGLE_TRANSLATE_API_KEY / ANTHROPIC_API_KEY |
Provider keys |
JAVSTASH_API_KEY |
JAVStash GraphQL API key (get from javstash.org) |
| Variable | Purpose |
|---|---|
CHROME_BIN |
Chrome binary path for browser scraping |
GH_TOKEN |
GitHub token (avoids rate limits for update checks) |
docker run --rm \
-e LOG_LEVEL=debug -e TZ=Asia/Tokyo \
-e JAVINIZER_SETUP_TRUSTED_CIDRS=172.16.0.0/12 \
-p 9000:8765 \
-v "$(pwd)/data:/javinizer" -v "/media/jav:/media" \
ghcr.io/javinizer/javinizer-go:latestSee .env.example for Docker Compose configuration.
| Guide | Covers |
|---|---|
| Getting Started | Installation and first steps |
| Docker Deployment | Container setup and management |
| Configuration | Config file reference |
| CLI Reference | Every command and flag |
| TUI Guide | Interactive terminal UI |
| API Reference | REST API endpoints |
| Template System | Output naming templates |
| Genre Management | Genre replacement rules |
| User Guide | Web UI workflows |
| Architecture | System architecture overview |
| Development | Contributing and dev setup |
| Testing | Testing practices and coverage |
| Troubleshooting | Common issues and solutions |
- Issues: github.com/javinizer/javinizer-go/issues
- Discussions: github.com/javinizer/javinizer-go/discussions
- Discord: invite link
MIT License — see LICENSE. This project is a Go recreation of the original Javinizer.