An open-source, local-first desktop status matrix powered by an ESP32, TCA9548A I2C multiplexer, and up to eight SH1106 OLED displays.
Each screen can show an independent widget: system metrics, local service health, Git information, timers, custom webhook data, or optional adapters for AI development tools.
Important
This project is in the early design stage. Hardware pinouts, protocols, and software architecture may change before the first stable release.
- Support 1-8 independent SH1106
128x64OLED displays. - Use a TCA9548A multiplexer for displays that share I2C address
0x3C. - Keep authentication, log parsing, and data collection on the computer.
- Keep ESP32 firmware lightweight and independent from specific data sources.
- Add community widgets without requiring firmware changes.
- Avoid mandatory cloud services and telemetry.
flowchart LR
A["Local Data Sources"] --> B["Python Relay"]
B --> C["Widget Formatters"]
C --> D["WebSocket Protocol"]
D --> E["ESP32"]
E --> F["TCA9548A"]
F --> G["OLED CH0-CH7"]
The local relay will normalize widget data into a generic screen payload:
{
"screens": [
{
"channel": 0,
"title": "CPU USAGE",
"value": "42%",
"status": "live",
"alert": false,
"msg": ""
}
]
}The ESP32 only renders screen data. It does not need to understand the original data source.
| Widget | Default Data Source |
|---|---|
| Clock | Local time |
| Focus Timer | Relay timer |
| CPU Usage | psutil |
| RAM Usage | psutil |
| Disk Usage | psutil |
| Network Activity | psutil |
| Git Branch | Local Git repository |
| Git Dirty Files | Local Git repository |
| Local Service Health | HTTP health checks |
| Custom Webhook | Local REST endpoint |
| Custom JSON File | Local file |
| Pending Approvals | Optional tool adapters |
Optional experimental adapters may be added for AI development tools when reliable local APIs or log sources are available.
| Component | Quantity |
|---|---|
| ESP32 development board | 1 |
| TCA9548A I2C multiplexer | 1 |
SH1106 128x64 OLED display |
1-8 |
| USB cable or power supply | 1 |
| Wires or custom PCB | As required |
| ESP32 | TCA9548A |
|---|---|
3.3V |
VIN |
GND |
GND |
GPIO 22 |
SCL |
GPIO 21 |
SDA |
Connect each OLED to a separate TCA9548A channel:
| OLED | TCA9548A Channel |
|---|---|
| OLED 1 | SC0 / SD0 |
| OLED 2 | SC1 / SD1 |
| OLED 3 | SC2 / SD2 |
| OLED 4 | SC3 / SD3 |
| OLED 5-8 | SC4 / SD4 through SC7 / SD7 |
Displays may share power and ground. Each display must use a separate TCA9548A
channel because SH1106 modules commonly use the same I2C address: 0x3C.
ai-dev-dashboard-matrix/
|-- firmware/ # ESP32 PlatformIO firmware
|-- relay/ # Local Python relay
| |-- collectors/ # Data-source adapters
| |-- widgets/ # Widget formatters
| `-- webui/ # Desktop configuration UI
|-- docs/
| |-- wiring.md
| |-- protocol.md
| `-- custom-widget.md
|-- examples/
|-- CONTRIBUTING.md
|-- SECURITY.md
|-- LICENSE
`-- README.md
- Local-first operation.
- No mandatory cloud account.
- No telemetry by default.
- Tokens and credentials must never be sent to the ESP32.
- Local web endpoints should bind to
127.0.0.1by default. - LAN WebSocket access should require authentication before stable release.
- Define the generic
screens[]protocol. - Implement TCA9548A firmware with 1-8 OLED support.
- Build the local Python relay.
- Add a desktop web configuration UI.
- Add at least 10 built-in widgets.
- Document custom widget development.
- Publish BOM and wiring diagrams.
- Add enclosure and PCB design files.
- Run hardware integration tests.
- Prepare the first tagged release.
Maintained by MiinkLab.
Licensed under the MIT License.