Repository navigation
Releases
v0.8.2
Added
- Doctor: a new "ADB port range availability" check -- found live on server01 setting up a
second checkout: the defaultADB_PORT_START/ADB_PORT_ENDrange silently overlapped with a
port an unrelated process already held on the host, surfacing only as Docker's own "port is
already allocated" mid-create. Now checked against the real host ahead of time. - Settings: the ADB port range is now also a UI field (previously
.env-only), with a live
as-you-type check, applied with no restart needed. - Instance create dialog and Configure panel: an optional "ADB port" field, with the same live
host check -- a taken port is caught with a clear error before it ever reaches Docker. Changing
it on an existing instance means a real recreate (Docker's own port publishing is immutable),
same as width/height/gpuMode. - README/
.env.example: documented two things a second checkout on the same host does NOT
inherit from the first one (this port range, and the optional modules' local host data).
Full backend test suite green (502 tests).
Full details in CHANGELOG.md.
v0.8.1
Fixed
- The VA-API daemon is no longer vendored.
backend/native/vaapi-daemon/used to be a
hand-copied checkout of redroid-hwenc'stier5-vaapi-daemon("a direct port, no logic
changes") -- every real upstream fix or addition needed porting by hand, file by file, with no
clean way to try a newer redroid-hwenc and roll back if it regressed a GPU this project already
had working. The Dockerfile now builds the daemon straight from a pinned redroid-hwenc tag
(REDROID_HWENC_VERSION, defaultv0.2.0, the same version the vendored copy matched),
overridable per host in that host's own.envindependently of every other host. Same binary,
same protocol -- verified live against the real daemon/GPU after rebuilding. The now-dead
vendored source and its owntest/directory are gone (that tooling lives in redroid-hwenc
now). - Doctor's "HW acceleration (hwenc, VA-API)" check now shows which redroid-hwenc tag the running
daemon was actually built from.
Added
- Doctor: a new "Active ADB connections (possible scrcpy)" check. Recreating the redroid-forge
container (e.g. for theREDROID_HWENC_VERSIONchange above) briefly drops the hwenc socket --
this is a heads-up, never a blocker, naming any instance with an established ADB connection
right now (could be a shell, could be scrcpy -- ADB gives no way to tell from the host side).
Verified end to end: rebuilt the image, confirmed the daemon starts and detects the real GPU
exactly as before, confirmed the new Doctor checks through the real API (including against a
genuine adb connect), full backend test suite green (498 tests).
Full details in CHANGELOG.md.
v0.8.0
Added
- Android 11 support for
venus3d(real NVIDIA 3D via Venus/vtest), completing the port
started 11-12/11/2026. Confirmed: stable boot, no crash loop, no ANR, with the guest artifact
rebuilt against its real SDK level (30, not Android 15's 34). Not yet confirmed: actual
on-screen 3D-accelerated rendering -- tracked as a known-incomplete state, not reported as
fully working. - A browser-tab icon for the dashboard (there was none before).
Fixed
- Login inside Plenum's dashboard (embedded iframe) was broken -- correct credentials got
accepted but the login dialog kept reappearing forever. Root cause: the session cookie was
alwaysSameSite=Lax/non-secure, which a cross-site iframe embed silently refuses to send back
on the next request. NowSameSite=None; Securebehind a TLS-terminating proxy (detected via
X-Forwarded-Proto), unchanged for plain-HTTP access. - README corrected: NVIDIA encode/decode/3D claims (decode was never actually run on the RTX
4060; encode/decode/3D are now validated end to end on both GPUs in the table), the bundled-web-
viewer absence, and the "no reverse proxy/auth stack" note -- all previously read as permanent
decisions when they were not.
Verified: full backend test suite (491 tests) green. The cookie fix is confirmed at the code/test
level and through the real public domain directly; not yet confirmed inside the actual
cross-site iframe embed that triggered the bug -- marked pre-release until that's checked live.
Full details in CHANGELOG.md.
v0.7.1
Fixed
- Opus audio now works out of the box. scrcpy's own default audio codec used to fail on
every instance withFailed to initialize audio/opus. Root-caused by diffing a fullgetprop
dump between a working and a failing instance: the real cause was a read-only boot-time
property,ro.boot.use_redroid_c2, which triggers the official image's own
/vendor/bin/redroid.c2.sh. It used to be added only by thehwenc/hwdec/nvencmodules on
the mistaken assumption that it was VA-API-specific -- it is a plain software-codec switch,
confirmed purely additive (same codecs that worked before keep working, plus Opus, HEVC and
AV1). It is now a default boot flag for every instance. scripts/connect.sh/.ps1no longer force--audio-codec=aac-- scrcpy's own default (Opus,
lower latency/bitrate) works as-is now.
Verified end to end through the real instance API (not a hand-patched container) on a freshly
created instance with zero modules.
Full details in CHANGELOG.md.
v0.7.0
Added
- Android 11-13 HIDL support for
hwenc/hwdec/redroid-gralloc-fix: a HIDL port of the
Codec2 VA-API component (AIDL does not exist before Android 14), plus adma_heapfallback for
libion.so. Validated end-to-end through the real instance API on both AMD (Ryzen 5700G/Renoir)
and Intel (Iris Xe). Android 12/13 assumed to work the same way, not separately tested yet. gapps/aurora-store/arm-translationextended to Android 11. Confirmed end to end on
real hardware (Iris Xe/host): gapps signs in, aurora-store installs,arm-translationruns a
real ARM64-only app.
Fixed
- Android 11's runtime fixups no longer race Android's own boot sequence (waits for real
sys.boot_completed=1). - Dropped a stale, HIDL-specific Intel risk warning now superseded by the general
encode-backend-risk warning.
Security
- Closed a loopback-auth bypass where a local reverse proxy relaying external traffic could make
every visitor silently authenticate as a trusted local tool, regardless ofAUTH_MODE.
Full details in CHANGELOG.md.
v0.6.3 - appBindHosts hot-restart + ADB knock panel IP fix
Fixed
appBindHosts(Settings' "App network" addresses) used to require a full container restart to take effect -- it was only ever read once, at process start. Saving a change now closes and reopens this app's own HTTP listeners in place, in process, within a few seconds -- no manual restart needed any more.- The ADB "open access" (port-knock) panel's source-IP field used to silently pre-fill from the backend's own view of the connecting address (
req.ip) -- behind this app's own Caddy route, that is always the proxy's own address, not the browsing device's, so the suggestion was actively wrong there. Dropped that pre-fill; the row now labels the server's own fixed listening address and the editable source-IP field separately and explicitly, and offers a collapsed, per-OS terminal command (with a copy button) to find the browsing device's own address instead, hinted to the right address family (Tailscale vs. private LAN) for that particular server address. (A WebRTC-based in-page detection was tried first; confirmed live that no major browser -- Firefox, Chrome, Edge, Brave, Safari -- exposes this to a page any more, so there was nothing reliable left to read in-page.)
v0.6.2 - FFmpeg h264_vaapi encode path + per-host backend setting
Added
- A new H.264 encode path for
hwenc(hardware video encode), built on FFmpeg'sh264_vaapiencoder instead of this project's own hand-rolled bitstream writer. The original path could not do P-frames on Intel (iHD) GPUs without corrupting the image, so every frame had to be a full keyframe there -- fine at a high bitrate, visibly worse at the low bitrates this project's typical use (scrcpy over a slow link) needs. The new path encodes P-frames correctly on Intel, and is also validated on AMD Cezanne-family APUs (e.g. Ryzen 5700G). Not yet enabled on AMD Polaris (RX 400/500): it causes real GPU hangs there, still under investigation -- Polaris keeps using the original path, which is solid on that hardware. NVIDIA is unaffected (it uses the separatenvencmodule). - A Settings control to choose the
hwencencode backend (legacy/ffmpeg) for the whole host, plus a matching warning -- shown in Settings, the instance creation dialog, and the Doctor tab -- whenever the active backend is a known-risky choice for the host's own GPU (today:ffmpegon Polaris,legacyon Intel). Never blocks the choice, same "warn, don't gate" approach asdocs/KNOWN-COMBINATIONS.md. Changing it relaunches the shared VA-API daemon with the new backend -- hardware encode/decode is briefly unavailable for every instance on that host while it restarts.
v0.6.1 - multi-instance-on-one-host fixes
Found by deliberately installing this project from scratch, README-only, as if a brand new user
-- on a host that already runs another checkout of this app.
Fixed
git clone ... && cd redroid-forgecollided if a checkout already existed at that default
path -- README now shows cloning into a differently-named directory instead.container_namewas hardcoded toredroid-forgewith no override, so even a second checkout
in its own directory still collided on the container name. Now reads
${CONTAINER_NAME:-redroid-forge}-- same default as before, no change for a single-instance
host.- A failed
app.listen()(e.g. the defaultPORT=8080already taken by something else on the
host) was silently swallowed by the genericuncaughtExceptionhandler meant to survive a bug
in a single request, not a startup failure -- the container stayed "Up" with the Express server
never actually listening, no real signal anything was wrong. A failed bind is now fatal, so
restart: unless-stoppedshows it honestly as a crash-looping container instead.
Added
.env.example-- every env var was only discoverable by readingdocker-compose.yml's own
comments before this. DocumentsPORT/CONTAINER_NAMEup front plus the rest.
See CHANGELOG.md
for the full detail.
v0.4.0: instance rename, live RAM lowering, second install validated end to end
A second real install (jgustavo46, AMD Polaris) was brought up from scratch and exercised end to end against this release line -- not just the project's own dev host any more. Every fix below was found live on that second machine, several only because it exists: a hardcoded personal path, a missing per-host env var, a rename-then-restart sequence nobody had tried yet.
Added
- Instance rename (pencil icon next to the name,
PUT /api/instances/:id/name): renames the instance and, cosmetically, the underlying Docker container's own--nametoo. Validates and uniqueness-checks the new name; id, data volume and running state are untouched. Names are normalized automatically (lowercased, spaces/underscores to hyphens, disallowed characters stripped) instead of being rejected outright -- applies at creation too. - RAM can now actually be lowered on a running instance: stops it, applies the lower cap, restarts it, with a confirmation prompt first. Previously blocked outright. Raising RAM live is unchanged.
- Doctor warns when hwenc is encoding all-intra (
REDROID_FORGE_ENCODE_IDR_PERIODunset, AMD for now) instead of using P-frames.
Fixed
- Renaming an instance could permanently break its ability to ever restart --
meminfoFix's bind-mounted file was keyed by the renamablename, but a container'sHostConfig.Bindsis a path string frozen at creation time. Re-keyed everything off the immutablevolumeNameinstead. - An instance that gained the
gappsmodule after creation never hadhasGappsrecomputed on recreate, hiding the Android-ID registration flow. - Auto-refresh closed the inline rename editor mid-type.
- A washed-out/low-quality scrcpy picture on the second install was live-misdiagnosed as an H.264 colour-matrix bug (two different VUI/matrix attempts changed nothing) before the real cause -- P-frames never enabled on that host -- was found. Confirmed live at both 8Mbps and 1Mbps once set.
REDROID_HWENC_ARTIFACTS_DIRsilently fell back to this project's own author's personal AOSP build path when unset.- VA-API daemon's native build (
Makefile) was missing-lm, a link failure on at least one host's toolchain. - Doctor/README pointed at a custom image build instead of the public Docker Hub default.
- README now flags AMD Polaris as not recommended for hardware decode at the same time as hwenc.
Full diff: v0.3.1...v0.4.0
v0.3.1 — Auth mode and OIDC providers manageable from the Identities panel
Changed
- Auth mode (
none/local/both) and OIDC providers (add/edit/remove) can now be switched and
managed live from the Identities panel, instead of only via.envwith no visibility into what
is configured.PUT /api/auth/modeenforces the same safety rules either way --none → local
requires an admin to already exist, any→ bothrequires at least one OIDC provider configured,
both → localrequires an existing local admin,local → nonerequires explicit confirmation --
a restart is still required to apply (AUTH_MODE/providers are read once at process start, same
rule as every other setting in this app). Both now persist inbackend/data/settings.json(never
committed, same as every other instance-specific data file), with the env var only acting as the
bootstrap default before the UI is ever touched -- same precedence pattern asappBindHosts
(Phase 6). Live-verified end to end against two real OIDC providers (a Keycloak realm and Google)
by an actual login round trip through each, not just unit tests -- the specific provider
configuration/secrets used for that test are not part of the repo.
Fixed
- The restart command the UI tells you to run after a settings change (setup wizard,
appBindHost,
and now auth mode) saiddocker compose up -deverywhere, which does nothing when only
backend/data/*.jsonchanged (no.env/image diff for Compose to notice) -- corrected to
docker compose restartin all three places.
Added
- Known-combinations resolver: a new
piezas-validadassupport tier, betweenoficialand
comunidad-- seedocs/KNOWN-COMBINATIONS.mdsection 3.