HopOS · the Go-only OS

Give every Go app its own piece of the machine.

HopOS boots directly on ARM and RISC-V hardware. No Linux, no VM and no container layer. It turns a board into a small, stateless application node where each app gets physical cores and hardware-fenced memory.

HOP decides what runs where · meet the orchestrator →

What it is

An application node, not a general-purpose computer.

Compile a Go service for HopOS and hand HOP a signed image plus a small job spec. HopOS downloads it, gives it cores and memory, connects it to the network and keeps it inside that boundary.

That narrow job is the point. There are no users, packages, shell services, container daemons or local state to manage.

01Build

Compile your Go app for arm64 or riscv64.

02Place

HOP sends the job to a matching node.

03Fence

HopOS assigns cores, memory and network access.

04Run

The app talks through ten small OS operations.

Why it exists

Less code means fewer places for bugs to wait.

01

Start before Linux.

A conventional node already trusts a complex bootloader before it starts a ~30-million-line Linux kernel — then adds systemd, libc and a container runtime. AI makes large patch rounds easier to produce; it does not make that surface smaller. HopOS includes its own boot path; a complete node is about 11,300 lines.

a smaller bug surface

02

Keep dependencies visible.

Lean contains the network stack, TLS, HTTP, S3 and ELF support in one readable Go module. It can be the only library dependency of a HopOS app; it does not have to be — ordinary Go packages remain your choice.

no dependency pile

03

Change the boundary, not just the line count.

Apps do not share a kernel or an address space. HopOS gives each app cores and memory, then uses the processor’s own translation and protection hardware to make everything outside that partition unreachable.

hardware, not policy

How does that work? open the technical version

HopOS owns the privilege level above the apps: EL2 on ARM and machine mode on RISC-V. It loads an app into a memory partition, asks the processor to enforce that partition, and only then starts the app at the lower privilege level.

Load one relocatable slot

The node streams the signed app image into its assigned partition. Address translation lets every slot use the same link address, so one artifact per architecture can run in any slot.

Fence it before entry

ARM uses a stage-2 page table with its own VMID. RISC-V uses a PMP whitelist for the boundary and an Sv39 page table for relocation. If HopOS cannot establish the cage, it does not start the app.

Keep devices on the other side

The app talks to HopOS through a control page and two rings. The node programs network and storage devices; an app cannot invent a syscall or point DMA outside its cage.

Give the resource back cleanly

On ARM, HopOS revokes the stage-2 mapping and parks the core. On RISC-V, it resets the hart. The boundary belongs to the hardware, so stopping one slot does not require cooperation from its app.

ARMRISC-V
HopOS ownsEL2machine mode
app runs inEL1supervisor mode
memory boundarystage-2 table + VMIDPMP whitelist
relocationthe same stage-2 tableSv39 page table
stoprevoke mapping + park corereset hart

By default an app also gets whole physical cores, with no time-sharing between strangers. Trusted apps may explicitly opt into a sharegroup; the memory cage stays in place.

One OS, two ways to use it

Boot your own programs. Or give a fleet one shared state.

one machine

Put your programs on it and power on.

Jobs in hopos.init[] live on the boot medium. Without S3, every boot is clean: HopOS starts that exact set of Go apps again.

boot mediumHopOSyour apps
no S3 · no cluster required

a fleet

Keep the truth outside every machine.

HOP commits the desired cluster state to one object in S3. Each HopOS node reads that shared state and reconstructs its own jobs after a reboot.

HOPS3 stateevery node
shared state · replaceable machines

The Go-first ecosystem

Real apps and useful tools.

Stulp is a real HopOS workload. GoNet is companion tooling for running .NET test work from Go, on your own development machine.

cloudflaredCloudflare’s Go client, running in a slot
hoplb + hopdnscluster routing and service discovery
hoppromper-app metrics without a node exporter

Where it runs

From a tiny board to a many-core server.

Apps are built once per architecture, not once per board. HopOS supplies the board-specific boot and drivers underneath. On UEFI machines and the Mac mini M4, its own bootloader takes over from the platform firmware — no GRUB in between.

Ampere Altra128-core reference · UEFI Raspberry Pi 4 + 5arm64 Radxa Zero 3Earm64 + GUI LicheeRV Nanoriscv64 · ~€15 Mac mini M4iBoot → HopOS bootloader UEFI arm64firmware → HopOS bootloader · hardware + QEMU

Try it

Write a card. Power on.

The HopOS Imager downloads the latest signed release, writes and verifies the card, keeps config during updates and finds the node on your network.

on hardware
  1. Choose Desktop or Headless and your board.
  2. Write and verify a USB stick or SD card.
  3. Power on. FIND shows the node and its boot log.
without hardware
$ git clone https://github.com/xinix00/HopOS
$ cd HopOS
$ ./image/uefi-run.sh agent
HOPOS_AGENT_UP
Prefer a direct image?

Each file is the complete medium. GUI boots the SURF desktop; Headless contains no graphics code.