[2026-09-21] eagle: personal/how-to/old-ipad-ios935-ipa-sources.md personal/how-to/scripts/fetch-ios935-ipas.sh personal/tech/archive-org-collection-harvest.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-21 18:46:30 +06:00
1 parent cbc5019a10
commit 177da1e681
3 files changed
+305

No files matched your search

@@ -0,0 +1,151 @@
# Old iPad — iOS 9.3.5: IPA Sources & App Shortlist
**Date:** 2026-09-21
**Device target:** iPad 2 / iPad 3 / iPad mini 1 / iPhone 4S (iOS 9.3.5–9.3.6 max)
**Status:** research complete, sources verified, nothing downloaded yet
---
## 1. Where the IPAs actually are
| Source | Size | Notes |
|---|---|---|
| **archive.org → `iOSObscura`** | **17,652 IPA** | iPhoneOS Obscura Project. Real files, HTTP 206 works. **Primary source.** |
| archive.org → `legacyiosapparchive` | 680 IPA | Smaller, older-version-first naming |
| archive.org → `ios-ipa-collection` | ~10k | DISCONTINUED upstream, but files still served |
| mtmdev.org | Momentum Store | Forum-gated. Installer webapp only works for iOS 4/5/6 — **not useful for 9.3.5** |
| ipatool (github qnblackcat gist) | — | Needs an Apple ID that *owns* the app. Gets last-compatible version. Cleanest legal path. |
### Warning: network pitfall on this Mac
`archive.org` **does not resolve** on the home network — the router DNS (192.168.1.1) blocks it.
`dig @1.1.1.1` returns an IP, but the system resolver fails → `curl: Could not resolve host`.
Workaround used successfully:
```bash
# metadata list
curl -s --resolve archive.org:443:207.241.224.2 "https://archive.org/metadata/iOSObscura"
# downloads 302 to dn####.ca.archive.org - that host must ALSO be pinned
DN=$(curl -sI --resolve archive.org:443:207.241.224.2 "$URL" | grep -i ^location | sed 's/^[Ll]ocation: //')
HOST=$(echo "$DN" | sed -E 's#https://([^/]+)/.*#\1#')
IP=$(dig +short "$HOST" @1.1.1.1 | tail -1)
curl -L --resolve archive.org:443:207.241.224.2 --resolve "$HOST:443:$IP" -O "$URL"
```
Verified: DM1 IPA returns `HTTP 206`, `file` → `iOS App Zip archive data`. **Downloads are live.**
**Ready-made downloader:** [`scripts/fetch-ios935-ipas.sh`](scripts/fetch-ios935-ipas.sh)
— curated 25-file shortlist (all music picks + utility), handles the double `--resolve`,
validates each file is a real zip. Run: `bash scripts/fetch-ios935-ipas.sh ./ipas935`
Download URL form (note the `%20` for spaces — URLs contain literal spaces otherwise):
```
https://archive.org/download/iOSObscura/<iOS N>/<bundle-id>/<App>-(<bundle-id>)-<ver>-(iOS_x.y)-<hash>.ipa
```
### Warning: install requirement
These IPAs are unsigned/cracked. Installing on a non-jailbroken iOS 9.3.5 device needs
**AppSync Unified** (Cydia) — i.e. the iPad must be **jailbroken**. iOS 9.3.5 jailbreak: Phoenix
(32-bit). Without it, only the App Store "download last compatible version" route works.
---
## 2. MIDI / music apps present in iOSObscura
All paths below are relative to `https://archive.org/download/iOSObscura/`.
### Synthesizers
| App | iOS build in archive |
|---|---|
| **Korg iMS-20** | `iOS 4/jp.co.korg.iMS-20/…-1.5.2-(iOS_4.2)…` ← best version |
| **Korg iELECTRIBE** | `iOS 4/jp.co.korg.iELECTRIBE/…-1.5.2-(iOS_4.2)…` |
| **Korg iPolysix** | `iOS 5/jp.co.korg.iPolysix/…-146-(iOS_5.1)…` |
| **Korg iKaossilator** | `iOS 5/jp.co.korg.ikaossilator/…-2.3.0-(iOS_5.1)…` |
| **Moog Animoog** | `iOS 5/com.moogmusic.animoog/…-2.1.1-(iOS_5.0)…` |
| **Moog Filtatron** | `iOS 5/com.moogmusic.filtatron/…-1.2.0-(iOS_5.0)…` |
| **Arturia iMini** | `iOS 5/com.arturia.imini/…-1.1-(iOS_5.1)…` |
| **Sunrizer** | `iOS 5/com.giku.Horizon/…-3.0-(iOS_5.0)…` |
| **Yamaha TNR-i (Tenori-on)** | `iOS 4/jp.co.yamaha.emi.tenopad/…-1.2.1-(iOS_4.3)…` |
| **PulseCode Modular** | `iOS 6/com.pulsecodeinc.ModularSynthesizer/…-1.04-(iOS_6.0)…` |
| **NLog PRO** | `iOS 4/com.temporubato.NLogPro/…-3.4-(iOS_4.0)…` |
### DAWs / sequencers / drum machines
| App | Build |
|---|---|
| **GarageBand** | `iOS 8/com.apple.mobilegarageband/…-3417.29-(iOS_8.0)…` ← best (Apple, iOS 8) |
| **Steinberg Cubasis** | `iOS 8/com.steinberg.cubasis/…-2.2.0.8-(iOS_8.3)…` ← best |
| **Intua BeatMaker 2** | `iOS 5/net.intua.beatmaker2/…-2.5.4-(iOS_5.0)…` |
| **Fingerlab DM1 (drum machine)** | `iOS 8/net.fingerlab.beat/…-01-(iOS_8.0)…` |
| **Fingerlab Musyc** | `iOS 6/net.fingerlab.musyc/…-017-(iOS_6.0)…` |
| **Propellerhead Figure** | `iOS 7/se.propellerheads.figure/…-341-(iOS_7.0)…` |
| **Blip NanoStudio** | `iOS 5/co.uk.blipinteractive.NanoStudio/…-1.43-(iOS_5.0)…` |
| **Seline Ultimate** | `iOS 5/com.amidio.seline.hd/…-2.2-(iOS_5.0)…` |
| **Beatwave** | `iOS 7/com.collect3.beatwave/…-2.6.1.2-(iOS_7.0)…` |
| **Patatap** | `iOS 7/com.patatap.iphone/…-1.1-(iOS_7.1)…` |
| **iZotope iDrum** | `iPhoneOS 2/com.izotope.iphone.idrum.*` |
### Audio routing / live / guitar
| App | Build |
|---|---|
| **Audiobus** (inter-app audio routing) | `iOS 5/us.audiob.Audiobus/…-1.0.2.5-(iOS_5.0)…` |
| **Traktor DJ** | `iOS 6/com.native-instruments.traktordj/…-1.3.3.383-(iOS_6.1)…` |
| **AmpliTube** (many variants) | `iOS 7/com.ikmultimediaus.amplitubefull/…-35-(iOS_7.1)…` |
| **ThumbJam** | `iOS 5/com.sonosaurus.thumbjam/…-2.4.2-(iOS_5.0)…` |
| **iGrand Piano** | `iOS 5/com.ikmultimediaus.igrandpadfull/…-1.0.1-(iOS_5.1)…` |
| **Galileo** (organ) | `iOS 5/com.bodunov.galileo/…-2.5.2-(iOS_5.0)…` |
### Best picks if you only take 5
1. **Korg iMS-20** — the killer app for this era, full MS-20 patchable semi-modular
2. **Moog Animoog** — best-sounding iPad synth of its generation, expressive touch
3. **GarageBand (iOS 8 build)** — DAW, still Apple, most stable
4. **Audiobus** — glue that lets the above talk to each other
5. **Fingerlab DM1** — drum machine, instantly fun
---
## 3. General-purpose top picks for an old iPad
The archive also has the utility media stack. Relative paths under `iOSObscura/`:
| Need | App | Build |
|---|---|---|
| Video player | **VLC / VLC Streamer / ProPlayer / AVPlayerHD** | `VLC-v2.6.6--iOS6.1…`, `iOS 4/ProPlayer/`, `iOS 4/AVPlayerHD…` |
| Local media + file manager | **Documents** | `iOS 4/com.EZYPages.USBFlashDisk/Documents-…-4.0-(iOS_4.3)…` |
| Browser | **Puffin** (cloud-rendered, still fast on old HW), Dolphin, Mercury | `Puffin-v4.7.3--iOS6.0…`, `iOS 5/com.cloudmosa.puffin/…-10265` |
| Remote desktop | **VNC Viewer, TeamViewer, RDP** | `VNC Viewer-v2.3.5--iOS5.1.1…`, `TeamViewer-v10.0.37492…` |
| Kodi control | **Kodi Remote** | `Kodi Remote-v1.5.5--iOS5.1.1…` |
| Comics / PDF | **Comic Zeal, Comic Touch, GoodPlayer** | `iOS 4/Ff2lqVpcZ2.ComicZeal4/…` |
### What still works / doesn't (community consensus, 2023–2025)
- Works: Puffin, Alook, Snowbunny (browsers, shared WebKit), Byline (RSS), Readder (Reddit),
iBooks/PDFs, VLC, Amazon Prime Video, Amazon Music, SoundCloud, YouTube *via Safari*, Flipboard
- Dead: Netflix app, YouTube app, most streaming apps, anything updated past 2019
- Trick: Google `site:apps.apple.com ios 9.0 <keyword>` to find still-compatible App Store apps
- App Store route: if you ever *purchased* the app, iOS offers "download last compatible version"
automatically
---
## 4. Open questions / next steps
- [ ] Is the iPad jailbroken? (determines whether IPA route or App Store route)
- [ ] Which model exactly (iPad 2 vs 3 vs mini 1 — affects RAM, iMS-20 stability)
- [x] Bulk-download script for a chosen shortlist → `scripts/fetch-ios935-ipas.sh` (written, not yet run)
- [ ] Check `ios-ipa-collection` + `legacyiosapparchive` for anything missing above
---
## 5. Session log
**2026-09-21 — initial research pass.** Enumerated `iOSObscura` via
`curl --resolve archive.org:443:207.241.224.2 https://archive.org/metadata/iOSObscura | jq -r '.files[].name'`.
Two keyword sweeps over the 18,332 unique IPA filenames (music/MIDI terms, then
utility/media/browser/remote terms) produced the shortlists in sections 2 and 3.
Verified a live download end-to-end on `DM1` (HTTP 206 + valid zip header).
Nothing downloaded to disk; no config touched.
**Discovery order that worked** (reuse for the other collections):
1. `curl --resolve` the `/metadata/<identifier>` endpoint → JSON `files[].name`
2. `jq -r '.files[].name'` → one filename per line
3. `grep -iE '<terms>'` the filename list — filenames carry bundle-id + iOS version,
so version targeting needs no extra API calls
4. URL = `https://archive.org/download/<identifier>/<path>` with spaces → `%20`
5. `curl -I` first to catch the redirect host, then pin it
@@ -0,0 +1,84 @@
#!/bin/bash
# Download a curated shortlist of iOS 9.3.5-compatible IPAs from archive.org
# (iOSObscura collection) on a network where archive.org DNS is blocked.
#
# Usage: bash fetch-ios935-ipas.sh [outdir]
# Default outdir: ./ipas935
#
# WHY --resolve: the home router DNS (192.168.1.1) does not resolve archive.org.
# archive.org 302-redirects downloads to dn####.ca.archive.org, which ALSO must
# be pinned, otherwise curl resolves it and fails.
#
# Requires: curl, dig. Run from anywhere.
set -u
OUT="${1:-./ipas935}"
mkdir -p "$OUT"
ORIGIN_IP=207.241.224.2 # archive.org (nlb). Re-check with: dig +short archive.org @1.1.1.1
BASE="https://archive.org/download/iOSObscura"
# Relative archive paths. Spaces MUST be %20-encoded in the URL.
PATHS=(
# --- music / MIDI ---
"iOS 4/jp.co.korg.iMS-20/iMS-20-(jp.co.korg.iMS-20)-1.5.2-(iOS_4.2)-b907eac71f276430c76260efb4bc88a2.ipa"
"iOS 4/jp.co.korg.iELECTRIBE/iELECTRIBE-(jp.co.korg.iELECTRIBE)-1.5.2-(iOS_4.2)-9402340e34240bb1ec56487a6e8c2006.ipa"
"iOS 5/jp.co.korg.iPolysix/iPolysix-(jp.co.korg.iPolysix)-146-(iOS_5.1)-cf0662fa0ecfac24cd633eeec2f758d7.ipa"
"iOS 5/jp.co.korg.ikaossilator/iKaossilator-(jp.co.korg.ikaossilator)-2.3.0-(iOS_5.1)-7f78df777b8eea3ac3a7421383b1107e.ipa"
"iOS 5/com.moogmusic.animoog/Animoog-(com.moogmusic.animoog)-2.1.1-(iOS_5.0)-005cf967f702b9cd728a8e90869bae2d.ipa"
"iOS 5/com.moogmusic.filtatron/Filtatron-(com.moogmusic.filtatron)-1.2.0-(iOS_5.0)-41c0b0b57ae11a7127098218b2fa8b35.ipa"
"iOS 5/com.arturia.imini/iMini-(com.arturia.imini)-1.1-(iOS_5.1)-3a7d6691ce8d5aeff9247471a7e4c065.ipa"
"iOS 5/com.giku.Horizon/Sunrizer-(com.giku.Horizon)-3.0-(iOS_5.0)-32152900a4482119c57590557514dd6a.ipa"
"iOS 4/jp.co.yamaha.emi.tenopad/TNR-i-(jp.co.yamaha.emi.tenopad)-1.2.1-(iOS_4.3)-2fcfb9205482329a25b73d3df866b7c0.ipa"
"iOS 6/com.pulsecodeinc.ModularSynthesizer/modular-(com.pulsecodeinc.ModularSynthesizer)-1.04-(iOS_6.0)-1a62151edacb566c74bc4afd70200eef.ipa"
"iOS 8/com.apple.mobilegarageband/GarageBand-(com.apple.mobilegarageband)-3417.29-(iOS_8.0)-b3b43b5ab1b763afdbc7c3b7293fc19a.ipa"
"iOS 8/com.steinberg.cubasis/Cubasis-(com.steinberg.cubasis)-2.2.0.8-(iOS_8.3)-e133725270833b6bca3fb97db0eb2f61.ipa"
"iOS 5/net.intua.beatmaker2/BeatMaker 2-(net.intua.beatmaker2)-2.5.4-(iOS_5.0)-78f41efe78dae096ccf1b472fe2f4bd8.ipa"
"iOS 8/net.fingerlab.beat/DM1-(net.fingerlab.beat)-01-(iOS_8.0)-351e437413b9f3765d0b6d967750977b.ipa"
"iOS 6/net.fingerlab.musyc/Musyc-(net.fingerlab.musyc)-017-(iOS_6.0)-1e5da2d554b6803e6dde327f6ac79304.ipa"
"iOS 7/se.propellerheads.figure/Figure-(se.propellerheads.figure)-341-(iOS_7.0)-d2ba4bce45e5ca0d23a0863c98d90673.ipa"
"iOS 5/co.uk.blipinteractive.NanoStudio/NanoStudio-(co.uk.blipinteractive.NanoStudio)-1.43-(iOS_5.0)-7a3bdf08297a38060d045afdd7751de0.ipa"
"iOS 5/us.audiob.Audiobus/Audiobus-(us.audiob.Audiobus)-1.0.2.5-(iOS_5.0)-39dc47e3dc76359207763652f99a065e.ipa"
"iOS 6/com.native-instruments.traktordj/Traktor DJ-(com.native-instruments.traktordj)-1.3.3.383-(iOS_6.1)-57b48c1607bc00f53cdf5832e492c071.ipa"
"iOS 5/com.sonosaurus.thumbjam/ThumbJam-(com.sonosaurus.thumbjam)-2.4.2-(iOS_5.0)-0479efba0d47b4672117f5a2ccfeed6e.ipa"
"iOS 5/com.ikmultimediaus.igrandpadfull/iGrand Piano-(com.ikmultimediaus.igrandpadfull)-1.0.1-(iOS_5.1)-5b480775a406e8bd16e75c29daf098a9.ipa"
"iOS 7/com.collect3.beatwave/Beatwave-(com.collect3.beatwave)-2.6.1.2-(iOS_7.0)-f720430fc4c0d1a0568c4b9b2a047bff.ipa"
# --- general utility (from top-level Clutch-renamed files) ---
"VLC-v2.6.6--iOS6.1-(Clutch-1.4.6).ipa"
"Puffin-v4.7.3--iOS6.0-(Clutch-1.4.6).ipa"
"Kodi Remote-v1.5.5--iOS5.1.1-(Clutch-1.4.6).ipa"
"VNC Viewer-v2.3.5--iOS5.1.1-(Clutch-1.4.6).ipa"
"TeamViewer-v10.0.37492--iOS5.0-(Clutch-1.4.6).ipa"
)
ok=0; fail=0
for rel in "${PATHS[@]}"; do
enc=$(printf '%s' "$rel" | sed 's/ /%20/g')
url="$BASE/$enc"
fname=$(basename "$rel")
printf '>> %s\n' "$fname"
# resolve the redirect host once per file
DN=$(curl -sI --resolve archive.org:443:"$ORIGIN_IP" --max-time 30 "$url" \
| grep -i '^location' | tr -d '\r' | sed 's/^[Ll]ocation: //')
if [ -z "$DN" ]; then
printf ' !! no redirect / not found\n'; fail=$((fail+1)); continue
fi
HOST=$(printf '%s' "$DN" | sed -E 's#https://([^/]+)/.*#\1#')
IP=$(dig +short +time=5 +tries=2 "$HOST" @1.1.1.1 | tail -1)
if [ -z "$IP" ]; then
printf ' !! no DNS for %s\n' "$HOST"; fail=$((fail+1)); continue
fi
curl -sL --resolve archive.org:443:"$ORIGIN_IP" --resolve "$HOST:443:$IP" \
--max-time 300 -o "$OUT/$fname" "$url"
if [ -s "$OUT/$fname" ] && file "$OUT/$fname" | grep -qi 'zip archive'; then
printf ' ok %s\n' "$(du -h "$OUT/$fname" | cut -f1)"; ok=$((ok+1))
else
printf ' !! bad download\n'; fail=$((fail+1))
fi
done
printf '\n=== done: %d ok, %d failed -> %s ===\n' "$ok" "$fail" "$OUT"
printf 'Install requires jailbreak + AppSync Unified (Cydia).\n'
@@ -0,0 +1,70 @@
# archive-org-collection-harvest
**Type:** Hermes skill (`~/.hermes/hermes-whale/skills/research/archive-org-collection-harvest/SKILL.md`)
**Created:** 2026-09-21
**Origin:** Old iPad iOS 9.3.5 IPA hunt — archive.org was unreachable, this pattern was
worked out to get around it.
---
## What it does
Enumerate and bulk-download files from any archive.org collection when
**archive.org does not resolve** on the current network (home router blocks the DNS name).
Covers the metadata API, the "filenames are the index" filtering technique, and the
**double `--resolve`** needed because downloads 302 to a second host.
## The two things that make it non-obvious
### 1. Filenames carry the metadata
Archive.org item filenames often embed app ID + bundle ID + version + min OS:
```
iOS 4/jp.co.korg.iMS-20/iMS-20-(jp.co.korg.iMS-20)-1.5.2-(iOS_4.2)-b907eac….ipa
```
So one `curl` of `/metadata/<id>` + `jq -r '.files[].name'` + `grep -iE '<terms>'` gives you
full search, version targeting, and curation. No per-file API calls, no page scraping.
### 2. Downloads need the redirect host pinned separately
`archive.org/download/...` returns **302** to `https://dn####.ca.archive.org/...`.
Pinning only `archive.org` yields `http=302 size=0` — looks like a broken file, is actually
an unpinned redirect. You must read the `Location` header, resolve that host (`dig @1.1.1.1`),
and add a second `--resolve`:
```bash
ORIGIN_IP=$(dig +short archive.org @1.1.1.1 | tail -1)
DN=$(curl -sI --resolve archive.org:443:"$ORIGIN_IP" "$url" \
| grep -i '^location' | tr -d '\r' | sed 's/^[Ll]ocation: //')
HOST=$(printf '%s' "$DN" | sed -E 's#https://([^/]+)/.*#\1#')
IP=$(dig +short "$HOST" @1.1.1.1 | tail -1)
curl -sL --resolve archive.org:443:"$ORIGIN_IP" --resolve "$HOST:443:$IP" -o out.bin "$url"
```
## Other pitfalls recorded
- Spaces in filenames are **literal** → must `sed 's/ /%20/g'`. `+` is not accepted.
- `web_extract` on `archive.org/details/...` returns
`Blocked: URL targets a private or internal network address` — the extractor's own guard.
`web_search` on the same topic can also return empty. Fall back to `curl --resolve` fast
instead of retrying the web tools.
- Big metadata items (17k files) truncate in tool output and break `json.loads`.
**Always** `curl -o file.json` then `jq`, never parse the response inline.
- `HOST`/`IP` change per download host — re-derive, never hardcode `dn####`.
- Cheap probe before a big fetch: `curl -r 0-4095 -w 'http=%{http_code} size=%{size_download}'`
→ expect `HTTP 206` + non-zero bytes.
- Verify with `file` — an empty file or `HTML document` means the resolve failed.
- Write harvests as a **script file** run with `bash file.sh`; inline multi-line
`curl | jq` chains are fragile and each inline call may need approval.
## Verification checklist
- [ ] Control site returns 200 (network up, only archive.org DNS blocked)
- [ ] `/metadata/<id>` returns JSON with plausible `.files` count
- [ ] Filename list non-empty, filtered hits match expectations
- [ ] `-r 0-4095` probe → HTTP 206, non-zero size
- [ ] `file` on probe reports expected archive/binary type
## Applied in
- `personal/how-to/old-ipad-ios935-ipa-sources.md` — iOSObscura collection (17,652 IPAs),
curated iOS 9.3.5 music/MIDI + utility shortlist
- `personal/how-to/scripts/fetch-ios935-ipas.sh` — working downloader built on this pattern