Skip to main content

Config and profiles

config.json is public PermawebOS operator config. LapEE reads it from the boot USB EFI System Partition, copies it to /tmp/config.json, and includes it in the measured node message.

Do not put secrets in config.json. WiFi credentials belong in wifi.conf.

Runtime Order

LapEE starts PermawebOS with:

HB_CONFIG=/tmp/config.json,/etc/lapee/lapee.json[,/run/lapee/on-start-merged.json]
ConfigSourcePurpose
/tmp/config.jsonESP EFI/boot/config.jsonPublic operator config or role profile.
/etc/lapee/lapee.jsonBase imageBase defaults and measurement startup hook.
/run/lapee/on-start-merged.jsonInit-generated when neededPreserves base startup hooks and appends profile startup hooks.

The base config remains present. Operator keys that the base does not set remain visible through ~meta@1.0/info and are committed into the boot measurement.

Profiles

A profile is just role-specific config.json. For LapEE, stage the profile beside the Makefile as:

config.json

An example configuration to enable paid bundling is here.

It enables remote device loading, pins the trusted device signer, maps published Forge device IDs, and installs the paid-bundler startup hook.

Merge Existing Config

If you have release-provided operator config to preserve, merge release config first and the role profile second before applying it to the image:

jq -S -s '.[0] * .[1]' \
/path/to/release-config.json \
/path/to/profile-config.json \
> config.json

The profile wins if both files define the same role key.

Apply To Image

Run these commands from the LapEE source repo root. For a prebuilt release image, stage the verified image at the Makefile's default path:

mkdir -p build/images
cp /path/to/lapee-usb.img build/images/lapee-usb.img

Then apply staged operator inputs:

make operator-config-apply IMAGE=build/images/lapee-usb.img

Docker must be running. The helper copies config.json into the image as EFI/boot/config.json. If wifi.conf is present, it also copies it as EFI/boot/wifi.conf.

After applying inputs, write the image:

make write-image DEV=/dev/diskN IMAGE=build/images/lapee-usb.img

WiFi

wifi.conf is separate plaintext secret material:

SSID
WPA2-PSK

Place it beside the Makefile before running make operator-config-apply. At boot it is read from:

EFI/boot/wifi.conf

Prefer Ethernet when available.

Useful Checks

After boot:

export NODE_URL=http://HOST:8734

curl -fsS -H 'accept: text/plain' \
"$NODE_URL/~meta@1.0/info/lapee-profile"
curl -fsS -H 'accept: text/plain' \
"$NODE_URL/~meta@1.0/info/load-remote-devices"
curl -fsS \
-H 'accept: application/json' \
-H 'accept-bundle: true' \
"$NODE_URL/~meta@1.0/info/trusted-device-signers" \
| jq '[to_entries[] | select(.key | test("^[0-9]+$")) | .value]'

For the paid-bundler launch profile, lapee-profile should be:

aopayment-bundler

trusted-device-signers is an AO json@1.0 list. Over HTTP it is encoded with numeric object keys, not as a plain JSON array. The command above extracts the signer values.

Attestation Impact

Public config can change the node message. A changed node message changes the measurement subject and the PCR 15 node-binding path. A verifier should check the profile and device-signer keys it relies on before accepting the node.