Tags files in a Hydrus client from:
- VRChat screenshots -- the metadata VRChat and companion tools embed in PNG iTXt chunks, in any of three formats: VRCX JSON, VRChat's XMP, and the older pipe-delimited "line" format.
- Twitter/X URLs -- the account each known URL points at.
It is a single executable with no runtime to install, and only ever adds tags.
State is kept in a local SQLite cache (vrchat.db) so a scheduled run only
reads new files and only pushes tags that changed.
| Source | Tags |
|---|---|
| VRChat | vrchat, vrchat-author-id:, vrchat-author-name:, vrchat-world-id:, vrchat-world-name:, vrchat-world-instanceId:, vrchat-user-id:, vrchat-user-name: (players present), vrchat-date:, creator_tool: (the XMP CreatorTool, verbatim), editor: (the app that edited the image, if any) |
| Twitter/X | twitter-username: -- from twitter.com, x.com and the fxtwitter/vxtwitter/fixupx/fixvx mirrors |
-
In Hydrus, create a client API key (services > review services > client api) with permission to search files, read metadata and add tags.
-
Create
%APPDATA%\hydrus-tagger\config.json:{ "api_key": "<key>", "service_name": "my tags", "data_directory": "\\\\server\\hydrus\\files" }data_directoryis the Hydrus files directory (the one with thef00..ffffolders); the VRChat tagger reads PNGs from it. Other settings, all optional:hydrus_address(defaulthttp://127.0.0.1:45869),database(defaultvrchat.db, relative to where you run the tool),vrchat_selector/twitter_selector(search overrides),twitter_namespace,timeout(per request, e.g."2m"),max_retries(default 3; 0 disables retries). Unknown keys are an error, so a typo cannot silently fall back to a default.The key can also come from the
HYDRUS_API_KEYenvironment variable. Flags override both.
hydrus-tagger run --dry-run # preview, against a throwaway copy of the database
hydrus-tagger run # derive and push
hydrus-tagger run --only twitter
hydrus-tagger status # what the cache database holds (read-only)
hydrus-tagger correlate # suggest which vrchat-user-id and -name tags are the same personrun checks Hydrus is reachable and the tag service exists before touching the
database. Ctrl+C stops it after saving progress; nothing done so far is redone.
Each tagger names a Hydrus search, and the host does the rest:
- Discover candidates with the tagger's search.
- Extract (VRChat only): read new files' iTXt chunks off disk and cache them. Versioned separately, so improving a parser never re-reads the share.
- Derive tags for files whose version is stale, or every file for taggers whose input is live Hydrus metadata (Twitter: a file can gain a URL).
- Push only tag sets whose hash differs from the ledger of what was last pushed, grouping identical sets into one request.
Progress is saved after every extract chunk, after deriving and after every push batch.
Requires Go 1.27.
go build -o dist\hydrus-tagger.exe ./cmd/hydrus-tagger
go test ./...
go vet ./...