A modern, modular web platform for monitoring and controlling heterogeneous robotics and autonomous systems in real-time. ORMI offers a unified interface for managing multiple robotic platforms, leveraging a scalable architecture constructed with modern web technologies.
The Robotics and Autonomous Systems Laboratory develops ORMI at the Royal Military Academy of Belgium. The platform addresses the need for flexible, responsive human-machine interfaces that can adapt to diverse robotic systems while maintaining high performance and reliability.
The architecture supports multiple data sources, including ROS2 systems through ROSBridge Suite and Foxglove WebSocket protocol, direct drone control via Tello drones, and custom data providers. Widgets and dashboards are fully customizable through a plugin-based system.
Lidars and maps
Map with path and video feedback
Different workspaces
New workspaces and layouts
Widgets

- Multi-Platform Support: Integrate with ROS2, Tello drones, REST APIs, and other robotics platforms
- Real-Time Communication: WebSocket and WebRTC for low-latency data streaming
- Modular Plugin System: Extend functionality with custom datasources and widgets
- Responsive Design: Works across desktop and mobile devices with theme customization
- 3D Visualization: Native Three.js integration for spatial data representation
- Dashboard Customization: Drag-and-drop interface to create tailored monitoring layouts
- Database Integration: Prisma ORM with PostgreSQL for persistent data storage
The project is organized as a monorepo using Turbo and Bun workspaces:
apps/web - Next.js web application
packages/
ormi-core - Core library for widgets, datasources, and transformations
ormi-jsonforms - JSON Forms integration
ormi-plugins - Plugin system framework
ui - Shared UI component library
utils - Utility functions and CLI tools
eslint-config - Shared ESLint configuration
typescript-config - Shared TypeScript configuration
plugins/ - Feature plugins
ormi-rosbridge-suite - ROS2 ROSBridge integration
ormi-foxglove - Foxglove WebSocket protocol support
ormi-tello - Tello drone control
ormi-std-widgets - Standard widget collection
ormi-flight-indicator - Flight dynamics visualization
ormi-randoms-datasources - Test data generation
ormi-rest-bags - REST API data sources
teodor-emi-extension - Military-specific extensions
postgres/ - Database initialization
- Frontend: Next.js, React, TypeScript, TailwindCSS
- Backend: Node.js, Prisma ORM, PostgreSQL
- Build Tools: Turbo, Bun package manager
- UI Components: Radix UI, Shadcn/ui
- 3D Graphics: Three.js
- Real-Time Communication: WebSocket, WebRTC
- Robotics Integration: ROS libraries, Foxglove protocol
- Docker and Docker Compose
- Git
The easiest way to get ORMI running is using Docker Compose, which handles all dependencies including the database.
- Clone the repository and navigate to the project directory:
git clone <repository-url>
cd ORMI-CORE- Set up environment variables by creating a
.envfile inapps/web:
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=__YOUR__SUPER__MAGNIFICIENT__SECRET__
DATABASE_URL=postgresql://ormi_user:ormi_password@postgres:5432/ormi_db
NEXT_PUBLIC_APP_URL=http://localhost:3000- Start the application with Docker Compose:
docker-compose up -dThe application will be available at http://localhost:3000 and PostgreSQL will be running on localhost:5432.
- Stop the application:
docker-compose downFor development without Docker, you need Bun and PostgreSQL installed locally.
- Install dependencies:
bun install- Set up environment variables in
apps/web/.env:
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=__YOUR__SUPER__MAGNIFICIENT__SECRET__
DATABASE_URL=postgresql://USER_DB:USER_PSW@localhost:5432/ORMI_DATABASE_NAME
NEXT_PUBLIC_APP_URL=http://localhost:3000- Initialize the database:
cd apps/web
bun run db-generate
bun run db-migrateStart the development server with Turbo:
bun run devThe application will be available at http://localhost:3000.
If you hit an error like "OS file watch limit reached", increase the inotify limits:
sudo sysctl -w fs.inotify.max_user_watches=524288
sudo sysctl -w fs.inotify.max_user_instances=1024To make it persistent:
sudo tee /etc/sysctl.d/99-inotify.conf > /dev/null <<'EOF'
fs.inotify.max_user_watches=524288
fs.inotify.max_user_instances=1024
EOF
sudo sysctl --systemIndividual package development:
cd packages/ormi-core
bun run devBuild all packages:
bun run buildBuild specific package:
cd packages/ormi-core
bun run buildGenerate Prisma client:
cd apps/web
bun run db-generateRun migrations:
cd apps/web
bun run db-migrateOpen Prisma Studio for database inspection:
cd apps/web
bun run db-studioReset database:
cd apps/web
bun run db-resetThe plugin system allows extension of datasources and widgets. Create a new plugin using:
bun run createA basic plugin structure includes:
- Datasource provider for connecting to external systems
- Widget definitions for UI components
- Export configuration for registration
Plugins are automatically discovered and loaded into the plugin manager at runtime.
Lint code across all packages:
bun run lintFormat code with Prettier:
bun run formatCritical variables for apps/web/.env.local:
DATABASE_URL: PostgreSQL connection stringNEXTAUTH_SECRET: Authentication secretNEXTAUTH_URL: Application URL for OAuth callbacksNEXT_PUBLIC_APP_URL: Public application URL
Customize the application appearance in apps/web/config/site.ts. This includes site name, description, branding, and contact information.
Comprehensive documentation is available in the application at /docs route and source files in apps/web/content/docs.
API documentation for creating custom widgets and datasources is maintained in the docs section.
Robotics and Autonomous Systems Laboratory Royal Military Academy of Belgium Avenue De La Renaissance 30 1000 Brussels, Belgium
Website: https://mecatron.rma.ac.be
This project is maintained by the Royal Military Academy of Belgium and is licensed under the Apache License 2.0. See LICENSE for details.
If you use this software in academic work, please cite it. See CITATION.cff.
Contributions are welcome. Please ensure code follows project standards and passes all linting and type checks before submitting pull requests.