Ultralight is built as a small stack of modules that build on top of each other.

## The Engine

Three libraries make up the core engine (see [Linking to the Library](/docs/2.0/linking-to-the-library)).

| Library | What it holds |
|---|---|
| `Ultralight` | The API you program against. Responsible for managing Views, high-level rendering, input translation, compositing, resource policies, and event dispatch. |
| `WebCore` | The HTML/CSS layout engine, our fork of WebKit. It parses resources, applies styles, calculates layout, and turns the result into a tree of paint nodes. JavaScriptCore, WebKit's JavaScript VM, lives here too. |
| `UltralightCore` | Our drawing library, responsible for all low-level graphics routines (paths, fonts, GPU command lists, CPU rasterization, tessellation, image cache, etc.). |

## The App Framework

`AppCore` is optional. It creates platform windows, runs the event loop, forwards input, drives the GPU with stock drivers— everything [Writing Your First App](/docs/2.0/writing-your-first-app) leans on.

You can **skip it** when Ultralight lives inside your own engine or window system. [Integrating into a Game Engine](/docs/2.0/integrating-into-a-game-engine) demonstrates that path, with the handlers you supply yourself in [Setting Up the Platform](/docs/2.0/setting-up-the-platform).

AppCore is built from the reference implementations of the platform handlers in the SDK's **platform** folder (GPU drivers, font loaders, file systems, clipboards, and more), published under the Zlib license so you can copy them straight into your own engine.

## The Page Bridges

Three opt-in header families connect native code to the page. None is pulled in by `<Ultralight/Ultralight.h>`— include the one you use.

- **JavaScript bridge** (`<Ultralight/JS.h>`) — typed bindings between page script and native functions, classes, and promises. Start at [About JavaScript Interop](/docs/2.0/about-javascript-interop).
- **DOM API** (`<Ultralight/DOM.h>`) — documents, elements, styles, and events driven directly from native code, with or without JavaScript. Start at [About the DOM API](/docs/2.0/about-the-dom-api).
- **Data bindings** (`<Ultralight/dom/data/Context.h>`) — markup that keeps itself in sync with your application's data. Start at [About Data Bindings](/docs/2.0/about-data-bindings).

All three are thin C++ layers over the C API, and JavaScriptCore's own C API remains available underneath for code that wants to go deeper ([Using JavaScriptCore Directly](/docs/2.0/using-javascriptcore-directly)).

## The C API

Everything above is available from C as well— `<Ultralight/CAPI.h>` and `<AppCore/CAPI.h>` mirror the C++ surface, and the DOM and data-binding C headers under `<Ultralight/CAPI/>` are separate includes (see [C API Conventions](/docs/2.0/c-api-conventions)).
