diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f815a87..e7228e3 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -13,9 +13,9 @@
git clone https://github.com/RJNY/Obtainium-Emulation-Pack.git
cd Obtainium-Emulation-Pack
-# Make your changes to src/applications.json (or use just add-app)
-just test # verify configs resolve to real APKs
-just build # test, validate, normalize, and generate all output files
+just add-app # interactive CLI to add a new app
+just test --verbose --apks # verify configs resolve to real APKs (with full details)
+just build # test, validate, normalize, and generate all output files
```
## Project Structure
@@ -36,6 +36,7 @@ scripts/
generate-readme.py # Stitches markdown files into README
minify-json.py # Creates release JSON files
normalize-json.py # Normalize key order and backfill defaults
+ process-test-results.py # Processes scheduled test results, manages GitHub issues
release.py # Automated release workflow (tag, push, gh release)
pages/
header.md # README header/intro
@@ -89,12 +90,17 @@ Open `src/applications.json` and add your app to the `apps` array:
"author": "example",
"name": "Example Emulator",
"preferredApkIndex": 0,
- "additionalSettings": "{...}",
+ "additionalSettings": {
+ "apkFilterRegEx": "arm64",
+ "about": "Example emulator description"
+ },
"categories": ["Emulator"],
"overrideSource": "GitHub"
}
```
+> **Note:** `additionalSettings` is a **sparse JSON object** - only include values that differ from the defaults. The full settings are hydrated automatically at export time. See `scripts/constants.py` for the schema and default values.
+
#### Step 3: Add meta fields (optional)
Add a `meta` object to customize how the app appears:
@@ -106,7 +112,10 @@ Add a `meta` object to customize how the app appears:
"author": "example",
"name": "Example Emulator",
"preferredApkIndex": 0,
- "additionalSettings": "{...}",
+ "additionalSettings": {
+ "apkFilterRegEx": "arm64",
+ "about": "Example emulator description"
+ },
"categories": ["Emulator"],
"overrideSource": "GitHub",
"meta": {
@@ -119,14 +128,16 @@ Add a `meta` object to customize how the app appears:
#### Step 4: Validate, test, and regenerate
```bash
-just validate # check for structural errors
-just test # verify your app config resolves to a real APK
-just build # test, validate, normalize, and generate all output files
+just test AppName --verbose --apks # verify your app config resolves to a real APK
+just validate # check for structural errors
+just build # test, validate, normalize, and generate all output files
```
## CI
-Pull requests and pushes to `main` are checked by GitHub Actions (single job):
+### Pull request / push checks
+
+Pull requests and pushes to `main` are checked by GitHub Actions (`ci.yml`, single job):
1. **Validate** - structural checks, regex syntax, source types
2. **Test** - verifies all app configs resolve to real APKs
@@ -135,6 +146,10 @@ Pull requests and pushes to `main` are checked by GitHub Actions (single job):
All steps must pass before merging.
+### Scheduled tests
+
+A separate workflow (`scheduled-test.yml`) runs daily at ~6 AM Central. It live-tests every app config and automatically creates GitHub issues for any failures. When a previously failing app starts passing again, the issue is auto-closed. You can dry-run this locally with `just test-cron`.
+
## Pre-Commit Checklist
Before committing, run `just build`, then verify:
@@ -151,18 +166,22 @@ Before committing, run `just build`, then verify:
Run `just` to see all available commands. Recipes with `*args` accept `-h` for help.
-| Command | Description |
-| ----------------------- | ----------------------------------------------------------- |
-| `just add-app` | Interactive CLI to add a new app |
-| `just validate` | Validate applications.json (structure, regex, source types) |
-| `just normalize` | Normalize key order and backfill defaults |
-| `just test` | Live-test all app configs resolve to downloadable APKs |
-| `just test AppName` | Live-test a single app by name (partial match) |
-| `just test --verbose` | Live-test all apps with APK URL details |
-| `just generate` | Generate all output files (README, release JSONs) |
-| `just generate table` | Generate the README table only |
-| `just build` | Test, validate, normalize, and generate all output files |
-| `just release` | Tag, push, and create a GitHub release |
+| Command | Description |
+| ----------------------------- | ----------------------------------------------------------- |
+| `just add-app` | Interactive CLI to add a new app |
+| `just validate` | Validate applications.json (structure, regex, source types) |
+| `just normalize` | Normalize key order and backfill defaults |
+| `just test` | Live-test all app configs resolve to downloadable APKs |
+| `just test AppName` | Live-test a single app by name (partial match) |
+| `just test --verbose --apks` | Live-test all apps with full APK URL details |
+| `just test-cron` | Dry-run the scheduled test workflow (no issues created) |
+| `just generate` | Generate all output files (README, release JSONs) |
+| `just generate table` | Generate the README table only |
+| `just generate readme` | Generate README (includes table) |
+| `just generate standard` | Generate standard release JSON only |
+| `just generate dual-screen` | Generate dual-screen release JSON only |
+| `just build` | Test, validate, normalize, and generate all output files |
+| `just release` | Tag, push, and create a GitHub release |
## Meta Field Reference
@@ -197,7 +216,7 @@ An app can belong to multiple categories.
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
+- **Dual-Screen** (`obtainium-emulation-pack-dual-screen-latest.json`): For dual-screen devices (AYN Thor, Anbernic RG DS, etc.)
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.
@@ -220,7 +239,7 @@ Example: Standard Cemu excluded from dual-screen, dual-screen fork excluded from
"id": "info.cemu.cemu",
"name": "Cemu",
"url": "https://github.com/SapphireRhodonite/Cemu",
- "categories": ["Dual Screen"],
+ "categories": ["Emulator"],
"meta": { "includeInStandard": false }
}
```
diff --git a/README.md b/README.md
index 7d87f9b..404acaa 100644
--- a/README.md
+++ b/README.md
@@ -1,67 +1,68 @@
+
+
# Obtainium Emulation Pack
-An [Obtainium](https://github.com/ImranR98/Obtainium) import file that adds popular Android
-emulation applications to Obtainium.
+A curated collection of Android emulators and gaming utilities for [Obtainium](https://github.com/ImranR98/Obtainium).
+
Import the pack and get automatic updates for every emulator on your device.
-The maintainer of Obtainium also hosts a collection of Crowdsourced app configurations.
-[apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev)
+[](https://github.com/RJNY/Obtainium-Emulation-Pack/releases/latest)
+[](https://github.com/RJNY/Obtainium-Emulation-Pack/actions/workflows/scheduled-test.yml)
-## Prerequisite
+
The Obtainium maintainer also hosts a broader collection of crowdsourced app configs at apps.obtainium.imranr.dev
-> [!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
+## Getting Started
-### Option 1. Import Method
+### 1. Install Obtainium
-> [!TIP]
-> This is recommended installation method for beginners and/or new devices
+Download the [latest release of Obtainium](https://github.com/ImranR98/Obtainium/releases/latest) and install it on your device. If you're unsure which APK to grab, use `app-release.apk`.
-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.
+### 2. Import the Pack
-### Option 2. Click-to-Install Method
+This is the easiest way to get started, especially on a new device.
-1. Visit this page on your android emulation device
-1. Click the "Add to Obtainium!" links of the emulators you wish to track
+1. On your device, go to the [latest release](https://github.com/RJNY/Obtainium-Emulation-Pack/releases/latest).
+2. Download the JSON for your device:
+ - **Standard** (`obtainium-emulation-pack-vX.X.X.json`) - most devices
+ - **Dual-Screen** (`obtainium-emulation-pack-dual-screen-vX.X.X.json`) - dual-screen devices (AYN Thor, Anbernic RG DS, etc.)
+3. In Obtainium, go to **Import/Export** > **Obtainium Import** and select the file.
-## Applications
+Obtainium will now track and update all included apps.
+
+## What's in the Pack
+
+Don't want the whole pack? Browse the tables below on your device and tap the **Add to Obtainium!** links for just the apps you want.
### Emulator
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| aPS3e | Add to Obtainium! | ✅ | ✅ |
| ARMSX2 | Add to Obtainium! | ✅ | ✅ |
| Azahar | Add to Obtainium! | ✅ | ✅ |
-| Cemu | Add to Obtainium! | ✅ | ❌ |
-| Cemu (Dual-Screen) | Add to Obtainium! | ❌ | ✅ |
+| Cemu | Add to Obtainium! | ✅ | - |
+| Cemu (Dual-Screen) | Add to Obtainium! | - | ✅ |
| Citra MMJ | Add to Obtainium! | ✅ | ✅ |
| Dolphin Emulator | Add to Obtainium! | ✅ | ✅ |
-| Dolphin Emulator (Dev build) | Add to Obtainium! | ❌ | ❌ |
-| Dolphin-MMJR2-VBI | 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! | ❌ | ❌ |
+| Eden Nightly | Add to Obtainium! | - | - |
| Flycast | Add to Obtainium! | ✅ | ✅ |
| MelonDS | Add to Obtainium! | ✅ | ✅ |
| MelonDS Nightly | Add to Obtainium! | ✅ | ✅ |
| MelonDualDS | Add to Obtainium! | ✅ | ✅ |
-| NetherSX2-Classic | Add to Obtainium! | ❌ | ❌ |
+| NetherSX2-Classic | Add to Obtainium! | - | - |
| NetherSX2-Patch | Add to Obtainium! | ✅ | ✅ |
| Pico8 Android | Add to Obtainium! | ✅ | ✅ |
| Play! | Add to Obtainium! | ✅ | ✅ |
| PPSSPP | Add to Obtainium! | ✅ | ✅ |
| RetroArch (AArch64) | Add to Obtainium! | ✅ | ✅ |
-| RetroArch Nightly (AArch64) | Add to Obtainium! | ❌ | ❌ |
+| RetroArch Nightly (AArch64) | Add to Obtainium! | - | - |
| RPCSX | Add to Obtainium! | ✅ | ✅ |
| ScummVM | Add to Obtainium! | ✅ | ✅ |
| Vita3K | Add to Obtainium! | ✅ | ✅ |
@@ -69,8 +70,8 @@ Download and Install the [latest release of Obtainium](https://github.com/ImranR
### Frontend
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| Argosy | Add to Obtainium! | ✅ | ✅ |
| Cocoon FE | Add to Obtainium! | ✅ | ✅ |
| Daijishō | Add to Obtainium! | ✅ | ✅ |
@@ -79,10 +80,10 @@ Download and Install the [latest release of Obtainium](https://github.com/ImranR
### PC Emulation
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| GameHub Lite | Add to Obtainium! | ✅ | ✅ |
-| GameHub Lite (pre-release) | Add to Obtainium! | ❌ | ❌ |
+| GameHub Lite (pre-release) | Add to Obtainium! | - | - |
| GameNative | Add to Obtainium! | ✅ | ✅ |
| Winlator | Add to Obtainium! | ✅ | ✅ |
| Winlator CMod | Add to Obtainium! | ✅ | ✅ |
@@ -90,16 +91,16 @@ Download and Install the [latest release of Obtainium](https://github.com/ImranR
### Streaming
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| Artemis | Add to Obtainium! | ✅ | ✅ |
| Moonlight | Add to Obtainium! | ✅ | ✅ |
-| PXPlay | Add to Obtainium! | ❌ | ❌ |
+| PXPlay | Add to Obtainium! | - | - |
### Track Only
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| AdrenoToolsDrivers | Add to Obtainium! | ✅ | ✅ |
| ES-DE Custom Systems | Add to Obtainium! | ✅ | ✅ |
| Mr. Purple Turnip Drivers | Add to Obtainium! | ✅ | ✅ |
@@ -107,69 +108,81 @@ Download and Install the [latest release of Obtainium](https://github.com/ImranR
### Utilities
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| 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! | ❌ | ✅ |
-| O2P Tweaks | Add to Obtainium! | ❌ | ❌ |
+| ES-DE Companion | Add to Obtainium! | - | ✅ |
+| Jarngreipr | Add to Obtainium! | - | ✅ |
+| Mjolnir | Add to Obtainium! | - | ✅ |
+| O2P Tweaks | 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
+
+Can I install both stable and nightly versions of the same app?
+
+No. Android only allows one app per package ID. You must choose between stable and nightly for apps like RetroArch, MelonDS, Eden, etc. The pack includes stable versions by default - use the individual "Add to Obtainium!" links above to switch to a nightly if you prefer.
+
-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.
+
+How do I update the pack?
+
+Same as the initial install. Re-import the latest JSON and it will update existing configs without removing any apps you've added separately.
+
-To make things easier for beginners, I've omitted nightly, beta and canary versions where a stable
-one exists.
+
+What are the two JSON variants?
+
+Some emulators have dual-screen forks (Cemu, MelonDS) that share the same Android package ID as the standard version. Since Obtainium can't have two apps with the same ID, the pack ships two variants:
+
-You can manually add beta/nightly applications by using the links in the README
+- **Standard** - for AYN Odin, Retroid Pocket, and most Android devices
+- **Dual-Screen** - for AYN Thor, Anbernic RG DS, and other dual-screen devices, with dual-screen forks swapped in plus dual-screen utilities
-### 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?
+
+
+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?
+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: GPU driver repos don't publish
+APKs, but you'll get update notifications so you don't have to manually check for new releases.
+
+
+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.
+
+Can configs break?
+
+Yes. Apps sourced from websites (HTML scraping) can break if the site changes its layout. GitHub-sourced apps are more stable. The pack is tested daily and broken configs are flagged automatically.
+
## Contributing
-Want to add an app or fix a config? See the [Contributing Guide](CONTRIBUTING.md) for setup instructions, how to add apps, and the pre-commit checklist.
-
-Quick version:
+Want to add an app or fix a config? See the [Contributing Guide](CONTRIBUTING.md).
```bash
git clone https://github.com/RJNY/Obtainium-Emulation-Pack.git
cd Obtainium-Emulation-Pack
-# Add or edit apps in src/applications.json (or use just add-app)
-just test # verify configs resolve to real APKs
-just build # test, validate, normalize, and generate all output files
+just add-app # interactive CLI to add a new app
+just test --verbose --apks # verify configs resolve to real APKs
+just build # test, validate, normalize, and generate all output files
```
diff --git a/justfile b/justfile
index 6a4860e..0a635e8 100644
--- a/justfile
+++ b/justfile
@@ -10,9 +10,9 @@ default:
add-app:
@python scripts/add-app.py
-# Test, validate, normalize, and generate all output files
+# Validate, normalize, and generate all output files
[group('Release')]
-build: test validate normalize generate
+build: validate normalize generate
# Tag, push, and create a GitHub release
[group('Release')]
@@ -30,6 +30,7 @@ normalize:
@python scripts/normalize-json.py src/applications.json
# Live-test app configs
+[group('Release')]
test *args:
@python scripts/test-apps.py {{ args }}
diff --git a/pages/faq.md b/pages/faq.md
index 213b9db..7ba3580 100644
--- a/pages/faq.md
+++ b/pages/faq.md
@@ -1,37 +1,51 @@
## FAQ
-### A note about stable, beta, nightly and canary versions of the same app
+
+Can I install both stable and nightly versions of the same app?
+
+No. Android only allows one app per package ID. You must choose between stable and nightly for apps like RetroArch, MelonDS, Eden, etc. The pack includes stable versions by default - use the individual "Add to Obtainium!" links above to switch to a nightly if you prefer.
+
-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.
+
+How do I update the pack?
+
+Same as the initial install. Re-import the latest JSON and it will update existing configs without removing any apps you've added separately.
+
-To make things easier for beginners, I've omitted nightly, beta and canary versions where a stable
-one exists.
+
+What are the two JSON variants?
+
+Some emulators have dual-screen forks (Cemu, MelonDS) that share the same Android package ID as the standard version. Since Obtainium can't have two apps with the same ID, the pack ships two variants:
+
-You can manually add beta/nightly applications by using the links in the README
+- **Standard** - for AYN Odin, Retroid Pocket, and most Android devices
+- **Dual-Screen** - for AYN Thor, Anbernic RG DS, and other dual-screen devices, with dual-screen forks swapped in plus dual-screen utilities
-### 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?
+
+
+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?
+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: GPU driver repos don't publish
+APKs, but you'll get update notifications so you don't have to manually check for new releases.
+
+
+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.
+
+Can configs break?
+
+Yes. Apps sourced from websites (HTML scraping) can break if the site changes its layout. GitHub-sourced apps are more stable. The pack is tested daily and broken configs are flagged automatically.
+
\ No newline at end of file
diff --git a/pages/footer.md b/pages/footer.md
index fd982ea..b37ecbe 100644
--- a/pages/footer.md
+++ b/pages/footer.md
@@ -1,14 +1,12 @@
## Contributing
-Want to add an app or fix a config? See the [Contributing Guide](CONTRIBUTING.md) for setup instructions, how to add apps, and the pre-commit checklist.
-
-Quick version:
+Want to add an app or fix a config? See the [Contributing Guide](CONTRIBUTING.md).
```bash
git clone https://github.com/RJNY/Obtainium-Emulation-Pack.git
cd Obtainium-Emulation-Pack
-# Add or edit apps in src/applications.json (or use just add-app)
-just test # verify configs resolve to real APKs
-just build # test, validate, normalize, and generate all output files
-```
+just add-app # interactive CLI to add a new app
+just test --verbose --apks # verify configs resolve to real APKs
+just build # test, validate, normalize, and generate all output files
+```
\ No newline at end of file
diff --git a/pages/header.md b/pages/header.md
index c320c82..787999f 100644
--- a/pages/header.md
+++ b/pages/header.md
@@ -1,34 +1,33 @@
+
+
# Obtainium Emulation Pack
-An [Obtainium](https://github.com/ImranR98/Obtainium) import file that adds popular Android
-emulation applications to Obtainium.
+A curated collection of Android emulators and gaming utilities for [Obtainium](https://github.com/ImranR98/Obtainium).
+
Import the pack and get automatic updates for every emulator on your device.
-The maintainer of Obtainium also hosts a collection of Crowdsourced app configurations.
-[apps.obtainium.imranr.dev](https://apps.obtainium.imranr.dev)
+[](https://github.com/RJNY/Obtainium-Emulation-Pack/releases/latest)
+[](https://github.com/RJNY/Obtainium-Emulation-Pack/actions/workflows/scheduled-test.yml)
-## Prerequisite
+
The Obtainium maintainer also hosts a broader collection of crowdsourced app configs at apps.obtainium.imranr.dev
-> [!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
+## Getting Started
-### Option 1. Import Method
+### 1. Install Obtainium
-> [!TIP]
-> This is recommended installation method for beginners and/or new devices
+Download the [latest release of Obtainium](https://github.com/ImranR98/Obtainium/releases/latest) and install it on your device. If you're unsure which APK to grab, use `app-release.apk`.
-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.
+### 2. Import the Pack
-### Option 2. Click-to-Install Method
+This is the easiest way to get started, especially on a new device.
-1. Visit this page on your android emulation device
-1. Click the "Add to Obtainium!" links of the emulators you wish to track
+1. On your device, go to the [latest release](https://github.com/RJNY/Obtainium-Emulation-Pack/releases/latest).
+2. Download the JSON for your device:
+ - **Standard** (`obtainium-emulation-pack-vX.X.X.json`) - most devices
+ - **Dual-Screen** (`obtainium-emulation-pack-dual-screen-vX.X.X.json`) - dual-screen devices (AYN Thor, Anbernic RG DS, etc.)
+3. In Obtainium, go to **Import/Export** > **Obtainium Import** and select the file.
+
+Obtainium will now track and update all included apps.
diff --git a/pages/table.md b/pages/table.md
index e20c29b..d81928a 100644
--- a/pages/table.md
+++ b/pages/table.md
@@ -1,32 +1,34 @@
-## Applications
+## What's in the Pack
+
+Don't want the whole pack? Browse the tables below on your device and tap the **Add to Obtainium!** links for just the apps you want.
### Emulator
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| aPS3e | Add to Obtainium! | ✅ | ✅ |
| ARMSX2 | Add to Obtainium! | ✅ | ✅ |
| Azahar | Add to Obtainium! | ✅ | ✅ |
-| Cemu | Add to Obtainium! | ✅ | ❌ |
-| Cemu (Dual-Screen) | Add to Obtainium! | ❌ | ✅ |
+| Cemu | Add to Obtainium! | ✅ | - |
+| Cemu (Dual-Screen) | Add to Obtainium! | - | ✅ |
| Citra MMJ | Add to Obtainium! | ✅ | ✅ |
| Dolphin Emulator | Add to Obtainium! | ✅ | ✅ |
-| Dolphin Emulator (Dev build) | Add to Obtainium! | ❌ | ❌ |
-| Dolphin-MMJR2-VBI | 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! | ❌ | ❌ |
+| Eden Nightly | Add to Obtainium! | - | - |
| Flycast | Add to Obtainium! | ✅ | ✅ |
| MelonDS | Add to Obtainium! | ✅ | ✅ |
| MelonDS Nightly | Add to Obtainium! | ✅ | ✅ |
| MelonDualDS | Add to Obtainium! | ✅ | ✅ |
-| NetherSX2-Classic | Add to Obtainium! | ❌ | ❌ |
+| NetherSX2-Classic | Add to Obtainium! | - | - |
| NetherSX2-Patch | Add to Obtainium! | ✅ | ✅ |
| Pico8 Android | Add to Obtainium! | ✅ | ✅ |
| Play! | Add to Obtainium! | ✅ | ✅ |
| PPSSPP | Add to Obtainium! | ✅ | ✅ |
| RetroArch (AArch64) | Add to Obtainium! | ✅ | ✅ |
-| RetroArch Nightly (AArch64) | Add to Obtainium! | ❌ | ❌ |
+| RetroArch Nightly (AArch64) | Add to Obtainium! | - | - |
| RPCSX | Add to Obtainium! | ✅ | ✅ |
| ScummVM | Add to Obtainium! | ✅ | ✅ |
| Vita3K | Add to Obtainium! | ✅ | ✅ |
@@ -34,8 +36,8 @@
### Frontend
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| Argosy | Add to Obtainium! | ✅ | ✅ |
| Cocoon FE | Add to Obtainium! | ✅ | ✅ |
| Daijishō | Add to Obtainium! | ✅ | ✅ |
@@ -44,10 +46,10 @@
### PC Emulation
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| GameHub Lite | Add to Obtainium! | ✅ | ✅ |
-| GameHub Lite (pre-release) | Add to Obtainium! | ❌ | ❌ |
+| GameHub Lite (pre-release) | Add to Obtainium! | - | - |
| GameNative | Add to Obtainium! | ✅ | ✅ |
| Winlator | Add to Obtainium! | ✅ | ✅ |
| Winlator CMod | Add to Obtainium! | ✅ | ✅ |
@@ -55,16 +57,16 @@
### Streaming
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| Artemis | Add to Obtainium! | ✅ | ✅ |
| Moonlight | Add to Obtainium! | ✅ | ✅ |
-| PXPlay | Add to Obtainium! | ❌ | ❌ |
+| PXPlay | Add to Obtainium! | - | - |
### Track Only
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| AdrenoToolsDrivers | Add to Obtainium! | ✅ | ✅ |
| ES-DE Custom Systems | Add to Obtainium! | ✅ | ✅ |
| Mr. Purple Turnip Drivers | Add to Obtainium! | ✅ | ✅ |
@@ -72,16 +74,16 @@
### Utilities
-| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |
-|------------------|------------------|---------------------------|----------------------|
+| App | Add to Obtainium | Standard | Dual-Screen |
+|-----|------------------|:--------:|:-----------:|
| 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! | ❌ | ✅ |
-| O2P Tweaks | Add to Obtainium! | ❌ | ❌ |
+| ES-DE Companion | Add to Obtainium! | - | ✅ |
+| Jarngreipr | Add to Obtainium! | - | ✅ |
+| Mjolnir | Add to Obtainium! | - | ✅ |
+| O2P Tweaks | Add to Obtainium! | - | - |
| OdinTools | Add to Obtainium! | ✅ | ✅ |
| PixelGuide | Add to Obtainium! | ✅ | ✅ |
| Syncthing-Fork | Add to Obtainium! | ✅ | ✅ |
diff --git a/scripts/generate-table.py b/scripts/generate-table.py
index 65e3622..c269cf4 100644
--- a/scripts/generate-table.py
+++ b/scripts/generate-table.py
@@ -15,15 +15,19 @@ def generate_category_tables(apps: list[dict[str, Any]]) -> str:
for category in categories:
categorized[category].append(app)
- markdown_sections = ["## Applications\n"]
+ markdown_sections = [
+ "## What's in the Pack\n",
+ "Don't want the whole pack? Browse the tables below on your device "
+ "and tap the **Add to Obtainium!** links for just the apps you want.\n",
+ ]
for category in sorted(categorized.keys()):
markdown_sections.append(f"### {category}\n")
markdown_sections.append(
- "| Application Name | Add to Obtainium | Included in export json? | Included in DS json? |"
+ "| App | Add to Obtainium | Standard | Dual-Screen |"
)
markdown_sections.append(
- "|------------------|------------------|---------------------------|----------------------|"
+ "|-----|------------------|:--------:|:-----------:|"
)
apps_in_category = sorted(
@@ -40,9 +44,9 @@ def generate_category_tables(apps: list[dict[str, Any]]) -> str:
)
obtainium_link = make_obtainium_link(app)
badge_md = f'Add to Obtainium!'
- include_standard = "✅" if should_include_app(app, "standard") else "❌"
+ include_standard = "✅" if should_include_app(app, "standard") else "-"
include_dual_screen = (
- "✅" if should_include_app(app, "dual-screen") else "❌"
+ "✅" if should_include_app(app, "dual-screen") else "-"
)
markdown_sections.append(
diff --git a/scripts/release.py b/scripts/release.py
index 1356659..0f8e23d 100644
--- a/scripts/release.py
+++ b/scripts/release.py
@@ -210,8 +210,8 @@ def make_app_table_row(app: dict[str, Any], change: str) -> str:
install = "-"
else:
install = f"[Add to Obtainium!][{ref_key}]"
- std = "✅" if should_include_app(app, "standard") else "❌"
- ds = "✅" if should_include_app(app, "dual-screen") else "❌"
+ std = "✅" if should_include_app(app, "standard") else "-"
+ ds = "✅" if should_include_app(app, "dual-screen") else "-"
return f"| {app_link} | {install} | {change} | {std} | {ds} |"
@@ -222,8 +222,8 @@ def make_app_reference_link(app: dict[str, Any]) -> str:
CHANGES_TABLE_HEADER = (
- "| Application | Add to Obtainium | Change | Standard | Dual-Screen |\n"
- "|-------------|------------------|--------|----------|-------------|"
+ "| App | Add to Obtainium | Change | Standard | Dual-Screen |\n"
+ "|-----|------------------|--------|:--------:|:-----------:|"
)