TribesPad logo

TribesPad

The original Tribes 2 and Starsiege: Tribes, native on iPad, iPhone and Mac.
Jetpacks, skiing and capture the flag, translated ahead of time from x86 to native ARM64 and rendered through Metal, with touch controls and gamepad support.

Apple Silicon Metal renderer Ahead-of-time translation iPad and iPhone Mac playable One-command build License: MIT TribesNEXT Game data not included Join the community on Discord

![TribesPad: jetting over Katabatic on iPad with touch controls](docs/images/tribespad-gameplay-jet.jpg) > [!IMPORTANT] > **TribesPad is an early release.** One command (or PadMint's **Build** button) downloads > the free official Tribes 2 and TribesNEXT files and the community's Starsiege: Tribes 1.41 > installer, and builds your own copy for iPhone, iPad and Mac. Pick either game when it opens. On a real iPad and iPhone it signs in to TribesNEXT and joins online > matches with touch or a controller. Expect rough edges: some crashes are still being > found in online play, and every fix so far came from a session log. See > [Get TribesPad](#get-tribespad) and [Known issues](#known-issues). Tribes 2 never had a released Mac version: a Mac port was announced and then put on hold before the 2001 Windows launch, and only Loki's Linux port shipped. As far as we know, TribesPad is the first native Tribes 2 for Mac, iPhone and iPad. ## What is TribesPad? TribesPad runs the **original Tribes 2 executable and the TribesNEXT / QoL client** on Apple devices. It does not run a CPU emulator and is not a remake: the game's x86 code is translated ahead of time into native ARM64, and TribesPad supplies the Windows, OpenGL, audio, input and networking services the game expects. The original menus, maps, weapons, physics, bots and scripts are all the game's own. It also runs **Starsiege: Tribes** (1998), version 1.41, the one the community plays online, translated the same way. TribesPad opens to a picker with both games and how many people are playing each right now. On iPhone and iPad it adds an analog touch layout, gamepad mapping and a small TribesPad menu for settings. On Mac it runs as a normal app with mouse and keyboard, on the same Metal renderer. ## Screenshots | | | |---|---| | ![Katabatic vista from the Starwolf base](docs/images/tribespad-katabatic-vista.jpg) | ![Inside a base on Katabatic](docs/images/tribespad-base-interior.jpg) | | **Katabatic**, original terrain, fog and snow through Metal | **Base interiors** with the original lighting and HUD | | ![The original inventory station](docs/images/tribespad-inventory.jpg) | ![The TribesPad menu](docs/images/tribespad-menu.jpg) | | **Inventory**: touch controls step aside so the original screen can be tapped | **TribesPad menu**: scores, chat, in-match actions and touch settings during a match | ## Current status | Question | Answer | |---|---| | Is this an emulator or streaming? | Neither. The x86 game and DLLs are translated ahead of time into native ARM64 code. Memory permissions are enforced by the CPU's page protections, and any access that breaks them stops the game. | | Can I play it today? | **Yes, if you build it.** [One command](#get-tribespad) builds an iPhone/iPad IPA or a Mac app from the official downloads. There is no prebuilt download. | | Does it work on a real iPad or iPhone? | **Yes, early.** Tested on a 12.9-inch iPad Pro (6th generation) and an iPhone 14 on iOS 27: TribesNEXT sign-in, the internet server list, joining Classic CTF servers and playing with touch and an Xbox controller. | | What has been played? | Offline Katabatic CTF with two bots: spawning, movement, aiming, firing, jets, skiing/jumping, weapon switching, grenades, inventory, an end-of-match map change, and a clean quit. A 30-minute session ran without a crash. | | Does it match the original game? | In the one scenario measured so far, yes: a [reference trace](docs/validation/reference-trace-katabatic.json) of the same Katabatic flight is bit-identical to the original Windows game in the air and differs by about 1 cm after landing, where the QoL collision patch applies (the Windows reference ran without QoL). | | Online play? | **Yes.** TribesPad opens to the TribesNEXT login, remembers your password if you ask it to, and joins community servers. Most servers are empty outside North American evenings; see [Online servers](#online-servers). | | Controllers? | One Xbox, PlayStation or MFi extended gamepad maps to the original bindings, played on iPad with an Xbox controller. | | Starsiege: Tribes? | **Yes.** Version 1.41 from the game picker: bot matches offline and community servers online, with the same touch, controller and ··· menu as Tribes 2. Played on iPad; Mac and the iPhone Simulator reach the menus and matches. See [Starsiege: Tribes](#starsiege-tribes). | | Is the game included? | **No.** Your build downloads the free official Tribes 2 installer and the TribesNEXT client and checks them by SHA-256. See [Game data](#game-data). | ### Performance Performance went from unplayable to steady in the Simulator: | Build | Offline Katabatic, iPad Air 11-inch (M4) Simulator | |---|---| | Software-checked memory (start) | 6–7 FPS, 221 s map load | | Page-protection memory checks | ~20 FPS | | + lighter GL checks, draw streaming, texture-upload ring, faster float paths | **~30 FPS** steady, worst frames 50–90 ms, ~70 s map load | The steady 30 FPS is the vertical-sync pacing: with VSync off the same match runs 36–37 FPS. Details are in the [handoff](docs/HANDOFF.md) and [performance records](docs/validation/ipad-hardware-permissions.json). On a physical 12.9-inch iPad Pro (M2), online with maximum detail settings, menus run at 74–104 FPS and matches at about 22–31 FPS. To go faster, try **··· → Graphics → Balanced** (or **Fast**) and **Settings → Render Scale** below 100%. The [performance notes](docs/PERFORMANCE.md) explain the measurements and how to read the FPS counter and session log. ## Play an offline match 1. Choose **LAN GAME → HOST → Katabatic**, enable two bots and tap **START GAME**. 2. When the world appears, the touch controls appear by themselves. 3. Tap **Fire** to spawn. ![Third-person view in the pre-match countdown](docs/images/tribespad-third-person.jpg) ### Touch controls | Control | Action | |---|---| | **Move stick** (bottom left) | Analog movement | | **Right side of the screen** | Drag anywhere that is not a button to aim | | **Fire** (bottom right) | Hold to fire; drag to aim while firing | | **Jet** (orange) · **Ski / Jump** · **Grenade** · **Weapon** | Beside and above Fire | | **Pack · Inventory** | Above the move stick; Inventory hides the controls so the original screen can be tapped | | **Controller / X button** (right edge) | Show or hide the touch controls | | **Cursor button** (right edge) | Turn the trackpad cursor on or off | | **Keyboard button** (right edge) | Onscreen keyboard for chat and text fields | | **··· menu** (right edge) | Game Menu (Escape), Scores, Chat, in-match actions, settings, help | ### Menus on iPhone The original menus were made for a mouse, and on a phone their buttons are smaller than a fingertip. With the **trackpad cursor** (on by default on iPhone), the whole screen works like a laptop trackpad while the touch controls are hidden: drag to move the cursor, tap anywhere to click, touch and hold then drag to hold the button (sliders, scroll bars), and drag with two fingers to scroll. Turn it off with the cursor button to tap the menus directly. On iPhone the game stays clear of the notch and rounded corners, with TribesPad's buttons in the side margin; turn off **Settings → Keep Clear of the Notch** to fill the whole screen. In Inventory, tap the original **Done**, then the controller button to resume. To close the game, use **Launch → Quit** in the original menu. ### TribesPad menu The ··· menu is the same in both games, in this order. Each game item sends the game's own key, so the original screens open. | Section | What it has | |---|---| | This Match (on a server) | **Game Menu** (the original Escape menu), **Scores**, **Chat** (all, team, quick chat), **Actions** (repair kit, mine or beacon, targeting laser, flag, zoom, third-person view, command map, suicide) | | Play Online | **Who's Playing Now**: every server with people (and, in Tribes 2, bots counted separately; the game's own list mixes them: "40/48 (38)" is two people); tap one to join. **Server List**: the original PLAY GAME → JOIN (on a server it offers to leave the match first). **Game Nights**: the regular pickup times, in your device's time zone. **Community**: the game's Discords and sites. Open at the top between matches; a submenu during one. | | Options | Show / Hide Touch Controls, Trackpad Cursor, FPS Counter (top right: frames each second and the slowest frame), Graphics Quality (Tribes 2: **Balanced** or **Fast**, and **Render Scale** on iPad), Settings… (touch size, opacity, look sensitivity, left-handed, hide with a controller, trackpad speed, notch, FPS counter, render scale) | | Help | Touch and trackpad guide, controller guide, original console, TribesPad on GitHub, About | | Choose Game… | Closes TribesPad (iOS doesn't let an app restart itself); the next time you open it, the game picker appears | ![Touch Settings during a match](docs/images/tribespad-touch-settings.jpg) ### Controller layout While playing: | Control | Action | Control | Action | |---|---|---|---| | Left stick | Move | Right stick | Aim (fine near center, fast at full tilt) | | RT | Fire | LT | Jet | | A | Ski / jump | B | Place mine | | X | Use pack | Y | Grenade | | RB / LB | Next / previous weapon | Click right / left stick | Zoom on / off / third person | | D-pad up / down | Repair kit / inventory | D-pad left / right | Beacon / quick chat | | Menu | Game menu | View | Scores | The first few times you play with a controller, a short card shows this layout; the full guide is in **··· → Help → Controller Guide**. In menus, lobbies and screens the left stick or D-pad moves the cursor, A clicks (hold to drag), B or Menu goes back, and the right stick scrolls. The game does not see the controller while a menu is open. Look speed is in Settings. Disconnecting releases the controller's actions, and backgrounding the app releases all controls. ### Online servers On iPhone and iPad, TribesPad opens to the TribesNEXT login. Tap **Account** or **Password** and the keyboard opens with the login pane above it. Sign in with your TribesNEXT account (**CREATE NEW ACCOUNT** makes a free one), then **PLAY GAME → JOIN** lists the internet servers. Tick **Remember Password** to skip typing it next time. You join as an observer: press **Fire** (RT on a controller) to join a team. Change armor and weapons at an inventory station or with **Inventory** (D-pad down). The Tribes 2 community mostly plays at set times in North American evenings: pickup games, The Cut and the 25th Anniversary draft league. At other hours most public servers are empty or hold only bots. **··· → Play Online** shows who is playing now, the regular game nights in your time zone, and the PlayT2 and The Cut Discords, where pickups are organized. Missing maps and interiors download from the TribesNEXT asset depot (on by default in TribesPad). ### Game picker TribesPad opens to a picker: **Starsiege: Tribes**, **Tribes 2** and **Tribes: Vengeance**, each with how many people are playing now. Vengeance is an optional download: its card says **DOWNLOAD** until you install it (below). Tap a card, or choose with the D-pad, left stick or arrow keys and press A or Return. The gear at the top right has **Open Tribes 2 Directly**, which skips the picker; **Settings → Display → Game Picker at Launch** brings it back. In a game, **··· → Choose Game…** closes TribesPad, and the picker appears the next time you open it (iOS doesn't let an app restart itself). Each card shows its game's own title screen, taken at build time from your own downloads. Nothing from either game is in the repository. ### Starsiege: Tribes Starsiege: Tribes 1.41, the version the community plays online, runs natively on ARM64 on iPhone, iPad and Mac, recompiled the same way as Tribes 2. Every build includes it: the build downloads PlayT1's installer and checks it against `config/starsiege/inputs.json` (`--games tribes2` leaves it out). - **Offline:** TRAINING with bots, or HOST MULTIPLAYER. - **Online:** JOIN lists the community master servers (tribes1.co); **··· → Play Online** shows who is playing, PlayT1's nightly pickup in your time zone, and the PlayT1 Discord. - **Controller:** RT fire, LT jet, A jump, RB/LB next/previous weapon, Y grenade, X pack, B crouch; the D-pad has repair kit, inventory, beacon and quick chat. In menus, X double-clicks to buy. - **IRC Chat** in the game's menu does nothing: it connects to Dynamix's IRC server, which closed long ago. Tribes 1 players talk in the PlayT1 Discord (**··· → Play Online → Community**). - **Not yet:** modded servers (RPG and other mods) need their own files, which the game cannot download; graphics presets ([validation](docs/validation/starsiege-g2.md)). ### Tribes: Vengeance Tribes: Vengeance runs natively on iPhone, iPad and Mac, recompiled from the community's free Revengeance release the same way as the other two games. Nothing from the game is in the repository, and on iPhone and iPad it is an **optional download**: tap its card, then **Download**. TribesPad fetches the same release from tribesrevengeance.net (3.1 GB), unpacks it on the device and checks every file against `config/vengeance/inputs.json`. It needs about 15 GB free while it installs and keeps 11 GB (the campaign and its 200 multiplayer maps); keep TribesPad open meanwhile, and a paused download continues where it left off. The gear on the picker has **Remove Tribes: Vengeance** to free the space. The Mac app carries the game itself. Every build includes it (`--games tribes2,starsiege` leaves it out); the build downloads the same release once to translate the game's code ([progress](docs/validation/vengeance-progress.md)). - **Campaign:** New Game, Load Game and the whole story; ··· → This Match → Campaign has Quick Save and Quick Load. - **Multiplayer:** the game's own MULTIPLAYER screen (··· → Play Online → Server List opens it) joins internet and LAN servers and hosts games. The game is free now, and like the community release's TV Key Generator, TribesPad gives it a CD key from that program's own list the first time one is needed, kept in `TribesPad-CDKey.txt` in the game folder (put your own key there to use it instead). Who's Playing Now lists OpenSpy's servers with their players and maps. - **Controller:** RT fire, LT jet, A jump (hold to ski), LB ski, RB and D-pad left change weapons, Y grenade, X pack, B use; Menu opens the game menu. - **Graphics:** ··· → Options → Graphics Quality: Fast (the default, without projected lights and shadows) or Full Detail, and a Resolution of 1024 × 768, 1600 × 1200 (the default) or 2048 × 1536. - **Speed:** 80 frames a second on the heaviest map on a Mac (SP-Spaceship); the iPad has not been measured since the latest speed work. ### Keyboard and trackpad With a Magic Keyboard or keyboard folio on iPad, **W A S D** move, **E** zooms and **Q** picks the next weapon, as with Tribes 2's WASD layout. TribesPad translates keys from the physical keyboard into the game's own E S D F binds, so the touch controls and controllers keep working and your saved binds don't change. Turn it off in **Settings → Keyboard and Trackpad** to use the original keys. The trackpad moves the game's cursor in menus; in play the game asks iPadOS to lock the pointer for mouse look (full screen only). Keyboards without an Esc key can use ⌘-period, or map Caps Lock to Escape in iPadOS Settings → General → Keyboard → Hardware Keyboard. ### Skins In the Files app, **On My iPad (or iPhone) → TribesPad → Skins** takes Tribes 2 player skins (`name.lmale.png`, `name.lfemale.png`, `name.lbioderm.png`) and skin packs (`.vl2`). TribesPad copies them into the game when it opens; choose yours under **PLAY GAME → WARRIOR SETUP → Custom Skins**. Other players see your skin only if they have the same file. TribesPad ships no community skins. **Settings → Online Play** off starts offline instead: Training, LAN Game, and the internet server list in JOIN without signing in. ## Recompiled, not decompiled TribesPad contains no Tribes 2 source code, original or reconstructed. It works from the game's shipped Windows machine code: 1. **Input.** The original x86 binaries: `Tribes2.exe`, the TribesNEXT/QoL client DLL and the Miles audio DLL and codec plugins. 2. **Lift.** Each x86 code block is converted into compiler intermediate code (LLVM IR), one function per original block, keeping the game's exact 32-bit memory layout. 3. **Compile.** That code is compiled ahead of time to native ARM64 and linked with the TribesPad runtime. Nothing is interpreted or just-in-time compiled while you play. Around the translated game, TribesPad supplies what Windows and the PC used to: the Windows API functions the game calls (files, threads, timers, memory, sockets), OpenGL through GL4ES and ANGLE to Metal, exact x87 floating point, DirectInput through SDL3, and Miles audio through OpenAL. The QoL client patches the engine's code while it runs; each of those patches was captured and translated in advance, so code written at run time is never executed. This differs from decompilation ports, which rebuild readable C source and then modify it. TribesPad keeps the original program's behavior instruction for instruction, which keeps it faithful to the original and compatible with TribesNEXT servers. ## How it works ```mermaid flowchart LR A[Tribes2.exe + TribesNEXT/QoL DLLs
original x86] -->|ahead-of-time translation| B[Native ARM64 code
32-bit guest address space] B --> C[Checked memory
CPU page protections] B --> D[Windows services
files, threads, timers, Winsock] B --> E[OpenGL 1.x → GL4ES → ANGLE → Metal] B --> F[Miles audio → OpenAL] B --> G[DirectInput → SDL3
touch, gamepad, keyboard] ``` - **Memory checks the CPU enforces.** The game's 32-bit address space keeps exact 4 KiB Windows page permissions. Pages are protected in hardware, mixed pages are checked in a fault handler, and any violation stops the game. - **Original rendering.** The game's fixed-function OpenGL runs through GL4ES and ANGLE on Metal, with streaming paths added for draws and texture uploads. ## Get TribesPad TribesPad never ships the games. You build your own copy: the build downloads the free official Tribes 2 and TribesNEXT files, PlayT1's Starsiege: Tribes installer and the Revengeance release of Tribes: Vengeance, and turns them into one app on your Mac (add `--games tribes2` to build Tribes 2 alone). It needs a Mac with Apple Silicon and about 40 minutes the first time. After installing Xcode and the tools below, allow **20 GiB (about 22 GB) of free build space** for one target with both games. This includes downloads, generated code, build files and packaging, with headroom above the [measured clean builds](docs/validation/build-disk-space.md). Xcode and the build tools need their own space; keep more free if you retain builds for multiple targets or versions. ### Mac 1. Install **Xcode** from the App Store and open it once. 2. Install [Homebrew](https://brew.sh), then run: ```sh brew install llvm@20 cmake ninja sevenzip zstd innoextract ``` 3. Build: - **With [PadMint](https://github.com/chrissotraidis/padmint) (0.5.13 or newer):** choose TribesPad and press **Build**. - **Or in Terminal:** ```sh git clone https://github.com/chrissotraidis/tribespad.git cd tribespad scripts/build-tribespad.sh --platform macos ``` 4. Unzip `build/output/TribesPad-mac.zip`, drag **TribesPad** to Applications and open it. No Apple account is needed for the Mac. ### iPhone and iPad (experimental) 1. Do steps 1–2 above, then build with PadMint, or in the `tribespad` folder in Terminal: ```sh scripts/build-tribespad.sh ``` No Mac? Build it on GitHub's free Mac from Windows, Linux or any computer with a web browser: follow [PadMint's steps](https://github.com/chrissotraidis/padmint#no-mac-build-on-githubs-mac). The IPA contains the game, so keep it to yourself. 2. Install `build/output/TribesPad.ipa` with [Sideloadly](https://sideloadly.io) or your usual signing tool. > [!NOTE] > TribesPad runs without Apple's *Extended Virtual Addressing* permission. It was tested > with a paid Apple Developer account; a free Apple ID should work (apps then expire after > seven days) but has not been tried. The app is about 1 GB with the game data. ### First launch Accept the license, create a warrior, then choose **LAN GAME → HOST → START GAME** for a match against bots. On iPhone and iPad, tap the controller button to show touch controls. ## Game data No Tribes 2, TribesNEXT or Starsiege: Tribes files are stored in this repository or published by it. The build keeps the downloads in the ignored `ref/` folder and its own work in `generated/`. The accepted files are listed by SHA-256 in [inputs-manifest.json](inputs-manifest.json) and [config/game-inputs.json](config/game-inputs.json), and Starsiege's in [config/starsiege/inputs.json](config/starsiege/inputs.json). That a game is free to download does not grant the right to redistribute it. To recreate the exact translated code the engine was tested with, the build lifts your downloaded binaries with the pinned recompiler and then applies small binary differences from [patches/translation](patches/translation) (about 3.5 MB, recorded in [config/translation-patches.json](config/translation-patches.json)). Each result is checked by SHA-256. The patches are useless without your own lift of the official files. How this works, stage by stage, is in [Reproducible build](docs/REPRODUCIBLE-BUILD.md). ## Known issues - **Crashes in online play.** Each crash so far was a Windows or OpenGL function the translated game had not reached before. TribesPad now keeps a session log in its app data (`Library/Logs/TribesPad.log`, previous session beside it); attach it to an issue. Every OpenGL 1.1 function the game loads is now either implemented or a logged no-op, so that family of crashes should be over. - **Performance.** Online matches can lag on busy maps, and loading datablocks takes a while. High ping is usually distance: most servers are in North America. - **Hosting.** HOST works for a local game with bots. Registering a hosted server on the internet list is new and lightly tested. - **Not implemented:** clipboard paste with a hardware keyboard, joining by host name (the IP dialog), and deleting recorded demos stop the game. - **Night maps are dark**, as in the original. - **Starsiege: Tribes:** servers running mods (RPG and others) need the mods' own files, which the game cannot download; the game's IRC Chat points at Dynamix's closed server (the PlayT1 Discord is where players talk); a mission takes a few seconds to load. - **Starsiege's download is slow from some places.** Its installer comes from PlayT1's host in New York; if it does not finish, the build completes with Tribes 2 alone and the picker says Starsiege is not in this build. Save `retro_141_installerv2.exe` from playt1.com into `ref/downloads` in the `tribespad` folder and build again; its SHA-256 is checked. ## Roadmap - Fix crashes reported in session logs; measure frame rate and heat on iPad - A server browser that sorts by human players, using the TribesNEXT server list - Automatic map downloads for community map packs - Touch layout editor - Measure Mac performance - Compare with the QoL client on Windows and add jet, weapon and bot scenarios to the reference trace - Join TribesNEXT community servers - Starsiege: mod packs, IRC chat, graphics presets and faster loading ([plan](docs/STARSIEGE-TRIBES-PLAN.md), [validation](docs/validation/starsiege-g2.md)) - Tribes: Vengeance device acceptance on iPad; Ascend after that ([plan](docs/VENGEANCE-ASCEND-PLAN.md), [progress](docs/validation/vengeance-progress.md)) - A headless dedicated server on a Mac, then Linux on ARM ([plan](docs/DEDICATED-SERVER-PLAN.md)) - Raspberry Pi 5 / Linux on ARM, then Android, as personal builds ([plan](docs/ANDROID-LINUX-PLAN.md)) ## Documentation - [Handoff](docs/HANDOFF.md): what works, current evidence and next steps - [Development guide](docs/DEVELOPMENT.md): building, packaging and validation - [Reproducible build](docs/REPRODUCIBLE-BUILD.md): how the one-command build recreates the game from the official downloads - [Validation records](docs/validation): measurements and screenshots - [Product target](docs/Tribes2-Online-HD-Target.md): the intended experience - [Starsiege: Tribes plan](docs/STARSIEGE-TRIBES-PLAN.md): evidence, a lift preview and gated steps for a second game - [Vengeance and Ascend plan](docs/VENGEANCE-ASCEND-PLAN.md): optional engines in the same app, community inputs, milestones and the next implementation handoff - [Vengeance implementation plan](docs/VENGEANCE-IMPLEMENTATION-PLAN.md): concrete translation/bootstrap sequence, campaign target, touch/controller bindings and third-engine integration - [Expansion research](docs/TRIBES-EXPANSION-RESEARCH.md): community services, binary audits, reusable runtime code and distribution evidence - [Launcher plan](docs/LAUNCHER-PLAN.md): the game picker, Switch Game, per-game controls and folders, and when it ships - [Android and Linux plan](docs/ANDROID-LINUX-PLAN.md): what carries over from the Apple build, and gated steps for Raspberry Pi and Android - [Dedicated server plan](docs/DEDICATED-SERVER-PLAN.md): how Tribes 2 servers run today and a headless TribesPad server - [Community research](docs/COMMUNITY-RESEARCH.md): what players asked for, community data sources and ranked feature ideas - [Archive](docs/archive): historical status checkpoints, plans and rejected experiments ## Credits Tribes 2 was developed by Dynamix and published by Sierra. Thanks to the [TribesNEXT](https://www.tribesnext.com) community, which keeps the game and its servers alive. Touch control design follows HaloPad / [ProjectReach](https://github.com/chrissotraidis/projectreach) and SunPad. TribesPad's own code is released under the [MIT License](LICENSE). Tribes 2, TribesNEXT and their files belong to their owners and are not covered by it; this repository contains none of them. The translation patches in `patches/translation` apply only to your own lift of the official downloads. TribesPad is an unofficial fan project and is not affiliated with or endorsed by the owners of Tribes 2. Report problems in [issues](https://github.com/chrissotraidis/tribespad/issues).