← Back
agentthink

agentthink/next-scada-hmi

一个开源工业 SCADA/HMI 平台,支持可视化组态、实时数据绑定、报警、趋势曲线和自定义组件。

View on GitHub ↗
Stars
6
Forks
1
Watchers
6
Open issues
0
Contributors
0
Language
TypeScript
License
GNU Affero General Public License v3.0
Default branch
main
Created Oct 1, 2026Updated Oct 1, 2026

Star growth

Today—
This week—
This month—

Star history will appear here once this repo has been tracked for a couple of days.

README

NEXT HMI

Your plant deserves better than a panel from 2009.

License: AGPL v3 Docker Releases Docs

NEXT HMI replaces proprietary HMI/SCADA panels with one self-hosted server: your PLCs on OPC-UA in, live operator screens in any browser out, and the whole project as plain JSON and CSV your team can diff, review and version.

No seat licences. No tag counts. No feature paywall — historian, alarms with acknowledgement, recipes, users and permissions are all in this build, and there is no licence check in it at all.

The NEXT HMI in-browser page editor: the page tree on the left, a live fill-line dashboard in the middle, and the property panel on the right binding each card to an OPC-UA tag.


Get it running

Two ways in, same runtime, same project folder — so what you try on your laptop is what runs on the line. Both boot with a seeded example project, so there is something to click before you have a PLC connected.

1 · Docker — servers and anything with a container runtime

docker run -d --name nexthmi -p 8000:8000 -p 8443:8443 \
  -v nexthmi-data:/data ghcr.io/mpnvdlee/next-hmi:latest

Open http://localhost:8000. The image is multi-arch (linux/amd64 + linux/arm64); swap :latest for a version tag such as :1.0.0 to pin a release.

Both ports are published on purpose: turning on HTTPS in Settings moves the app to 8443 and leaves 8000 redirecting there. Map them one-to-one.

With compose instead — docker-compose.yml at the repo root binds ./project-data to /data:

docker compose up -d

2 · Portable zip — panel PCs, Windows and Apple-silicon Macs

Download nexthmi-windows-x64-<version>.zip or nexthmi-macos-arm64-<version>.zip from the Releases page, unzip anywhere you can write, and double-click nexthmi.exe or nexthmi.command. No installer, no admin rights, no Python or Node on the host. A terminal opens and prints the URL to visit.

These builds are unsigned, so the OS asks once — Gatekeeper on macOS, SmartScreen on Windows. The one-time steps are two lines each. The zip also carries the full guide as an offline HTML site in docs/ beside the executable.

There is no portable Linux build; on Linux, use Docker.

First launch — one password, then you are in

  1. Set the device-admin password on the manager dashboard. It gates the whole installation — the dashboard, and every project's runtime and editor.
  2. Start the seeded project, then open its runtime or its editor.

A new project carries no accounts of its own beyond the anonymous guest, and nothing ships with a default credential. Add real users when you want them, from the editor's Users area.

Full install reference — runtime home, HTTPS, environment variables, upgrades: docs/user/install.md.

Want to hear when a new version ships? Subscribe to release announcements — or just watch this repository.


What it looks like

One project — a bottling line — from the screens an operator touches back to the editor that builds them. Click any shot for full size.

The same dashboard on a laptop at 1440 px, a tablet at 900 px and a phone at 390 px: the KPI strip, OEE ring, active batch and line flow reflow to each width. One page, every screen — laptop, panel PC, tablet and phone off the same layout. No second project for mobile. The widget gallery on a dark theme: PLC-writing inputs — stepper, text field, dropdown, segmented control and toggle — above indicator rings, gauges, sparklines and a trend chart, all in the theme's blue accent. Themeable to the token — every built-in widget reads its colour, radius and spacing from theme tokens. Swap the theme, not the pages.
The add-widget dialog: categories on the left, cards for custom widgets and reusable components on the right, each with a description, over the live editor and its property panel. Widget catalogue — built-ins, your own custom widgets and reusable components, searchable in one picker. The alarm editor: the alarm tree grouped by machine area, a live popup and detail-dialog preview in the middle, and the property panel with code, level, trigger source, limits and resolutions. Alarm authoring — the popup and detail dialog preview live beside the definition driving them.
The project manager: one project card showing its folder path, running state, default and MCP toggles, and buttons to open, edit, export, transfer or stop it. Project manager — many projects per server, each a folder you can export, transfer to another box or pull from a peer. The variable picker: a datasource tree with Machine expanded to Tanks showing T1Level, T1Volume, T1Temp and CIP nodes with their data types and RW badges, a required-type chip reading Integer / Float / Boolean, and the selected variable summarised on the right. Variable picker — browse the live node tree, filtered to the types the field accepts, wherever a binding is asked for.

