One self-hosted system for a plant. Devices on the network, operator screens, alarms, history, production accounting, and the workflows between them. Same object tree, same API, same console — on your server or in your cloud.
Website: ispf.ai · Demo: demo.iot-solutions.ru · Repo: github.com/iot-solutions-ru/ispf
On a typical site those jobs are five products and a year of integration. Here a device, a dashboard, an alert rule, a correlator, and a BPMN workflow are nodes of one tree, and you talk to all of them the same way. Orchestration and twin logic sit on SINGLETON or INSTANCE hubs. A DEVICE node is the driver and the telemetry, nothing else.
Business logic lives on the platform — models, variables, events, functions, and workflows. The core ships generic engines; solutions are declarative configuration (bundle deploy), not core forks. See architecture.
Industry apps ship as React SPAs at /apps/<appId>/ — not pages inside the admin console. Live gallery: demo.iot-solutions.ru (admin / admin).
Field and IoT. 162 driver packs: Modbus, OPC UA, S7, MQTT, SNMP, BACnet, IEC-104, DNP3, JDBC, and a long tail of lab codecs. 114 are marked PRODUCTION. In this repo that word means a codec plus a loopback test, not a signed plant pilot. The protocols we stand up in the interop lab are the usual industrial set. Maturity, protocol by protocol: drivers.
SCADA. Mimic editor in the browser, 218 P&ID symbols (valves, pumps, tanks, pipes, electrical), a symbol bound to a variable, and a command back to the device from the same screen. Dashboards for trends, tables, maps, and spreadsheets. Operator mode is the same screens without the admin tree. Symbol library: scada.
Alarms and shift processes. A CEL condition on a variable fires an event. A correlator can start a BPMN workflow from that event. The workflow waits on an operator in the work queue, calls a function, or branches. A trip, a work order, and an escalation are the same mechanism. automation · workflows.
History. The screen reads the last value. Trends and shift reports read the historian. Local profile is a file H2 database. In production the hot tier is PostgreSQL/Timescale (about a week of operator trends), the warm tier is ClickHouse, and cold export is Parquet. Cassandra stays experimental. historian tiers.
MES. Lines, shifts, OEE, batches, SPC, and dispatch are configuration on the tree. The catalog bundle mes-platform carries dispatch, OEE, batch, and quality; mes-oee-reference is the separate OEE reference. The model follows ISA-95. The operator opens them as dashboards of one app (?mode=operator&app=mes-platform). MES · platform reference.
The shop floor’s side of ERP. Orders, batches, yield, and what the shop has to tell the office. Catalog bundles cover ISA-95 contours for a core plant, pharma, printing, APS, and CMMS. Where a demo exchanges data with an accounting system, the bundle says the exchange is simulated. A live 1C or SAP connector is not shipped.
Twins and ready sites. An INSTANCE hub is a twin with its own logic: a farm, a warehouse, a store, a tank farm, a CHP. The operator UI for those is a React app at /apps/<appId>/, built outside this repo and installed as a ui-pack. The pictures above are that gallery. Live catalog: marketplace.ispf.ai.
People, tenants, other sites. TOTP, rights down to a variable, separate tenants, an audit log. Federation when a second site has to see the first. Helm, and an ARM image when the box is in the field rather than in the server room. security · deployment.
Assistant. You write the task in the console. The agent lays out devices, screens, and rules, shows each step, and waits for an OK before it writes. 67 regression scenarios cover that path. ai-development.
How a solution leaves the laptop. ispf pack or a bundle deploy. Or Application Git: pull a release, push a branch, open a PR (ADR-0063). Logic stays in hub functions and binding rules. Widgets only display variables.
A code-verified read against Ignition, PI, Opcenter, and the rest is the competitive scorecard (about 8.0 / 10 as of the September 2026 audit). First hour on the product: learn · по-русски.
| Job | Where it lives |
|---|---|
| One address space for tags, screens, and processes | Object tree, CEL bindings |
| Operator screens, not only a protocol gateway | Explorer, operator mode, SCADA mimics |
| An alarm that starts real work | Alert rule → correlator → BPMN |
| A plant solution without a fork of the server | Bundle + ui-pack |
| The tree in git | ispf pack, or Application Git |
| A stack you can patch yourself | Java 25, Spring Boot 4, React 19, PostgreSQL |
Portable zip (JDK 25): download ispf-*-portable.zip from GitHub Releases, unzip, then start.bat (Windows) or ./start.sh (Linux/macOS).
Uses an embedded H2 file DB (no PostgreSQL to install). After first start: data/ispf-local.mv.db next to the JAR.
Container (GitHub Packages):
docker pull ghcr.io/iot-solutions-ru/ispf-server:latest
docker run --rm -p 8080:8080 -v ispf-data:/opt/ispf/data ghcr.io/iot-solutions-ru/ispf-server:latestOpen http://localhost:8080 — login admin / admin. Operator HMI: http://localhost:8080?mode=operator
Requirements: JDK 25, Node.js 20+, Docker optional (Postgres/NATS/Keycloak for fuller stacks).
# API — local profile (H2, no OAuth; syncs a small set of dev driver packs)
./gradlew :packages:ispf-server:bootRun --args="--spring.profiles.active=local"
# Web console (separate terminal)
cd apps/web-console && npm install && npm run dev| URL | Purpose |
|---|---|
| http://localhost:8080 | Admin console (all-in-one JAR) |
| http://localhost:5173 | Admin console (Vite dev) |
| http://localhost:8080?mode=operator | Operator HMI (all-in-one JAR) |
| http://localhost:5173?mode=operator | Operator HMI (Vite dev) |
| http://localhost:8080/api/v1/info | Version / capabilities |
| http://localhost:8080/actuator/health | Health |
Full guide: Getting started · Начать работу
Avoid a cold
./gradlew teston first day — it builds the full driver matrix and can take a long time. PreferbootRun+ the console, or./tools/ci/pr-fast.sh/.\tools\ci\pr-fast.ps1before a PR.
| Path | Purpose |
|---|---|
root.platform.devices.demo-sensor-01 |
Virtual sensor + alarm |
root.platform.dashboards.demo-sensor |
HMI dashboard |
root.platform.alert-rules.temperature-threshold-exceeded |
CEL alert rule |
root.platform.correlators.alarm-handler-on-threshold-event |
Correlator → workflow |
root.platform.workflows.demo-alarm-handler |
BPMN demo |
root.platform.devices.snmp-localhost |
SNMP agent |
Start here: Learn ISPF · Try ISPF (≈15 min) · Docs hub by role
| English (canonical) | Русский | |
|---|---|---|
| Learn | learn.md | learn.md |
| Hub | docs/en/readme.md | docs/ru/readme.md |
| Product | product.md | product.md |
| Getting started | getting-started.md | getting-started.md |
| Architecture | architecture.md | architecture.md |
| Drivers | drivers.md | drivers.md |
| Applications / Git | applications.md | applications.md |
| Solution developer | solution-developer-guide.md | solution-developer-guide.md |
| API | api.md | api.md |
| License | license.md | license.md |
| Roadmap | roadmap.md | roadmap.md |
More: operator guide · anti-patterns · glossary · ADRs · doc hub
iot-solutions-platform-framework/
├── packages/ # Core, CEL, drivers, server (Spring Boot)
├── apps/web-console/ # React admin + operator UI
├── examples/ # demo-app, MES/HVAC references, labs
├── docs/en · docs/ru # Canonical EN + Russian docs
├── site/ # Project GitHub Pages (EN + RU)
├── deploy/ # Compose, VPS, Grafana, edge
└── docker-compose.yml
GNU Affero General Public License v3.0 — platform (ispf-server, web-console, core packages).
Optional Enterprise dual-license: LICENSE-COMMERCIAL.md · commercial licensing.
Driver packs and application bundles may use separate terms. Details: license · NOTICE.
Issues and PRs welcome — especially driver/HMI bugs, docs fixes, and real-plant pilot feedback.
Notable product changes go in CHANGELOG.md ([Unreleased] until the next version bump). See CONTRIBUTING.md.
If ISPF helps your project, a GitHub ★ helps others discover it. For OT / integrator discussions, open an issue with your stack (protocols, historian size, HMI constraints).














