NXT Control Room is the operations dashboard for NXT. It is the central tool for managing mini-grid infrastructure - from grid sites and hardware to user accounts, payments, and field commissioning workflows.
- Grid, site, and hardware management
- Real-time meter interaction queue via Socket.IO
- Geo editor for draft grid designs (with webhook integration)
- LoRaWAN meter troubleshooting via ChirpStack
- User and organisation account management
- Flutterwave payment operations
- Grafana-embedded analytics dashboards
- Mapbox-based mapping and geo tools
- Bulk meter import and testing tools
- Offline clear-tamper token generation
| Layer | Technology |
|---|---|
| Framework | Vue 3 |
| Build tool | Vite 6 |
| State management | Pinia |
| Routing | Vue Router |
| Styling | Sass |
| HTTP | ky |
| Real-time | Socket.IO |
| Geo | Mapbox GL JS, Turf.js |
| Backend | Supabase |
| Shared UI | NXT UI Components |
- Node.js — use the version in
.nvmrc(managed via NVM) - A running instance of the NXT backend (or a local Supabase setup)
NXT Control Room shares UI components and libraries with the other NXT front-end apps via NXT UI Components. Clone it as a sibling of this project:
git clone https://github.com/nxtgrid/nxt-ui-components.git ../nxt-ui-componentsnvm use
npm installThe
jsconfig.jsonpath alias@nxt/*already points to../nxt-ui-components/shared, so NXT UI Components is available automatically in local development without any additional build step.
Copy .env.example to .env and fill in your values:
cp .env.example .envSee .env.example for a full description of each variable, including the optional ones for Socket.IO, ChirpStack, and geo webhook integrations.
Use .env.local to override the relevant settings when running Supabase locally:
VITE_API_URL="http://localhost:80"
VITE_SUPABASE_REFERENCE_ID="local"
VITE_SUPABASE_ANON_KEY="<key from `supabase start`>"npm run dev| Script | Description |
|---|---|
npm run dev |
Start the Vite dev server with hot-reload |
npm run build |
Compile and minify for production |
npm run preview |
Preview the production build locally |
npm run lint |
Lint all JS and Vue files |
npm run lint:fix |
Lint and auto-fix |
All commits are linted via Husky + lint-staged. If you encounter a "command not found" error on commit, see the Husky troubleshooting guide.
If you use a GUI Git client like GitKraken, set the project's Git hooks path to an absolute path rather than the default relative ./husky.
See CONTRIBUTING.md.
Bobby Bol ([email protected]) — author & maintainer
See AUTHORS.md for the full list of authors and CONTRIBUTORS.md for all contributors.
This project is licensed under the Mozilla Public License 2.0 (MPL 2.0). See LICENSE for the full text.
Repository: https://github.com/nxtgrid/nxt-control-room
Third-party licenses: Dependencies include NXT UI Components (nxt-shared) and its npm tree; those packages have their own terms. See the NXT UI Components README, section Third-party licenses.