CrimsonOnlineSubsystemv1.0In development
Follow development on Discord

A platform-agnostic online layer: identity, sessions, friends, presence, parties, achievements, stats, leaderboards, store, purchases, entitlements, voice, and cloud save behind one typed, Blueprint-friendly subsystem.

Coming Soon · Online · Unreal Engine 5

One online API for Steam, EOS and the console backends.

CrimsonOnlineSubsystem wraps Epic's OnlineSubsystem behind a typed, Blueprint-friendly GameInstance subsystem. One UCrimsonOnlineSubsystemGI owns 15 specialised services, from identity, sessions and friends to store, entitlements, voice and cloud save. The platform is detected once at boot, and DebugPlatformOverride pins it so PIE resolves against the backend you are testing.

Why CrimsonOnlineSubsystem

Write your online code once against typed services; the right platform backend is resolved at boot.

One subsystem, 15 typed services

UCrimsonOnlineSubsystemGI owns one service per interface, each with a typed accessor: GetSessionService(), GetFriendsService(), GetStoreService() and twelve more. Every service exists on every platform, so an accessor is never null. Where a backend lacks the interface, the call fails safely; handle the failure branch.

Six backends, one set of calls

Detection reads IOnlineSubsystem::GetSubsystemName() and maps it: Steam, Epic Online Services, PlayStation (PS4/PS5), Xbox (XboxOne / XboxOneGDK / GDK), Nintendo Switch, and Null for LAN development. Anything else resolves to Unknown and logs a warning. Your calls stay identical across all of them.

Sessions without the boilerplate

FCrimsonSessionSettings configures a session in one struct: max players, LAN, presence, invites, join-in-progress, travel map and game-mode label. Create, find, join, start, end and destroy are typed calls with a completion delegate each, and OnSessionJoined hands you the resolved TravelURL, ready for ClientTravel.

The whole social stack

Read the platform friend list into FCrimsonFriendInfo, send and answer friend requests, block, query recent players. Publish rich presence; remote players arrive as an Online / Away / Offline state. Then create a party (invite, kick, transfer leadership) with party delegates driving the UI.

Achievements, stats & leaderboards

Write achievement progress 0 to 100; the platform unlocks at 100. Submit ranked scores to a named leaderboard and read the top N or a range centred on the player. Track raw per-player int64 stats with Sum / Set / Largest / Smallest write semantics.

Store, DLC & cloud save

Query storefront offers, open the platform checkout, and read receipts back. A DataTable DLC mapping resolves one FName to the right Steam, EOS, PSN, Xbox or Switch product before checking ownership. Cloud save moves byte blobs keyed by file name, whatever save format you write.

A closer look

Host, browse, join: a session flow designers can wire

Log in with the Login (Online) Blueprint node, create a session from an FCrimsonSessionSettings struct, and populate a server browser straight from the OnSessionsFound results. Every step is a typed call with a completion delegate.

  • Each FCrimsonSessionSearchResult carries session id, owner name, current and max players, and ping
  • Pass the whole struct back to Join Session, take the TravelURL the delegate hands you, and travel

Friends, presence, and parties in one pass

Read the platform friend list once and render it from FCrimsonFriendInfo: display name, platform id, condensed presence, and whether an invite is pending in either direction. Then send and answer invites and move the group into a party.

  • Re-read the list whenever OnFriendsListChanged fires
  • Create, invite, join, kick and transfer leadership, with member-joined, member-left and leader-changed delegates keeping every frame in sync
  • One party is active at a time; GetPendingInviterIds lists everyone waiting on an answer

Point it at a backend, then test it from PIE

The plugin never chooses a provider for you: enable the provider's own plugin and set it in DefaultEngine.ini. To skip the fiddly part, complete config overlays for Steam, EOS and SteamEOS ship in Config/CustomTemplates/. Copy one into your project.

  • Net driver and CompatibleUniqueNetIdTypes entries included
  • DebugPlatformOverride pins the platform, so PIE resolves DLC ids and platform branches against the backend you are testing

Honest about what the wrapper does not do

Two project settings, bVerboseLogging and bEnableCloudSave, are declared but not read by anything yet. They change nothing today and are documented that way rather than quietly removed. bVerboseCloudSaveLogging is the logging switch that works.

  • FCrimsonCloudFileHeader::LastModified is always zero, so version-stamp your save payload instead of building a newest-wins sync on it
  • No receipt-finalize call: grant content when checkout reports Purchased
  • Re-query receipts when OnUnexpectedReceipt fires; that is how a purchase from another device reaches this session

Technical details

Engine
UE 5.8
Tested platforms
Windows
Blueprint-ready
Yes
C++ required
No
Network replicated
No
Dependencies
OnlineSubsystem, OnlineSubsystemUtils, GameplayTags, DeveloperSettings

Frequently asked questions

Which online backends does it support?
Steam, Epic Online Services, PlayStation (PS4/PS5), Xbox (XboxOne, XboxOneGDK, GDK), Nintendo Switch, and the Null backend for LAN-only development. Steam, EOS and the three console families each have their own field in the DLC mapping row, so an internal DLC id resolves per platform. Null is not one of them (it implements no entitlements), and any subsystem name outside that table resolves to Unknown, where DLC lookups return an empty id and log a warning.
Do I need C++ to use it?
No. Enabling the plugin in the editor is the entire install for a Blueprint project (no .uproject or .Build.cs edits), and the services are Blueprint-callable with Blueprint-pure accessors. Three flows also ship as async Blueprint nodes: Login (Online), Write Achievement Progress and Query Entitlements (DLC). C++ teams get the same 15 services through strongly-typed accessors on UCrimsonOnlineSubsystemGI.
Does it work in multiplayer?
It's the layer that gets you into multiplayer: platform login, session creation and search, joining, invites, and the resolved connect string you travel with. It isn't a gameplay replication system: once players are connected, standard UE networking takes over, and player registration is left to the engine's own session travel path, which is why the specs above honestly say "replicated: no".
Does it configure the backend for me?
No, and deliberately: it reads whichever IOnlineSubsystem your project activates rather than picking one. You enable the provider's plugin and set DefaultPlatformService in DefaultEngine.ini. What it does ship is ready-made config overlays for Steam, EOS and SteamEOS under Config/CustomTemplates/, each with a header comment explaining what it assumes; copy the one you want into your project's config.
Does it depend on other Crimson plugins?
No. It is fully standalone: it sits directly on the engine's OnlineSubsystem and OnlineSubsystemUtils plugins plus whichever platform OSS module you ship with. CrimsonCore, the free integration layer for the full suite, uses it for identity, presence and friends in its front end; nothing on this side needs wiring.
Can I buy it yet?
Not yet. CrimsonOnlineSubsystem is still in development and not on sale. It needs no other Crimson plugin, so when it ships it drops into any project on its own, or next to the rest of the suite without dependency conflicts.

Go online without marrying a platform

Enable the plugin, point DefaultEngine.ini at your backend (or copy one of the shipped overlays), and log in with one async node. The same session, social, progression, and store code then ships everywhere your game does.