# Obtainium Emulation Pack
An [Obtainium](https://github.com/ImranR98/Obtainium) import file that adds popular Android
emulation applications to Obtainium.
The maintainer of Obtainium also hosts a collection of Crowdsourced app configurations.
[apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev)
## Prerequisite
> [!TIP]
> Which APK you need to download will depend on your device.
> If you're unsure, you can download `app-release.apk`
Download and Install the [latest release of Obtainium](https://github.com/ImranR98/Obtainium/releases/latest)
## Setup
### Option 1. Import Method
> [!TIP]
> This is recommended installation method for beginners and/or new devices
1. On your android emulation device, navigate to the [latest release](https://github.com/RJNY/Obtainium-Emulation-Pack/releases/latest) of the Obtainium Emulation Pack.
1. Download the file titled `obtainium-emulation-pack-vX.X.X.json` to your device.
1. Open Obtainium.
1. Navigate to Import/Export.
1. Select `Obtainium Import` and open `obtainium-emulation-pack-vX.X.X.json`
1. You should see packages imported to your obtainium.
### Option 2. Click-to-Install Method
1. Visit this page on your android emulation device
1. Click the "Add to Obtainium!" links of the emulators you wish to track
## Applications
### Emulator
| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
|------------------|------------------|---------------------------|----------------------|
| aPS3e | Add to Obtainium! | ✅ | ✅ |
| ARMSX2 | Add to Obtainium! | ✅ | ✅ |
| Azahar | Add to Obtainium! | ✅ | ✅ |
| Cemu | Add to Obtainium! | ✅ | ❌ |
| Cemu (Dual-Screen) | Add to Obtainium! | ❌ | ✅ |
| Citra MMJ | Add to Obtainium! | ✅ | ✅ |
| Citron | Add to Obtainium! | ✅ | ✅ |
| Citron Nightly | Add to Obtainium! | ❌ | ❌ |
| Dolphin Emulator | Add to Obtainium! | ✅ | ✅ |
| Dolphin Emulator (Dev build) | Add to Obtainium! | ❌ | ❌ |
| Dolphin-MMJR2-VBI | Add to Obtainium! | ❌ | ❌ |
| DuckStation | Add to Obtainium! | ✅ | ✅ |
| Eden | Add to Obtainium! | ✅ | ✅ |
| Eden Nightly | Add to Obtainium! | ❌ | ❌ |
| Flycast | Add to Obtainium! | ✅ | ✅ |
| Kenji-NX | Add to Obtainium! | ❌ | ❌ |
| MelonDS | Add to Obtainium! | ✅ | ❌ |
| MelonDS (Dual-Screen) | Add to Obtainium! | ❌ | ✅ |
| MelonDS Nightly | Add to Obtainium! | ❌ | ❌ |
| NetherSX2-Classic | Add to Obtainium! | ✅ | ✅ |
| NetherSX2-Patch | Add to Obtainium! | ❌ | ❌ |
| Pico8 Android | Add to Obtainium! | ✅ | ✅ |
| PPSSPP | Add to Obtainium! | ✅ | ✅ |
| RetroArch (AArch64) | Add to Obtainium! | ✅ | ✅ |
| RetroArch Nightly (AArch64) | Add to Obtainium! | ❌ | ❌ |
| RPCSX | Add to Obtainium! | ✅ | ✅ |
| ScummVM | Add to Obtainium! | ✅ | ✅ |
| Vita3K | Add to Obtainium! | ✅ | ✅ |
### Frontend
| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
|------------------|------------------|---------------------------|----------------------|
| Cocoon FE | Add to Obtainium! | ✅ | ✅ |
| Daijishō | Add to Obtainium! | ✅ | ✅ |
| iiSU | Add to Obtainium! | ❌ | ✅ |
| Pegasus | Add to Obtainium! | ✅ | ✅ |
| RetroHrai | Add to Obtainium! | ✅ | ✅ |
### PC Emulation
| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
|------------------|------------------|---------------------------|----------------------|
| GameHub Lite | Add to Obtainium! | ✅ | ✅ |
| GameHub Lite (pre-release) | Add to Obtainium! | ❌ | ❌ |
| GameNative | Add to Obtainium! | ✅ | ✅ |
| Winlator | Add to Obtainium! | ✅ | ✅ |
| Winlator CMod | Add to Obtainium! | ✅ | ✅ |
| Winlator-Ludashi | Add to Obtainium! | ✅ | ✅ |
### Streaming
| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
|------------------|------------------|---------------------------|----------------------|
| Artemis | Add to Obtainium! | ✅ | ✅ |
| Moonlight | Add to Obtainium! | ✅ | ✅ |
### Track Only
| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
|------------------|------------------|---------------------------|----------------------|
| AdrenoToolsDrivers | Add to Obtainium! | ✅ | ✅ |
| Obtainium Emulation Pack | Add to Obtainium! | ✅ | ✅ |
### Utilities
| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
|------------------|------------------|---------------------------|----------------------|
| Bifrost | Add to Obtainium! | ✅ | ✅ |
| CHDroid | Add to Obtainium! | ✅ | ✅ |
| EmuReady Lite | Add to Obtainium! | ✅ | ✅ |
| ES-DE Android Apps | Add to Obtainium! | ✅ | ✅ |
| ES-DE Companion | Add to Obtainium! | ❌ | ✅ |
| Jarngreipr | Add to Obtainium! | ❌ | ✅ |
| Mjolnir | Add to Obtainium! | ❌ | ✅ |
| OdinTools | Add to Obtainium! | ✅ | ✅ |
| PixelGuide | Add to Obtainium! | ✅ | ✅ |
| Syncthing-Fork | Add to Obtainium! | ✅ | ✅ |
## FAQ
### A note about stable, beta, nightly and canary versions of the same app
You cannot install more than one version of the same app. For example: You must choose between RetroArch (stable) or RetroArch (nightly). You cannot have both.
To make things easier for beginners, I've omitted nightly, beta and canary versions where a stable
one exists.
You can manually add beta/nightly applications by using the links in the README
### How do I update Obtainium Emulation Pack?
Same as install method. It'll update existing resources.
It will not remove any other resources you've added.
### Why do some applications say TRACK ONLY?
As the name implies, these application versions are only tracked, not pulled.
This was done because we _can't_ pull these resources, but you may still care to know when these
resources have updates so you can pull them manually. For example: NetherSX2 can't provide an APK
for legal reasons, but you'll get update notifications so you don't have to manually check or be
stuck with outdated resources.
### How do I use TRACK ONLY resources?
When you get notified of an update to your track only resource:
- visit the link to your resource
- download it manually
- in obtainium > click resource > click "Mark Updated"
### Can this break?
Yes. Absolutely it can.
Any of the scrapers that use regex can break if the application maintainers break convention.
The applications pulling from GitHub are more stable and less likely to break.
## Development & Contribution
### Prerequisites
- Python 3.11+
- Make (optional, but recommended)
- Git
### Quick Start
```bash
# Clone the repository
git clone https://github.com/RJNY/Obtainium-Emulation-Pack.git
cd Obtainium-Emulation-Pack
# Make your changes to src/applications.json
# Then regenerate all files before pushing your PR
make release
```
### Project Structure
```
src/
applications.json # Source of truth - all app definitions
scripts/
generate-table.py # Generates the README table
generate-readme.py # Stitches markdown files into README
minify-json.py # Creates release JSON files
validate-json.py # Validates applications.json
pages/
init.md # README header/intro
table.md # Generated - app tables (do not edit)
faq.md # FAQ section
development.md # This file
obtainium-emulation-pack-latest.json # Standard release
obtainium-emulation-pack-dual-screen-latest.json # Dual-screen release
```
### Adding a New Application
#### Option A: Quick Add (Recommended for GitHub apps)
Use the interactive CLI to quickly add a new app:
```bash
make add-app
```
This will:
- Prompt you for the GitHub URL
- Auto-detect the source, author, and app name
- Ask for the Android package ID and category
- Generate proper Obtainium settings
- Add the app to `applications.json`
> **Tip:** To find the package ID, open the app in Obtainium - the package ID is displayed directly below the source URL (e.g., `com.example.android`).
After running, execute `make release` to regenerate all files.
#### Option B: Manual Add (For complex configs or non-GitHub sources)
##### Step 1: Export the app config from Obtainium
1. Open Obtainium on your device
2. Add the app you want to include (configure it how you want)
3. Long-press the app and select "Export"
4. Choose "Obtainium Export" format
5. Transfer the JSON to your computer
##### Step 2: Add the app to applications.json
Open `src/applications.json` and add your app to the `apps` array:
```json
{
"id": "com.example.emulator",
"url": "https://github.com/example/emulator",
"author": "example",
"name": "Example Emulator",
"preferredApkIndex": 0,
"additionalSettings": "{...}",
"categories": ["Emulator"],
"overrideSource": "GitHub"
}
```
#### Step 3: Add meta fields (optional)
Add a `meta` object to customize how the app appears:
```json
{
"id": "com.example.emulator",
"url": "https://github.com/example/emulator",
"author": "example",
"name": "Example Emulator",
"preferredApkIndex": 0,
"additionalSettings": "{...}",
"categories": ["Emulator"],
"overrideSource": "GitHub",
"meta": {
"nameOverride": "Example Emu",
"urlOverride": "https://example-emu.org"
}
}
```
#### Step 4: Validate and regenerate
```bash
make release
```
This will:
1. Validate your JSON for errors
2. Regenerate the README table
3. Update both release JSON files
### Pre-Commit Checklist
Before committing, run `make release` and verify:
- [ ] `obtainium-emulation-pack-latest.json` has been updated
- [ ] `obtainium-emulation-pack-dual-screen-latest.json` has been updated
- [ ] `README.md` has been updated
- [ ] The README table shows a friendly application name (use `nameOverride` if not)
- [ ] The README table links to the correct homepage (use `urlOverride` if not)
- [ ] Beta apps are excluded with `meta.excludeFromExport: true`
### Available Make Commands
| Command | Description |
| ------------------------- | ----------------------------------------------------------- |
| `make help` | Show all available commands |
| `make add-app` | Interactive CLI to add a new app |
| `make release` | Run validation, generate table, README, and both JSON files |
| `make validate` | Validate applications.json for errors |
| `make table` | Generate the README table only |
| `make readme` | Generate README.md from pages |
| `make minify` | Generate standard release JSON |
| `make minify-dual-screen` | Generate dual-screen release JSON |
| `make links` | Generate click-to-install URLs (for testing) |
### Meta Field Reference
These fields in the `meta` object control how apps are processed:
| Field | Type | Default | Description |
| --------------------- | ------ | ------- | ------------------------------------------------------------------- |
| `excludeFromExport` | bool | `false` | Exclude from both release JSON files. Use for beta/unstable apps. |
| `excludeFromTable` | bool | `false` | Exclude from the README table. |
| `includeInStandard` | bool | `true` | Include in standard release. Set `false` for dual-screen-only apps. |
| `includeInDualScreen` | bool | `true` | Include in dual-screen release. Set `false` for standard-only apps. |
| `nameOverride` | string | `null` | Override the display name in the README table. |
| `urlOverride` | string | `null` | Override the homepage link in the README table. |
### Categories
Apps are organized into categories that appear as sections in the README table:
| Category | Description |
| -------------- | ---------------------------------------------------------------- |
| `Emulator` | Console/handheld emulators (Dolphin, RetroArch, PPSSPP, etc.) |
| `Frontend` | Emulator launchers and game library managers (Daijisho, Pegasus) |
| `Utilities` | Helper apps (Syncthing, OdinTools, LED controllers, etc.) |
| `Dual Screen` | Apps specifically for dual-screen devices |
| `PC Emulation` | Windows/PC game layers (Winlator, etc.) |
| `Streaming` | Game streaming clients (Moonlight, etc.) |
An app can belong to multiple categories.
### Dual-Screen vs Standard
The pack supports two variants:
- **Standard** (`obtainium-emulation-pack-latest.json`): For regular Android devices
- **Dual-Screen** (`obtainium-emulation-pack-dual-screen-latest.json`): For dual-screen devices like LG V60/Velvet
Some apps have dual-screen-specific forks (e.g., Cemu, MelonDS). Use the `includeInStandard` and `includeInDualScreen` flags to control which variant(s) include each app.
**Why this matters:** Apps with the same Android package ID (`id` field) will conflict in Obtainium. If two apps share an ID (like standard Cemu and dual-screen Cemu), they **must not** both appear in the same JSON file.
Example: Standard Cemu excluded from dual-screen, dual-screen fork excluded from standard:
```json
// Standard Cemu - exclude from dual-screen JSON
{
"id": "info.cemu.cemu",
"name": "Cemu",
"url": "https://github.com/SSimco/Cemu",
"categories": ["Emulator"],
"meta": { "includeInDualScreen": false }
}
// Dual-screen Cemu fork - exclude from standard JSON
{
"id": "info.cemu.cemu",
"name": "Cemu",
"url": "https://github.com/SapphireRhodonite/Cemu",
"categories": ["Dual Screen"],
"meta": { "includeInStandard": false }
}
```
### Choosing the Right Category and Variant
Use this decision tree:
1. **Is this app device-specific?** (e.g., AYN Thor frontend, LG dual-screen fork)
- Yes: Set `includeInStandard: false` and use appropriate category
- No: Continue to step 2
2. **Does this app share an ID with another app in the pack?** (e.g., forks, beta builds, dual-screen variants)
- Yes: Only one app per ID can be in each release JSON. Options:
- Use `includeInStandard`/`includeInDualScreen` to split between variants
- Use `excludeFromExport: true` on the less stable version (e.g., nightly builds)
- No: App can be in both variants (default)
3. **Is this app stable and ready for users?**
- Yes: Include normally
- No: Set `excludeFromExport: true` (still visible in table but not in release JSONs)