The longer walkthrough — the editor, the property panel and its 27 sources, the OPC-UA wizard, recipes, translations and theming — is at next-hmi.com/tour.


What you get

  • In-browser editor — pages, datasources, alarms, translations and users at /editor/<project>/, with a live preview. No engineering workstation, no dongle.
  • OPC-UA out of the box — an asyncua client pool subscribes, writes and browses, viewport-aware so the tags on screen update first.
  • Git-native projects — every artifact is JSON or CSV on disk, so your change control already works and a project moves as a folder or a zip.
  • Property sources — 27 composable sources ($var, $if, $switch, $loc, $viewport, …) that nest, so no property needs a script.
  • Custom widgets — drop a .tsx into custom-widgets/ and it hot-compiles. No Node toolchain, no rebuild of the core.
  • AI-driven engineering — a built-in MCP server exposing 30+ read/write tools, with dry-run diffs guarding every destructive change.
  • Responsive by project — one project branches layout by viewport class, so the maintenance engineer's phone is not a second project to keep in step.

One binding language covers every property on every widget:

// colour the gauge from the live motor temperature
"color": {
  "$if": {
    "cond": { "$compare": [ { "$var": "PLC1:motor1.temp" }, ">", 120 ] },
    "then": "#e5484d",
    "else": "#2563eb"
  }
},
"label": { "$loc": "MotorSpeed" },
"value": { "$var": "PLC1:motor1.speed" }

Built on FastAPI · React · OPC-UA · asyncua · Python 3.14 · Node 22+.


Build from source

Requirements: Python 3.14 (>=3.14.2, <3.15) and Node 22+.

git clone https://github.com/mpnvdlee/next-hmi.git
cd next-hmi

python3 -m venv .venv && source .venv/bin/activate
pip install -r backend/requirements.txt
cd frontend && npm install && cd ..

python start-dev.py       # app on :8000 (Vite with HMR), API on :8001

Stop with Ctrl-C, or python start-dev.py --stop to free :8000/:8001 from another shell. Tests and linters: pytest backend/tests, ruff check backend, and npm test / npm run lint / npm run build from frontend/.

Documentation

  • User guide (docs/user/) — building dashboards, connecting OPC-UA, alarms, theming. Also shipped behind the editor's Help button.
  • Contributor reference (docs/dev/) — architecture, REST and WebSocket protocols, the custom-widget SDK, theming tokens, and the MCP server.

Contributing

Fork, branch, keep the diff focused and tested, then git commit -s — the sign-off is how you accept the CLA, and it is the only step. Open a pull request describing the why. Details in CONTRIBUTING.md; participation is governed by the Code of Conduct. Bugs and ideas belong in a GitHub issue.

Security

NEXT HMI writes to PLCs and is meant to run on a trusted OT network behind a VPN, never exposed to the public Internet — read Network placement and threat model before putting it on any network. Report vulnerabilities privately via SECURITY.md; never open a public issue for one.

Licence

AGPL-3.0-or-later across the whole repository — no dual-licensed core, no per-file carve-outs, no licence check in the build. Run it at any scale, commercially, for as many operators and tags as the plant has.

The project content you author — pages, themes, translations, datasources, custom widgets — is your own work and is not covered by the copyleft; that is written down in LICENSE-EXCEPTION.md rather than left to interpretation. Hand a build to someone outside your organisation and the AGPL asks you to offer them the corresponding source; a commercial licence is the alternative to doing that. A separate proprietary enterprise build adds an audit trail for regulated plants — see next-hmi.com/licensing.