Quick Start

By the end you will walk up to a chest, press the interact key, and have the chest react - in singleplayer and multiplayer - using only CrimsonInteraction and CrimsonCommon. You author two small abilities along the way (a handler and an interact ability); they are yours to keep and extend.

Prerequisites
Your pawn (or player state) has a UAbilitySystemComponent and you can grant abilities on the server. You have one IA_Interact Input Action mapped in an Input Mapping Context (leave its Triggers list empty - important later for holds). How-To: Get the Building Blocks covers every node and getter used below.
Have all the Crimson plugins?
CrimsonCore (free to download, but it only compiles when all Crimson plugins are installed) ships prebuilt versions of steps 3-8: an auto-activating interact ability with prompt widgets, a default handler, and a drop-in ACrimsonInteractableActor. If your project can use it, grant UCrimsonCoreGameplayAbility_Interact to your pawn and skip to step 9's verify. Everyone else: the steps below build the same thing.

1. Enable the plugin

Enable CrimsonInteraction. CrimsonCommon comes in as a dependency.

Edit -> Plugins -> search 'Crimson' -> tick CrimsonInteraction. Restart when prompted.
Verify
Open Project Settings -> Crimson -> Crimson Interaction and confirm the settings page exists with default values.

2. Define your gameplay tags

The plugin hardcodes no tags - you own them. You need one event tag that fires interactions, and two input-forwarding tags. The string Ability.Interaction.Activate matches CrimsonCore's convention (keeps content portable), but any string works as long as sender and trigger agree.

Project Settings -> Project -> GameplayTags -> Manage Gameplay Tags -> add Ability.Interaction.Activate, Input.Interact.Pressed, Input.Interact.Released.
Verify
All three tags appear in the Gameplay Tag picker (e.g. open any Gameplay Tag property and search 'Interact').

3. Author the handler ability

This is the ability an option grants via InteractionAbilityToGrant. It triggers on your activate event, reads the interactable from the payload, does its work, and ends. This one calls NotifyInteractionSuccess on the target so any interactable can react - a good generic default.

New Gameplay Ability BP 'GA_InteractionHandler': Class Defaults -> Ability Triggers -> add entry (Trigger Tag = Ability.Interaction.Activate, Trigger Source = Gameplay Event). Graph: Event ActivateAbilityFromEvent -> break Payload -> Target -> Notify Interaction Success (message call, In Instigator = Get Avatar Actor From Actor Info) -> End Ability.
Authority in the handler
LocalPredicted handlers run on the owning client and the server. Anything that mutates authoritative state (loot, doors, quest flags) must be guarded with HasAuthority() on the receiving side.

4. Make the chest interactable

Implement ICrimsonInteractableTarget (CrimsonCommon) on the chest and return one instant option pointing at your handler. Then react to success: the handler calls NotifyInteractionSuccess, so override that to open the chest (guard authoritative changes with HasAuthority).

Chest BP: Class Settings -> add Interface 'Crimson Interactable Target'. In K2 Gather Interaction Options: Make CrimsonInteractionOption (Text='Open', Input Type=Instant, Interaction Ability To Grant=GA_InteractionHandler) -> Add to the Out Options array. Then override 'Notify Interaction Success' to play the open animation.
Verify
Place the chest in the level. It needs collision that overlaps the Visibility channel - any default static mesh qualifies. Nothing detects it yet; that is the next step.

5. Author the interact ability shell

