Skip to content

Releases

v0.8.2

Choose a tag to compare

@fogelmanjg fogelmanjg released this 14 Nov 18:23

Added

  • Doctor: a new "ADB port range availability" check -- found live on server01 setting up a
    second checkout: the default ADB_PORT_START/ADB_PORT_END range 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

Choose a tag to compare

@fogelmanjg fogelmanjg released this 14 Nov 17:07

Fixed

  • The VA-API daemon is no longer vendored. backend/native/vaapi-daemon/ used to be a
    hand-copied checkout of redroid-hwenc's tier5-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, default v0.2.0, the same version the vendored copy matched),
    overridable per host in that host's own .env independently of every other host. Same binary,
    same protocol -- verified live against the real daemon/GPU after rebuilding. The now-dead
    vendored source and its own test/ 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 the REDROID_HWENC_VERSION change 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

v0.8.0 Pre-release
Pre-release

Choose a tag to compare

@fogelmanjg fogelmanjg released this 14 Nov 15:49

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
    always SameSite=Lax/non-secure, which a cross-site iframe embed silently refuses to send back
    on the next request. Now SameSite=None; Secure behind 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

Choose a tag to compare

@fogelmanjg fogelmanjg released this 09 Nov 16:10

Fixed

  • Opus audio now works out of the box. scrcpy's own default audio codec used to fail on
    every instance with Failed to initialize audio/opus. Root-caused by diffing a full getprop
    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 the hwenc/hwdec/nvenc modules 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/.ps1 no 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

Choose a tag to compare

@fogelmanjg fogelmanjg released this 09 Nov 16:03

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 a dma_heap fallback 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-translation extended to Android 11. Confirmed end to end on
    real hardware (Iris Xe/host): gapps signs in, aurora-store installs, arm-translation runs 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 of AUTH_MODE.

Full details in CHANGELOG.md.

v0.6.3 - appBindHosts hot-restart + ADB knock panel IP fix

Choose a tag to compare

@fogelmanjg fogelmanjg released this 08 Nov 16:34

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

Choose a tag to compare

@fogelmanjg fogelmanjg released this 08 Nov 16:34

Added

  • A new H.264 encode path for hwenc (hardware video encode), built on FFmpeg's h264_vaapi encoder 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 separate nvenc module).
  • A Settings control to choose the hwenc encode 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: ffmpeg on Polaris, legacy on Intel). Never blocks the choice, same "warn, don't gate" approach as docs/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

Choose a tag to compare

@fogelmanjg fogelmanjg released this 07 Nov 17:31

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-forge collided if a checkout already existed at that default
    path -- README now shows cloning into a differently-named directory instead.
  • container_name was hardcoded to redroid-forge with 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 default PORT=8080 already taken by something else on the
    host) was silently swallowed by the generic uncaughtException handler 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-stopped shows it honestly as a crash-looping container instead.

Added

  • .env.example -- every env var was only discoverable by reading docker-compose.yml's own
    comments before this. Documents PORT/CONTAINER_NAME up 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

Choose a tag to compare

@fogelmanjg fogelmanjg released this 31 Oct 01:21

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 --name too. 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_PERIOD unset, 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 renamable name, but a container's HostConfig.Binds is a path string frozen at creation time. Re-keyed everything off the immutable volumeName instead.
  • An instance that gained the gapps module after creation never had hasGapps recomputed 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_DIR silently 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

Choose a tag to compare

@fogelmanjg fogelmanjg released this 30 Oct 15:18

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 .env with no visibility into what
    is configured. PUT /api/auth/mode enforces the same safety rules either way -- none → local
    requires an admin to already exist, any → both requires at least one OIDC provider configured,
    both → local requires an existing local admin, local → none requires 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 in backend/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 as appBindHosts
    (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) said docker compose up -d everywhere, which does nothing when only
    backend/data/*.json changed (no .env/image diff for Compose to notice) -- corrected to
    docker compose restart in all three places.

Added

  • Known-combinations resolver: a new piezas-validadas support tier, between oficial and
    comunidad -- see docs/KNOWN-COMBINATIONS.md section 3.