MetaPLC
One web platform to configure, program, deploy, operate, and simulate industrial devices. A personal project built on the .NET stack, used to run the devices in my own homelab.

Interface preview coming soon.
Overview
Getting one automation cell running normally means touching several tools: a vendor IDE to program the controller, a separate SCADA tool to operate it, a separate simulator, and hand-written glue to connect them. MetaPLC is my attempt to do all of it from one place.
For any registered device you can set up its connection and I/O map, write the control logic in the browser, deploy that program to the device over the air, watch live values and alarms, and run a software twin of the device alongside the real one. The twin can also replay recorded production data, which is useful for debugging and for validating a change before it goes near hardware.
Today it drives the ESP32-based devices in my homelab. The same workflow is meant to scale up to larger industrial controllers later.
Architecture
The backend is ASP.NET Core on .NET 8, with a Blazor Server UI and SignalR pushing live device state to the browser. Data access is EF Core against PostgreSQL. Devices talk to the platform over MQTT through a Mosquitto broker, and firmware updates are delivered over the air.
The codebase is organised with Clean Architecture and domain-driven design: separate Domain, Application, Infrastructure, and Api layers, with a set of architecture tests that fail the build if a layer reaches somewhere it should not. The whole thing runs as a Docker container next to the rest of my home server stack, reusing the broker, database, and reverse proxy that are already there.
Status
In active development, built in vertical slices. The core path works end to end: registering a device, writing and deploying a program, seeing live I/O, and replaying recorded data through the twin. Real ESP32 hardware bring-up, including firmware with over-the-air updates and USB provisioning, is done.
Current work is on device introspection, so a device reports its own capabilities and the platform builds the right I/O map from them. Authentication, CI, and broader hardening come after that.