Browse, install, and manage homebrew apps, emulators, and community content directly on your console — from any source you trust.
Like APT or Homebrew — but on your Xbox 360. Add sources, browse packages, install with one click.
Add community-hosted sources with a single URL. Every source you add shows up as a tab — scroll through all their packages in one unified cover-art grid.
Select a package and press install. Downloads happen in the background so you can keep browsing, and everything is ready to launch when it's done.
Enable it once and forget it. Packages unzip automatically the moment they finish downloading — no manual steps, no hunting through file managers.
Big packages are handled by downloading independent zip parts that install together as a single unit. It avoids true dependent multi-part zips, maximizing compatibility and bypassing FAT32 limits safely.
Designed to be used from the couch with a controller. Live progress bars, download speed display, and cover art caching so you can browse even without a connection.
Queue up as many packages as you want and walk away. Triangle works through the list one by one, installing each automatically as the previous one finishes.
Triangle is source-agnostic. Point it at any compatible API — community repos, your own server, or a friend's private source.
Enter the URL of any compatible source in Settings. Multiple sources stack seamlessly.
The browser fetches the source's package catalogue and renders it as a cover-art grid. Any endpoint that returns the expected JSON format is compatible.
Select a package, press install. The browser downloads and auto-extracts in one step.
Package is installed on your HDD. Launch it from your favourite file browser or dashboard.
Anything you own and have the right to distribute — homebrew apps, emulators, open-source games, dev tools, themes, and more. Sources are operated independently by their owners; the browser is just the client.
Built for the TV — clean, readable, and snappy from across the room.
We are actively building towards v1.0 stable. Once stable, the client code will be completely open-sourced (the API is already public). Here's what we're working on.
Gracefully pause, resume, and recover partially downloaded packages across reboots.
Download multiple packages simultaneously across multiple threads for maximum bandwidth saturation.
APIs will be able to return submenus (e.g., "Themes" or "Games"), allowing nested navigation within Triangle.
Define specific install locatons per package type (e.g. HDD1:/Emulators, USB0:/Games).
Ongoing performance upgrades, memory optimization, and squash of alpha-stage bugs.
The complete frontend client source code will be published to GitHub once v1.0 stable is reached.
Browse, move, and delete files across the Xbox 360 file system from within Triangle. Planned support for launching content directly from the app.
Rich package metadata — ratings, descriptions, screenshots, changelogs, and version history — surfaced directly in the browser.
Triangle connects to any server that implements the simple JSON API spec. A reference Python server is included — drop it on your LAN or any public host.
# 1. Clone or download the sample server
git clone https://github.com/JakobRangel/Triangle-API
cd hbbrowser/API
# 2. Install dependencies
pip install flask requests
# 3. Edit SERVER_PORT at the top of api.py if needed
# Default is 8080
# 4. Run
python api.py
# ========== CONFIGURATION ==========
# Edit these constants near the top of api.py
SERVER_PORT = 8080 # port to listen on
PACKAGES_DIR = Path(...) / "packages" # folder containing packages
COVERS_DIR = Path(...) / "covers" # folder containing cover images
# Auto-fetch metadata from Xbox Live for new TitleIDs
# Off by default — see note below.
FETCH_XBOX_METADATA = False
The server auto-detects your local IP at startup and prints the full address to the terminal. No external config file is needed.
FETCH_XBOX_METADATA — When
False (default), new TitleID folders get a blank
metadata.json entry you fill in manually. When
True, the server queries the Xbox Live Catalog API once per
TitleID and caches the result. It is left off by default to avoid automated
lookups of commercial game identifiers, keeping the tool clearly separate
from any piracy use case.
API/
├── api.py # Flask server (edit config here)
├── metadata.json # auto-generated metadata cache (editable)
├── covers/ # cover image files (flat folder)
│ └── TITLEID.png # e.g. CODE9999.png (or .jpg)
└── packages/ # packages to serve
└── <TITLEID>/ # e.g. CODE9999
├── part1.zip # single-part package
└── part2.zip # additional independent part
The packages/ and covers/ folders are created
automatically when you run the script. metadata.json is generated on the
first request to /. Xbox Live metadata is fetched once per TitleID and
cached locally — if an entry already exists in metadata.json it is never
re-fetched. If a title isn't found on Xbox Live, a blank entry is still written so
you can fill in the fields manually.
.zip file for download
{"front_url":"...","name":"..."} for a
package
/ — Response Schema
{
"packages": [
{
"titleid": "CODE9999", // 8-char hex TitleID (folder name)
"name": "My Homebrew App", // display name
"description": "What this package does",
"developer": "YourName",
"publisher": "YourOrg",
"release_date": "2009-11-17", // from Xbox Live metadata
"rating": "4.5", // from Xbox Live metadata
"parts": [ // sorted list of .zip download URLs
"/download/CODE9999/part1.zip"
],
"cover_url": "/api/cover/CODE9999"
}
]
}
For large packages, split content across multiple independent .zip files
inside the same <TITLEID>/ folder. Each .zip must be
in STORE format (uncompressed), self-contained, and no larger than
2.5 GB. The server detects all .zip files in the folder
automatically and lists them in the parts array in sorted order.
Triangle downloads and extracts them sequentially.
Drop a TITLEID.png (or .jpg) directly into the
covers/ folder, named exactly after the TitleID —
e.g. CODE9999.png. No subdirectories or metadata file needed.
Triangle fetches and caches covers locally so they load instantly after the
first visit.
The server runs on any machine with Python and prints its LAN address to the
terminal on startup. To make it internet-accessible, port-forward
SERVER_PORT on your router or deploy to any Linux VPS.
The Xbox will stream packages at full connection speed.
| Component | Target | Notes |
|---|---|---|
| Startup | <5 sec | Async thumbnail loading at startup |
| Download | 10+ Mbps | SSD + Ethernet + Experimental Mode |
| Extraction | 10–20 MB/s | Storage-limited; SSD recommended |
Xbox 360 RGH / JTAG
VS 2010 · DirectX 9 · XDK
Free · Homebrew Community
Transfer the XEX to your Xbox 360, launch it, add a source, and start browsing in seconds.
View all releases →