Play TESL Reborn, the community revival of The Elder Scrolls: Legends, on your Mac with the game's own macOS build and the official plugin. Intel Macs run it natively, Apple Silicon Macs run the same x86_64 build through Rosetta 2. No Wine, no Parallels, no Windows VM, and you stay logged in.
softwareupdate --install-rosetta --agree-to-license. Intel Macs need nothing extra.python3 --version).The game lives here, everything below goes next to its app.app:
~/Library/Application Support/Steam/steamapps/common/The Elder Scrolls Legends/
The script fetches the current TESL Reborn plugin, the BepInEx macOS launcher and the Mac fix files from the GitHub release, installs everything, and applies all three Mac fixes below. It verifies the checksums of the Mac fix files and is safe to re-run, e.g. after a plugin update. Have a look at it before running it:
curl -fsSL https://github.com/MarschMallow/tesl-reborn-mac/releases/latest/download/install.sh -o install.sh
less install.sh
sh install.sh
Then set the Steam launch option from Launching and do the first start.
tesl-reborn-plugin-1.3.1-beta.zip).BepInEx_macos_universal_5.4.23.5.zip from the
BepInEx releases. Its Doorstop
must match the plugin's .doorstop_version; for v1.3.1-beta that is Doorstop 4.5.0, i.e.
BepInEx 5.4.23.5.tesl_reborn_mac_fix.py and TeslRebornMacFix.dll.BepInEx/ folder. (winhttp.dll and
doorstop_config.ini are Windows-only, skip them.)run_bepinex.sh, libdoorstop.dylib,
.doorstop_version. Do not overwrite the plugin's BepInEx/core.tesl_reborn_mac_fix.py next to app.app, and
TeslRebornMacFix.dll into a new folder BepInEx/plugins/TeslRebornMacFix/.Open run_bepinex.sh and set the executable name near the top:
executable_name="app.app"
Make it executable and clear the quarantine flag macOS puts on downloads:
cd ~/Library/Application\ Support/Steam/steamapps/common/The\ Elder\ Scrolls\ Legends
chmod +x run_bepinex.sh
xattr -dr com.apple.quarantine BepInEx libdoorstop.dylib run_bepinex.sh
Launched via the script instead of directly from Steam, SteamAPI_Init fails
("SteamNotAvailable") unless the Steam app ID is in the environment. And the plugin first asks
http://localhost:3000 for its config; on a developer Mac something often listens there
(Node, Docker, Grafana), answers with HTML, and the game dies with
invalid token "<". tesl_reborn_mac_fix.py flips one byte in the plugin so it
goes straight to tesl-reborn.com. It keeps a backup, is idempotent, and refuses to touch a changed plugin.
In run_bepinex.sh, directly below # Everything past this point is the actual script, insert:
cd "$(dirname "$0")"
python3 "$(pwd -P)/tesl_reborn_mac_fix.py" || true
export SteamAppId=364470 SteamGameId=364470 SteamClientLaunch=1 SteamEnv=1
Already in place if you copied TeslRebornMacFix.dll in step 2. Without it you can log in
exactly once, every later login fails. Why is explained below.
From Steam (recommended): Library → right-click the game → Properties → Launch Options:
"/Users/<you>/Library/Application Support/Steam/steamapps/common/The Elder Scrolls Legends/run_bepinex.sh" %command%
Or from the terminal (Steam must be running):
~/Library/Application\ Support/Steam/steamapps/common/The\ Elder\ Scrolls\ Legends/run_bepinex.sh
Mind the exact path, a stray double space breaks the Steam launch with OS Error 260. The splash screen shows the TESL Reborn plugin version in a corner.
Logging in on another device logs out your other sessions, that is normal TESL Reborn behaviour.
Since TESL Reborn v1.1.0 the server checks whether a device is trusted. A new device has to confirm
with username and password. For the macOS client that confirmation is broken on the server: the Mac
build identifies itself as componentType "osx", os "OSX",
platform "MAC_CLIENT" with a UUID-style device fingerprint, and the password login for an
existing account answers those values with HTTP 500. So the Mac never becomes trusted. You get in
once, afterwards the Steam sign-in fails (resultCode 17 or 13) and the password
fallback crashes.
The Windows client sends win, WINDOWS, PC_CLIENT, osVersion
"10" and a 40-character hex fingerprint, and that works. The Mac Fix plugin rewrites exactly those
fields in the game's account requests to the Windows values. The fingerprint becomes a stable SHA-1 hash
of your Mac's own hardware ID, so it is unique per Mac and never changes. Nothing else is touched: your
Steam ticket, your credentials and the game itself go through unchanged, and the plugin does nothing on
Windows. If the game's Steam step reports SteamAuthFailed, it continues to the password dialog
instead of a dead end.
How this was found: with every Mac-side cause ruled out, the Windows client was run under CrossOver on the same Mac and its requests compared field by field with the native client's. The issue is reported to the TESL Reborn team. Once it is fixed on the server, the plugin becomes unnecessary and can simply be deleted.
Download the new TESL Reborn ZIP and unpack it over the game folder (overwrite BepInEx/),
or simply re-run install.sh. The Mac Fix plugin and the localhost fix survive updates, the
launcher re-applies the localhost patch on every start. If it prints "IL pattern not found",
the plugin code changed, please report it with the version. If a build bumps
.doorstop_version, grab the matching BepInEx macOS release.
The Windows client also runs in CrossOver (paid,
14-day trial): install Windows Steam in a Windows 10 64-bit bottle, install the game there, unpack the
TESL Reborn ZIP into the game folder and set the library override winhttp to
native, builtin in the bottle's Wine configuration. You still need the localhost fix on a Mac
with something on port 3000. It works, but the native route above is free and lighter.
Logs are in BepInEx/LogOutput.log inside the game folder. The Mac Fix plugin writes one line
per account request there (HTTP status and result code, no credentials).
| Symptom | Cause / fix |
|---|---|
SteamNotAvailable dialog | Steam not running, or env vars missing (Fix 1). |
invalid token "<" at start | Something on port 3000 (Fix 2). |
| No Reborn version label on the splash | BepInEx did not inject: wrong executable_name, script not executable, or quarantine flag. |
| Logs in once, then never again | Mac Fix plugin missing. Install it, then log in once with username and password. |
| Password prompt on every start | Check the log for TESL Reborn Mac Fix active. If it is there, log in once more so the Mac gets registered. |
Bad CPU type / game does not start on M-series | Rosetta 2 missing, see prerequisites. |
OS Error 260 from Steam | A typo or double space in the launch-option path. |
winhttp.dll on Windows, libdoorstop.dylib
with DYLD_INSERT_LIBRARIES on macOS. BepInEx ships both.app.app is not code-signed and has no hardened runtime, so dyld happily inserts the library./api/account/ requests,
plus one on the Steam sign-in callback. Source is in the downloads.All files come from the latest release of github.com/MarschMallow/tesl-reborn-mac, where the source lives too.
Delete BepInEx/, run_bepinex.sh, libdoorstop.dylib,
.doorstop_version, tesl_reborn_mac_fix.py and steam_appid.txt
from the game folder, and clear the Steam launch options. The game itself is untouched.
Questions, success reports, a different Mac model? Leave a note. Comments are moderated and show up once they are approved. Your name and comment are stored on this server; the email field is optional, never shown, and only used if you want reply notifications.