moToroTor XBVR builds
Upstream xbapps/xbvr, plus the crash fixes,
scraper repairs, and small features below — built fresh as a Docker image on every change and as a
Synology package per release, and dogfooded daily on real hardware.
Get it
Docker (any x86-64 host or NAS)
docker pull ghcr.io/motorotor/xbvr:dogfood
Rebuilt automatically on every change to the fork. A pinned :dogfood-<sha> tag
is published alongside each build if you ever need to roll back.
Synology DSM 7 (native package, no Docker needed)
One-step install or upgrade over SSH as admin (config and database are preserved):
curl -fsSL -o /tmp/xbvr-upgrade.sh https://motorotor.github.io/xbvr/upgrade.sh && sudo sh /tmp/xbvr-upgrade.sh
Or install manually from a .spk in
fork releases via Package Center.
Builds currently ship for two architectures:
| Build | Covers |
avoton (x86-64) | Intel-based models (e.g. DS1815+, DS916+, DS718+) |
aarch64 (ARMv8) | ARM-based models (e.g. DS220+, DS420+, DS920+ is Intel — check yours) |
The package offers a MariaDB-or-SQLite setup wizard, uses the ffmpeg6 package with a
fallback, and keeps your data across upgrades. Needs another architecture?
Open an issue with your model and DSM version —
run these three commands over SSH as admin and paste the output:
uname -m
grep -E '^unique|^upnpmodelname' /etc/synoinfo.conf
grep -E 'majorversion|minorversion|buildnumber' /etc/VERSION
Why run this instead of stock
- It survives "run all scrapers". Full multi-scraper runs used to die with
database is locked (#2139) or a
TransVR date panic (#2279). Both are fixed here.
- Broken scrapers get repaired fast — see the list below — instead of waiting on an upstream release.
- Small features upstream hasn't taken, like an append-only filenames API for download-manager
tooling and batch JAV scraping.
- Every change is proposed upstream with an issue and a PR; nothing here is meant to be a
private fork of the app's behavior. Upstream merges on its own schedule — and sometimes declines —
so this page tracks what these builds carry that stock doesn't.
Patches in these builds, not yet upstream
Each item links the upstream issue, and the pull request where one exists. Status is current
as of the latest build; merged upstream items drop off this page.
Crashes and data loss
- All-scrapers run dies with "database is locked" —
SQLite opened with no WAL/busy-timeout; fixed with pragmas plus retry backoff.
Issue #2139,
PR #2278
- TransVR scraper panic kills the whole server —
a data race in goment's lazy global init plus unchecked date parsing; fixed with startup warmup,
guarded parsing, and per-scraper panic isolation.
Issue #2279,
PR #2280
go test dies in flag.Parse (init chain parses flags before
testing registers its own) —
Issue #2252
- Files vanishing mid-scan no longer break the scan —
Issue #1459
- Bundle restore aborts loudly on JSON decode errors instead of importing garbage —
Issue #2247
Features
- Append-only scene filenames API (
POST /api/scene/filenames/{id}) so external
tools can register an expected filename without GET-merging and reposting the whole scene object —
PR #2277
- Batch JAV code scraping endpoint (
POST /api/task/scrape-javr-batch) —
Issue #398
- Custom sites manageable from the UI, reload without restart —
Issue #415,
PR #2275
- Match dialog says when the search index is rebuilding instead of showing a silently
empty table, and retries automatically —
Issue #2283
- Per-file projection override (moved to scene Details) plus Heresphere file-endpoint
projection — Issue #1343
- Scene list indexes fixing page timeouts —
Issue #1309
- File list filter/sort by path —
Issue #299
- Unreadable storage path returns 400 instead of panicking —
PR #2276
- Funscript speed stats — median speed per script file, per-scene speed with sort,
range filter, card badge, and optional DeoVR title prefix —
PR #622 (imported; ported to current conventions)
- Optional actor restoration from edit history —
PR #2246 (imported)
- Automatic JAV engine choice — the JAV importer can query every engine in order and
keep the most complete result ("Auto (best data)") instead of one fixed source
- Web search in the manual scene creator — find a scene page on a supported site
and scrape-and-match it straight from the ranked candidate list
- Scrapers page shows the last run — per-site new-scene counts plus blocked/error
tallies so an empty site says why
- Scraper switches stay truthful — rows keyed by site id so toggling under filters
can't desync the display —
Issue #2286
Scraper repairs
| Site | Fix | Upstream |
| SLR trans/gay projects | 404 fallback chain across projects | #2073 |
| RealityLovers | POV vs Voyeur variants | 300 |
| FuckPassVR | Partial scrapes from redirect-dedup poisoning | #2160 |
| SwallowBay | Scene-ID regex guard | #1948 |
| SexBabesVR | SiteID from canonical scene URL | #1867 |
| VRSpy | Selector re-map for current DOM | #1814 |
| VRHush | Crash on null JSON values | #1601 |
| NaughtyAmericaVR | Domain fix | #1979 |
| Pornhub Originals VR | New scraper (listing-based; scene pages need login) | PR #618 (imported) |
| UpCloseVR | Expired Algolia key, zero scenes (reported, awaiting fix) | #2281 |
| VR3000 | Site TLS certificate expired 2025-04-09 (reported, awaiting fix) | #2282 |
File matching and playback integrations
- Scene filename matching — wildcard support and ampersand variants, so moved or
renamed files rematch instead of landing in Unmatched —
#348,
#1739
- Matching a file to a freshly scraped scene works — scenes with no stored
filenames yet no longer fail the match silently
- DeoVR JSON output hardened against unescaped stored characters —
#256
- DLNA filenames follow per-video projection —
#725
Reporting problems
- Broken builds, packaging, or install issues with these builds (Docker image,
.spk,
upgrade script, catalog) — fork issues.
- App bugs and scraper breakage — upstream
xbapps/xbvr issues (there's even a
tracking ticket for new scrapers); note these builds aren't
monitored for upstream merges — if you want something pulled in, say so.