Use this when a Raspberry Pi is booting Raspberry Pi OS for the first time and you do not have a monitor or keyboard. The goal is to preconfigure Wi-Fi, SSH, username/password, and a unique hostname before first boot.
- Raspberry Pi Imager: https://www.raspberrypi.com/software/
- Raspberry Pi OS images: https://www.raspberrypi.com/software/operating-systems/
- Raspberry Pi installation docs: https://www.raspberrypi.com/documentation/computers/getting-started.html
- Raspberry Pi cloud-init notes for newer OS images: https://www.raspberrypi.com/news/cloud-init-on-raspberry-pi-os/
For hackathon use, prefer Raspberry Pi OS Lite 64-bit unless you need a desktop environment.
- Install and open Raspberry Pi Imager on the Mac.
- Insert the microSD card.
- Choose:
- Device: your Raspberry Pi model
- OS: Raspberry Pi OS Lite 64-bit
- Storage: the microSD card
- Click Next.
- Choose Edit Settings when Imager asks about OS customization.
- Set:
- Hostname: something unique, such as
team42-pi1 - Username: for example
piuser - Password: a password your team knows
- Wi-Fi SSID and password
- Wi-Fi country:
US - Time zone:
America/Los_Angeles - SSH: enabled, with password authentication unless you are using SSH keys
- Hostname: something unique, such as
- Write the image.
- Put the card in the Pi and power it on.
- Wait 2-5 minutes, then connect from the Mac:
ssh piuser@team42-pi1.localIf .local does not resolve, check the active link's client list if one exists, or scan the local subnet. On macOS:
ipconfig getifaddr en0
arp -aIf your Mac is on 192.168.1.37, the subnet is usually 192.168.1.0/24. If nmap is installed:
nmap -sn 192.168.1.0/24The helper script in this repo customizes the SD card after the OS image has been written. This is useful when you already flashed an image and want a repeatable way to set per-device values.
- Write Raspberry Pi OS to the microSD card with Raspberry Pi Imager.
- Eject and reinsert the card if macOS does not automatically mount it.
- Confirm the boot partition is mounted. It is usually:
ls /Volumes/bootfs- Run the script:
./scripts/customize_raspberry_pi_sd.sh \
--boot /Volumes/bootfs \
--hostname team42-pi1 \
--username piuser \
--wifi-ssid "YOUR_WIFI_NAME" \
--wifi-country US \
--timezone America/Los_AngelesThe script prompts for the Raspberry Pi user password and Wi-Fi password so they do not end up in shell history.
For multiple Pis, run it once per SD card with a different hostname:
team42-pi1
team42-pi2
team42-pi3
The script supports both newer Raspberry Pi OS images that expose user-data and network-config on the boot partition, and older images that use ssh, userconf.txt, and firstrun.sh.
- A router, phone hotspot, or internet path is not required to prove the Altiair edge implementation.
- The physical baseline is the Pi 5 private mission LAN.
altiair-hubcreatesAltiair-LAN;altiair-node-a,altiair-node-b, andaltiair-orinjoin it. - The fastest proof path is to boot one Pi at a time, then run logical nodes on the Pi 5 or laptop until
Altiair-LANis ready. - Physical distribution across separate nodes requires the Pi 5 AP to be up before the failure demo so a bundle can replicate off the node that later goes down.
- To prove preservation, generate a bundle, verify it replicated to a surviving peer, then power down or isolate one node. Data that never left the failed node cannot be recovered by the mesh.
- If Jetson Wi-Fi fails, use Ethernet for
altiair-orinwhen available. - Venue Wi-Fi is optional for later internet/uplink only; do not depend on it for node-to-node traffic.
- Captive portal Wi-Fi usually does not work for headless first boot.
- A phone hotspot or travel router remains optional only as a backup or later uplink path.
Pi 5 AP baseline:
sudo nmcli device wifi hotspot ifname wlan0 con-name altiair-lan ssid Altiair-LAN password "change-this-demo-password"If the Pi 5 uses its Wi-Fi radio as the AP, do not depend on that same Wi-Fi radio for internet. The local mesh works without internet; Foundry/CASK sync queues until any gateway gets an uplink later.
Field pattern after the hackathon:
Altiair-LANis one local cell.- A drone, Hawkeye/vehicle kit, operator compute node, or gateway payload can host or bridge another local cell if that fits the deployment.
- Nodes keep their stable overlay identities and replicated ledger behavior regardless of which local cell carries the packets.
Example Wi-Fi customization, only when a normal SSID is available:
./scripts/customize_raspberry_pi_sd.sh \
--boot /Volumes/bootfs \
--hostname altiair-node-a \
--username piuser \
--wifi-ssid "OPTIONAL_NORMAL_WIFI_SSID" \
--wifi-country US \
--timezone America/Los_AngelesAfter booting the Pi:
ssh piuser@team42-pi1.local
hostname
ip addr
sudo systemctl status ssh --no-pagerIf SSH fails:
- Wait up to 5 minutes on first boot.
- Confirm the Wi-Fi network has no captive portal.
- Confirm the SSID and password are exact.
- Try the IP address instead of
.local. - Reinsert the SD card into the Mac and inspect the boot partition files.