Quick Start

By the end of this page you have the full UI stack running: a policy that creates one root layout per local player, tag-keyed layers registered on it, and a HUD layout pushed onto the Game layer at startup. Every screen you build later is a two-line push onto this stack.

Prerequisites
A UE 5.8 project. The plugin ships ready-made policy, root layout, HUD layout, dialog, context-menu, and input assets - you assign them below instead of building from scratch (the manual route lives in How-To: Build the Boot Assets by Hand). CommonUI, EnhancedInput, and ModelViewViewModel are engine plugins that enable automatically with CrimsonUI.

1. Enable the plugin

Open Edit -> Plugins, type Crimson in the search box, tick CrimsonUI's checkbox (and CrimsonCommon, its dependency), and restart the editor when prompted. For a Blueprint project that is the entire install - you never hand-edit the .uproject or any .Build.cs.

Edit -> Plugins -> search 'Crimson' -> tick CrimsonUI's Enabled checkbox -> restart the editor.

C++ projects: after enabling the plugin, add its module to your build file so your game code can use its types:

csharp
// YourGame.Build.cs
PublicDependencyModuleNames.Add("CrimsonUI");
PublicDependencyModuleNames.Add("CrimsonCommon"); // policy/layout base layer
Verify
CrimsonUI shows as enabled in the Plugins window and the editor restarts without errors.

2. Set the Game Instance and Local Player classes

The UI manager boots off two classes from CrimsonCommon. UCrimsonCommonGameInstance broadcasts player-added/removed events the manager subscribes to; UCrimsonCommonLocalPlayer is the local-player type the manager requires (players of any other class are silently ignored). UCrimsonCommonGameInstance is Abstract, so make a subclass first.

Content Browser -> Blueprint Class -> parent = Crimson Common Game Instance -> name it BP_GameInstance. Then Project Settings -> Maps & Modes -> Game Instance Class = BP_GameInstance.
Skip this and nothing ever appears
UCrimsonUIManagerSubsystem casts the game instance to UCrimsonCommonGameInstance to hear about players, and only creates a layout for local players that are UCrimsonCommonLocalPlayer subclasses. Wrong class on either = no layout, no widgets, no error message.
Verify
Project Settings -> Maps & Modes shows your game instance; DefaultEngine.ini has the LocalPlayerClassName line.

3. Set the viewport client

UCrimsonGameViewportClient (a UCommonGameViewportClient) drives hardware vs software cursor from the Platform.Trait.Input.HardwareCursor platform trait. CommonUI needs a UCommonGameViewportClient for its input routing, so set it even if you never touch cursors:

Edit -> Project Settings -> Engine -> General Settings -> Default Classes -> Game Viewport Client Class = Crimson Game Viewport Client.

Open Edit -> Project Settings -> Engine -> General Settings, expand the Default Classes section, and set Game Viewport Client Class = Crimson Game Viewport Client. The editor prompts to restart - accept it, because the viewport client class is only swapped in on startup. No .ini editing needed; the picker writes the same GameViewportClientClassName line for you.

Verify
PIE still launches normally. CommonUI input routing (step 4) depends on this class.

4. Give CommonUI its Click and Back actions

CommonUI's action router needs a Click and a Back input action to drive activatable widgets. Those are configured inside a UCommonUIInputData asset, and the plugin ships one - Crimson_CommonUIInputData - with its Click and Back already set to Crimson_IA_UI_Confirm / Crimson_IA_UI_Back. Assign it to the Input Data field in Project Settings -> Game -> Common Input Settings (or the ini in the C++ tab) and enable Enhanced Input support, so glyphs resolve from live key bindings and update on rebind. (The other shipped actions - Crimson_IA_UI_Escape / Next / Previous - are yours to bind wherever you like.)

Project Settings -> Game -> Common Input Settings: Input Data = Crimson_CommonUIInputData (which already sets the Click/Back actions), Enable Enhanced Input Support = true.

Open Project Settings -> Game -> Common Input Settings. Set Input Data = `Crimson_CommonUIInputData` - the shipped asset already has its Click and Back actions set to Crimson_IA_UI_Confirm / Crimson_IA_UI_Back - and tick Enable Enhanced Input Support. The picker writes the same DefaultGame.ini lines for you - no file editing needed.

