Building Unbound
Build Unbound's own bundle and load it on your phone.
Build Unbound itself from source and point the loader at your build instead of https://builds.unbound.rip/. To build an addon, see Your First Plugin.
Quick Start
Install Dependencies
From the repository root:
bun installStart the Dev Server
It rebuilds on every change and serves the bundle over HTTP.
bun run --filter @unbound-app/client devIt prints the address for your phone:
Devices on the LAN should connect to: ....Point the Loader
Set
loader.update.urlin the phone'ssettings.jsonto that address. See Settings Reference. Bundles from your local network skip the signature check.
To build once without watching:
bun run --filter @unbound-app/client build
bun run --filter @unbound-app/client serveJailbroken iPhone over SSH
The scripts in skills/ubd-vphone/scripts/ run the test loop on a jailbroken iPhone or iOS VM. With VPHONE_SSH set, they reach it over SSH.
Set Up SSH
The device needs an SSH server plus
sudo,base64,psanduiopenfrom a rootless jailbreak's bootstrap. Use key login; the scripts never answer a password prompt.ssh-copy-id [email protected] ssh -o BatchMode=yes [email protected] trueInstall the loader tweak's debug build. In Settings, Display & Brightness, set Auto-Lock to Never: the debugger connects only while Discord is open, and SSH cannot unlock the screen.
Configure .env
At the repository root:
.env VPHONE_SSH=[email protected] DEV_HOST=192.168.1.20Check:
skills/ubd-vphone/scripts/vphone pidprints Discord's process id, ornot running.Start the Servers
up.shstarts the dev server and the debugger bridge in tmux sessions.skills/ubd-vphone/scripts/up.shProvision Discord
Copies the loader's resources into Discord, points the loader and debugger at your computer, and relaunches. Rerun after every Discord reinstall.
skills/ubd-vphone/scripts/provisionRun Your Build
claim.shserves the current checkout and relaunches Discord until it runs that build.release.shhands the device back.skills/ubd-vphone/scripts/claim.sh
Variables
| Variable | Default | Meaning |
|---|---|---|
VPHONE_SSH | Unset | SSH host: a ~/.ssh/config alias, or user@address |
VPHONE_SSH_PORT | SSH's own | SSH port, when not in ~/.ssh/config |
VPHONE_SUDO_PASSWORD | alpine | The sudo password. Root reads Discord's containers and crash reports |
DEV_HOST | Your LAN address | The address the device reaches your computer at |
Scripts
| Script | What it does |
|---|---|
relaunch | Restarts Discord and waits for Unbound. If Discord dies on start, prints the crash and retries |
crashes | Explains the newest crash: what killed it, suspect libraries, and Unbound's log for that run |
unbound-log | Prints errors and warnings from Unbound's log for the current run |
doctor.sh --fix | Checks the servers, bridge and loader bundle address, and repairs failures |