
“The network is the computer.”
– J. Gage
With this key area of my portfolio, I bring Best Practices and Optimization techniques.
Below I discuss a client-server API for gaming. If you want to see other backend topics, see these;
- For real-time, shared experiences, checkout my dedicated Multiplayer Portfolio
- For the main page on backend, see my Backend Portfolio
Interested to collaborate on BUFF?
RMC
Together with my teams, I have released free and premium code packages released under Rivello Multimedia Consulting (RMC) including Unity and Godot tooling and APIs. Checkout the highlights.
RMC Buff

While finishing an Amazon Web Server (AWS) Gaming integration, I refined the API and generalized it for educational and development use-cases.
RMC Buff demonstrates my philosophy to API design, my development approach, and competence in using backend services.
- Just
- Amazon
- Web
- Services
Subsystems
- Buff.Instance.Accounts – Responsible for user authentication
- Buff.Instance.Database – Manages server data
- Buff.Instance.CloudCode – Calls server functionality
Philosophy
- Easy to learn
- Easy to use
- Hard to misuse
Possible Expedient Solutions
- Hacks: During development, some ‘cheats’ may be employed like a hardcoded backend account, a simplified database table, etc…
Scope: Goals
- User Accounts
- Database (CRUD)
- Cloud Code
Scope: Goals (Stretch)
- Abstract the C# base types used for Buff to allow for a separate, sibling API powered by a competitor (e.g. Google Firebase) instead
Buff API
This RMC Backend library has a main BackendSystem (e.g. Buff.Instance) with subsystems of Accounts, Database, and CloudCode. The architecture is flexible too. Developers can scale it by adding and updating new subsystems for specific needs.
This is a custom API created by RMC.
1. Accounts 👨💼
Accounts is responsible for user authentication.
//
// Observe
Buff.Instance.OnInitialized.AddListener((buff) => { Debug.LogWarning("@@ Buff.OnInitialized()"); });
Buff.Instance.Accounts.OnUserCreate.AddListener((accounts) => { Debug.LogWarning("@@ Buff.OnUserCreate()"); });
Buff.Instance.Accounts.OnUserDelete.AddListener((accounts) => { Debug.LogWarning("@@ Buff.OnUserDelete()"); });
Buff.Instance.Accounts.OnUserSignIn.AddListener((accounts) => { Debug.LogWarning("@@ Buff.OnUserSignIn()"); });
Buff.Instance.Accounts.OnUserSignOut.AddListener((accounts) => { Debug.LogWarning("@@ Buff.OnUserSignOut()"); });
// Initialize
await Buff.Instance.InitializeAsync();
// Prepare
string userEmail = "test@email.com";
string userPassword = "abc123";
string userNickname = "testName";
// Check
if (!Buff.Instance.Accounts.HasUser())
{
// Create User
var createUserResponse = await Buff.Instance.Accounts.UserCreateAsync(userEmail, userPassword, userNickname);
if (!createUserResponse.IsSuccess)
{
Debug.Log($"{createUserResponse.ErrorMessage}");
return;
}
// SignIn User
var signInUserResponse = await Buff.Instance.Accounts.UserSignInAsync(userEmail, userPassword);
if (!signInUserResponse.IsSuccess)
{
Debug.Log($"{createUserResponse.ErrorMessage}");
return;
}
// Response
Debug.Log($"Result = {signInUserResponse.User.Email}");
}
//
2. Database 💾
Database is responsible for managing server data.
//
// Observe
Buff.Instance.OnInitialized.AddListener((buff) => { Debug.LogWarning("@@ Buff.OnInitialized()"); });
Buff.Instance.Database.OnTableRead.AddListener((database) => { Debug.LogWarning("@@ Buff.OnTableRead()"); });
Buff.Instance.Database.OnItemCreate.AddListener((database) => { Debug.LogWarning("@@ Buff.OnItemCreate()"); });
Buff.Instance.Database.OnItemRead.AddListener((database) => { Debug.LogWarning("@@ Buff.OnItemRead()"); });
Buff.Instance.Database.OnItemUpdate.AddListener((database) => { Debug.LogWarning("@@ Buff.OnItemUpdate()"); });
// Initialize
await Buff.Instance.InitializeAsync();
// Prepare
var user = Buff.Instance.Accounts.GetUser();
var table = new Table("InventoryTable");
var item = new Item("Gold");
// Check
if (user != null)
{
// Add Item To Table
var itemCreateResponse = await Buff.Instance.Database.ItemCreateAsync(table, user, item);
if (!itemCreateResponse.IsSuccess)
{
Debug.Log($"{itemCreateResponse .ErrorMessage}");
return;
}
// Response
Debug.Log($"Result = {itemCreateResponse.Item.Quantity} of {itemCreateResponse.Item.Name}");
}
//
3. CloudCode ☁️
CloudCode is responsible for calling server-side code.
//
// Observe
Buff.Instance.OnInitialized.AddListener((buff) => { Debug.LogWarning("@@ Buff.OnInitialized()"); });
Buff.Instance.CloudCode.OnMethodCall.AddListener((cloudCode) => { Debug.LogWarning("@@ Buff.OnMethodCall()"); });
// Initialize
await Buff.Instance.InitializeAsync();
// Prepare
string functionName = "HelloWorld";
Dictionary<string, string> args = new Dictionary<string, string>();
args.Add("message", "this is from the client");
// Check
if (user != null)
{
// Call Server Code
var methodCallResponse = await Buff.Instance.CloudCode.MethodCallAsync<string>(functionName, args);
if (!methodCallResponse.IsSuccess)
{
Debug.Log($"{methodCallResponse.ErrorMessage}");
return;
}
// Response
Debug.Log($"Result = {response.Data}");
}
//
Downloads

This repo is the ideal starting point for new Unity projects with AWS using RMC Buff.
Repo link not yet available. Its a work-in-progress 🙂
What’s Next?
This area of my expertise is particularly exciting!I love to learn & to make an impact with my teams and projects.
Contact me regarding new opportunities that align with my skills and experience.