Skip to content

S3 Compatible Storage

🇬🇧 English | 🇺🇦 Українська

Object storage for Unreal Engine — on any S3-compatible provider.

Version 1.0 · Runtime · UE 5.7 · Release Notes Win64 · Mac · Linux · iOS · Android No third-party libraries: just the engine's HTTP module and our own SHA-256 implementation

Verified end to end against Amazon S3, Cloudflare R2, Backblaze B2, Google Cloud Storage, MinIO and Wasabi.


Quick start: three nodes

The shortest path from "just installed" to "a file in storage."

1. Configure the connection once

Open Project Settings → Plugins → S3 Compatible Storage:

Field What to enter
Provider Your provider from the list. This is the key field — it fills in the rest for you
Endpoint URL Leave empty for Amazon S3 and Google Cloud Storage. For everyone else — your service's address
Region Your bucket's region. For Cloudflare R2 — the literal auto
Default Bucket The bucket you'll work with by default

Below that, in the S3 Credentials (Editor Only) section, enter your keys. They're stored in your own EditorPerProjectUserSettings.ini and never end up in a packaged game — details in Credentials.

2. Press Test Connection

The button at the top of the page. It sends a real request using the exact same code the packaged game will use, and prints the result right below the buttons. If something's wrong, it tells you which setting to change.

3. Run an operation

Get S3 Subsystem  →  Get Default S3 Client  →  S3 Upload File

No need to create a client or store it in a variable — the subsystem does that for you.


Chapters

Chapter About
Release Notes What's new and what's fixed in each release
1. Quick Start Your first upload and first download, step by step
2. Configuration The settings page, providers, transfer parameters
3. Credentials Where to keep your keys — and why it's the most important decision
4. Blueprint Operations Every node, with pin descriptions and examples
5. Transfers Progress, cancellation, large files, multipart upload
6. C++ API The same functionality, from code
7. Errors and Diagnostics How to read errors and what to do about the common ones
8. Providers Quirks of each service
9. Testing The plugin's automated tests, and how to test your own integration
10. Deployment Scenarios Single-player, multiplayer, dedicated server, desktop app
11. FAQ Short answers to the questions asked most often
12. Debug Console Console commands for testers and programmers: upload, list, watch recent requests
13. Profiles in Practice Profile assets in single-player, a listen server, a dedicated server and a desktop app — where each one's keys come from
14. Credentials Cookbook Step by step for every configuration, C++ and Blueprint side by side: from the key-entry screen to presigned links

What the plugin does

Operations. Uploading and downloading objects, partial byte-range reads, listing objects and buckets, single and batch deletion, reading and replacing metadata, server-side copying, bucket creation, presigned URL generation.

Large files. Anything larger than the part size automatically goes through multipart upload, several parts at once. The file is read as it's sent, so a 2 GB upload costs a few buffers, not 2 GB of memory. Downloads are written to disk the same way, as data arrives.

Reliability. Dropped connections, timeouts, provider-side rate limiting and server failures are retried automatically with exponential backoff. Client errors are not retried — retrying wouldn't make them go away.

Cancellation. Every operation returns a handle. Cancelling a multipart upload also cancels it on the provider's side, so parts already sent don't linger in the bucket — invisible in listings, and billed anyway.

Understandable errors. A provider answers with a code like SignatureDoesNotMatch, which says nothing about the cause. The plugin adds a sentence to the result naming exactly which setting to change.


What's not included

  • Storage-class transitions in lifecycle rules — set those in your provider's console.
  • ACL helpers. Amazon disables ACLs on new buckets by default, and Cloudflare R2 doesn't support them at all — access is granted through bucket policy or presigned URLs instead.