# Architecture

The core of the engine is coded in C++, which also determines the native [C++ API](/vr/developers/api/cpp.md#c-plugin-interface). [JavaScript binding](/vr/developers/api/javascript.md) is also available , which gives You the opportunity to real-time “live code” your scenes through a JavaScript console, while You are inside the 3D scene.

![](/files/-LF2a5nPvQ3cyAsa9gnH)

## Core

The core of the engine is very sleek, so it can run on any device (desktop, notebook, tablet, mobile phone, even Raspberry Pi). It consists of **core modules** (shared libraries) which provide base functionality like managing scene, network-synchronization, configuration-, event-, log- and plugin-handling.

### System

This core module takes care of the initialization process in ApertusVR. It starts all **core modules** like Scene, SystemConfig, EventManager, etc. ApertusVR can be started from any program calling System's Start() method.

### CoreConfig

This module loads *ApeSystem.json*, which contains configuration settings for the core modules.\
For more details, please check the [Configuration Ecosystem](/vr/developers/architecture/configuration-ecosystem.md) page.

### SceneManager

This is the **database** where 3D scene elements (nodes and entities) are live. It implements the base **APE types** ie. Node, Light, Camera, etc. It also responsible for **network synchronization** between participants.

### EventManager

EventManager is handling Events in ApertusVR. An event can be a creation of a *geometry* or a change in the position of a *node*. Plugins are able to subscribe for these events.

{% hint style="info" %}
An Ape::Event holds information only about:\
\- **SubjectName** (the unique name of the node, entity, etc.)\
\- **Type** of the event (NODE\_CREATE, CAMERA\_FRUSTUMOFFSET, etc.)\
\- **Group** of the event (node, geometry, light, camera, etc.)
{% endhint %}

### LogManager

Logging is a very basic functionality for any kind of application. It provides logging levels like *info*, *debug*, *trace*, *warning* and *error*.

### PluginManager

Apertus' plugins are handled by this module. It creates a new thread for each plugin and takes care of their life-cycle.

## Plugins

**Plugins** are extending the functionality of the Core, according to your needs/choice. Plugins do not know anything about any other plugin, they only use Apertus interfaces.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://apertus.gitbook.io/vr/developers/architecture.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
