xtafkit is a FATX/XTAF filesystem browser and Xbox 360 content tool for macOS. It plugs the gap left by Windows-only utilities like FATXplorer and Horizon by running natively on macOS: connect an Xbox 360 hard drive or USB storage device, then browse, transfer, resolve game titles, decode profile gamertags, extract XISO disc images, build Games on Demand packages, and extract STFS containers from a terminal UI plus a small command-line surface.
Overview
xtafkit reads and writes both Xbox 360 (XTAF, big-endian) and Original Xbox (FATX, little-endian) volumes on raw storage devices and disk images. The primary interface is an interactive terminal UI for browsing and transferring files; a CLI surface covers scripting and one-shot operations such as XISO extraction, Games on Demand conversion, and STFS package extraction. There is no GUI — the tool is designed for macOS users comfortable opening a terminal.Requirements
- macOS (Intel or Apple Silicon).
sudofor raw device access (/dev/rdiskN). Disk images do not require root.- No system dependencies beyond a Rust toolchain for building from source.
- Also supports Original Xbox FATX volumes, though Xbox 360 (XTAF) is the primary target.
Features
- Interactive terminal UI for browsing partitions, transferring files, creating directories, and renaming or deleting entries.
- Bundled catalog of ~5,500 Xbox 360 and Original Xbox game titles, with on-demand STFS header parsing for anything the catalog misses.
- Profile gamertag extraction — decrypts the embedded Account file (ARC4 + HMAC-SHA1) to label profile XUIDs.
- Slot-aware folder display: game titles, content-type categories, and gamertags shown next to raw IDs.
- XISO extraction and Games on Demand conversion for Xbox 360 backward-compatible titles.
- STFS container extraction for Arcade (XBLA), XBLIG, Title Update, and Marketplace DLC packages.
- Persistent caches under
~/.config/xtafkit/— plain text and human-editable. - JSON output mode for scripting (auto-detected when stdout is piped).
Usage
Find your Xbox drive and unmount macOS's hold on it before xtafkit can read it raw:
Code:
diskutil list
diskutil unmountDisk /dev/diskN
sudo xtafkit scan /dev/rdiskN
sudo xtafkit
The no-argument invocation launches the TUI via a guided picker that detects external disks automatically. If exactly one external disk is present, it skips the picker and uses it directly.
The CLI surface is small — file operations live inside the TUI:
Code:
xtafkit launch TUI (guided picker)
xtafkit browse [DEVICE] [--partition NAME] launch TUI on a known device
xtafkit ls <DEVICE> [PATH] [-l] list files (text in TTY, JSON when piped)
xtafkit scan <DEVICE> [--deep] detect FATX/XTAF partitions
xtafkit mkimage <PATH> [--size 1G] [--populate] [--format fatx|xtaf]
xtafkit resolve <DEVICE> <PATH> STFS-based title / file resolution
xtafkit extract <ISO> <DEST> [--keep-systemupdate] [--dry-run]
xtafkit extract-stfs <PACKAGE> [--to DIR] [--dry-run]
xtafkit god <ISO> <DEST> [--trim compact|preserve-layout|none] [--dry-run] [--game-title TITLE]
TUI
The xtafkit TUI browsing an Xbox 360 Game Content partition with slot-aware folder names:
Launch the TUI on a known device:
sudo xtafkit browse /dev/rdisk4 --partition "360 Data"Resolved game names, content-type labels, and decoded gamertags appear next to raw IDs. Entries that can be resolved but haven't been yet show a
? marker; press R to resolve them, or bulk-scan an entire content-type folder in one keystroke.Uploading an XISO
When the file under the upload cursor is an Xbox or Xbox 360 disc image, the upload prompt becomes:Detected XISO 'Halo.iso'. e(X)tract / (G)oD / (R)aw / Esc
- (X)tract - Walks the XISO and writes each file into
<cwd>/<name>/on the drive. $SystemUpdate is skipped automatically. Best for alt dashboards (Aurora, FreeStyle Dash, XBMC4XBOX) that launch loosedefault.xexordefault.xbedirectly. - (G)oD - Streams a Games on Demand package into
<cwd>/<TitleID>/00007000/<MediaID>{,.data/}.Uses the compact trim by default so the output is sized to actual content. Required for stock Xbox 360 backward-compatibility playback. - (R)aw - Plain byte-for-byte copy of the source ISO file.
/Content/<XUID>/ the default is G (where the dashboard looks for BC packages); everywhere else the default is X.Uploading an STFS package
The STFS upload prompt after pointingu at a local Arcade package.
When the file under the upload cursor is an Xbox 360 STFS container (CON, LIVE, PIRS) that contains a depth-0 default.xex, the upload prompt becomes:
Detected STFS 'SOME_RANDOM_XBLA_PACKAGE' (Arcade). e(X)tract / (R)aw / Esc- (X)tract - Walks the STFS package and streams each inner file into
<cwd>/<DisplayName>/on the drive.<DisplayName>is taken straight from the package's STFS header (per-package, not the catalog's system-wide title), and sanitised for FATX. The default action. - (R)aw - Plain byte-for-byte copy of the source STFS file. Use this for packages you want to keep packed (Title Updates that need to stay STFS-wrapped to be applied at runtime, save games, streaming DLC, etc.).
Extracting XISO discs
xtafkit extract streams every file from an XISO to a local directory and skips$SystemUpdate by default. Use --dry-run to inspect the contents without writing.
Code:
xtafkit extract Halo.iso ./Halo
xtafkit extract Halo.iso ./Halo --dry-run
Converting XISO to GoD
xtafkit god converts an XISO into a Games on Demand package on the local filesystem. The default trim mode is compact, which repacks XDVDFS densely before packaging — use --trim preserve-layout to keep mastered holes, or --trim none to use the full data partition.xtafkit god Halo.iso ./outExtracting STFS containers
Two ways to extract: in the TUI via the upload prompt (covered above — see Uploading an STFS package), or via theextract-stfs CLI. The CLI is unrestricted and works on any type-1 STFS regardless of contents; the TUI gates on a depth-0 default.xex to avoid offering extraction on packages that produce nothing useful as loose files.xtafkit extract-stfs reads any Xbox 360 STFS container (CON, LIVE, PIRS) and writes its inner files to a local directory. Works on Arcade (XBLA), XBLIG, Title Updates, and Marketplace DLC.
Code:
xtafkit extract-stfs ./XBLA_pkg --dry-run
xtafkit extract-stfs ./TU_patch --to ./out/title-update
The default destination (when
--to is omitted) is ./<DisplayName>/ taken directly from the STFS header. No catalog lookup and no [TitleID] suffix. This matters for XBLIG, where every indie game shares the same generic system title-id and only the header's per-package display name carries the actual game name.Only read-only (type-1) STFS packages are supported. Type-0 packages (used by save games and on-drive system files) surface a clean error rather than producing wrong output.
Title resolution
xtafkit ships with a compiled-in catalog of ~5,500 entries merged from two community sources. When the catalog misses a title, xtafkit parses the STFS header of any file inside the unresolved folder to recover the name. For profile XUID folders, it decrypts the embedded Account file with the public Live keys to recover the gamertag.All three resolution caches live under
~/.config/xtafkit/:user_titles.txt— title-ID → nameuser_files.txt— STFS file path → title nameuser_profiles.txt— XUID → gamertag
Output format
xtafkit ls auto-detects: human-readable text when stdout is a terminal, JSON when stdout is piped or redirected. Force either with --text or --json:
Code:
sudo xtafkit ls /dev/rdisk4 --partition "360 Data" /Content
sudo xtafkit ls /dev/rdisk4 --partition "360 Data" /Content | jq '.[] | .name'
sudo xtafkit --json ls /dev/rdisk4 --partition "360 Data" /Content
GitHub: https://github.com/rdmrocha/xtafkit






