Last updated: 2/24/26

An open source handheld device
Adafruit electronics modules combined with software to allow for a highly customizable device to tinker with.
I have moved all of the documentation hosted here into the Github.
There you can find a guide on how/where to purchase the hardware necessary, Quickstart steps, as well as an in-depth guide of the project’s capabilities.
Below are update notes and videos of the development as time goes on. Click the text to expand the sections.
- Processor:
- ESP32 Dual Core @ 240Mhz
or - ESP32-S3 Dual Core @ 240Mhz
- ESP32 Dual Core @ 240Mhz
- Storage:
- Flash: 8Mb
- Optional Storage: SD Card
- Accepts up to 32Gb FAT SDcards
- Increasing this up to 128Gb is on the roadmap.
- Memory:
- ROM: 384Kb
- PSRAM:
- ESP32 – 2MB
- ESP32-S3 – 8MB
- Connectivity:
- WiFi
- Bluetooth 5 BLE
- Supports UART, I2C, I2S
- Serial
- Display (Choose one):
- 1.3″ 128 x 64px Black and White OLED
- Connects via StemmaQT – Does not require soldering
- 2.0″ 320 x 240px Color LCD
- Connects via EYESPI – Requires soldering
- Currently not supported yet, will come in future updates.
- 1.3″ 128 x 64px Black and White OLED
- Supported Optional Hardware Modules / Sensors:
- Camera + Microphone + SD Card Reader “hat”
- Thermal Camera
- IMU – Gyroscope
- GPS
- ToF – Distance
- IR Presence
- FM radio
- RTC – Real Time Clock
- and more coming in the future
- Interfaces:
- HTTP Web Server:
- Features:
- Device Dashboard
- Sensor, Automation, Logging pages and more
- File Manager
- Settings editor
- CLI terminal
- REST API for controling sensors
- HTTP for now, HTTPS will become available in a future update.
- Features:
- Onboard Display:
- The onboard display enables the use of all features, meaning it is a valid replacement for the Serial or HTTP interface.
- Serial CLI Interface:
- The serial interface exists mostly for debugging, as there are no visuals to accompany it. It can be used to control the device, but its not recommended.
- HTTP Web Server:
- I2C System:
- Enables concurrent I2C device usage through:
- Serialization of sensor initialization
- Per Device I2C Clock Speeds, changed dynamically to allow for all devices to communicate when its their turn to
- ‘Health’ tracking watches for sensor failures and auto stops sensors which are producing garbled input or NACK errors. After it will reinitialize and resume reading if the sensor doesn’t continue producing errors.
- Enables concurrent I2C device usage through:
- Security:
- Flash encryption + Secure Boot support
- Hashed Passwords with AES-256 for User Passwords, Wifi Passwords, ESP-NOW Passphrases, and other data that needs to be secured across the project.
- User Account management
- Standard and Admin roles
- Users can be be perma-banned according to userID
- Session management
- Force Logout or Ban users sessions.
- ESP-NOW:
- Wireless communication method that doesn’t require WiFi or Bluetooth
- A passphrase shared across devices encrypts communications with AES-256
- Features many kinds of messages that are able to be sent between paired devices. Some examples are:
- Text based messaging
- Remote CLI Execution
- Device metadata transfer
- File transfer
- Heartbeats
- User customizable ‘meta data’
- Data which can be used in automation logic
- Features both direct peer to peer communication, as well as communication across devices set up in a mesh
- Mesh networking allows for messages unable to be sent directly to be broadcast across the encrypted device network, bouncing from peer to peer with deduping to reduce unnecessary mesh traffic until either its delivered, not able to be delivered, or its TTL hits 0
- 20-200m range
- Optional encryption
- Master/Worker roles
- This mostly exists as a way for devices to know who to send their sensor data to. Will probably be phased out when I figure out a better way to do it.
- MQTT
- Send system and sensor data to a mosquito server.
- While only the basic have been implemented, this is the bones for a Home Assistant integration.
- Edge Impulse:
- Machine Learning
- Run pre-trained models on-device for image classification
- ESP-SR:
- Voice Control
- On-device speech recognition with wake word and voice commands. No internet required
- Offline Maps:
- GPS waypoint tracking with local tile rendering
- Automation:
- Scheduled tasks and sensor-triggered actions
- Features a ‘logic’ builder which allows the automation to incorporate IF and ELSE into the triggered actions
- Bluetooth:
- BLE GATT server for mobile app integration
- Storage:
- Setting configs stored in JSON
- CSV sensor logs
- CLI:
- 550+ serial commands split across the project
- Debug flags per subsystem
- Memory monitoring
- Debugging System
- Features a two tiered system:
- One layer for what level of Debug log it is – Info, Error, Warn and Debug
- The second layer has over 75 different flags that can be enabled or disabled to zero in on what feature/aspect of the program caused it to malfunction
- Ties into features like System Logging and Sensor Logging to allow for filtering and sorting
- Features a two tiered system:
Features include:
- Sensors added
- 6 dof IMU
- Gamepad (Joystick + Buttons)
- Commands to initialize, start, stop and reset sensors
- Wifi connectivity + management commands
- Bluetooth Connectivity + management commands
- Bluetooth and Serial Command processing
- Onboard Neopixel effect function
Updates include:
- Swapped out previous IMU for BNO-055 (easier to work with, more accurate)
- Switched from SPIFFS to LittleFS (for memory improvements)
- Added commands to increase debugging capabilities
- Removed Bluetooth as it was too heap inefficient. Will revisit later.
New Features:
- Added Thermal Infrared Sensor
- Added Color and Light Sensor
- Added an HTTP web Interface
- Switched from Adafruit web server library to native ESP library (for security and function improvements)
- Easier to eventually migrate to HTTPS
- File browser
- User Account System
- Required authentication for web and serial interfaces
Updates include:
- Heap and Efficiency improvements across the board
- Reducing heap churn and fragmentation by reducing the amount of string concatenation
- Reducing heap churn and fragmentation by reducing the amount of string concatenation
- Sensors
- Introduced a queue system for sensor initialization
- Separate tasks are utilized for sensors
- Thermal Sensor
- Im trying to find ways to smooth out the output so it’s less jittery and flickery. The video below is extra bad because it’s at 2x playback speed. WIP
- Im trying to find ways to smooth out the output so it’s less jittery and flickery. The video below is extra bad because it’s at 2x playback speed. WIP
- Improved wireless connectivity options
- There can now be multiple SSIDs saved to a device
- SSIDs can be ranked by priority
- Web Interface
- Visual overhaul
- ‘Dynamic’ loading of sensor visuals and help commands depending on what sensors are connected
- General Security
- WiFi Passwords and User Passwords are hashed, not viewable once entered.
- Uses a basic hardware ID based hash.
- File System
- In-browser file editing
- File uploading to LittleFS storage
- Folder and file creation
- Marking certain folders immutable by user interaction
New Features:
- ESP NOW wireless communication
- Remote Command Execution with output streamed back to the remote device (ssh like)
- Remote Command Execution with output streamed back to the remote device (ssh like)
- ‘Automations’
- The ability to queue commands based on time, event based triggers, simple ‘logic’, and on command.
- Automations can be exported to a JSON format
- Automations can be downloaded directly from Github (JSON only)
- Web Interface
- Adoption of SSE
- Ability to revoke sessions of users
- System Memory Allocation
- Created function for memory allocation that replaces malloc where available with ps_alloc, which enables the initialization to use PSRAM if available. It will fall back to heap if PSRAM is disabled or it cannot allocate the space requested, or if the request is flagged to go straight to heap.
- Created function for memory allocation that replaces malloc where available with ps_alloc, which enables the initialization to use PSRAM if available. It will fall back to heap if PSRAM is disabled or it cannot allocate the space requested, or if the request is flagged to go straight to heap.
- Logging
- Authentication attempt logging (always on)
- Stored regardless of success or failure.
- Sensor logging (optional)
- Can be enabled by the user
- Memory allocation logging (optional)
- Works to provide a history of heap consumption
- Command logging (always on)
- Acts as a global log for both system commands and user executed commands
- Authentication attempt logging (always on)
Updates Include:
- Migration from manual JSON parsing to the ArduinoJSON library
- Increases ease of programming
- Decreases code length
- All JSON files stored in LittleFS utilize this
- ESP NOW wireless communication
- A new ‘mesh’ mode exists, and allows messages to travel/hop between devices that are both paired and on the same encryption key to extend range
- There are several kinds of messages that can traverse the network of devices
- Through each hop the core message will remain the same while metadata builds on top of the original message. This provides a large benefit such as topology mapping, more intelligent routing
- Debugging
- Added many more debugging flags to help provide more granularity to the programs output
- Added many more debugging messages
- Sensor Settings
- Added sensor settings to rotate the thermal sensor’s visual output, to help in configuring a device after its been built.
- Removed group sensor buffer and replaced it with multiple smaller buffers to reduce race conditions and compute time with juggling another mutex separately for this.
- I2C Bus Management
- Expanded upon the sensor queue to add all i2c devices into the mix
- Added i2cMutex which allows multiple sensors to start and stop repeatedly without corrupting by preventing overcrowding of the I2C bus
- ‘Dynamic’ Clock Adjustment
- Allows for the sensors to request a clock speed change if necessary, without clamping back to a preset value.
- Prevents unnecessary changes to only change clock when needed
- Supports up to 8 different devices’s clock speeds between 100k and 800k
- Gracefully errors out when encountering errors or early returns. No more crashing >_>
No video will be made available of this version.
I have already began a complete refactor to reorganize and modularize the codebase to enable feature selection at the time of compilation for maximum flash and iram savings, in addition to then having control of those selected during boot for heap/stack savings. The next update will leave behind the Arduino IDE in favor of the much more feature rich ESP IDF. From there I will work to de-arduino the code and make it as effective and efficient as possible before moving to my next goal.
New Features:
- Onboard Screen
- Now featuring a 128×64 OLED monochrome display, the device finally has a way to display various different modes each with a different purpose.
- Modes include: Sensor List, Sensor Data, System Status, Thermal Visual, Mesh Status, Custom Text, Logo, Animation, Boot Sensors, IMU Actions – These are named pretty literally. Currently it is only able to be changed via serial or web CLI commands.
- Modes include: Sensor List, Sensor Data, System Status, Thermal Visual, Mesh Status, Custom Text, Logo, Animation, Boot Sensors, IMU Actions – These are named pretty literally. Currently it is only able to be changed via serial or web CLI commands.
- Now featuring a 128×64 OLED monochrome display, the device finally has a way to display various different modes each with a different purpose.
- Game… Engine¿?
- Rendering System
- 2D View – Top-down rendering of everything
- 3D View – Multi-Raycast rendering
- Multiple control schemes
- ‘Gyro Aiming’ + walk and attack buttons
- Joystick aiming + walk and attack buttons
- Attack System
- Magic
- Fire, Lightning, Ice and Magic Missile
- Unique projectiles for each type of magic
- Melee
- Nothing yet
- Magic
- Leveling System
- Rough XP system has been implemented. Does nothing.
- Shop System
- Nothing yet
- Levels
- ‘Random’ world generation
- Seed based, and the seed is randomized
- Multiple Levels/Biomes with Varying terrain height and types, as well as Columns, Walls, and Decorations to make it look less empty.
- Varying enemy spawning
- Not implemented yet
- Based on seeds, and the seed will change when the page is refreshed.
- Debugging
- Rendering Debugging
- Math Debugging
- Time Debugging
- ‘Random’ world generation
- Rendering System
Updates to make this project more enjoyable to use/work on:
- BuildConfig File
- This is a file that is now used for configuration of the software at compilation time. Its used to enable or disable flags, which controls what software gets loaded into the ESP32.
- This enables the user to flash different software on each device, saving both flash storage space, and enabling the usage of different features across multiple devices.
- OLED Screen menu revamp
- This revamp focused on:
- Adding Joystick and button support for user input
- Making icons larger
- Creating reusable elements for things like navigation text, scrolling menus, popup windows, notifications panels, an OLED keyboard, a file explorer, etc
- Adding the navigation bar
- Implementing nearly all the projects features
- The OLED interface is now put behind a login screen
- A CLI interface that shows what the serial interface would show
- A Settings editor
- A File Explorer
- Paired Device configurator
- Paired Device functions
- Maps
- Automation Viewer
- Memory Footprint
- Etc
- The only missing elements are things that the OLED cannot display, such as the camera, as the monochrome screen can’t handle that resolution or the fact that camera has color.
- This makes the OLED a viable screen for a low-cost, no-solder display option instead of an EYESPI screen.
- This revamp focused on:
- Project file reorganization
- Project files now follow a general naming scheme:
- Sensor related file names are named by what kind of sensor they are, then the ID of the sensor / chip, and then its display type.
- Examples:
- I2C Thermal Camera Sensor (MLX90640):
- (Sensor functions file) i2csensor-mlx90640.cpp
- (Sensor header file) i2csensor-mlx90640.h
- (Sensor Interface file – OLED) i2csensor-mlx90640-oled.h
- (Sensor Interface file – Web) i2csensor-mlx90640-web.h
- I2C Thermal Camera Sensor (MLX90640):
- Examples:
- System related files are named fairly literally.
- Examples:
- FileSystem
- (File System functions file) System_FileSystem.cpp
- (File System header file) System_FileSystem.h
- DebugSystem
- (Debug System functions file) System_DebugSystem.cpp
- (Debug System header file) System_DebugSystem.h
- FileSystem
- Examples:
- Sensor related file names are named by what kind of sensor they are, then the ID of the sensor / chip, and then its display type.
- Project files now follow a general naming scheme:
On 2/24/26 I will change the Github to be public! 🎉
If you know me IRL and want to try this out let me know and I’ll send you free hardware 🙂
New Features/Updates:
- New Bonded Usage Mode:
- Instead of just one ESP32 ‘per-device’ for this project, now there can be two ESP32s which share command registries, live statuses and more to work together
- With this, you can have a device that can run all of the features in this project. Before the limiting factor was the instructional RAM, which limits the amount of libraries/features that can be included on one device.
- Parses internal command manifest with fallback to bonded manifest if no matches are found
- ‘Apps’ utilize either local or remote sensors
- Maps and Games can use the GPS and IMU on a paired device if necessary
- More functionality for other features coming shortly
- Limitation: Camera and Microphone ‘Apps’ like Edge Impulse and ESP-SR require a greater data throughput than ESP-NOW is capable of. While they can be setup and the ‘Apps’ can be started, stopped, and the settings can be interacted with on the bonded device, they cannot be displayed live on bonded devices.
- Maps and Games can use the GPS and IMU on a paired device if necessary
- Leverages the ESP-NOW Communication system previously implemented
- Updated from V2 ESP-NOW communication to V3
- Dropped the base64 encode in favor of binary due to less overhead
- -30% overhead on every transmission
- Faster chunked data sending
- File Transfer
- Large console output
- Added new message types for paired devices
- Enables the auth of cross-device commands with a session token created when devices are first successfully paired, and authenticated without directly needing user credentials.
- Dropped the base64 encode in favor of binary due to less overhead
- Notifications
- Notifications can show
- Connectivity changes of:
- WiFi / Bluetooth / ESP-NOW / Paired Device
- Manual command execution
- Shows a notification for command execution
- Shows different text/icons if command is executed on the local device or the paired device
- Shows Success / Failure
- Shows a notification for command execution
- Connectivity changes of:
- Notifications can show
- Added Offline Maps
- Created Map Generator: Link
- This allows the user to download an offline map of a specific area, which can be read by the device.
- Having gone through many iterations, this features many customizable options to reduce feature count, feature complexity, feature name count, and more.
- Added Web Interface and OLED maps interface.
- The web interface is a full color version, nearly identical to what you see when you generate the map.
- The OLED version is much less detailed, given it’s a 128×64 OLED screen. It shows a wireframe sort of view, skipping things like buildings and other features that would cause clutter. Despite this rendering change, its supporting functions work identically to the web interface map since they’re shared.
- Added Waypoint files for each map
- Stores:
- Name of associated map file
- Waypoint names
- Map coordinates per waypoint
- Associated files per waypoint
- Notes per waypoint
- Stores:
- Created Map Generator: Link
- Added Camera + Microphone (Only for specific hardware)
- Added Edge Impulse (Machine Vision)
- I am getting decent results, but the models I train are generally low confidence – something I need to improve. I recommend a model with over 70% confidence to get results that aren’t jumpy.
- Train models with Edge Impulse
- Load the models onto the device and utilize the camera for object detection
- Added ESP-SR Speech Recognition (Voice Control)
- Utilizes the MultiNet 7 English Model
- Commands are integrated into the per file command modules, allowing for automatic command list generation upon startup
- The equivalent to “Hey Alexa” / “Hey Siri” for this is using the default “Hi ESP” – This can be changed later.
- Photo capture and Video streaming
- Microphone capture
- Added Edge Impulse (Machine Vision)
- Added GPS I2C module
- Added live location readings and map route tracking functionality
- Added live location readings and map route tracking functionality
- Added IR Presence I2C module
- Added RTC I2C module
- When added and configured, this can reduce boot times to 1/3rd of what they are otherwise.
- I will be looking at the NTP function soon, it shouldn’t be that high of a impact.
- I will be looking at the NTP function soon, it shouldn’t be that high of a impact.
- When added and configured, this can reduce boot times to 1/3rd of what they are otherwise.
- Added Bluetooth
- Can act as a client and a server
- 4 Max concurrent connections possible – reduced from 6 to save iram
This first release will only be the ‘full fat’ development case, which can accommodate:
- 2x ESP32 Microcontrollers
- Camera + Microphone + SD Card
- Either the I2C OLED or the EYESPI TFT Display
- Features a swappable design – WIP
- Space for every I2C sensor listed in the Hardware Specifications
- Gamepad cutouts for on device controls
- Physical slidable privacy shade to cover sensors when not in use