Registering the actions is only half of it - Enhanced Input still needs to know which keys trigger them, or nothing happens when the player presses a button. Create an Input Mapping Context (Content Browser -> right-click -> Input -> Input Mapping Context, e.g. IMC_UI) and map keys to the shipped actions: e.g. Space Bar + Gamepad Face Button Bottom -> Crimson_IA_UI_Confirm, Escape + Face Button Right -> Crimson_IA_UI_Back (and keys for Crimson_IA_UI_Escape / Next / Previous). Then add that context to the local player:

In your PlayerController Blueprint: Event BeginPlay -> Is Local Player Controller (Branch, True) -> Get Enhanced Input Local Player Subsystem -> Add Mapping Context (Mapping Context = IMC_UI, Priority = 100). Pick a priority above your gameplay contexts, and in IMC_UI untick Consume Input on any UI mapping whose key overlaps a gameplay action.

Priority and Consume Input decide glyphs vs gameplay
Both triggering and key glyphs depend on IMC_UI being added: a CrimsonActionWidget/Bound Action Button resolves its icon by querying the keys mapped to the action, which only works once the context is added to the EnhancedInputLocalPlayerSubsystem. Add it at a higher priority than your gameplay contexts, and set each UI mapping's Consume Input toggle to off where its key overlaps a gameplay key - so glyphs resolve and the UI reacts while the same key still reaches gameplay. The platform controller-brush data (CommonInput_KeyboardMouse, CommonInput_Gamepad_*, all shipped) must also be registered as +ControllerData= under the platform's CommonInputPlatformSettings, or glyphs render blank.
Legacy path
The same Crimson_CommonUIInputData asset also carries the legacy DefaultClickAction / DefaultBackAction (DataTable-based) fields, used when Enhanced Input Support is off. The Enhanced Input path (support on) is recommended for new 5.8 projects - it resolves live key bindings for glyphs. bEnableEnhancedInputSupport also unlocks the EscapeInputAction binding in How-To: HUD Layout & Escape Menu and per-layer input domains via an ActionDomainTable (see Concept: Input Routing & Activatable Widgets).
Verify
Input Data is set to Crimson_CommonUIInputData, and IMC_UI (mapping keys to its Click/Back actions) is added to the player. Routing is exercised the first time you push an activatable widget (step 7) - a button reacts to the Confirm key and shows its glyph.

5. Layer tags (shipped - add your own if needed)

Layers are gameplay tags under the UI.Layer parent. The base set - UI.Layer.Game, UI.Layer.GameMenu, UI.Layer.Menu, UI.Layer.Modal, UI.Layer.ContextMenu - is defined natively in CrimsonCommon (the shared layer that owns the layout/push system), so the tags exist whenever any Crimson UI is present and appear in every UI.Layer picker automatically. The shipped root layout registers a stack under each, so there is nothing to set up here. Define an additional layer only if your game needs one (e.g. a dedicated tooltip or notification layer):

ini
; Config/DefaultGameplayTags.ini - only for EXTRA layers beyond the shipped base set
[/Script/GameplayTags.GameplayTagsSettings]
+GameplayTagList=(Tag="UI.Layer.Notification",DevComment="Toasts / transient notifications")
A custom layer needs its own stack
Adding a new UI.Layer tag only creates the identifier - nothing pushes to it until the root layout registers a stack under it. To add a layer, subclass the shipped W_CrimsonOverallUILayout (or build your own - see How-To: Build the Boot Assets by Hand) and call Register Layer for the new tag.
Tags must live under UI.Layer
RegisterLayer and the push functions restrict their tag pickers to the UI.Layer category (meta = (Categories = "UI.Layer")), so a tag outside that parent will not appear in the dropdowns - and RegisterLayer also rejects a non-UI.Layer tag at runtime (logged as an error), in case one is passed via a variable or from C++.
Verify
The tag picker on any UI.Layer field (e.g. the Layer Name pin in step 7) lists UI.Layer.Game, UI.Layer.GameMenu, UI.Layer.Menu, UI.Layer.Modal, and UI.Layer.ContextMenu.

6. UI policy & defaults (pre-configured)

Nothing to set up here - CrimsonUI ships these settings pre-filled at Project Settings -> Crimson -> Crimson UI (UCrimsonUISettings, saved to DefaultCrimsonUI.ini), each pointing at its ready-made asset. So a fresh project already has a working policy, dialogs, and context menus. The default DefaultUIPolicyClass is B_CrimsonUIPolicy, whose LayoutClass is W_CrimsonOverallUILayout - the root UCrimsonPrimaryGameLayout that owns a stack for every standard layer (Game, GameMenu, Menu, Modal, ContextMenu). Open the panel only to point a setting at your own subclass:

