{"slug": "running-alecaframe-overwolf-with-warframe-on-linux-non-steam-umu-launcher-proton", "title": "Running AlecaFrame (Overwolf) with Warframe on Linux — non-Steam, umu-launcher + Proton", "summary": "A developer has created a working solution to run AlecaFrame, a Warframe companion app built on Overwolf, with Warframe on Linux using umu-launcher and Proton without Steam. The setup enables live data tracking of inventory and relics through a standalone window, though the in-game overlay remains non-functional under DXVK/Proton. The solution involves a single command that launches Warframe and auto-prepares AlecaFrame, with self-healing capabilities across reboots and updates.", "body_md": "**Goal:** Get [AlecaFrame](https://alecaframe.com/) — a Warframe companion app built on\n**Overwolf** — to actually read live in-game data (inventory, relics, missions, etc.) when\nWarframe runs on Linux through ** umu-launcher +\nProton**,\n\n*without*Steam.\n\n**What this achieves (verified working):**\n\n- ✅ AlecaFrame's\n**data/tracking works**— inventory and the rest populate from the live game. - ✅ A\n**single command** launches Warframe and auto-prepares AlecaFrame in the correct order. - ✅ It is\n**self-healing** and survives reboots, Overwolf self-updates, and AlecaFrame data updates. - ❌ The transparent\n**in-game overlay (Ctrl+Tab) does NOT work** under DXVK/Proton and almost certainly can't without upstream changes. You use AlecaFrame's**standalone window** instead. (Full technical reason below — it's a real wall, not a missing setting.)\n\nThis guide was largely written by AI (Opus 4.8).Every step was validated on a live system, but treat the Wine/Overwolf internals as \"true as of the versions tested\" (see[Versions]) and adapt paths to your setup. Nothing here modifies the game itself — it only adds launcher scripts, window rules, and a couple of harmless local files.\n\n**Contents:** [TL;DR](https://gist.github.com/starred.atom#tldr) · [Prerequisites](https://gist.github.com/starred.atom#prerequisites) ·\n[Background](https://gist.github.com/starred.atom#background-why-each-piece-is-needed) ·\n[1. ptrace_scope](https://gist.github.com/starred.atom#step-1--persist-ptrace_scope--0) ·\n[2. Scripts](https://gist.github.com/starred.atom#step-2--install-the-two-launcher-scripts) ·\n[3. First-run seed](https://gist.github.com/starred.atom#step-3--first-run-sanity-for-oopo-and-the-data-cache) ·\n[4. Hide junk windows](https://gist.github.com/starred.atom#step-4--hide-the-useless-wineoverwolf-windows-sway-example) ·\n[5. Daily use](https://gist.github.com/starred.atom#step-5--daily-use) ·\n[Overlay limitation](https://gist.github.com/starred.atom#the-in-game-overlay-why-it-renders-black) ·\n[Versions](https://gist.github.com/starred.atom#versions-tested)\n\n- Warframe runs via umu-launcher + Proton (DXVK). Overwolf is a separate Windows app; it can only\nread the game if it runs\n**inside the same Proton/pressure-vessel container** as the game. - umu can re-enter that container: a second\n`umu-run`\n\nwith the**same** plus`WINEPREFIX`\n\n+`GAMEID`\n\n`UMU_CONTAINER_NSENTER=1`\n\nand`PROTON_VERB=runinprefix`\n\n\"nsenters\" into the running game container. - AlecaFrame's data does\n**not** come from the EE.log — it comes from Overwolf's**memory scanner**(`gep_warframeext.dll`\n\n) reading the game's RAM. Three things must all be true for that to work:(Wine reads process memory via`kernel.yama.ptrace_scope = 0`\n\n`ptrace`\n\n).- The game must have\nin Overwolf's`<OOPO>True</OOPO>`\n\n`GamesList`\n\n(otherwise, under DXVK, Overwolf's renderer-detection fails and it never loads the scanner). - AlecaFrame's data cache (\n`cachedData/json.7z`\n\n) must be present & match the remote MD5, or its .NET init**hangs** trying to re-download over Wine's TLS.\n\n- AlecaFrame must finish initializing\n**before** the game process starts (load order matters). - Two small launcher scripts automate all of this, including self-healing #3 on every launch.\n\n- Warframe already installed and\n**working** via umu-launcher + Proton (this guide does not cover installing Warframe itself). - Overwolf + AlecaFrame already installed\n**into the same Warframe Proton prefix**. Doing this on a non-Steam umu prefix is fiddly (the Overwolf web installer fails under Wine) — see[Installing Overwolf into a Proton / umu-launcher prefix](https://gist.github.com/Deftera186/68c61da901a26feaae77313ed4a1924c)for the working route, then install AlecaFrame from Overwolf's App Store. You should have launched Overwolf at least once so the`Overwolf/`\n\nfolders and`GamesList*.xml`\n\nexist in the prefix. `curl`\n\n(or`wget`\n\n),`awk`\n\n,`grep`\n\n,`md5sum`\n\non the host.- Passwordless\n`sudo`\n\n(or root) once, to set a sysctl. - A compositor/WM where you can add window rules (examples use\n**Sway**; adapt for yours).\n\nThroughout, replace these with your values:\n\n| Placeholder | Meaning |\n|---|---|\n`WINEPREFIX` |\nYour Warframe Proton prefix, e.g. `$HOME/Games/Warframe-Proton-Prefix` |\n`GAMEID` |\nThe umu game id you launch Warframe with, e.g. `umu-warframe` |\n`LAUNCHER_EXE` |\nUnix path to Warframe's `Tools/Launcher.exe` |\n\nInside a Proton prefix the user folder is\n\n, so app data lives under`steamuser`\n\n`\"$WINEPREFIX/drive_c/users/steamuser/AppData/Local/...\"`\n\n. Use that, not your Linux username.\n\nAlecaFrame is an Overwolf app. Overwolf can only see Warframe if it shares the game's\nwine/Proton session (same `wineserver`\n\n, same pressure-vessel mount/PID namespaces). A plain second\n`umu-run`\n\nbuilds its **own** container and is blind to the game.\n\numu-launcher solves this: launch a second `umu-run`\n\nwith the **same WINEPREFIX and GAMEID** and\nset\n\n`UMU_CONTAINER_NSENTER=1`\n\n+ `PROTON_VERB=runinprefix`\n\n. umu then re-enters the existing container\n(you'll see *\"Re-entering container through bus …\"*). The injected Overwolf processes end up sharing the game's namespaces.\n\nAlecaFrame's inventory/relics/etc. are **not** parsed from `EE.log`\n\n. Overwolf's *General Game Events\nProvider* (GEP) loads a native plugin ** gep_warframeext.dll** that scans\n\n`Warframe.x64.exe`\n\n's\nmemory (`ReadProcessMemory`\n\n/`VirtualQueryEx`\n\n). Only the player **name** comes from\n\n`EE.log`\n\n.The GEP only loads that scanner if it knows the game's **renderer** *or* the game is flagged\n**out-of-process-overlay (OOPO)**. Under DXVK, Overwolf's renderer detection returns ** Unknown**, so\nwithout OOPO the scanner is never loaded (GEP just logs\n\n*\"Waiting for renderer..\"*). Setting\n\n`<OOPO>True</OOPO>`\n\nfor Warframe forces the scanner to load — and, as a bonus, the renderer then\ndetects as D3D11. With it set you can confirm in the GEP log:\n`Warframe plugin loaded: {\"status\":\"success\"}`\n\nand `\"oopOverlay\":true`\n\n.Under Wine/Proton, `wineserver`\n\nperforms `ReadProcessMemory`\n\nusing Linux ** ptrace** (\n\n`/proc/<pid>/mem`\n\n).\nThe scanner, the game, and `wineserver`\n\nare *sibling*processes, so the kernel's Yama\n\n**restricted-ptrace**(\n\n`ptrace_scope = 1`\n\n, the common default) blocks the cross-process reads and\nAlecaFrame shows **no data**. Setting\n\n`kernel.yama.ptrace_scope = 0`\n\nallows it.\n\nSecurity note:`ptrace_scope = 0`\n\nlowers system-wide ptrace hardening (any process of your user can read another's memory). That's a normal tradeoff on a single-user gaming desktop, but make the call for your threat model.`= 1`\n\nwill break the data feature.\n\nOn startup AlecaFrame's .NET client MD5-checks `cachedData/json.7z`\n\n. If that archive is **missing**\n(only the extracted `json/`\n\nfolder present), it logs\n`Got local data MD5: |==FILE-NOT-FOUND==|`\n\nand tries to **re-download** the data over HTTPS — which\n**hangs forever** under Wine's TLS, pinning a CEF process near 100% CPU. AlecaFrame deletes/renews\n`json.7z`\n\nwhenever the upstream data changes, so this recurs over time. Keep `json.7z`\n\npresent and\nmatching the remote MD5 → it logs *\"no data download is needed\"* and initializes in ~25s. The script\nbelow self-heals this from the CDN.\n\nIf AlecaFrame (re)initializes **after** `Warframe.x64.exe`\n\nis already running, it hits the hang in #4.\nSo: start the **launcher**, inject + initialize AlecaFrame to \"ready\", **then** press Play.\n\n```\nsudo tee /etc/sysctl.d/50-alecaframe-ptrace.conf >/dev/null <<'EOF'\n# AlecaFrame/Overwolf reads Warframe's memory cross-process via Overwolf's GameScanner.\n# Under Wine, wineserver does ReadProcessMemory via ptrace; with Yama restricted-ptrace\n# (scope 1) those sibling-process reads are blocked and AlecaFrame shows no data.\n# NOTE: this lowers system-wide ptrace hardening (single-user desktop tradeoff).\nkernel.yama.ptrace_scope = 0\nEOF\nsudo sysctl --system\ncat /proc/sys/kernel/yama/ptrace_scope   # must print 0\n```\n\nPut both on your `$PATH`\n\n(e.g. `~/.local/bin`\n\n) and `chmod +x`\n\nthem. **Edit the CONFIG block** at the\ntop of each to match your prefix, game id, and launcher path.\n\n``` bash\n#!/bin/sh\n# Launch Warframe (umu + Proton) AND auto-prepare AlecaFrame in the correct order.\n#\n# Correct order matters: AlecaFrame must FULLY initialize BEFORE Warframe.x64.exe starts,\n# or AlecaFrame hangs. This script starts the LAUNCHER, then (in the background) injects +\n# initializes AlecaFrame and waits for \"READY\". You press Play only after READY.\n#\n#   warframe              launch + auto-prepare AlecaFrame\n#   NO_ALECA=1 warframe   launch the game only, no AlecaFrame\n\n# ---- CONFIG: edit these ----\nWINEPREFIX=\"$HOME/Games/Warframe-Proton-Prefix\"\nGAMEID=\"umu-warframe\"\nLAUNCHER_EXE=\"$HOME/Games/Warframe-Proton-Prefix/drive_c/users/steamuser/AppData/Local/Warframe/Downloaded/Public/Tools/Launcher.exe\"\n# ----------------------------\n\nif [ -z \"$NO_ALECA\" ] && command -v alecaframe >/dev/null 2>&1; then\n    setsid alecaframe wait-prepare >/tmp/alecaframe-autostart.log 2>&1 &\nfi\n\nexec env \\\n  WINEPREFIX=\"$WINEPREFIX\" \\\n  GAMEID=\"$GAMEID\" \\\n  STORE=none \\\n  umu-run \"$LAUNCHER_EXE\" \"$@\"\n```\n\nAdd\n\n`gamemoderun`\n\nbefore`env`\n\nif you use gamemode. Keep the umu knobs identical to the`alecaframe`\n\nscript (below) or umu computes a different prefix hash and won't re-enter the container.\n\n``` bash\n#!/bin/sh\n# Inject Overwolf+AlecaFrame INTO Warframe's running umu/Proton container, in the correct order,\n# and keep the data feature healthy (self-healing). Subcommands:\n#   alecaframe prepare       inject into the running LAUNCHER, wait until AlecaFrame is initialized\n#   alecaframe wait-prepare  (used by `warframe`) wait for the launcher, then prepare\n#   alecaframe stop          stop Overwolf/AlecaFrame (never touches the game)\n#   alecaframe status        show launcher/game/Overwolf state\n\n# ---- CONFIG: edit these to match `warframe` EXACTLY ----\nWINEPREFIX=\"$HOME/Games/Warframe-Proton-Prefix\"\nGAMEID=\"umu-warframe\"\nSTORE=\"none\"\n# --------------------------------------------------------\n\nOW_LAUNCHER='C:\\Program Files (x86)\\Overwolf\\OverwolfLauncher.exe'\nAF_EXTID=\"afmcagbpgggkpdkokjhjkllpegnadmkignlonpjm\"     # AlecaFrame's Overwolf extension id (stable)\nWF_GAME_ID=\"89541\"                                       # Warframe's Overwolf game id (stable)\nLOG=\"/tmp/alecaframe-overwolf.log\"\nOW_BASE=\"$WINEPREFIX/drive_c/users/steamuser/AppData/Local/Overwolf\"\nAF_BGLOG=\"$OW_BASE/Log/Apps/AlecaFrame/BackGround.html.log\"\nAF_DATA_CDN=\"https://cdn.alecaframe.com/warframeData\"\n\n# --- self-heal #1: ensure Warframe has <OOPO>True</OOPO> so Overwolf loads the data scanner.\n# Patches every GamesList*.xml (Overwolf renames them and keeps a live + a bundled copy), inserting\n# OOPO into Warframe's own <GameInfo> block (id 89541). Idempotent; re-run on every launch.\ngameslist_files() {\n    for d in \"$OW_BASE\" \"$WINEPREFIX/drive_c/Program Files (x86)/Overwolf\"/*/Resources; do\n        [ -d \"$d\" ] || continue\n        for f in \"$d\"/GamesList*.xml; do [ -f \"$f\" ] && printf '%s\\n' \"$f\"; done\n    done\n}\noopo_present_in() {  # 0 if Warframe's block in $1 already has <OOPO>True</OOPO>\n    awk -v id=\"$WF_GAME_ID\" '\n        /<GameInfo>/ { blk=\"\"; isWF=0 }\n        { blk=blk $0 ORS }\n        $0 ~ (\"<ID>\" id \"</ID>\") { isWF=1 }\n        /<\\/GameInfo>/ { if (isWF && blk ~ /<OOPO>True<\\/OOPO>/) found=1 }\n        END { exit(found?0:1) }' \"$1\" 2>/dev/null\n}\nensure_oopo() {\n    gameslist_files | while IFS= read -r GL; do\n        oopo_present_in \"$GL\" && continue\n        cp -f \"$GL\" \"$GL.bak.$(date +%Y%m%d-%H%M%S)\" 2>/dev/null\n        awk -v id=\"$WF_GAME_ID\" '\n            /<GameInfo>/ { isWF=0 }\n            $0 ~ (\"<ID>\" id \"</ID>\") { isWF=1 }\n            (isWF && /<\\/GameInfo>/ && !done) { print \"    <OOPO>True</OOPO>\"; done=1; isWF=0 }\n            { print }' \"$GL\" > \"$GL.tmp\" 2>/dev/null && mv \"$GL.tmp\" \"$GL\"\n        oopo_present_in \"$GL\" && \\\n            echo \"  (re-applied <OOPO>True</OOPO> to Warframe in $(basename \"$GL\") so data/inventory works)\"\n    done\n}\n\n# --- self-heal #2: keep AlecaFrame's data cache (json.7z) present & matching remote MD5, or its\n# .NET init hangs re-downloading over Wine TLS (\"Got local data MD5: |==FILE-NOT-FOUND==|\").\nensure_data_cache() {\n    tool=\"\"\n    for t in curl wget; do command -v \"$t\" >/dev/null 2>&1 && { tool=\"$t\"; break; }; done\n    [ -n \"$tool\" ] || return 0\n    for U in steamuser \"$USER\"; do\n        CD=\"$WINEPREFIX/drive_c/users/$U/AppData/Local/AlecaFrame/cachedData\"\n        [ -d \"$CD\" ] || continue\n        want=\"\"; [ -f \"$CD/receivedMD5.txt\" ] && want=$(awk '{print $1; exit}' \"$CD/receivedMD5.txt\" 2>/dev/null)\n        cur=\"\";  [ -f \"$CD/json.7z\" ] && cur=$(md5sum \"$CD/json.7z\" 2>/dev/null | awk '{print $1}')\n        [ -n \"$cur\" ] && [ -n \"$want\" ] && [ \"$cur\" = \"$want\" ] && continue\n        if [ \"$tool\" = curl ]; then rmd5=$(curl -fsSL \"$AF_DATA_CDN/json7z.md5\" 2>/dev/null | awk '{print $1; exit}')\n        else rmd5=$(wget -qO- \"$AF_DATA_CDN/json7z.md5\" 2>/dev/null | awk '{print $1; exit}'); fi\n        [ -n \"$rmd5\" ] || continue\n        if [ -n \"$cur\" ] && [ \"$cur\" = \"$rmd5\" ]; then printf '%s  json.7z\\n' \"$rmd5\" > \"$CD/receivedMD5.txt\"; continue; fi\n        echo \"  (refreshing AlecaFrame data cache json.7z so init won't hang...)\"\n        if [ \"$tool\" = curl ]; then curl -fsSL \"$AF_DATA_CDN/json.7z\" -o \"$CD/json.7z.dl\" 2>/dev/null\n        else wget -qO \"$CD/json.7z.dl\" \"$AF_DATA_CDN/json.7z\" 2>/dev/null; fi\n        got=$(md5sum \"$CD/json.7z.dl\" 2>/dev/null | awk '{print $1}')\n        if [ -n \"$got\" ] && [ \"$got\" = \"$rmd5\" ]; then\n            mv -f \"$CD/json.7z.dl\" \"$CD/json.7z\"; printf '%s  json.7z\\n' \"$rmd5\" > \"$CD/receivedMD5.txt\"\n            echo \"  (data cache ready: $rmd5)\"\n        else rm -f \"$CD/json.7z.dl\"; echo \"  (WARN: could not refresh json.7z)\"; fi\n    done\n}\n\n# --- helpers (use ps, not pgrep -f, which can hang on defunct procs in this setup) ---\nlauncher_container_up() { ps -eo args 2>/dev/null | grep -E 'umu-run.*Launcher\\.exe' | grep -qv grep; }\ngame_running()          { ps -eo comm 2>/dev/null | grep -q 'Warframe.x64'; }\noverwolf_running()      { ps -eo args 2>/dev/null | grep -i 'OverwolfBrowser.exe' | grep -qv grep; }\n\n# inject an exe (+args) INTO the running game container (this is the whole trick)\ninject() {\n    setsid nohup env \\\n        WINEPREFIX=\"$WINEPREFIX\" GAMEID=\"$GAMEID\" STORE=\"$STORE\" \\\n        PROTON_VERB=\"runinprefix\" UMU_CONTAINER_NSENTER=1 UMU_RUNTIME_UPDATE=0 \\\n        umu-run \"$@\" </dev/null >\"$LOG\" 2>&1 &\n}\n\nwait_for_init() {  # 0 once AlecaFrame reports success, 1 on timeout\n    secs=\"${1:-120}\"; i=0\n    while [ \"$i\" -lt \"$secs\" ]; do\n        grep -q \"Plugin initialization successful\" \"$AF_BGLOG\" 2>/dev/null && return 0\n        game_running && echo \"[alecaframe] WARNING: game started before AlecaFrame finished init (will hang). Don't press Play until READY.\"\n        i=$((i + 1)); sleep 1\n    done\n    return 1\n}\n\ndo_prepare() {\n    if overwolf_running; then echo \"Overwolf already running. For a clean start: alecaframe stop, then prepare.\"; return 0; fi\n    if ! launcher_container_up; then\n        echo \"The Warframe LAUNCHER isn't running yet. Start it (e.g. 'NO_ALECA=1 warframe'),\"\n        echo \"stay on the launcher, then run 'alecaframe prepare' and wait for READY before Play.\"\n        return 1\n    fi\n    if game_running; then echo \"Game already running; AlecaFrame can't init cleanly now. Close it and retry from the launcher.\"; return 1; fi\n\n    echo \"Injecting Overwolf + AlecaFrame...\"\n    ensure_oopo\n    ensure_data_cache\n    : > \"$AF_BGLOG\" 2>/dev/null || true     # truncate so init-detection can't read a stale success line\n    inject \"$OW_LAUNCHER\"\n\n    echo \"Waiting for Overwolf to come up...\"\n    i=0; ow=0\n    while [ \"$i\" -lt 60 ]; do overwolf_running && { ow=1; break; }; i=$((i+1)); sleep 1; done\n    [ \"$ow\" -eq 1 ] || { echo \"Overwolf did not start.\"; return 1; }\n    sleep 5\n\n    echo \"Opening AlecaFrame (retrying until it starts)...\"\n    started=0; try=0\n    while [ \"$try\" -lt 5 ]; do\n        try=$((try+1)); inject \"$OW_LAUNCHER\" -launchapp \"$AF_EXTID\"; j=0\n        while [ \"$j\" -lt 20 ]; do\n            grep -qE 'Plugin (early )?initialization (started|completed)|Starting plugin initialization|Plugin instantiated' \"$AF_BGLOG\" 2>/dev/null && { started=1; break; }\n            grep -q 'Plugin initialization successful' \"$AF_BGLOG\" 2>/dev/null && { started=1; break; }\n            j=$((j+1)); sleep 1\n        done\n        [ \"$started\" -eq 1 ] && break\n        echo \"  (didn't start on attempt $try; retrying...)\"\n    done\n    [ \"$started\" -eq 1 ] || { echo \"AlecaFrame would not start. Try: alecaframe stop, then prepare.\"; return 1; }\n\n    echo \"Waiting for AlecaFrame to finish initializing (up to 120s)...\"\n    if wait_for_init 120; then\n        echo; echo \"==== READY — AlecaFrame initialized. You can now press PLAY in the launcher. ====\"\n        return 0\n    fi\n    echo \"AlecaFrame did NOT initialize in time. Check: tail -n 40 \\\"$AF_BGLOG\\\"\"\n    echo \"If stuck at FILE-NOT-FOUND, the game likely started too early: alecaframe stop, close game, retry.\"\n    return 1\n}\n\ncase \"$1\" in\n    stop)\n        echo \"Stopping Overwolf/AlecaFrame (never touches the game)...\"\n        PIDS=$(ps -eo pid,args 2>/dev/null | grep -i 'Overwolf' | grep -v grep | awk '{print $1}' | tr '\\n' ' ')\n        [ -n \"$PIDS\" ] && { kill -TERM $PIDS 2>/dev/null; sleep 3; echo \"  stopped: $PIDS\"; } || echo \"  (not running)\"\n        ;;\n    status)\n        launcher_container_up && echo \"Launcher: RUNNING\" || echo \"Launcher: not running\"\n        game_running        && echo \"Game:     RUNNING\"  || echo \"Game:     not running\"\n        overwolf_running    && echo \"Overwolf: RUNNING\"  || echo \"Overwolf: not running\"\n        ;;\n    wait-prepare)\n        # If a STALE Overwolf is up (left over/crashed) but AlecaFrame isn't initialized, clean it first.\n        if overwolf_running && ! grep -q 'Plugin initialization successful' \"$AF_BGLOG\" 2>/dev/null; then\n            echo \"[alecaframe] stale Overwolf detected; cleaning it first.\" >&2\n            PIDS=$(ps -eo pid,args 2>/dev/null | grep -i 'Overwolf' | grep -v grep | awk '{print $1}' | tr '\\n' ' ')\n            [ -n \"$PIDS\" ] && { kill -TERM $PIDS 2>/dev/null; sleep 3; }\n        fi\n        i=0\n        while [ \"$i\" -lt 180 ]; do\n            game_running && { echo \"[alecaframe] game already running before prepare; skipping.\" >&2; exit 0; }\n            launcher_container_up && { sleep 3; do_prepare; exit 0; }\n            i=$((i + 1)); sleep 1\n        done\n        ;;\n    prepare|\"\") do_prepare ;;\n    *) echo \"Usage: alecaframe [prepare|stop|status]\"; exit 2 ;;\nesac\n```\n\nThe scripts self-heal both on every launch, but you can seed them once manually to confirm:\n\n```\nPREFIX=\"$HOME/Games/Warframe-Proton-Prefix\"          # your WINEPREFIX\nOW=\"$PREFIX/drive_c/users/steamuser/AppData/Local/Overwolf\"\nCD=\"$PREFIX/drive_c/users/steamuser/AppData/Local/AlecaFrame/cachedData\"\n\n# 1) Confirm Warframe (id 89541) has OOPO in its own block, across every GamesList file:\nfor GL in \"$OW\"/GamesList*.xml \"$PREFIX/drive_c/Program Files (x86)/Overwolf\"/*/Resources/GamesList*.xml; do\n  [ -f \"$GL\" ] || continue\n  awk '/<GameInfo>/{b=\"\";w=0}{b=b $0 RS}/<ID>89541<\\/ID>/{w=1}/<\\/GameInfo>/{if(w&&b~/<OOPO>True<\\/OOPO>/)k=1}\n       END{exit(k?0:1)}' \"$GL\" \\\n    && echo \"OOPO ok : $GL\" || echo \"OOPO MISSING (run 'alecaframe prepare' to fix): $GL\"\ndone\n\n# 2) Seed the data cache so init won't hang:\nmkdir -p \"$CD\"\ncurl -fsSL https://cdn.alecaframe.com/warframeData/json.7z   -o \"$CD/json.7z\"\ncurl -fsSL https://cdn.alecaframe.com/warframeData/json7z.md5 | awk '{print $1\"  json.7z\"}' > \"$CD/receivedMD5.txt\"\nmd5sum \"$CD/json.7z\"; cat \"$CD/receivedMD5.txt\"        # the two hashes must match\n```\n\n(Just running `alecaframe prepare`\n\nonce does all of the above automatically.)\n\nUnder Wine/Xwayland, several Overwolf/Wine windows show up as class `steam_app_warframe`\n\nand are\nuseless or broken on Linux: the **black out-of-process overlay surface** (title `ow overlay`\n\n), the\n**Quick Launcher**, and Wine's tiny title-less `explorer.exe /desktop`\n\nartifact. Hide them\n(Sway shown; translate the idea to your WM):\n\n```\n# Keep the usable Overwolf client + AlecaFrame windows visible, float them (do NOT resize AlecaFrame —\n# resizing can crash its UI). Positions are examples; tweak to taste.\nfor_window [class=\"steam_app_warframe\" title=\"^Overwolf$\"]   floating enable, move position 230 130\nfor_window [class=\"steam_app_warframe\" title=\"^AlecaFrame$\"] floating enable, move position 80 100\n\n# Hide the broken/noise windows in the scratchpad:\nfor_window [class=\"steam_app_warframe\" title=\"^Overwolf Quick Launcher$\"] floating enable, move scratchpad\nfor_window [class=\"steam_app_warframe\" title=\"^ow overlay$\"]              floating enable, move scratchpad\nfor_window [class=\"steam_app_warframe\" title=\"^$\"]                       floating enable, move scratchpad\n```\n\nReload your WM config. (`title=\"^$\"`\n\ncatches the title-less Wine desktop window; the real Overwolf/\nAlecaFrame/launcher/game windows all map *with* a title, and move-to-scratchpad is non-destructive.)\n\n```\nwarframe            # starts the launcher AND auto-prepares AlecaFrame\n# watch for READY (tail -f /tmp/alecaframe-autostart.log, or: alecaframe status)\n# THEN press Play in the launcher.\n\nNO_ALECA=1 warframe # launch the game only\nalecaframe stop     # stop Overwolf/AlecaFrame without touching the game\n```\n\nOpen AlecaFrame's **standalone window** (from the Overwolf client) on a second monitor for your data.\n\nIf something gets stuck, the reliable reset is:\n\n```\nalecaframe stop\nWINEPREFIX=\"$HOME/Games/Warframe-Proton-Prefix\" \\\n  \"$HOME/.local/share/umu/compatibilitytools/UMU-Latest/files/bin/wineserver\" -k   # adapt path to your Proton\nrm -f \"$HOME/Games/Warframe-Proton-Prefix/pfx.lock\"\n```\n\nSymptom: pressing Ctrl+Tab shows a **fully black** surface over the game (and Overwolf's own\n`Settings`\n\nwindow is black too).\n\nRoot cause:\n\n- Overwolf renders the overlay UI with\n**CEF (Chromium) off-screen**, then hands the pixels to its compositor`ow-overlay.exe`\n\nas a**cross-process D3D11 shared texture**(NT-handle / keyed-mutex), optionally via** DirectComposition**. **DXVK does not support cross-process D3D11 shared textures**: its shared-resource table is per-process, so the texture created by CEF's GPU process can't be opened by`ow-overlay.exe`\n\n(`D3D11Device::OpenSharedResourceGeneric: Handle not found`\n\n). DXVK also lacks`CreateSwapChainForComposition`\n\n. CEF itself reports`shared texture compatibility: False`\n\nand`direct_composition: false`\n\n. Result: the pixels never reach the overlay surface → black.\n\nThings that **don't** fix it (tested):\n\n- Forcing only\n`ow-overlay.exe`\n\nonto**wined3d**(which*does*implement composition swapchains): it shares a folder with Overwolf's CEF browser, so CEF picks up wined3d too and renders broken; and a per-app Wine`DllOverride`\n\nof`dxgi/d3d11=builtin`\n\ncan't beat DXVK because DXVK is installed by physically replacing`system32\\dxgi.dll`\n\n. Even if it loaded, the failure is also on the CEF-GPU side, so the handoff still breaks. - There's no Overwolf/CEF setting found to force a CPU/shared-memory overlay transport.\n\nSo the overlay needs upstream support (DXVK cross-process shared NT-handle textures, or an Overwolf\nCPU-copy overlay path). Until then: use the standalone window. **Everything else works.**\n\nNon-fatal noise you can ignore: `gamemodeauto: dlopen failed libgamemode.so`\n\n, occasional\n`worldState.php`\n\n404s (an upstream Warframe endpoint moved; only affects a world-timer panel),\n`Uninstall registry key not found`\n\n.\n\n- umu-launcher +\n**UMU-Proton 10.0**(Wine 10),** DXVK 2.5.1**. - Overwolf client\n`0.304.x`\n\n, AlecaFrame`2.6.89`\n\n, GEP`307.4.3`\n\n. - AMD GPU (RADV/amdgpu), Wayland (Sway). The data approach is GPU-agnostic; the overlay limitation is DXVK-wide, not vendor-specific.\n\nOverwolf/AlecaFrame are third-party software; their internals can change and break these specifics. The general approach (container re-entry, OOPO, ptrace, data-cache, load order) should remain valid.", "url": "https://wpnews.pro/news/running-alecaframe-overwolf-with-warframe-on-linux-non-steam-umu-launcher-proton", "canonical_source": "https://gist.github.com/Deftera186/b589b9147694484e772ab7e164402d20", "published_at": "2026-06-24 00:09:34+00:00", "updated_at": "2026-06-24 23:12:49.207987+00:00", "lang": "en", "topics": ["developer-tools", "large-language-models"], "entities": ["AlecaFrame", "Overwolf", "Warframe", "umu-launcher", "Proton", "DXVK", "Linux"], "alternates": {"html": "https://wpnews.pro/news/running-alecaframe-overwolf-with-warframe-on-linux-non-steam-umu-launcher-proton", "markdown": "https://wpnews.pro/news/running-alecaframe-overwolf-with-warframe-on-linux-non-steam-umu-launcher-proton.md", "text": "https://wpnews.pro/news/running-alecaframe-overwolf-with-warframe-on-linux-non-steam-umu-launcher-proton.txt", "jsonld": "https://wpnews.pro/news/running-alecaframe-overwolf-with-warframe-on-linux-non-steam-umu-launcher-proton.jsonld"}}