Noureddine RAMDI / SignTools: self-hosted iOS sideloading with a split service-builder architecture

Created Tue, 05 May 2026 13:37:39 +0000 Modified Sat, 23 May 2026 20:41:27 +0000

SignTools/SignTools

iOS sideloading has always been a bit of a headache. The process requires code signing with Apple’s official tooling, which historically has meant a macOS environment and a clunky developer workflow. SignTools takes a clever approach to this problem by splitting the platform into two distinct parts: a portable web service written in Go, and a macOS-based signing builder. This separation allows you to run a minimal, mobile-friendly interface anywhere, while offloading the actual signing to a macOS machine where Apple’s tools are natively available.

what SignTools is and how it works

SignTools is an open-source, self-hosted platform for sideloading iOS apps. Its main goal is to simplify the signing and distribution workflow by dividing responsibilities between a web service and a builder component.

The web service is implemented in Go, designed to be lightweight and portable. It provides a minimalistic, mobile-friendly web interface that lets users upload app binaries, trigger signing, and distribute the signed apps over-the-air (OTA). Because it’s a Go binary, you can deploy the service on various platforms without worrying about Apple tooling compatibility.

The signing builder runs exclusively on macOS. This component interfaces with Apple’s official signing tools, ensuring that every app is signed correctly and reliably. It supports injecting tweaks and configuring entitlements on the fly, which adds flexibility for developers who want to customize their apps during sideloading.

The architecture also supports multiple signing workflows: you can use provisioning profiles or authenticate with developer accounts. This flexibility accommodates different user preferences and scenarios, whether you have a paid developer account or rely on free provisioning.

Overall, the architecture looks like this:

  • Web service: Go-based, platform-agnostic, handles user interaction, app uploads, and signing requests.
  • Signing builder: macOS-only, communicates with the web service, performs signing using Apple’s tooling.

This split means that after initial setup, you don’t need a Mac for every signing operation. The web interface can be accessed from any device, and signed apps can be installed OTA, which is a big convenience boost.

what makes SignTools technically interesting

The standout technical feature is the service-builder split architecture. Most iOS sideloading tools either require running everything on macOS or rely on fragile, unofficial signing methods. SignTools sidesteps these limitations by isolating the macOS dependency to the signing builder only.

This design choice has several implications:

  • Reliability: By using Apple’s official signing tools on macOS, the builder ensures high compatibility and reduces the risk of signature errors.
  • Flexibility: The web service can run anywhere, including headless servers or containers, without Apple’s dependencies.
  • User experience: A mobile-friendly web UI means you can manage signing and installs from any device, not just a Mac.

Under the hood, the codebase is mostly Go for the service and presumably some macOS-native code or scripts for the builder. The Go service is minimal but functional, focusing on the API and web UI. The signing builder is where the complexity lies, handling entitlements injection and tweak support.

There are tradeoffs, of course. The macOS requirement for signing is non-negotiable due to Apple’s closed ecosystem; you cannot fully escape that. Also, the split architecture adds some operational complexity — you need to maintain and connect two components reliably.

The code quality, based on the repo and documentation, appears solid and pragmatic. The service sticks to minimal dependencies, leveraging Go’s strengths in static compilation and concurrency. The builder side is less visible but seems to handle edge cases related to Apple tooling gracefully.

Here’s a minimal example snippet of how the service might expose signing endpoints (conceptual):

http.HandleFunc("/sign", func(w http.ResponseWriter, r *http.Request) {
    // Receive app upload
    // Forward signing request to builder
    // Return signed app URL
})

This simplicity on the service side contrasts with the complexity hidden in the builder, which is the right tradeoff for maintainability.

explore the project

The GitHub repo provides comprehensive documentation on setting up both the web service and the macOS builder. Since there is no quickstart command list extracted here, the best way to get started is by cloning the repo and reading the README.

The README breaks down installation steps, configuration options, and usage instructions. Key files to look at include the service directory for the Go web server and the builder directory containing macOS signing logic.

The web UI is minimalistic but functional, designed to work smoothly on mobile devices. This aligns with the use case of managing sideloaded apps on iPhones or iPads without switching to a Mac.

The project also documents how to configure entitlements and tweak injections, which is useful if you want to customize app behavior during signing.

verdict

SignTools targets iOS developers and enthusiasts who want a reliable, self-hosted sideloading platform without being shackled to a Mac for every signing operation. Its split architecture is a practical solution to Apple’s restrictions, balancing reliability with flexibility.

The main limitation is the unavoidable dependency on macOS for signing, which may complicate deployment in some environments. Additionally, maintaining two components requires some operational discipline.

That said, if you need to manage iOS app sideloading at scale or want a more accessible interface than raw Xcode or command-line tools, SignTools is worth exploring. Its pragmatic, code-driven approach and attention to developer experience make it a solid tool in the iOS sideloading space.


→ GitHub Repo: SignTools/SignTools ⭐ 2,141 · Go