One persistent, per-actor, locally-predicted ability owns the whole loop. It must run on both the server (to grant nearby options' abilities) and the owning client (to scan and take input), so it activates itself as soon as it is granted.

New Gameplay Ability BP 'GA_Interact': Class Defaults -> Instancing Policy = Instanced Per Actor, Net Execution Policy = Local Predicted. Add a variable CurrentOptions (array of Crimson Interaction Option).
Blueprint auto-activation
Blueprint cannot override OnAvatarSet, so activate from the pawn instead: after the ability is granted, Event BeginPlay -> Is Locally Controlled -> Get Ability System Component -> Try Activate Ability by Class (GA_Interact). A Local Predicted activation also activates the server instance - step 9 wires this.

6. Start the scan and grant tasks

In ActivateAbility: the server instance spins up Grant Abilities For Nearby Interactors (without it, the scan's CanActivateAbility filter rejects every option - the number-one setup bug); the owning client instance spins up a scan task and listens for the input events from step 7.

Event ActivateAbility -> authority branch (Switch Has Authority): Authority -> Grant Abilities For Nearby Interactors (Range 500, Rate 0.1, Channel Visibility). Is Locally Controlled branch: TRUE -> Make CrimsonInteractionQuery -> Wait For Interactable Targets Single Line Trace -> from Interactable Objects Changed, Set CurrentOptions. Also: Wait Gameplay Event (Input.Interact.Pressed) and Wait Gameplay Event (Input.Interact.Released).
Verify
Nothing visible yet, but pass bShowDebug = true on the scan call and the forward trace will draw once the ability activates (step 9). Top-down game? Use Wait For Interactable Targets Top Down Trace instead - see How-To: Choose a Scan Strategy.

7. Forward input as gameplay events

Keep input on the pawn (where Enhanced Input already lives) and forward presses to the ability as gameplay events - no input-component plumbing inside the ability, and the pattern is identical in Blueprint and C++.

Pawn graph: EnhancedInputAction IA_Interact -> Started -> Send Gameplay Event to Actor (Actor = Self, Event Tag = Input.Interact.Pressed). Completed AND Canceled -> Send Gameplay Event to Actor (Input.Interact.Released).
No Pressed/Tap trigger on IA_Interact
Leave the Input Action's triggers list empty (implicit Down). Pressed/Tap drop their trigger state one frame after the press, which fires Completed/Canceled while the key is still physically held - that breaks hold interactions later. If the IA must carry a trigger, use UInputTriggerCrimsonPressAndHold (CrimsonInput plugin - optional).

8. Fire the press

On press, take the focused option (CurrentOptions[0]) and fire it with Trigger Interaction Option (UCrimsonInteractionStatics). It back-fills the target ASC and spec handle if the server grant has not resolved locally yet, lets the target customize the event payload, and triggers the granted ability by replicated handle - predicted on the client, authoritative on the server. If the spec has not replicated yet it returns false and the press is safely ignored.

From Wait Gameplay Event (Input.Interact.Pressed): Get CurrentOptions -> Get (index 0) -> Trigger Interaction Option (Instigator = Get Avatar Actor From Actor Info, Interaction Event Tag = Ability.Interaction.Activate). Guard with a Length > 0 check.

9. Grant it and play

Grant GA_Interact on the server (grants are authority-only), then play. If you used the Blueprint shell, also activate it from the owning client (the note in step 5).

Pawn: Event BeginPlay -> Switch Has Authority -> Authority: Get Ability System Component -> Give Ability (GA_Interact). Then: Is Locally Controlled -> TRUE -> Try Activate Ability by Class (GA_Interact). (If your project already grants abilities via a startup set, add GA_Interact there instead.)
Verify - the full loop
PIE: walk to the chest and press interact - NotifyInteractionSuccess fires on the chest and it reacts. Test as a client too (Net Mode: Play As Client): the very first press right after entering range can be ignored while the grant replicates; that is by design. If nothing happens, check the two classic causes: the grant task is not running on the server instance, or the handler fails CanActivateAbility (cost/cooldown/tag block) - see Concept: Scan, Gather, Filter, Broadcast.
What's next
Add hold-to-open, timed channels (mining), and an on-screen prompt in How-To: Add Holds, Channels & a Progress Prompt. Give targets per-actor feedback in How-To: World Indicators & Hold-Progress Feedback.