a universal IPA repo format that automatically converts into nearly every major format! it converts into formats for the following apps:
- AltStore (incl. SideStore, TrollApps, altsource-viewer, and derivatives)
- ESign (can usually be used in most places)
- Feather
- GBox
- Scarlet
most (if not all) keys are technically optional. here's an example repo with every possible key:
{
"name": "hello!",
"identifier": "fyi.zxcvbn.repo.test",
"iconURL": "https://example.com/path/to/some/icon.png",
"caption": "a *short* description of your repo!",
"description": "this can be a longer description and include stuff like your links or something, idk",
"apps": [
{
"name": "app name",
"developerName": "zx",
"bundleID": "fyi.zxcvbn.app",
"caption": "just like the repo's caption",
"description": "just like the repo's description",
"downloadURL": "https://example.com/path/to/some/app.ipa",
"iconURL": "https://example.com/hopefully/path/to/itunes/icon.png",
"version": "1.2",
"date": "2024-12-18",
"size": 1073741824
}
],
"permissions": {
"fyi.zxcvbn.app": {
"entitlements": [
"aps-environment",
"com.apple.developer.associated-domains",
"keychain-access-groups",
"com.apple.security.application-groups"
],
"privacy": {
"NSBluetoothAlwaysUsageDescription": "example",
"NSFaceIDUsageDescription": "for face id"
}
}
}
}
you can see the output for this example in the examples/
directory.
identifier
is usually a reverse id. this can really be anything, but i like the reverse domains.
caption
translates to the subtitle
key in the AltStore and Feather outputs. it's the tiny text shown under the repo name.
description
is the big text describing your repo. this is only shown in some apps so feel free to exclude it.
permissions
translates to the appPermissions
key in the AltStore format. this is required according to my memory and AltStore docs. if you're going to upload multiple versions of an app with the same bundle id, chances are their permissions are the same too, which is why permissions
is a map of bundle ids to permissions. by the way, this wont be shown in sidestore, due to a different format. rip (i dont feel like implementing that)
developerName
is only shown in some apps. exclude it if you want.
bundleID
is the bundle identifier of the ipa. you want this to be accurate, it'll be used to make the AltStore-formatted repo accurate.
caption
and description
basically have the same purpose as their root counterparts.
date
is the date which this ipa was uploaded. this key isnt required, but can be helpful, especially in some apps like gbox. the most common date format is 2024-12-18
, however this doesn't work in gbox. gbox uses the format 2024-12-18T00:00:00+0800
. you can pick either.
you can either download the binary from the latest release or build this yourself with the latest version of Go:
$ cd cmd/urf
$ go build -ldflags="-w -s"
$ urf -h
Usage of urf:
-input string
the universal-format json file to read from (default "universal.json")
-output string
the directory to write the output repos to (default "formatted")
see the go reference at the top of the readme. just import repos
, construct a Universal
struct, then pass it to any of the ConvertTo functions. by the way, this tool is under the Unlicense, feel free to use it anywhere! credit isn't necessary per the license, but i would appreciate it !