Deploy ESP32 at Home in an Afternoon: Camera, Mic, Mesh
From a bare ESP32 board on your desk to a working home camera or microphone you own: flash it, give it Wi-Fi and an identity, adopt it, and watch it on your LAN.

What does it take to deploy an ESP32 device at home?
Four steps: flash a firmware built from a short manifest, provision the owner's Wi-Fi into a settings partition, let the device mint its own did:mata identity, and adopt it on your local mesh. With a supported board such as the XIAO ESP32-S3 Sense, espino does all four from one data file.
To deploy an ESP32 at home means four things done in order: flash a firmware onto the board, provision your Wi-Fi and a name into it, let the device mint its own identity, and adopt it so it appears on your local mesh. With a supported board and the espino command line, one short data file drives all four, and a camera or microphone can be running in your house the same afternoon. This guide shows how to deploy an ESP32 along the path that has actually run on silicon, and marks plainly the parts that have not.
What "deploy" means for an ESP32 in your home
Four steps, one data file
Most ESP32 tutorials stop at "it compiles". To deploy an ESP32 at home you need more. A home device needs more than a binary. It needs your network credentials, a name you recognise, a way to be found on the LAN, and a reason to trust it (and for it to trust you). The Janus family from Remade With Rust treats deploy as one loop with four stops:
- Flash. Build a firmware from a manifest, check it fits the board's partitions, write it, and watch the first boot.
- Provision. Write your Wi-Fi and a device name into a settings partition, separate from the firmware, so you can change them without rebuilding.
- Identity. On first boot the device mints a P-256
did:matainto a partition of its own that no reflash touches. - Adopt. Your home computer (or, today, a laptop client) presents a signed adoption record. The device then answers its owner and refuses strangers.
The first two are handled by espino, the maker's CLI. The last two live in the firmware, through rusty_esp_mid and rusty_esp_iroh, reached from a sketch written against rusty_esp_arduino.
What has actually run, and what has not
espino only offers combinations it calls cells: a board plus a set of connectivity, sensor and output packages that ran a kill test on hardware with numbers in a ledger. Six cells are Verified as of September 2026. On the Seeed XIAO ESP32-S3 Sense: the camera page (C0), the porch camera with microphone, RTP and PCM (C1), the mesh camera over iroh (C2), and a first no-radio project (C7). On the AI-Thinker ESP32-CAM: the camera page (C5), and the same page provisioned over Bluetooth from a browser (C6). The XIAO trips ran over a network the board hosted itself; the ESP32-CAM joined a 2.4 GHz hotspot as an ordinary client.
Presence sensing is not there yet. The mmWave radar cell on the ESP32-C6 and the Wi-Fi CSI presence cells build and pass host tests, but nothing has run on a board, so espino generates them only as labelled development builds. If your afternoon plan is a camera or a microphone, you are on proven ground. If it is presence, read the Sense vision and wait a little.
The afternoon, step by step
Before you plug in: tools and a manifest
Every ESP32 deploy starts on the laptop, not the board. You need the Rust toolchain from rust-lang.org, the Espressif toolchain installed with espup (the S3 is an Xtensa chip), and espflash plus ldproxy from cargo. The esp-rs book covers that setup. You also need a 2.4 GHz network: ESP32 radios do not speak 5 GHz, and espino warns if the network you name only appears on 5 GHz.
Then write the manifest. This is the porch camera from espino's own README, nine lines of intent and no GPIO numbers:
[device]
board = "xiao-esp32s3-sense"
name = "Porch Cam"
[connectivity]
packages = ["wifi-sta", "mesh"]
[sensors]
packages = ["camera-ov2640"]
[outputs]
packages = ["mesh-media"]
If you are not sure which board carries what you want, espino make find --want camera-ov2640,mic-pdm lists every board and kit that can, with where to buy it. Our board guide explains the choices.
Flash, provision, and see it on the LAN
Plug the board in and ask what is attached. espino ports lists serial ports and the board records their USB identity matches; espino detect --port COM4 asks the chip itself, because a XIAO and an S3 DevKitC report the same USB identity. Then one command generates the project, builds it, packs the filesystem, checks the fit, flashes and monitors:
espino make image --manifest make.toml --out porch-cam --release --port COM4
The first ESP-IDF build is slow, because it fetches and configures ESP-IDF. On the development laptop, with ESP-IDF already configured, the generated porch camera built in about two minutes end to end. Next, your network:
espino provision --board xiao-esp32s3-sense --name "Porch Cam" --wifi home --psk-env HOME_PSK -o nvs.bin --flash --port COM4
The passphrase comes from an environment variable (or --psk-stdin), never a flag. The board reboots, joins, mints its did:mata, and prints what it is. A camera page cell prints a URL carrying a token; without the token the page answers 403. A mesh cell prints a ticket instead, which a subscriber dials. On the XIAO the node came up 3.2 seconds after boot and delivered 721 camera packets in 60 seconds with none lost.
Owning the device after the first boot
Adoption, identity and the mesh
Once you deploy an ESP32 this way, the identity is the part you keep. The device's key is generated on the chip and written to its own partition, apart from your settings, so re-provisioning or reflashing leaves it alone. One XIAO held the same did:mata through six whole-image reflashes, a re-provisioning and three flashes of other firmware. Adoption is a signed record naming the owner's key; on the chip, a stranger replaying the owner's record was refused, and so was a superseded one. That is the core of the Own vision, and the reason we argue for a smart home without the cloud.
The mesh is iroh: QUIC between devices dialed by public key, with pure-Rust TLS. Be clear on one boundary. On the verified C2 run, the subscriber was a laptop client. Wiring the MATA home computer to receive that media is still open work, so today "see it on the LAN" means a browser page, an RTP player such as ffmpeg, or the iroh client, not yet a polished home app.
Honest limits, and where to go next
A few things will trip you if nobody tells you. The ESP32-CAM has no auto-reset, so flashing needs a jumper from IO0 to GND and a press of RST; espino holds the port and tells you when. The C1 porch camera's loop is paced by the camera, so it forwards about 12 audio blocks a second of the 50 the microphone makes; that is recorded, not yet fixed. And the web flasher that needs no toolchain is coming to dldeploy, not here today.
When your first device is running, deploy an ESP32 in a second room and watch the mesh grow. The Flash vision and the See vision describe where each piece is heading, and every article in Learn says how far its package is proven. The source lives under the Remade-With-Rust organisation on GitHub, and the silicon itself is documented by Espressif.
FAQ
Quick answers for builders evaluating this technology.
Which board should I start with to deploy an ESP32 at home?
The Seeed XIAO ESP32-S3 Sense. It carries a camera, a PDM microphone and 8 MB of PSRAM, and it is the board where the camera page, the camera plus microphone device and the mesh camera have all run their kill tests on real silicon.
Do I need to write any C or edit GPIO numbers?
No. You write a make.toml naming the board and the packages you want. espino reads the pins from its cited board record and generates a Rust sketch project over rusty_esp_arduino. Our crates contain no C, though ESP-IDF and the radio firmware underneath are Espressif's.
Can I deploy an ESP32 presence sensor today?
Not as a verified device yet. The mmWave radar node on the ESP32-C6 and the Wi-Fi CSI presence builds compile and pass their host tests, but none has run on a board, so espino only generates them as labelled development builds.
Where does my Wi-Fi password go?
Into an NVS settings image that espino writes to the board's own settings partition. The passphrase is read from an environment variable or standard input, never a command-line flag, and it does not appear in logs or generated files.
Does the device need a cloud account to work?
No. The camera page, the RTP stream and the iroh mesh all run on your local network. The device holds its own identity and answers only to the owner who adopted it.