Skip to main content
Compiled game platform · Unity & .NET

One schema.
Client, server, liveops.

You describe your game's state and rules once. Conjure runs that description on the device and on the server, and adds replay verification and liveops.Play offline, verify on the server, ship features in days — with a three-person team.

Offline-firstReplay-verifiedZero-allocFeatures are schemaSelf-hosted
interactive · two programs, one schema
networkclientserverShopPresenterInventoryMgrQuestSystemOnChanged busPlayerController APIDTOs + protocolSave migrationsAdmin panelAnalytics SDKactions → replayed on the serverClientUI views · framelocal stateServerplayer · configshared stateReplay verifieractions in, verdict outLiveopsrules withouta releaseModulesbattle pass ·store · inventorygame.conjuremodule Shop {table Offer { … }command Buy(…)reactive query Offers}module BattlePass { … }state · UI views · rulesnetworkclientserverShopPresenterInventoryMgrQuestSystemOnChanged busPlayerController APIDTOs + protocolSave migrationsAdmin panelAnalytics SDKClientUI views · framelocal stateServerplayer · configshared stateReplay verifieractions in, verdict outLiveopsrules withouta releaseModulesbattle pass ·store · inventorygame.conjuremodule Shop {table Offer { … }command Buy(…)reactive query Offers}module BattlePass { … }state · UI views · rules

Today a game is two programs — the client and the server — wired to each other by hand, and every feature is written twice.

1 schemaclient, server, liveops
0 Bon the query hot path
µsper command, device and server
0trust required in the client
Why this is new

Four things that change.

Play offline. The server still checks.

The device runs the game with no connection and writes down what the player did; when the network is back, the server replays that journal with the same compiled logic and compares the state. Commands that need the server — real-money purchases, clans — travel with the journal and run against the verified state.

  • replay verificationprototype validated
  • determinismshipped
interactive · offline play, server replay
gold1,2009509501,1509,9501,150sword250potion100chestopenBuyBuyItem(sword)OpenChestClaimRewardJoinClanneeds server · queueddevice state #91c0device state #b7e2device state #c06adevice state #a3f9device state #f00ddevice state #a3f9rolled back to server stateServer · player statestate matchesstate differsserver state restoredstate #91c0state #a3f9last verified state #91c0waiting for the journaljournal + request receivedJoinClan applied to verified statenot applied1 replayed · 2 µs2 replayed · 4 µs3 replayed · 7 µs3 replayed · 1 applied online · 11 µsentry 3 does not replaygold = 9,950 (edited, no command)acceptedrejected · state rolled backgold1,2009509501,1509,9501,150sword250potion100chestopenBuyBuyItem(sword)OpenChestClaimRewardJoinClanneeds server · queueddevice state #91c0device state #b7e2device state #c06adevice state #a3f9device state #f00ddevice state #a3f9rolled back to server stateServer · player statestate matchesstate differsserver state restoredstate #91c0state #a3f9last verified state #91c0waiting for the journaljournal + request receivedJoinClan applied to verified statenot applied1 replayed · 2 µs2 replayed · 4 µs3 replayed · 7 µs3 replayed · 1 applied online · 11 µsentry 3 does not replaygold = 9,950 (edited, no command)acceptedrejected · state rolled back

3 actions offline · 1 queued · 0 requests · illustrative timings

The phone is offline: three actions run on the device at once and go into a journal. Joining a clan needs the server, so it waits in the queue.

under the hood
schema
module Shop {
command BuyItem(…)
command OpenChest(…)
command ClaimReward(…)
}
module Clans {
command JoinClan(…)
}
  • Deterministic by construction — fixed-point math (Fixed64) instead of floats, seeded random in the schemashipped
  • Replay verification on the serverprototype validated
  • Microseconds per command, device and serverprototype validated

UI views update themselves.

Declare what a UI view shows and the compiler keeps that view model current by applying only the change. No OnChanged wiring, no refresh-order bugs, no stale UI.

  • view models · IVMshipped
  • reactive queriesshipped
interactive · UI view stays in sync
gold420Sword350ShieldownedPotion120Mega potion480BowownedWhetstone—
SubscribeChanged · per-row deltas
  1. Replace · gold 220 → 420
  2. Replace · row 1 · affordable

rows touched 1 / 6 · delta, not rescan

Gold changed, so the view model changed one row — the sword became affordable — and the UI view updated that one row.

