The Problem

Managing IoT devices at scale means juggling device connectivity, rule automation, user access, and data visualization—usually with a patchwork of separate tools. OpenRemote addresses this by bundling device management, protocol agents (MQTT, HTTP, and others), rule engines, multi-tenant access control, and a dashboard builder into one platform.

What This Does

This is a fork of the openremote/openremote project (1,875 stars upstream) and appears to be a near-complete copy with no local modifications visible in the file structure. The codebase is a monorepo containing eight self-contained projects, not a single application. The core Java backend lives in manager/ (171 files), with protocol agents in agent/ (493 files) and data models in model/ (399 files). The TypeScript frontend occupies ui/ (713 files) and includes a rules flow editor, map components, and a dashboard builder.

The system supports multi-tenancy via "realms," device auto-provisioning, and rule automation through visual flows, JavaScript, and Groovy. Deployment is container-first: docker-compose.yml at the root and deployment/Dockerfile handle the standard stack, while kubernetes/ (65 files) provides orchestration manifests.

How It Is Wired

The backend entry point is manager/src/main/java/org/openremote/manager/Main.java. The frontend has two entry points: ui/app/manager/src/index.ts and ui/app/insights/src/index.ts. The system is designed to run as Docker containers—the quickstart in the README pulls prebuilt images and runs docker compose up, which is the primary deployment path.

The static analysis mapped 391 internal modules with 588 import edges. The most connected frontend modules are ui/component/or-vaadin-components/src/util.ts and ui/component/storybook-utils.js, each with 25 modules depending on them—changes there have a wide blast radius. The ui/component/or-rules module has 110 modules inside circular dependencies, which makes refactoring the rules editor costly. The backend wiring has not been mapped in this analysis.

How To Use It

Setup: Requires Docker Desktop (v18+). Clone with git clone https://github.com/moses-y/openremote.

Running it: Download the compose file and start the stack:

docker compose pull
docker compose -p openremote up

Access the manager UI at https://localhost (accept the self-signed certificate). Default credentials are admin / secret. To change the host, set OR_HOSTNAME (e.g., OR_HOSTNAME=192.168.1.1 docker-compose -p openremote up -d).

Development: The repo uses Gradle for Java builds and Yarn for the UI. The README references IDE setup and UI development guides but does not document local build commands.

Real-World Use

A city operations team deploys OpenRemote to manage smart streetlights. They connect devices via the MQTT agent, define "when-then" rules in the flow editor to trigger maintenance alerts, organize assets by district using realms for multi-tenant access, and build a public dashboard in ui/app/insights to show live energy consumption.

Code Health & Issues

Static analysis found 407 findings (206 high, 180 medium, 21 low) across five categories: import cycle members (20), deep nesting (24), oversized files (4), high branching density (3), and hub modules (9). The most significant are concentrated in ui/component/or-rules and ui/component/or-mwc-components/src/or-mwc-input.ts (1,067 lines). These are frontend maintainability concerns, not runtime defects.

The code health audit found two high-severity issues:

  • High — Committed .env file at .ci_cd/env/.env. A tracked .env risks leaking live credentials. Remove it from tracking, rotate what it holds, and commit a .env.example.
  • Highcontinue-on-error on a correctness step in .github/workflows/ci_cd.yml (line 661), which can report a green check for a failing test suite.

Medium issues include missing GITHUB_TOKEN least-privilege permissions in three workflows, an unpinned alpine:latest base image in deployment/Dockerfile, no pre-commit secret gate, a 15.5MB devices.csv in test/load1/deployment3/, and persist-credentials not disabled in CI checkout. The repo has tests (335 files), CI, a license, and a lockfile.

The Bottom Line

OpenRemote is a mature, feature-complete IoT platform with a solid containerized deployment story. The codebase is large and the frontend has real maintainability debt, but for a team needing a self-hosted IoT platform with multi-tenancy and rule automation, it is a credible foundation. The fork itself adds no evident value over the upstream project—use the original unless this fork contains specific fixes you need.