IndustrialKit is an open source software platform for creating applications that enable the design and control of automated means of production. The framework provides modules that can be used out of the box, or extended and customized for more targeted use cases.
The primary IndustrialKit framework codebase supports macOS, iOS/iPadOS, visionOS. The IndustrialKit framework has a Base SDK version of 26.0.
IndustrialKit can be installed via SPM. Create a new Xcode project and navigate to File > Add Package Dependences. Enter the url https://github.com/MalkarovPark/IndustrialKit and select the main branch. Next, select targeted project and tap Add Package.
This sample demonstrates a fully assembled, document-based IndustrialKit app. Each document represents a preset description of a robotic complex. The app enables you to design and simulate the complex, as well as program and control the robotic devices within it.
This document-based app provides tools for preparing and deploying production according to user requirements and the underlying technological basis. Each document represents a Standard Template Construct (STC), whose processing enables the implementation of production for a specific product.
ProductionObject defines the means of production that make up the content of a robotic complex. It provides core properties such as an identifier name, spatial data, physical body parameters, and a visual model represented by a RealityKit Entity.
Out of the box, this open class serves as the foundation for Robot, Tool, and Part. Developers can extend it to define additional types of production assets.
Robot represents an automatically controlled, reprogrammable, and versatile manipulator with configurable kinematics and degrees of freedom. A robot operates in spatial coordinates and can sequentially define the position of its end effector.
Robot programming is performed using positional programs (PositionsProgram), each consisting of a sequence of target positions (PositionPoint). Each target position defines:
- Spatial configuration — position relative to the robot’s local coordinate system (
x,y,z) and orientation (r,p,w) - Trajectory smoothing mode (
linearorfine) - Motion speed (mm/s)
Movement of the end effector to a target position is initiated by calling the move(to:) function with a PositionPoint.
Tool describes other types of robotic devices that do not implement the full capabilities of a robot. A tool can function as a standalone device or as a robot end effector mounted via a mechanical interface.
Tool programming is based on operation codes. Each code corresponds to a predefined set of operations or parameters. A sequence of operation codes (OperationCode) forms an operation program (OperationProgram). Available codes are defined by OperationCodeInfo, which includes additional descriptions.
Performing an operation is initiated by calling the perform(code:) function with an Int value representing an OperationCode.
Part represents non-controllable components of a robotic complex. These include both means of production (such as tables, drives, and safety enclosures) and objects of labor, such as raw materials and workpieces that are transformed into finished products.
Robots and robotic devices can be linked to their physical counterparts as digital twins. A digital twin propagates actions from the software instance to the connected device and reflects the real device state back into the virtual model.
Digital twin functionality is enabled by conforming to the DeviceTwin protocol. It includes a pair of components: a model controller and a connector, along with supporting properties and methods.
DeviceMode defines two operating modes:
- Simulation — the device is fully simulated by the
ModelController - Real — the physical device is controlled via a
Connector, while the virtual model remains synchronized
The ModelController base class manages the virtual representation of a device (Entity). Each device type can use its own subclass:
RobotModelControllercontinuously updates the positions of robot links based on the end effector state. Link transforms are defined by an array ofEntityPositionData, generated by theentity_positionsfunction.ToolModelControllerapplies animations to tool components. Animation parameters are stored inEntityAnimationData, generated byentity_animationsbased on the current operation code. Animations are applied usingprocess_animations.
Connector enables communication between virtual and physical devices. It synchronizes device state and transmits commands such as starting or stopping operations.
A connector periodically produces state data (RobotState / ToolState), including:
- Performing state (
PerformingState) - Statistical output (
DeviceOutputData) - Model parameters (link positions or animations)
Connection parameters (ConnectionParameter) may include values of type String, Int, Float, and Bool.
Devices can provide extended output beyond the performing state. This includes:
- Charts (
StateChart) - Nested data arrays (
StateItem)
These are aggregated into DeviceOutputData.
For Robot and Tool, the current output is available via current_device_output, while default values are provided by initial_device_output.
Workspace represents a unified environment for robots, tools, and parts. It stores them in separate collections and provides services for managing, selecting, adding, removing, and controlling them.
Control of the robotic complex is performed by executing programs (ProductionProgram) written in Ithi Macro Assembler (IMA), a pendant-style language transferred from robot level—where execution units are target positions—to system level, where execution units are individual robotic devices.
An IMA program consists of ProductionProgramElement types:
Performers— execute programs or operations on devicesModifiers— update register values, including device dataLogic— control execution flow (branching and jumps)
The workspace includes a configurable array of Float registers. These registers are used to select device programs and parameters. Values are rounded when integer interpretation is required.
Registers can also be populated from DeviceOutputData, using indexed access across flattened StateItem collections.
Support for diverse robot and tool configurations, as well as advanced data processing, is provided through industrial modules (IndustrialModule).
Module types include:
RobotModule— defines aRobotModelController,RobotConnector, and a RealityKitEntityToolModule— defines aToolModelController,ToolConnector,Entity, and supported operation codesPartModule— defines only anEntityChangerModule— defines register update logic for the workspace
Instances of Robot, Tool, Part, and Changer (alias: ChangerProgramElement) can be initialized either directly from a module or by name. Named modules must be registered in internal_modules or external_modules.
Modules can be:
- Internal — compiled into the app for maximum performance
- External — loaded from packages for easier updates
External modules are packaged with extensions (.robot, .tool, .part, .changer) and include:
- A module descriptor (XML)
- Component code
- A USDZ model (except for changers)
External logic (ModelController and IMA Changer) is executed in a JSEnvironment. External connectors are implemented as executable processes communicating via UNIX sockets.
A collection of extensions for working with arrays and dictionaries, JSON transformation, RealityKit Entity manipulation, angle conversions, and color initialization from hex values.
Utility functions for generating unique object names, coordinate transformations, cloning codable objects, interacting with terminal applications, and working with UNIX sockets.
A universal pendant for Workspace and its constituent means of production — Robot and Tool.
SpatialPendant represents a unified control interface of labor, in which the content dynamically adapts depending on the selected production object. It acts as a synthesis of multiple device-specific pendants into a single adaptive interface.
The state of the pendant is determined by the Workspace property:
selected_object— defines the currently selected means of productionselect_object(_:)/deselect_object()— perform selection management
External control over pendant presentation is handled by PendantController.
Manual performing of a means of production is carried out using controls that directly define the state of robotic devices and their representation within the Workspace.
PositionControl is a control element for updating the current position of a robot end-effector.
It is implemented as a virtual ClickWheel, enabling intuitive manual guiding of a manipulator in space.
For fine adjustment, use PositionView, which can also be applied independently to edit arbitrary positions.
OperationControl enables performing a single operation on a Tool via a direct interaction.
In expanded form, the control provides:
- Selection of operation code
- Numeric representation of the code
- Detailed description (if available)
ElementControl provides a mechanism for constructing a program element of the Ithi Macro Assembler (IMA).
In expanded form, it allows flexible configuration of element parameters. During creation, the visual representation of the control evolves, reflecting the forming program structure.
A completed element can be tested by triggering performing at the Workspace level.
For both individual means of labor (Robot, Tool) and composite systems (Workspace), the framework provides pendant content views.
These views represent controls combined with program management in the form of a dynamic program list.
Program formation is achieved through a process analogous to teaching: a control defines the current state (e.g., position or operation), the state is tested and refined, and then recorded into a program as an element (PositionPoint, OperationCode, or ProductionProgramElement).
These assembled views, placed within a FloatingView, form a complete pendant that can be attached to a specific means of production. They collectively define the dynamic content of the SpatialPendant.
Management of the register memory of the Workspace is performed using RegisterDataView.
This view enables:
- Editing register values
- Clearing register contents
- Adjusting the number of registers
Manual selection of registers for IMA program elements is provided by RegistersSelector.
For visual representation of state data of a robotic device — including charts and nested items — the framework provides dedicated views: StateChartsView and StateItemsView.
DeviceOutputView consolidates these data representations into a single interface and provides UI controls for managing and configuring statistical data collection parameters, including synchronization interval and scope type.
This view is available for devices conforming to the StateOutputCapable protocol — out of the box, these are Robot and Tool.
A UI for managing the connection between a virtual robotic device and its physical counterpart, as well as synchronizing the digital twin.
ConnectorView allows switching between simulation and real modes, configuring connection parameters, and performing connection and disconnection operations.
This view is available for classes of means of production conforming to the DeviceTwin protocol. For external connectors, management of the executable process is also supported.
Representation of means of production and other objects is not limited to Entity.
Objects may also be expressed through a system of cards, reflecting their role within the production structure.
BoxCard displays:
- An SF Symbol
- A name (and optional subtitle)
This card emphasizes the form and primary color, highlighting the identity of the object as a unit of production.
GlassBoxCard is a translucent card resembling a thick glass plate.
It can contain:
- A UI image
- A RealityKit
Entity
This card shifts emphasis from color to content, reflecting the internal structure or visual model of the production object.
GitHub is our primary forum for IndustrialKit. Feel free to open up issues about questions, problems, or ideas.
This project is made available under the terms of an Apache 2.0 license. See the LICENSE file.












