← Back to Docs

Quick Start

Get Compuon running in your project in a few minutes.

1. Create a project & build your SDK

Sign up at compuon.dev/dashboard and create a project. Then click Build SDKto generate your SDK package. Each build is a build-specific variant generated from a per-request seed; the seed and the exact compiler are recorded in the package’s TOOLCHAIN.txt.

During the pilot phase, builds are enabled per account after sign-in; we do this for you as part of the pilot. Until your account is enabled, Build SDKanswers “Account pending admin approval for SDK builds” — email hello@compuon.dev if you see it and have not heard from us.

Dashboard → Your Project → SDK
Sign in → account enabled for builds (pilot) → Build SDK → wait for the build to finish → Download (Linux / Windows)
Package contents: compuon.lib (Win64) or libcompuon.a (Linux) at the zip root; include/compuon/ (compuon.h, types.h, platform.h); include/protocol/ (sync_handler.h, messages.h — the integrity-server link); INTEGRATION_TIPS.md (read this first); README.md; TOOLCHAIN.txt

2. Add to your project

Unreal Engine (source integration)
// YourGame.Build.cs
string CompuonPath = Path.Combine(ModuleDirectory, "ThirdParty", "compuon-core");
PublicIncludePaths.Add(Path.Combine(CompuonPath, "include"));
// compuon.lib sits at the zip root, not under lib/
PublicAdditionalLibraries.Add(Path.Combine(CompuonPath, "compuon.lib"));
Custom C++ Engine (CMake)
# COMPUON_SDK = the unzipped package; the library is at its root
set(COMPUON_SDK ${CMAKE_SOURCE_DIR}/third_party/compuon)
add_library(compuon STATIC IMPORTED)
set_target_properties(compuon PROPERTIES
  IMPORTED_LOCATION ${COMPUON_SDK}/compuon.lib   # libcompuon.a on Linux
  INTERFACE_INCLUDE_DIRECTORIES ${COMPUON_SDK}/include
)
target_link_libraries(YourGame PRIVATE compuon)
# Windows: match the package's /MD runtime (see TOOLCHAIN.txt for the toolset)
set_property(TARGET YourGame PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")

Windows: the package compuon.lib is a Release build with MSVC /GL and the /MD runtime. Build with the same MSVC toolset major version recorded in TOOLCHAIN.txt and keep /MD in your own configuration; a mismatch fails at link (LNK2038 / C1047), not at runtime. Linux: match the GCC major in TOOLCHAIN.txt. For another toolset or a Debug-CRT variant, email hello@compuon.dev.

Important: Ship a Shipping configuration and remove the .pdb files from the package. The SDK is a static library that exports no symbols, so debug info is what would put SDK names into a shipped build.

3. Protect your variables

Unreal Engine (FCompuon types)
#include "CompuonTypes.h"   // Unreal module, delivered separately (not in the zip)

// Before:  float Health = 100.f;
// After:
FCompuonFloat Health = FCompuonFloat::Make(100.f);
FCompuonInt Ammo = FCompuonInt::Make(30);

// All operators work the same:
Health -= FCompuonFloat::Make(Damage);   // Make() builds two values per call (see below)
Ammo.Set(30);                            // Tier 1: re-encodes (x = v: 5.9 µs)
bool bDead = Health.Val() <= 0.f;

CompuonTypes.h(FCompuonInt, FCompuonFloat, UCompuonSubsystem) and its Build.cs are not in the SDK zip. The Unreal module is delivered separately during the pilot — email hello@compuon.dev.

Custom C++ Engine
#include <compuon/compuon.h>
using namespace compuon;

// Anti-cheat mode (default) — plaintext cached, tamper detected:
Compuon<int> hp(100);
Compuon<float> speed(5.5f);

hp -= 25;                   // plain number: builds a temporary value (x += 25: 6.2 µs)
speed = 7.5f;               // Tier 1: re-encodes (x = v on Compuon<int>: 5.9 µs)
bool dead = (hp <= 0);      // reads cached value

// Deferred mode — no plaintext in the object. Every read and every op folds
// against the server's operand bundle, and a read then decodes: a read took
// 37 µs, about 17 times verify(), on the machine below.
// Needs the server-issued seeds (AUTH_OK -> api::rekey_session) and the
// server's operand bundle: create these only after AUTH_OK. Not
// spot-checkable in this release — do not register their ids with the server.
Compuon<int, true> gold(500);
gold += reward;

Timings: one AMD Ryzen 7 5825U, MSVC 19.51 x64 Release (LTCG), 2026-09-28, Compuon's internal operator benchmark (not yet in a released core) on Compuon<int> and Compuon<int, true>, core 0752031 library (median of three invocations of 9 runs). That is one build, from one seed; your SDK build comes from its own seed and will time differently. A plain-number operand to += or -= builds and destroys a temporary value, and FCompuonFloat::Make builds two values on every call: in a copy of the Unreal wrapper built outside UE, H -= FCompuonFloat::Make(d)took 1.9–2.0 times x -= Compuon<int>(25). Compuon<float> was not in the benchmark, and the server-verified profile has not been measured inside a game loop. See Operation Tiers.

4. Initialize

Unreal Engine
// UCompuonSubsystem comes up automatically with the game module.
// It does no per-frame SDK work. Rotation arrives on your
// integrity-server connection -- see the Key Rotation guide.
Custom Engine
#include <compuon/compuon.h>
#include <protocol/sync_handler.h>

// The two seeds you pass to init() are placeholders. The real seeds are
// issued by the integrity server on AUTH_OK and applied with
// compuon::api::rekey_session(session_seed, rotation_seed) -- SyncHandler
// does that for you once you opt in below. Create protected values only
// after AUTH_OK (handler.is_authenticated()), and never call init() twice:
// a second init() re-arms locally minted operands.
compuon::api::init(placeholder_session_seed, placeholder_rotation_seed,
                   /*bootstrap_operands=*/false);   // server-verified profile

compuon::SyncHandler handler;
handler.set_request_session_seed(true);   // ask the server for per-session seeds
handler.send_auth(player_id, project_id, api_key);
// Your WebSocket code feeds received messages to handler.on_message() and
// drains handler.pop_outgoing() to the socket. KEY_ROTATE is applied by the
// handler (api::rotate) -- you do not call rotate() yourself.

// No per-frame SDK call is required.

// At teardown. Terminal: every handle dangles afterwards.
compuon::api::shutdown();

5. Verify integrity

Each protected variable carries an integrity proof. Query it at any time to detect tampering — locally or via your server. A local check tells you the plaintext was edited; only the server check is authoritative.

Unreal Engine (FCompuonInt / FCompuonFloat)
// Client-side integrity check:
int64 verified = Health.VerifyIntegrity();
int32 current  = Health.Val();
bool tampered  = (verified != compuon::encode_for_crypto(current));

// Server-side spot check. The buffer must be at least 1024 bytes
// (a_hat 512 | b 512). ExportProxy returns 0 on success and -1 on
// error -- it does NOT return a byte count.
uint8 proxyBuf[1024];
if (Health.ExportProxy(proxyBuf, sizeof(proxyBuf)) == 0) {
    // Send the 1024 bytes to your integrity server
}
Custom C++ Engine
using namespace compuon;

int64_t verified = detail::verify(hp.ct_id());
bool tampered = (verified != encode_for_crypto(hp.val()));

uint8_t proxy[1024];
if (detail::export_ct(hp.ct_id(), proxy, sizeof(proxy)) == 0) {
    // Send the 1024 bytes to your integrity server
}

Shipping Checklist

✓ Use Shipping configuration (no debug symbols)
✓ Remove all .pdb files from the package
✓ Verify no SDK symbols are exported: dumpbin /exports YourGame.exe (Windows) or nm -D YourGame (Linux)
• Note: strings can still show paths containing “compuon”. Those are compiler __FILE__ build paths from your own source tree, not SDK symbols.
✓ No BlueprintType on FCompuonInt/FCompuonFloat

Operation Tiers

TierOperationsCostMethod
0+, -, integer scalar *, <<114 ns for x += y (both values built); 6.2 µs for x += 25Direct proxy update
1=, *, /, %, >>, &, |, ^5.9 µs (x = v)Full refresh
2==, !=, <, >, <=, >=not timed; a cache read took 0.2 nsCached value comparison

Measured 2026-09-28 on one AMD Ryzen 7 5825U, MSVC 19.51 x64 Release (/O2, LTCG), with Compuon's internal operator benchmark (not yet in a released core) on Compuon<int>, core 0752031 library: median of three invocations of 9 runs, one build from one seed (your SDK build will time differently). With a plain-number operand, += and -= build and destroy a temporary value, so they cost more than an assignment; integer-scalar *= and <<= take the number directly and build none (not timed). 100 adds per 60 Hz frame come to 0.07% of the frame with operands built once, 3.7% with plain numbers (per-call median times 100). An earlier revision gave 340 ns for every Tier-0 op, from a single 2026-04-20 run; that was an add between two existing values. Tier 0 *= takes an integer scalar only — m *= 1.5f is a compile error; use Compuon * Compuon (Tier 1) for a non-integer factor.