iOS Revival server guide
Run the Elvlin/exvius-offline engine inside Docker (CreamySeaman6/Exvius-revival-ios) to play the unmodified App Store FFBE Global app (ver.9100) on iPhone with Tailscale split DNS.
- Client: Stock iOS ver.9100
- Server: Docker + Tailscale
- Disk: ~17 GB setup / 15 GB final
- Replay start: 2016-12-16

How Exvius Revival for iOS works
Because iOS does not run Android APK files, CreamySeaman6/Exvius-revival-ios wraps the Elvlin/exvius-offline game engine inside a self-hosted Docker Compose container alongside Tailscale. Your iPhone runs the unmodified App Store version of Final Fantasy Brave Exvius Global (tested on Global build 1167 / ver.9100 on iOS) and talks to your server over a private Tailscale split-DNS route:
- Requirements: an Apple account that previously downloaded FFBE Global (re-downloadable from App Store → your account → Purchased), a Windows/macOS/Linux PC or NAS running Docker with 17 GB of free disk space during setup (15 GB after), and a free Tailscale account.
- Isolated network & X.509 name constraint: the container joins your tailnet as a machine named
ffbewith its own100.x.y.zIP. Its DNS responder answers onlygumi.sgandexvius.com, and its private root certificate carries a strict X.509 name constraint so it can only vouch for those two domains.
Step-by-step Docker & iPhone setup
- Clone the repository on your computer: install Docker Desktop (or Docker Engine + Compose on Linux/NAS) and run:
mkdir exvius && cd exvius git clone https://github.com/CreamySeaman6/Exvius-revival-ios.git repo cd repo/ios-server cp .env.example .env - Add your Tailscale auth key: in the Tailscale admin console, go to Settings → Keys → Generate auth key (leave reusable and ephemeral off), paste it after
TS_AUTHKEY=in.env, and save. - Build & download the 14.6 GB game data:
Wait for the log line ending indocker compose build docker compose run --rm server fetch-data docker compose up -d docker compose logs -f serverhttp://100.x.y.z/ca.mobileconfig, write down that100.x.y.zaddress, and press Ctrl+C. - Configure Tailscale split DNS: in the Tailscale admin console, open Machines → ffbe → … → Disable key expiry. Then open DNS → Nameservers → Add nameserver → Custom, enter your
100.x.y.zIP, turn on Restrict to domain forgumi.sg, and save. Add a second restricted nameserver entry with the same IP forexvius.com. - Trust the certificate on your iPhone: connect the Tailscale iOS app, install FFBE from App Store → Purchased, and open
http://100.x.y.z/ca.mobileconfigin Safari. Install the profile in Settings → Profile Downloaded, then go to Settings → General → About → Certificate Trust Settings and turn on Exvius Offline Root. - Verify & launch twice: open
https://v900-lapis.gumi.sg/__exvius/helloin Safari—if it says “Reachable. You can open the game.”, launch FFBE and let it finish its initial download. After logging in once, swipe the game closed in the iOS app switcher and reopen it so the patched upfront download list loads before your first battle.
How the server fixes stock iOS client bugs
The preserved assets come from Android, so source/server/ patches several iOS incompatibilities on the fly:
MST_LOAD_FAILUREfix: offsets every table version by+200000(EXVIUS_TABLE_VERSION_OFFSET) so the iPhone replaces its bundled tables, and converts Windows CRLF line endings to LF.- CRI HCA audio decryption (
sound_compat.py): Android sound banks use CRI HCA cipher type 1, which plays as loud static on iOS. WithEXVIUS_IOS_HCA_PLAIN=1, the server strips the cipher and rewrites frame checksums as it serves audio to/ios/paths. - Vortex banner CPK rebuild (
ios_art.py): packs loose event PNGs into a ~240 MB Vortex banner archive cached inFFBE_DIR/server/ios-cache/so Vortex tiles show artwork and the Enhance tab does not crash. - Missing English strings (
ios_texts.py): injects English bundle and ticket names into the game’s text tables so the stock iOS client never displays rawMST_BUNDLE_NAME_*keys.
Key docker-compose.yml settings & Historical Replay
Edit these variables in docker-compose.yml (or your Unraid template) and run docker compose up -d:
| Variable | Default | Effect in Exvius Revival Server |
|---|---|---|
EXVIUS_REPLAY | 1 (default) | Follows Global’s release history starting at Noctis (2016-12-16), advancing 3 historical weeks per real week (2 per week from the NV era on 2020-08-20). Set to 0 for random weekly banner rotation. |
EXVIUS_SUMMON_ROTATION | 1 (default) | Rotates summon banners weekly. Set to 0 to open all ~850 banners at once and disable date restrictions on shops and Vortex events. |
EXVIUS_VORTEX_ROTATION | 1 (default) | Matches open Vortex events to the current summon week. Set to 0 to open all 764 archived Vortex events simultaneously. |
EXVIUS_LAPIS_MULTIPLIER | 5 (default) | Multiplies Lapis earned from gameplay (story challenges pay 250 Lapis instead of 50; a full day of custom daily quests pays 3,250 Lapis). Set to 1 for stock rates. |
EXVIUS_QUEST_TRUST | 1 (default) | Grants each party unit a 30% chance of +1% Trust Master per cleared quest (with a 5% big-hit roll for +5%, averaging ~280 clears for 100% TMR). |
EXVIUS_FIELD_ENCOUNTERS | 1 (default) | Restores random monster encounters across 248 story, quest, and event exploration maps using FFBE wiki drop tables. |
EXVIUS_PLAYERS | 200 (default) | Populates 200 simulated companion and Arena rival accounts (IDs 910000001+) with 15 starting friends so friend-gift quests and Arena rankings work solo. |
iOS server log diagnostics
| Server Log / Symptom | Cause & Resolution |
|---|---|
Nothing appears in docker compose logs -f server when opening the game | The iPhone is not routing queries to the container. Re-check Tailscale split DNS for gumi.sg and exvius.com, and confirm https://v900-lapis.gumi.sg/__exvius/hello loads in Safari. |
TLS handshake failed from 100.… | The certificate profile is installed but not trusted. Open Settings → General → About → Certificate Trust Settings and enable Exvius Offline Root. |
OK POST … lines scrolling in logs | Normal operation—the iPhone app is communicating with your local Exvius Offline server. |
| Game crashes when entering the very first battle | Close the game completely (swipe it away in the iOS app switcher) and open it a second time so the upfront resources_common.cpk,resources.cpk download list takes effect. |
| A scene plays with sound effects but no background music | Music streams in the background on iOS; leave the game idle on a menu for 10–15 minutes so background audio banks finish downloading. |



Common questions
What if my Apple account never downloaded Final Fantasy Brave Exvius before end of service?
The stock iOS approach requires the unmodified Global app from App Store -> Purchased (or an existing backup of build 1167 / ver.9100). If your Apple ID does not have it in Purchased, play the Android APK on an Android phone or a Windows/Linux PC emulator instead.
Can I run the iOS server on an Unraid or Synology NAS so my PC can stay off?
Yes. The repository includes unraid/my-ffbe.xml so Unraid manages the container natively from the Docker tab with Autostart enabled (/mnt/user/appdata/ffbe), and Synology Container Manager works over SSH whenever /dev/net/tun is available for Tailscale.
Why did EXVIUS_SUMMON_ROTATION=0 stall with 100 KB left on the summon screen (Issue #6)?
Opening all ~850 banners at once triggers an ~150 MB banner-art download when entering the Summon tab (#6). If a single banner asset stalls, keep EXVIUS_SUMMON_ROTATION=1 (weekly rotation) or reopen the app twice after the cache finishes generating.