under the hood
schema
materialized view ShopOffers {
…
} = from Offer o
| join Price p (o.Id == p.OfferId)
| select { … }
reactive query Offers() -> OfferRow[] {
from ShopOffers
| sort Price
}

Meta and core in one architecture.

Inventory and progression live in persistent tables; units, projectiles and hit events live in per-frame tables, in the same schema with the same compiler. The weapon in the inventory is the weapon in the fight, without a second data model.

  • frame stateshipped
  • persistent + frame joinsshipped
interactive · meta and core, one schema
inventorySword +12BowRingPotion ×3XP 1,240equipped stats → Collision(indexed join)HitEvent → Progression.AddXp(command)inventorySword +12BowRingPotion ×3XP 1,240indexedjoinAddXpcommand

0 B per frame · one planner

Equipping a sword is an ordinary write to a persistent table: the inventory UI view updates, and the sword's stats are now game state.

under the hood
schema
// persistent — the meta
table Inventory { … }
table Progression { … }
// per-frame — the core
ephemeral table Unit { … }
event table HitEvent { … }
system Collision(phase: fixed_update)

Arena sample · 100 000 units · 171 µs per frame on IL2CPP + Burst · 0 B allocated methodology →

A feature is a schema, not a sprint.

A battle pass or a store is a module of the schema: tables, commands and queries in one place, for both sides. Carry it to the next game and point its declarations at that game's items and currencies — the compiler re-derives what depends on them. Change rules through liveops without a release, and let an assistant draft the first version — the compiler rejects what is wrong.

  • modules & overridesshipped
  • liveopsprototype validated
  • ready-made modulesplanned
interactive · a feature from declaration to reuse
declare
module BattlePass {
table Tier { … }
table Progress { … }
command ClaimTier(…)
reactive query Track(…)
}

one file · one owner · both sides

compiled
Battle pass1234562 %Claim
UI view binds the Track view model
Server · player stateClaimTier ·replayed and verified
prototype validated
liveops
  • season length
  • tier xp
  • rewards
tunable after releaseprototype validated
adapted
Project B
module BattlePass {
  table Tier {
    Reward: int @relation(
-     references: Item.Id)
+     references: Card.Id)
-   Price: Gold
+   Price: Gems
  }
  command ClaimTier(…)
  reactive query Track(…)
}

compiler: re-checked 3 joins · regenerated view model + server command · ok

same module · 2 declarations changed · logic untouched

assistant: add a weekly reset to the battle pass+4 lines · module BattlePasscompiler: ok · 0 diagnostics

One file declares the feature: its tables, the one command that changes them, and the reactive query the UI view binds.

under the hood
schema
module BattlePass {
table Tier { … }
table Progress { … }
command ClaimTier(…)
reactive query Track(…)
}
Shipped

What you can use today

The data layer, frame state, determinism and the interpreter are in the docs now. The server and liveops are validated prototypes; the services are designed. The platform page keeps the whole list honest.

ConjureDB schema
module Leaderboard {
table Player(
persistence: local, capacity: 16384, type_id: 1001) {
Id: int @id
Name: string
Score: int
@@index(fields: [Score], name: "Player_ByScore", kind: sorted_set)
}
// every UI view can reuse this — written once
query GetTopScorers(count: int) -> Player[] {
from Player p
| sort { -p.Score, p.Id }
| take @count
}
}

You write the schema. Conjure emits the C# — switch the tab and read it.

  • Compiled queries, commands and mutationsDeclared once, planned by a cost-based optimizer, emitted as plain C#.Docs →
  • UI views that update themselvesView models maintained by applying only what changed.Docs →
  • Frame state and systemsPer-frame tables and systems scheduled per phase, 0 B per frame.Docs →
  • Portable interpreterA no-JIT lane for queries that arrive after the build, bit-identical to compiled code.Docs →
  • DeterminismFixed-point math (Fixed64) and seeded random declared in the schema, held by tests.

57-query game workload · 50 000 players · 519× vs hand-written LINQ · 0 B allocated on 26 of 57 cases benchmarks →

Who it's for

Built for a team of three. Readable by a team of thirty.

Small studios

The infrastructure a platform team would build — client data layer, server, verification, liveops — compiled from one schema, without the platform team.

Tech leads

A deterministic, compiled model with explainable plans, generated code you can read, and limits stated out loud.

Gameplay programmers

Declare state and commands. UI views update themselves, the frame stays flat, and the same feature runs on the server without a second implementation.

See every part and its real status

The platform page lists what is shipped, what has been proven in a prototype and what is only designed.