Family Guardian publishes an unsigned iOS IPA with every release. You do not need a Mac. You do not need an Apple Developer Program account ($99/year). All you need is a Windows PC (or Mac), an iPhone with a USB cable, and a free Apple ID.
How Apple signing works: iOS refuses to install any app that is not signed. The IPA in releases is intentionally unsigned, because each user signs it themselves at install time with their own Apple ID. Sideloadly and AltStore do this for you in one click. The signature is then valid for 7 days on a free Apple ID, or 1 year on a paid Apple Developer Program account. When it expires, plug your phone back into your computer and click "refresh" in Sideloadly/AltStore - your app data is preserved.
Under Assets, download FamilyGuardian-<version>-unsigned.ipa.
Save it somewhere you can find again (Desktop is fine).
Alternative if you'd rather build it yourself in CI: open the repo's Actions tab, run the iOS Unsigned IPA workflow, and download the FamilyGuardian-unsigned-ipa artifact instead. This is identical to the IPA on Releases - just a fresher build off whatever commit you trigger.
Step 2 - install Sideloadly (Windows) or AltStore (macOS)
Windows:Sideloadly - download and install. Also install iTunes from Apple if you don't have it (Sideloadly needs Apple's device driver).
macOS:AltStore works without iTunes. Sideloadly also has a Mac build if you prefer.
Step 3 - sign and install
Plug your iPhone into your computer with a USB cable. Tap Trust on the iPhone when asked.
Open Sideloadly (or AltStore).
Drag the IPA file into the app.
Enter your Apple ID and password. Sideloadly uses these only to sign the app locally - they are not sent anywhere else.
Click Start. Sideloadly will sign the IPA and push it to your iPhone (~30 seconds).
On the iPhone, open Settings -> General -> VPN & Device Management, tap your Apple ID profile, and tap Trust. (iOS only asks this the first time.)
Open Family Guardian from the home screen.
Step 4 - first-run configuration
Run the Family Guardian server on your LAN: docker compose up -d.
Open the iOS app. Enter the server URL: http://YOUR-LAN-IP:8080 (e.g. http://10.0.0.110:8080).
Sign in with your bootstrap admin credentials, or join with an invite code from the admin.
Grant location permissions. Choose Always if you want background location reporting.
Grant notification permissions so SOS / geofence alerts can wake the device.
Verify the iPhone marker appears in the web dashboard and any Android apps within ~30 seconds.
Refreshing the signature
Plug the iPhone back into your computer.
Open Sideloadly (or AltStore).
Click Refresh. The app is re-signed with another 7 days, your data is preserved.
If you forget and the signature expires, the app icon stays on your home screen but iOS refuses to open it. Just re-sign with the same IPA - no need to re-download.
Known limits
No APNs remote push in v1. The app uses local notifications for WebSocket events while running.
Background GPS depends on iOS permission and power management. Keep Background App Refresh on for Family Guardian.
Free Apple IDs are capped at 3 sideloaded apps and 7-day signing. Paid developer accounts get 1 year and no app limit.
If you want to skip the 7-day refresh entirely, see building from source with a paid developer account.