A full native IDE and a userspace microkernel for building and running iOS apps entirely on-device. offline, unjailbroken, iOS 18.0 all the way through iOS 27.2 Beta 2
Nyxian is an iOS app that empowers developers with a full toolchain they can use while even being offline for iOS development on iPhone. It supports Swift, C, Objective-C, C++ and Objective-C++. It provides a native on-device build environment, a userspace microkernel, and the tooling to compile, run, and manage app packages without needing a desktop or a jailbroken device.
Everything I care about is located at Nyxian/LindChain/ProcEnvironment/Surface.
This is the core process-environment and runtime surface of Nyxian: the low-level layer where the microkernel, process abstraction, filesystem and tty plumbing, trust/key handling, memory mapping, and syscall-facing behavior are assembled. In practical terms, it is the foundation that connects Nyxian's userspace environment to the host iOS runtime and exposes the machinery needed for native app execution, process isolation, and system-like services.
To start using Nyxian view the Installation Guide.
The only current limitation is that we cannot intercept a arm64 supervisor call, but that is not so much of a problem, because remember we are on iOS, processes have nearly no priveleges, so by by not intercepting a supervisor call we can still do most things we need to do.
- IDE
- Compiling code
- C support
- Objective-C support
- C++ support
- Objective-C++ support
- Swift support
- Typechecking
- C support
- Objective-C support
- C++ support (limited without indexing)
- Objective-C++ support (limited without indexing)
- Swift support
- Linking objects to MachO
- Indexing
- Compiling code
- Offline Code Execution
- Code execution (via NSExtension)
- Micro Kernel (ksurface)
- radix trees
- object API
- process object
- privelege model
- custom entitlement blob (translated from AppleCS to NXT2 as well!)
- Kext Link Editor (kxld)
- validate code signature of kext
- validate it's nyxian trust blob
- load kext executable into nyxian address space
- find it's kmod
- apply fixups for kext
- fix ObjC
- fix thread local storage
- handle it's exports
- reseal constant data section
- run it's initializers
- act upon
kmod_info_t
- Syscall handling
- Mach IPC syscall server
- Task port handoff (usually they are guarded we bypass that by moving a receive right after the send right has been set as exception port to the host and then executing a
brkinstruction to move the task to a new address space that respects our init and their rest of data) - Memory copy in/out of guests (yep out of the iOS processes and into them without assistance, this is not a typo lol)
- Subprocess Patches
-
posix_spawn/posix_spawnpfix -
vforkfix -
sysctlfix - tty support on iPhone and the necessary
ioctlfix (tho not entirely yet, it only works when NXWindowSessionTerminal creates it, but it is already progress) - libproc fix
-
task_for_pid/task_name_for_pidfix (you heard right, that is not a typo) - patches to credential syscalls like
setuidorsetgid
-
- Signing executables
- NSBundle think it is loaded as a binary
- Actually make iOS apps and binaries use the version as DYLD version they have been made for
- Find NSExtension spawn limit
- File permissions in guest file system (using sandbox file extensions and clever self-written fs sandbox APIs)