Skip to main content

The Five-Runtime Graph Model

A Reaktor application is not a single runtime. It is a distributed system spanning five distinct execution environments, all modeled as graphs and visible in the Blueprint editor.

The Five Runtimes​

RuntimeExecution EnvironmentUpdate PathLatency
Common/KMPNative mobile binaries (Android/iOS) and JVM server JARs.Native release via App Store/Play Store.Days to weeks.
JVM ServerSpring Boot on k3s (GCP VM).Container build and k3s rolling update.30s to 5 min.
JS WorkerCloudflare Workers for Platforms.JS bundle upload to Cloudflare API.< 10 seconds.
JS WebBrowser runtime.JS bundle upload to CDN (Pages or R2).< 30 seconds.
JS MobileHermes JS engine embedded in the native mobile app.JS bundle upload to Cloudflare R2.Minutes to hours.

Graph Coloring and Partitioning​

In the Blueprint editor, every node is visually tagged with its runtime target using a color system that communicates how it can be updated:

  • Common nodes (gray/white): Exist on all targets. These are the slowest to update but the most portable.
  • JVM-only nodes (deep blue): Server-side only. Fast deployment via k3s.
  • JS Worker nodes (orange): Edge-only. Near-instant deployment via Cloudflare.
  • JS Web nodes (cyan): Browser-only. Instant deployment via CDN.
  • JS Hermes Mobile nodes (green): Hot-updatable mobile logic. Deployed via R2 bundle download without an app store review.

Proxy Nodes: ServiceNode and NativeNode​

When graphs cross runtime or language boundaries, two specialized proxy node types handle the translation and infrastructure:

ServiceNode (Remote Edge Proxy)​

Handles communication between graphs on different peers or runtimes. When a Kotlin graph node on mobile calls a JVM server graph node, a ServiceNode is inserted at the boundary. It handles serialization (FlexBuffer), transport (HTTP, Mesh, etc.), retries, and circuit breaking.

NativeNode (Bridge Edge Proxy)​

Handles communication between graphs in different languages on the same device. For example, when a React Native (JS) graph node calls a Kotlin (native) graph node, a NativeNode is inserted at the FFI boundary. It serializes to FlexBuffer, calls through the C++ ABI surface, and manages memory ownership.