SettingDefault (shipped)Notes
DefaultUIPolicyClassB_CrimsonUIPolicyLoaded once at game-instance startup; its LayoutClass is W_CrimsonOverallUILayout.
ConfirmationDialogClass / ErrorDialogClassW_CrimsonConfirmationDefault / W_CrimsonConfirmationErrorFor dialogs - see How-To: Show Confirmation Dialogs.
DefaultModalContextMenuClass / ...World / ...RadialW_ContextMenu_Modal / W_ContextMenu_World / W_ContextMenu_RadialFor context menus - see How-To: Show a Context Menu.
Project Settings -> Crimson -> Crimson UI: the settings ship pre-filled - Default UI Policy Class = B_CrimsonUIPolicy, with the dialog and context-menu defaults already set.
Open the shipped assets to see how they work
All of these live in the plugin's Content folder (/CrimsonUI/UI/...) and double as reference implementations - tick Show Plugin Content in the Content Browser's Settings menu to browse them. The Overview page's Shipped example content table maps every asset to what it demonstrates.
DefaultUIPolicyClass is load-bearing
It ships set to B_CrimsonUIPolicy and is read once in UCrimsonUIManagerSubsystem::Initialize (game-instance startup). If you clear it, no policy = no layout for any player. Changing it requires restarting PIE.
Want to build your own policy or layout?
Subclass or replace the shipped assets - How-To: Build the Boot Assets by Hand walks the root layout, policy, and HUD layout from scratch.
Verify
Press Play, then open Window -> Developer Tools -> Widget Reflector: one W_CrimsonOverallUILayout instance exists. Empty screen is correct - nothing is pushed yet.

7. Push the HUD layout

The plugin ships W_CrimsonHUD_Layout (a UCrimsonHUDLayout) - the always-present root HUD screen, already wired with the escape/pause menu (W_CrimsonGameMenu via Crimson_IA_UI_Escape) and the controller-disconnect screen. Push it onto the Game layer when the local player is ready:

In your PlayerController Blueprint: Event BeginPlay -> Is Local Player Controller (Branch, True) -> Push Content To Layer For Player (Owning Player = Self, Widget Class = W_CrimsonHUD_Layout, Layer Name = UI.Layer.Game). The node is async (from UCrimsonAsyncAction_PushToLayer) - it loads the soft class reference before pushing. Its BeforePush pin fires with the created widget before activation - use it to set variables the widget reads on activate; AfterPush fires once it is live.

Build your own HUD layout?
Subclass UCrimsonHUDLayout (or the shipped asset) - see How-To: Build the Boot Assets by Hand; wire its pause menu and controller-disconnect screen in How-To: HUD Layout & Escape Menu.
Verify
Press Play: the Widget Reflector shows W_CrimsonHUD_Layout inside the Game layer stack. Press your escape key and the pause menu appears.

8. (Recommended) Set the HUD actor class

ACrimsonHUD registers itself with UGameFrameworkComponentManager, which lets GameFeature actions attach HUD widgets/components later, and feeds the ability-system debugger a useful actor list. Set it as your GameMode's HUD Class:

Project Settings -> Maps & Modes -> Selected GameMode -> HUD Class = Crimson HUD (Default GameMode set to your GameMode Blueprint).

Open Project Settings -> Maps & Modes. Under Default Modes, set Default GameMode to your GameMode Blueprint, then set Selected GameMode -> HUD Class = Crimson HUD (or a Blueprint subclass of it). This saves onto your GameMode Blueprint - no .ini editing required.

The Selected GameMode rows are editable only while the Default GameMode is a Blueprint. You can set the same value directly on the GameMode Blueprint instead: open it and use Class Defaults -> Classes -> HUD Class.

What's next
Learn the getter chains once (How-To: Get the Building Blocks), wire the pause menu (How-To: HUD Layout & Escape Menu), push your first real screen (How-To: Push & Pop Screens), and add dialogs (How-To: Show Confirmation Dialogs).
On the full Crimson stack this is automatic
With CrimsonCore installed, steps 2, 6, and 7 are pre-wired: it ships B_CrimsonGameInstance, CrimsonCoreLocalPlayer, a policy + root layout, and a GFA_AddWidget GameFeature action that pushes W_CrimsonHUD_Layout when the HUD spawns - so you skip straight to building screens. See Concept: Full-Stack Integration & Multiplayer.