Version 1.6.1 | Production Ready | Unreal Engine 5.5+
Common questions and answers about the Supabase UE5 Plugin
This page covers frequently asked questions for the Supabase UE5 Plugin. Documentation is being actively developed.
The Supabase UE5 Plugin is a production-ready integration between Unreal Engine 5 and Supabase, providing database operations, authentication, file storage, real-time subscriptions, and entity persistence through a Blueprint-friendly API.
The plugin supports Unreal Engine 5.4 through 5.6. The current plugin version (1.4.1) is built against EngineVersion 5.6.0.
The plugin supports Windows (Win64), macOS, Linux, Android, and iOS.
YourProject/Plugins/Supabase/.uproject fileSee the Installation Guide for detailed instructions.
USupabaseSubsystem is the recommended approach. It is a UGameInstanceSubsystem that provides singleton access, automatic health monitoring (5-minute connection test interval, 55-minute token refresh), and centralized state management. USupabaseManager provides a static convenience interface that delegates to the subsystem.
You can create a USupabaseConnection DataAsset in the Content Browser and configure the Server URL and Anonymous Key in the editor. Alternatively, create one programmatically in C++ or via Blueprint. See First Connection for details.
The plugin supports five registration modes via ERegistrationMode:
| Mode | Description |
|---|---|
EmailPassword |
Standard email/password registration (immediate login) |
EmailPasswordConfirm |
Email/password with email confirmation required |
PhonePassword |
Phone number and password registration |
EmailOTP |
Passwordless email-based one-time password |
PhoneOTP |
Passwordless phone-based one-time password |
Use RegisterWithModeAsync() to register with a specific mode, or RegisterWithOptionsAsync() with an FRegistrationOptions struct for full control.
OTP (One-Time Password) modes allow passwordless authentication:
// Email OTP - sends a one-time code to the user's email
UAsyncRegister::RegisterWithModeAsync(
this, TEXT("user@example.com"), TEXT(""), ERegistrationMode::EmailOTP
);
// Phone OTP - sends a one-time code to the user's phone
UAsyncRegister::RegisterWithModeAsync(
this, TEXT("+1234567890"), TEXT(""), ERegistrationMode::PhoneOTP
);
Note: OTP modes require the corresponding provider to be enabled in your Supabase dashboard settings.
The FRegistrationOptions struct has these defaults:
bRequireEmailConfirmation: trueEmailConfirmationRedirectURL: ""UserMetadata: {}MinPasswordLength: 8bRequireSpecialCharacters: truebRequireNumbers: truebRequireUppercase: truebEnableRateLimiting: trueThe plugin provides static utility functions:
// Validate email format
bool bValid = UAsyncRegister::ValidateEmailFormat(EmailInput);
// Validate phone format
bool bValid = UAsyncRegister::ValidatePhoneFormat(PhoneInput);
// Validate password strength against FRegistrationOptions rules
bool bValid = UAsyncRegister::ValidatePasswordStrength(Password, Options);
// Generate a secure random password
FString Password = UAsyncRegister::GenerateSecurePassword(16);
PKCE (Proof Key for Code Exchange) is the recommended OAuth flow for native applications:
UAsyncOAuth::OAuthAsync(this, AuthProvider, EOAuthFlowType::PKCE)GetAuthorizationURL()HandleAuthorizationResponse(AuthCode, State) to complete the flowKey benefits:
// Start PKCE flow
UAsyncOAuth* OAuthTask = UAsyncOAuth::OAuthAsync(this, Provider, EOAuthFlowType::PKCE);
FString URL = OAuthTask->GetAuthorizationURL();
// ... open URL, handle callback ...
OAuthTask->HandleAuthorizationResponse(Code, State);
Yes. Use OAuthTask->CancelOAuth() to cancel an in-progress OAuth operation. You can check if a flow is active with OAuthTask->IsOAuthInProgress().
Yes. The plugin provides UAsyncExecuteSQL for direct SQL execution:
// Execute raw SQL
UAsyncExecuteSQL::ExecuteSQLAsync(this, TEXT("SELECT * FROM users WHERE score > 100"));
// Execute stored procedures
UAsyncExecuteSQL::ExecuteStoredProcedureAsync(this, TEXT("calculate_rankings"), Params);
SQL injection protection is built in. See the database documentation for details.
Yes. Use UAsyncCreateTable with FTableSchema and FTableColumn structs:
FTableSchema Schema;
Schema.bEnableRLS = true;
Schema.TableComment = TEXT("Player scores");
FTableColumn NameCol;
NameCol.Name = TEXT("player_name");
NameCol.Type = TEXT("text");
NameCol.bNotNull = true;
Schema.Columns.Add(NameCol);
// ... add more columns ...
UAsyncCreateTable::CreateTableFromSQLAsync(this, Schema);
Large file uploads use the chunked upload system with FUploadOptions:
FUploadOptions Options;
Options.bUseChunkedUpload = true; // Enable chunking (default: true)
Options.ChunkSize = 1 * 1024 * 1024; // 1MB chunks (default)
Options.MaxFileSize = 50 * 1024 * 1024; // 50MB limit (default)
Options.bReportProgress = true; // Enable progress reporting
Options.UploadMode = EUploadMode::Upload; // Upload, Upsert, or Update
UAsyncUploadFile::UploadFileWithOptionsAsync(this, Bucket, FilePath, Options);
Upload control methods:
CancelUpload() - Cancel an in-progress uploadPauseUpload() - Pause a chunked uploadResumeUpload() - Resume a paused uploadProgress events:
FUploadProgressDelegate - Overall upload progressFChunkUploadDelegate - Per-chunk progressEntity Persistence allows you to automatically save and load actor/entity data to Supabase. It provides:
Use the FEntityPersistenceConfig struct:
| Field | Description |
|---|---|
bAutoSave |
Automatically save data on changes |
bAutoLoad |
Automatically load data on begin play |
bAutoCreateTable |
Create the database table if it doesn't exist |
bSaveTransformOnly |
Only save actor transform (position/rotation/scale) |
bSaveOnDestroy |
Save data when the actor is destroyed |
ValidateData |
Validate data before saving |
AutoSaveInterval |
Seconds between auto-saves |
CustomTableName |
Override the default table name |
CustomMetadata |
Additional metadata to save with the entity |
Entities go through these states (EEntityPersistenceState):
Coming soon. This section will provide detailed information about real-time features including WebSocket connections, channel subscriptions, and event handling.
Coming soon. This section will provide detailed information about platform-specific questions including Android, iOS, and console deployment.
If your question isn't answered here, join our Discord community for support, or check the main documentation.