| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
hl core only. AppKit X and runnable applications live in public sibling repositories:
| Repo | Role |
|---|---|
| zw3rk/hyper-linux | This — runtime |
| zw3rk/hyper-linux-x11 | AppKit-origin X |
| zw3rk/hyper-linux-examples | XMMS demo |
The pre-split monorepo is preserved by tag split-base-2026-07-30.
hl executes aarch64-linux and x86_64-linux ELF binaries on macOS Apple Silicon using Apple's Hypervisor.framework. No Docker, no full VM — just a lightweight per-process virtual machine that translates Linux syscalls to macOS equivalents.
$ hl ./hello-linux Hello from Linux!
By default hl runs with a product-oriented profile:
# Same as the defaults (home media + Core Audio)
hl ./my-linux-app
# Hermetic / no auto home bind
hl --isolated --bind /path/to/media:/media ./app
# Deterministic tests (legacy paths + silent backend)
hl --fs-mode=legacy --audio-backend null ./test-program
# Category traces: HL_TRACE=fs,fd,dev,audio,proc,fork,syscurl -fsSL https://hyper-linux.app/install.sh | sh
Downloads, verifies SHA256, codesigns, and installs to /usr/local/bin.
brew install zw3rk/hyper-linux/hl
Download the latest .pkg or .zip from Releases:
# macOS installer package sudo installer -pkg hl-v0.2.4.pkg -target / # or unzip manually unzip hl-v0.2.4.zip -d /usr/local/bin/
nix run github:zw3rk/hyper-linux
Or add to your flake inputs:
{
inputs.hyper-linux.url = "github:zw3rk/hyper-linux";
}Requires the nix development shell (provides cross-toolchain, SDK, signing):
git clone https://github.com/zw3rk/hyper-linux.git cd hyper-linux nix develop -c make hl
The built binary is at _build/hl, codesigned with the Hypervisor entitlement.
hl [options] <elf-binary> [args...]
| Flag | Description |
|---|---|
| -h, --help | Show man page (or brief usage) |
| -V, --version | Print version and exit |
| -v, --verbose | Verbose output (ELF loading, syscalls) |
| -t, --timeout SECONDS | Opt-in per-iteration vCPU watchdog (default: 0/off) |
| --sysroot PATH | Musl/glibc sysroot for dynamically-linked binaries |
| --fs-mode legacy|rooted | Filesystem namespace mode (default: rooted) |
| --bind HOST:GUEST | Add a rooted-mode bind; accepts :ro and GUEST=HOST |
| --guest-home PATH | Set the guest home used by application profiles |
| --guest-cwd PATH | Set the initial rooted-mode virtual working directory |
| --isolated | Disable the automatic $HOME bind and default guest CWD |
| --app-profile | Add the fuller home/media/volume application profile |
| --trace=CATEGORIES | Trace fs,fd,dev,audio,proc,fork,sys or all |
| --audio-backend NAME | Select null, null-realtime, wav, or coreaudio |
| --gdb PORT | Start GDB RSP stub on TCP port (aarch64 only) |
| --gdb-stop-on-entry | Stop at ELF entry point and wait for GDB attach |
| -- | Stop processing hl options |
# Static aarch64-linux binary
hl ./my-static-binary arg1 arg2
# Dynamically-linked binary with musl sysroot
hl --sysroot /path/to/musl-sysroot ./my-dynamic-binary
# x86_64-linux binary (uses Rosetta for translation)
hl ./my-x86_64-binary
# Verbose output for debugging
hl -v ./program 2>debug.log
# GNU coreutils (static musl build)
hl /path/to/coreutils/bin/ls -laGuest memory is demand-paged — the VM address space can be up to 1TB but only touched pages consume physical RAM.
# Enter development shell
nix develop
# Build
make hl
# Run tests
make test-both-modes # aarch64 suite in legacy + rooted modes
make test-x64-both-modes # x86_64/Rosetta suite in both modes
make test-host-units # Host units + operator diagnostics
make test-coreutils # 104 GNU coreutils tools
make test-busybox # BusyBox applets
make test-static-bins # Static binaries (bash, lua, jq, etc.)
make test-dynamic # Dynamically-linked binaries
make test-dynamic-coreutils # Dynamic coreutils with sysroot
make test-haskell # GHC-compiled Haskell binary
make test-x64-hello # x86_64 via Rosetta
# All available targets
make helpRelease maintainers: see docs/RELEASING.md.
All source lives under src/ (~26,000 lines of C + assembly):
| File | Purpose |
|---|---|
| src/hl.c | CLI, VM setup, ELF loading entry point |
| src/guest.c | Guest memory, page tables, brk/mmap regions |
| src/elf.c | ELF64 parser, PT_LOAD/PT_INTERP, ET_DYN |
| src/stack.c | Linux initial stack builder (argc/argv/envp/auxv) |
| src/syscall.c | Syscall dispatch, FD table, errno translation |
| src/syscall_fs.c | Filesystem: stat, open, directory ops |
| src/syscall_fd.c | File descriptor ops: dup, dup3, fcntl, pipe2 |
| src/syscall_io.c | I/O: read/write, ioctl, splice, sendfile |
| src/syscall_poll.c | Poll/select/epoll/ppoll multiplexing |
| src/syscall_net.c | Socket networking, AF/sockaddr translation |
| src/syscall_signal.c | Signal delivery, rt_sigframe, ITIMER |
| src/syscall_time.c | Time: clock_gettime, nanosleep, setitimer |
| src/syscall_sys.c | System info: uname, getrandom, sysinfo |
| src/syscall_inotify.c | inotify emulation via kqueue EVFILT_VNODE |
| src/syscall_exec.c | execve: ELF reload, interpreter, vCPU restart |
| src/syscall_proc.c | Process state, wait4/waitid, ptrace, vCPU run loop |
| src/fork_ipc.c | fork/clone via posix_spawn + IPC |
| src/proc_emulation.c | /proc and /dev path interception |
| src/rosetta.c | Rosetta x86_64 translator setup (phase 1-2) |
| src/crash_report.c | Structured crash reports for GitHub issues |
| src/vdso.c | vDSO builder for Rosetta |
| src/shim.S | EL1 kernel shim, exception vectors, MMU |
| src/thread.c | Multi-threading, per-thread vCPU |
| src/futex.c | Futex wait/wake/requeue/PI |
| src/gdb_stub.c | GDB Remote Serial Protocol stub for debugging |
Apache License 2.0 — see LICENSE.
Copyright 2025-2026 zw3rk pte. ltd.
| Back | FazBrowse Home | New Git URL |