Tweak to inject Unbound into Discord and perform various utility tasks.
Builds can be found in the Releases tab.
- Either add the apt repo to your package manager: https://repo.unbound.rip
- Or install Unbound by downloading the appropriate Debian package (or by building your own, see Building) and adding it to your package manager.
Warning
Trying to use non-ellekit tweak runtimes will likely break functionality. Ideally always use the pre-patched ipa when sideloading.
- Either add the altsource to your on-device sideloading tool: https://repo.unbound.rip/app-repo.json
- Or download and install Unbound.ipa using your preferred sideloading method.
Note
Unless you plan on modifying source code you should fork this repository and use the provided workflow.
Instructions
These steps assume you use macOS.
- Install Xcode from the App Store. If you've previously installed the
Command Line Utilitiespackage, you will need to runsudo xcode-select -switch /Applications/Xcode.app/Contents/Developerto make sure you're using the Xcode tools instead.
If you want to revert the
xcode-selectchange, runsudo xcode-select -switch /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
-
Install Xcode command-line tools, GNU make, and ldid. You can do this by running
brew install make ldidin your terminal. If you do not have brew installed, follow the instructions at the Homebrew installation page. The build tool provisions pinned patcher, cyan, and simulator dependencies into.tools-cache. -
Setup your gnu make path:
export PATH="$(brew --prefix make)/libexec/gnubin:$PATH"- Setup theos by running the script provided by theos.
bash -c "$(curl -fsSL https://raw.githubusercontent.com/theos/theos/master/bin/install-theos)"If you've already installed theos, you can run $THEOS/bin/update-theos to make sure it's up to date.
-
Clone this repository via
git clone git@github.com:unbound-app/loader-ios.gitandcdinto it. -
To build the complete package, run:
go run ./tools build allPass --ipa /path/to/Discord.ipa when the source IPA is not the only .ipa in the repository root. Use --extensions exclude to omit extensions or --simulator to create the simulator archive. go run ./tools doctor checks host dependencies. For a tweak-only build, make package remains available.
Repository-dispatched builds use the DKRYPT_API_KEY Actions secret to download authenticated dkrypt artifacts. The remote-deploy workflow defaults to https://ipa.dylib.dev; set the repository variable DKRYPT_BASE_URL when using another dkrypt deployment. Manual and external IPA source downloads do not send that secret.
The resulting .deb file will be in the packages folder.
When working on the JavaScript client you can have the app reload automatically whenever you rebuild the bundle, instead of relaunching by hand.
- Run the client's dev server (
bun scripts/devin the client repo). It serves the bundle and a Server-Sent Events stream at/__hot. - In Unbound's settings, set:
loader.update.urlto your dev server's bundle URL, e.g.http://<your-LAN-ip>:3000/unbound.bundleloader.update.hmrtotrue
- Launch Discord. The loader connects to
<origin>/__hot; when you edit a file and the dev server rebuilds, the app re-fetches the bundle and reloads automatically.
loader.update.hmr is off by default, so this never runs for normal users. The HMR endpoint is
derived from loader.update.url's origin — no separate setting needed.



