Profile
Back to NewsBack
GitHub Trending 15 min
Reader Mode
javinizer/javinizer-go: Javinizer written in Go and Svelte. This is a modern replacement for the original Javinizer. (NSFW) Organize your local Japanese Adult Video (JAV) library.

javinizer/javinizer-go: Javinizer written in Go and Svelte. This is a modern replacement for the original Javinizer. (NSFW) Organize your local Japanese Adult Video (JAV) library.

7 hours ago

Javinizer Go

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.

Go Version</a> License</a> Test & Coverage</a> codecov</a> Discord</a> latest release</a>


Quick Start

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 | bash

Windows (PowerShell):

irm https://raw.githubusercontent.com/javinizer/javinizer-go/main/scripts/install-app.ps1 | iex

Launch 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 web

Open http://localhost:8765, create your admin login on first startup, and start scraping.

First time? Skim Features to see what it does, then jump to Usage or the Web UI section.

Docker (alternative)

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 \ --hostname javinizer \ -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/media with your JAV library path.
  • On Unraid, use --user 99:100.

Features

| 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. |

Supported Scrapers

| 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. |


Installation

Docker

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 -d

The 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.

Homebrew (macOS / Linux)

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 later

Homebrew 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.

Scoop (Windows)

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 later

The 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.

Desktop app (clickable GUI)

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-release

Windows — 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))) -PreRelease

Or 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.

One-shot install (Linux / macOS / Windows)

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-release

Windows (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))) -PreRelease

The 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.

Prebuilt Binaries (manual download)

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 version

One-shot download: releases/latest resolves 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-amd64
>
Prereleases 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 version
Windows 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.ps1 above runs Unblock-File automatically; for a manual download, unblock it by right-clicking the .exe → Properties → check Unblock → OK (equivalently Unblock-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 web
Windows builds are CLI/TUI/API + embedded web UI, same as the other platforms. CGO/SQLite is statically linked, so no separate runtime is required.

Self-upgrade

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 prereleases

The 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 upgrade updates the program; javinizer update refreshes metadata for your existing files. They are different commands.

Build from Source

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 version

make 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.


Usage

Start the web UI

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 8081

javinizer 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.

Organize a folder

javinizer sort ~/Videos --dry-run   # preview renames/moves first
javinizer sort ~/Videos             # scrape + organize for real

Scrape a single ID

javinizer scrape IPX-535
javinizer scrape SSIS-123 --force   # force-refresh cached metadata

Update metadata in place

Re-scrape and merge into already-organized files (supports merge presets/strategies):

javinizer update ~/Videos/IPX-535
javinizer update ~/Videos --dry-run

Interactive TUI

javinizer tui ~/Videos

See the TUI Guide for keyboard shortcuts and workflows.

Manage your library

# 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 updates

See the CLI Reference for every command and flag.


Web UI

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.

Web development

Production build (single binary with embedded UI):

make build && javinizer web

Dev 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.


Configuration

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.

Multi-language template tags

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)

  • — English title; — Japanese with English fallback.
  • Supported tags: TITLE, MAKER, LABEL, SERIES, DIRECTOR, DESCRIPTION, ORIGINALTITLE, STUDIO (synonym for MAKER).
  • 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.

Environment Variables

Docker deployments support environment-variable overrides. Defaults shown are for Docker; outside Docker, paths resolve relative to your config/data directory.

Core

| 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_HOME | Persistent application state; sweep signing key is stored in cache/Javinizer | /javinizer | | 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 |

Translation & Scraper API Keys

| 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) |

Development

| 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:latest

See .env.example for Docker Compose configuration.


Documentation

| 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 |

Support

License

MIT License — see LICENSE. This project is a Go recreation of the original Javinizer.

Chat with me