UNITYZM
UnityZM: Sovereign Infrastructure & the Case for OCI

UNITYZM TECHNOLOGIES · LUSAKA

The ledger stays.
The compute can travel.

UnityZM is a sovereign economic platform for Zambia: identity, payments, settlement, tax, commerce and logistics on a single runtime. It is live and serving tenants today.

The mission is to soften and harmonise the Zambian and wider African economy, removing the shocks and friction between the people who make, move, sell and settle. That is a decade of work, not a product launch.

This is what it is, how it is built, and precisely which workloads we would place on Oracle Cloud Infrastructure.

62PRIMITIVE TYPES
38INTEGRATED DOMAINS
303kLINES OF PRODUCTION CODE
133DAYS · ONE OPERATOR
10PROVINCES IN SCOPE

Three independent estimation methods, COCOMO, a productivity benchmark, and a domain-by-domain check, put roughly 40 person-years of engineering effort in this codebase, delivered in 4.4 months. We publish our own honest grading of how complete that makes it. It is section 10.

01 · PRIMITIVES

An economy's vocabulary is finite. Build it once.

Most platforms grow as a portfolio: a payments product, then invoicing, then logistics, each with its own data model and its own auth. Integration then becomes a tax paid forever.

UnityZM made the opposite decision at the start. Every capability is a Primitive: a standalone, supervised service implementing one economic function behind one shared interface. Payments is a primitive. So is tax. So is a delivery, a warehouse shelf, and a clinic appointment slot.

Because they share an interface, any primitive can talk to any other without knowing where it runs, same machine, same city, or a lean node at a border post.

THE CONTRACT

Four functions, no exceptions: primitive_type/0 for identity, primitive_layer/0 for its position in the trust hierarchy, issue_token/1 to sign proof it acted, and validate_envelope/1 to check every inbound message at the boundary.

TWO CONSEQUENCES

Trust is structural, not procedural. A primitive cannot accept work it is not entitled to, because validation runs before any domain logic does.

Every state transition is signed. The audit trail is not a log written afterwards. It is the accumulated signatures of every primitive that touched the transaction.

THE CATALOGUE, 62 IMPLEMENTED TYPES

SOVEREIGN AUTHORITY
sovereignregulatortax_authoritycentral_bankregistry
IDENTITY & MONEY
identityauthconsentcredentialaccountledgerinvoicepaymentpayrollescrow
GOVERNANCE, COMMERCE & CAPACITY
policyauditcomplianceriskcontractcatalogueorderinventorypricingreturnsfulfilmentassetfacilityequipmentcapacitysupply_chain
PEOPLE, TIME, PLACE & WORK
memberemployeebeneficiaryguardianrolecalendarslotquotaschedulelocationzoneunitworkflowapprovaltaskdocumentreportanalytics
EXTERNAL BRIDGES
mobile_moneybankswiftcustomscredit_bureauinsurancelogisticsemergencyportal_relaybridge_relaynotificationmessaging

A haulage business, a certification authority and a district clinic are on the same platform wearing different configuration, not three products.

TRUST IS TIERED, AND AUTHORITY ONLY FLOWS DOWN

AUTHORITY DELEGATES DOWN, NEVER UP LAYER 0 · ROOT AUTHORITY sovereign · central bank · tax · regulator LAYER 2–4 · IDENTITY & TRUST digital ID providers · compliance validators LAYER 10–11 · NETWORK SERVICES settlement routing · finance gateways · comms LAYER 12 · FINALITY settlement engine · forensic ledgers ENFORCED IN CODE primitive_layer/0 declares the tier validate_envelope/1 checks it at every service boundary
A commerce primitive cannot mint currency, because there is no path by which it could ask. The tier is declared in code and checked before any domain logic runs.
LAYERDESIGNATIONHOLDS
0Root authoritySovereign · central bank · tax authority · regulator · registry
2–4Identity & trustDigital ID providers, compliance validators
10–11Network servicesSettlement routing, finance gateways, comms
12FinalitySettlement engine, forensic ledgers

A commerce primitive cannot mint currency, because there is no path by which it could ask.

02 · HOW IT LAYERS

The commercial stack and the technical stack are the same stack.

UnityZM sells at four altitudes. Each is a different buyer and a different contract, but all four are served by one running platform.

TIERWHAT IS BOUGHTWHO BUYSMAPS TO
1 · NetworkAccess to the settlement, identity and tax railsBanks, mobile-money operators, authoritiesNetwork + trust layers
2 · PlatformA configured cockpit: orders, dispatch, stock, settlementEnterprises and operatorsExperience + domain layers
3 · EditionA licensed, deployable instance for their own estateInstitutions, partners, other marketsSubstrate, same image, different estate
4 · APIMetered calls into settlement, KYC, balance, webhooksDevelopers and integratorsDomain layer, exposed and metered

These are layers rather than a menu because tier 2 customers become tier 1 volume. An operator running dispatch on the cockpit settles through the network by default. That is not cross-selling; it is architecture.

BUSINESS TIERS THE SAME STACK, IN TECHNOLOGY 4 · API metered calls 3 · EDITION a licensed instance 2 · PLATFORM a configured cockpit 1 · NETWORK the settlement rail itself Domain layer, exposed and metered Substrate, same image, different estate Experience + Domain layers Network + Trust layers HIGHER TIERS CONSUME THE LOWER ONES
An operator running dispatch on the cockpit settles through the network by default. That is not cross-selling. It is architecture.

A new commercial tier is not a new build. Tier 3 exists because of one environment variable and a signed partition licence.

The same mechanism that lets us run a lean node at a border post lets us license a whole edition to an institution. The commercial model is downstream of the deployment model, which is why three consequences follow that shape what we need from a cloud partner.

LAYERS SEPARATE AT THE SUBSTRATE

Data and trust carry the residency constraints. Experience, build and AI carry none. That boundary is enforced by the architecture, not by a policy we wrote, which is why hybrid is genuinely available to us rather than aspirational.

LOAD IS NOT EVEN ACROSS LAYERS

Data and trust are steady and modest. Experience and AI are spiky and occasionally enormous. One machine large enough for the second means overpaying permanently for the first.

TIER 3 MULTIPLIES ESTATES

Every licensed edition is another cluster to build, test and support, from the same team. This is exactly where an elastic build fleet stops being a nice-to-have.

03 · WHY ELIXIR / ERLANG / PHOENIX

In this market, the runtime choice is a pricing decision.

Erlang was built to run telephone switches that could not go down, on expensive hardware, maintained by small teams. That is our problem statement almost word for word.

ONE MODEST NODE, HIGH CONCURRENCY

The BEAM schedules millions of lightweight processes pre-emptively across cores. In practice the whole platform serves live tenants from a modest VPS, and edge nodes are 4–8 GB ARM64 boxes. That is the difference between a viable Zambian price point and an unviable one.

PARTIAL FAILURE, NOT OUTAGE

Every primitive runs under a supervisor. A crash in invoicing restarts invoicing. It does not touch settlement. A node's blast radius is fixed at boot by its assigned role.

DISTRIBUTION IS IN THE RUNTIME

Location transparency is native; Horde adds a CRDT-backed registry for cluster-wide discovery. We never had to buy or build a service mesh, for a self-funded company, this is a whole category of cost never incurred.

LOCAL SURVIVABILITY

A worker node partitioned from the master keeps operating on local authority and reconciles on reconnect. Where links to a border post are genuinely intermittent, that is not exotic. It is Tuesday.

UNITYZM_NODE_ROLE = settlement Primitive.NodeSupervisor reads the role at boot commerce subtree not started settlement subtree logistics subtree not started ledger escrow crashed → restarting settlement BLAST RADIUS One branch restarts. Its siblings never notice, and the node stays up. A dormant subtree cannot be woken by changing a variable, the signed partition licence has to permit the role.
The same release image becomes a core node, a settlement node, or a 4 GB ARM64 box at a border post, by environment variable, not by a different build.

WHAT WE GIVE UP, BEFORE YOU ASK

TRADE-OFFHOW WE HANDLE IT
Small talent poolWe hire for fundamentals and train Elixir. It also acts as a filter, and OTP's constraints make junior code safer than the same engineer's Node or Python would be
Wrong language for numeric / ML computeWe do not pretend otherwise. This is precisely why AI inference is a cloud workload for us and not a BEAM workload
Fewer vendor SDKsMost SDKs are thin HTTP wrappers; we implement against the API. It does mean we would call OCI over plain REST, with no Oracle SDK for our runtime

THE STACK

CONCERNCHOICEWHY THIS ONE
RuntimeElixir 1.20 / OTP 27Concurrency, supervision, native distribution
Web & UIPhoenix + LiveViewServer-rendered real-time; one codebase, no separate frontend team; diffs over a socket suit thin pipes
Distributed registryHordeCRDT process registry, location transparency across nodes
Background workObanDurable Postgres-backed queue; survives restarts
System of recordPostgreSQLTransactional core; also backs the job queue
Ephemeral & pub/subRedisCache, ephemeral state, cross-node signalling
Edge & offlineSQLiteLean nodes where a full server is unwarranted
PackagingDockerIdentical artefact on VPS, on-prem or any cloud, no proprietary service dependency

Portability is a design property, not a migration project. We can place a workload on OCI because nothing in our stack is welded to where it currently runs.

04 · THE MESH

One platform, many nodes, across ten provinces.

WESTERN NORTH-WESTERN COPPERBELT LUAPULA NORTHERN MUCHINGA EASTERN CENTRAL LUSAKA SOUTHERN Lusaka core · settlement finality · system of record Kitwe Ndola Kabwe Chipata Kasama Solwezi Mansa Livingstone Mongu Choma Kasumbalesa Chirundu Nakonde Kazungula Mpulungu Chinsali
Core: full tree, settlement finality, system of record
Regional: same image, tree narrowed by role
Edge: ARM64 4–8 GB, offline-first

All three tiers run the identical release artefact. A lean node is not a cut-down product. It is the same platform with a narrowed supervision tree and a signed licence saying which role it may be.

ONE ORDER, THREE PROVINCES

A wholesaler in Chipata orders stock from a supplier in Ndola, moved by a haulier registered in Lusaka.

#WHEREWHAT HAPPENSPRIMITIVES
1ChipataBuyer places the orderorder · catalogue · pricing
2Chipata → LusakaIdentity and KYC tier resolved; trust level gates the valueidentity · compliance
3Lusaka coreFunds locked in escrow, held, not paidescrow · account · ledger
4NdolaSupplier sees a funded order, picks and confirms stockinventory · fulfilment
5LusakaCarrier matched, priced, dispatchedlogistics · capacity
6On the roadPosition pings, corridor to corridorlocation · zone
7ChipataDelivery confirmed with proof at the edge nodefulfilment · document
8Lusaka coreEscrow releases, commission taken, tax computed and filed, ledger hash-chainedsettlement · tax_authority · audit

One transaction, three provinces, four parties, one traceable record. And the tax event is produced by the transaction that moved the goods, not reconstructed from paperwork a month later.

NOW BREAK THE NETWORK

At step 7, the link between Chipata and Lusaka drops. The Chipata node keeps working: it captures proof of delivery against local storage, signs it with its node identity, and queues it. The driver is not blocked. On reconnect the envelope replays, escrow releases, settlement completes.

What is not permitted: Chipata cannot declare finality alone. Settlement lives at trust layer 12 and stays in Lusaka.

The edge can always capture truth. Only the core can declare it final.

HOW NODES ACTUALLY CONNECT

Nodes never address each other by IP. Every message is a signed envelope, routed by a topology policy chosen at runtime, over whichever transport is currently healthy.

FIVE LAYERS BETWEEN ONE NODE AND ANOTHER 1 · Discovery Horde, a CRDT registry. Ask for `:p002_tax_authority` and get a process, wherever it lives. libcluster forms the cluster 2 · Envelope Seven layers: network, routing (scope, TTL, hop count), group, delivery semantics, versioned payload, signatures, UI metadata 3 · Topology Five pluggable policies: single node, full mesh, hub and spoke, Horde ring, zone-aware hybrid. Chosen at runtime, not at build 4 · Authentication Distributed Erlang with per-cluster cookies, plus an HMAC cluster secret on every handshake. Unsigned envelopes are dropped at the boundary 5 · TRANSPORT, WITH FAILOVER WireGuard, then Tailscale, then a public TLS bridge. A selector probes health and picks the best available tier BUILT AND RUNNING Horde · envelopes · topology policies · HMAC handshake · the transport selector itself DESIGNED, NOT DEPLOYED The physical WireGuard and Tailscale meshes, and the outbound half of the cluster bridge
The selector is live and surfaced on the cluster console. The meshes it would select between are the part we have not yet built, because one node has nothing to connect to.

WHY A SELECTOR AND NOT ONE TRANSPORT

A border post may have a usable private mesh on Monday and nothing but public internet on Tuesday. The node should keep working either way and tell the operator which tier it is on, rather than silently degrade.

FEDERATION IS THE SAME MECHANISM

A cluster bridge connects one estate to another over opaque peer descriptors and the same HMAC handshake. That is how a licensed edition settles with the network without joining its cluster.

05 · ORDER TO DELIVERY

We don't take over a business. We close the gaps between its steps.

The classic enterprise play arrives with a system of record and asks the business to reorganise around it. In this market that is dead on arrival, and rightly so. The capital lands before the benefit, and it discards how the operator actually works.

The business is usually not broken. The seams are.

Walk a real order today: the customer orders on WhatsApp. Stock is checked on a spreadsheet, or by walking to the shelf. Payment goes to a personal mobile-money number. Dispatch is a phone call. Delivery is a photo of a signed paper note. The invoice is retyped. Tax is reconstructed at month-end from paperwork.

TODAY, EVERY STEP WORKS, EVERY SEAM LEAKS Order WhatsApp Stock spreadsheet Payment mobile money Dispatch phone call Delivery paper note NO RECORD UNRECONCILED NO VISIBILITY RETYPED WITH UNITYZM, THE SAME STEPS, NO SEAMS Order Stock Escrow Dispatch Proof one transaction · one ledger · the tax event is produced by the movement, not reconstructed from it
No single-purpose product fixes a handoff, because a handoff belongs to neither system on either side of it.

Every individual step works. The losses are entirely in the handoffs, and no single-purpose product fixes a handoff, because a handoff belongs to neither system on either side of it.

EVERY ECONOMIC SERVICE HAS THE SAME SHAPE

DiscoverOrderVerifyPriceCommitAllocateExecuteProveSettleAccount
STAGEHAULAGESEED CERTIFICATIONCLINIC
DiscoverAvailable capacityCertified lotsAvailable services
VerifyLicence, KYC tierGrower registrationPatient identity
CommitFunds held in escrowFee heldCover confirmed
AllocateTruck + driverInspector + windowClinician + slot
ProveProof of deliveryCertificate + lot eventRecord of care
AccountInvoice filed, hash-chainedRegulator sees the lotAudit trail

Same stages, same primitives, different configuration. This is why unrelated industries do not require forking the product.

A CLIENT IS CONFIG, NOT CODE

There is not a single client's name anywhere in the codebase, not a table, a route, a module, or a CSS class. A client is a descriptor: a database record plus their ingested data. Generic code renders it.

Onboarding the next operator in the same line of business is a config change and a data import, zero lines of code.

WE MEET THE RAILS THAT EXIST

Bridges to what the market already uses: MTN MoMo, Airtel Money, Zamtel, banks, card networks, ZRA Smart Invoice, USSD.

We are not asking anyone to abandon mobile money. We are asking that the payment land against the order instead of in a spreadsheet.

START AT ONE GAP

An operator adopts the gap that hurts most, usually dispatch visibility or reconciliation. The spine fills in behind it as trust builds. No big-bang migration, no stop-the-business cutover.

WHAT WE ARE NOT

Not an ERP, no company-wide HR, CRM or group accounting, and we say so in writing to prospects. Not a payment processor. Not a replacement for the operator's judgement. Being explicit about the boundary is what makes the rest believable.

06 · THE MISSION

Soften and harmonise.

To reduce the shocks and the friction between the people who make, move, sell and settle, so that participating in the formal economy stops being a cost and starts being an advantage.

Two verbs carry the whole thing, and they are chosen carefully.

SOFTEN, REMOVE THE HARD EDGES

An economy that runs mostly on cash has sharp edges, and people fall off them daily. Softening means replacing each cliff with a gradient. This is not aspiration. It is what the mechanisms already do:

THE HARD EDGETHE GRADIENT WE PUT IN ITS PLACE
Trust is binary, pay first or ship firstEscrow. Funds held, visible to both sides, released on proof. Strangers can trade
Identity is all-or-nothingTrust tiers 0–10. Enter at the tier you can evidence and climb as you trade. Nobody is turned away at the door
Systems are online-or-deadOffline-first edge nodes. Poor connectivity degrades the platform; it does not stop the business
Tax is reconstructed at month-endThe invoice files itself as the goods move. No shock, no penalty, no reason to stay informal
No transaction history existsHistory accrues by trading. The precondition for credit that most Zambian businesses cannot access today

HARMONISE, MAKE THE PARTS AGREE

Today the parts do not speak to each other. Mobile-money operators interoperate poorly, banks are separate estates, the tax authority reconstructs after the fact, the regulator sees things late, and cross-border is paperwork at a barrier.

Harmonising means the same participants settling on the same network under the same identity, so agreement is structural instead of reconciled. One network. One identity. One double-entry ledger that physically refuses a movement that does not balance. Tax and audit as products of the transaction rather than archaeology performed on it later.

Zambia borders eight countries, and our corridors already end at other economies. The same primitives that harmonise a domestic corridor harmonise a regional one. That is the ten-year shape of this: the same platform, more borders.

NOT JUST SERVICES, RESEARCH AND DATA

Zambia's economy has never been measured at transaction granularity. Policy is made on surveys, estimates and lagging indicators. Meanwhile a platform carrying orders, deliveries, invoices, settlements and corridor movements holds the most accurate picture of real economic activity anyone has had of this economy.

WHAT IT COULD ANSWER

Corridor throughput and where freight actually slows. Price formation by district over time. Informal-sector activity made visible without being made punishable. Seasonal and agricultural flows at a granularity that helps a planner. Credit signal for businesses with years of honest trading and no bank history.

THREE COMMITMENTS, STATED FIRST

Consent and anonymisation are prerequisites, not later features. The data stays sovereign. It is Zambian economic data and does not become someone else's asset. And research is not a monetisation strategy in disguise: the moment it is, the trust that makes the data accurate disappears.

This is why the AI and GPU conversation is a mission conversation rather than a feature conversation. Research at this granularity is embeddings, clustering, time-series and inference over a growing corpus, precisely the workload our runtime is wrong for and elastic cloud is right for. Without capacity we do not currently have, it does not happen at all.

WIDEN WITHOUT DISTURBING DAILY LIFE

The failure mode for national infrastructure is well documented: a mandated cutover, a system that does not work on day one, and an economy that pays for the transition in lost trade. We have designed explicitly against it.

A national rail must never make somebody's Tuesday worse.

HOW WE WIDENWHY IT DOES NOT DISTURB
Adopt one gap firstThe operator keeps their whole existing process; we close the seam that hurts most
Cash keeps workingWe are additive to cash, not a replacement. Nobody is forced digital
Existing rails stayBridges to the operators, banks and the tax authority. We ask no one to abandon what they use
Config, not codeA new tenant or region is a descriptor and a data import, no redeployment that could break someone live
Kill-switch and maintenance windowsWhen something must go down it is scoped, scheduled and announced. Never a surprise
Backward compatibility as an invariantA feature reaches a tenant only when their descriptor opts in

Growth is quiet by construction. We widen by being adopted, one gap and one operator at a time, not by being mandated.

07 · HARD RAILS FIRST

Build the parts that cannot be retrofitted.

There is an order to this work, and it is not the order that demos well. Identity, money, settlement and tax came first: before dashboards, before mobile apps, before anything a buyer gets excited about in a meeting.

You cannot retrofit correctness into a ledger. You can always add a screen to a correct ledger.

A ledger that has been wrong for two years cannot be repaired, every downstream balance, invoice and tax filing inherits the error. So the hard rails were built first and built strictly: double-entry journals that physically refuse a movement which does not sum to zero, hash-chained append-only event logs, trust tiers enforced at the service boundary, and settlement finality isolated at its own layer.

WHAT WENT FIRST

Identity and KYC tiers · double-entry ledger · escrow · settlement finality · tax and audit · signed transport envelopes · hardware-bound node boot.

WHAT CAME AFTER

Cockpits, maps, replay, reporting and the AI layer. Every one of them reads from rails that were already correct, which is why they could be built quickly.

THE COST OF THE ORDER

It is slower to demo and harder to fund. For eighteen months the impressive part was invisible. We would make the same choice again.

HOW THE SECURITY IS LAYERED

Security here is not a perimeter with an application behind it. It is seven layers, each of which assumes the one outside it has already failed.

OUTSIDE IN. EACH LAYER ASSUMES THE ONE BEFORE IT WAS BREACHED 1 · The machine may not boot A signed boot lock bound to the host hardware ID, plus a partition licence naming the permitted role. A stolen disk image will not start 2 · The node may not be what it claims Every node carries an RSA identity registered cluster-wide. Mutual verification before any message is accepted 3 · The message may be forged Signed transport envelopes with an HMAC cluster secret. Unsigned traffic is dropped at the boundary, before any domain code runs 4 · The caller may not be entitled Trust layers 0 to 12, declared per primitive and validated at every service boundary. Authority delegates downward and never upward 5 · The human may not be who they say KYC tiers gate value, TOTP two-factor, per-account and per-IP throttling, scoped API keys with quotas and address allowlists 6 · The data may leak PII encrypted at the domain boundary with blind indexes for search. The Identity Veil pseudonymises anything crossing to a model 7 · AND IF ALL OF THAT FAILS, IT CANNOT BE HIDDEN Append-only hash-chained ledgers that refuse UPDATE, multi-signed audit trails, maker-checker on privileged actions, and a kill-switch
The last layer is the one that matters most commercially. We cannot promise nothing will ever go wrong. We can promise it will be visible and provable afterwards.

THE ORDER IS DELIBERATE

Cheap checks run first. An unsigned envelope is discarded before it costs a database query. Trust-tier validation happens before domain logic. The expensive work only runs for traffic that has already earned it.

WHAT IS NOT YET DONE

The transport mesh is designed and not deployed. Keys are held as environment variables rather than in a managed store. There is a tracked hardening register, and it is shared on request rather than published.

SECURITY THROUGH THE IDENTITY VEIL

The hardest question a sovereign platform faces about AI is simple: how do you use a model without handing it your citizens?

Our answer is a subsystem called the Identity Veil (Unityzm.AI.IdentityVeil). It sits between the platform and any model, and no real identifier ever crosses it.

SOVEREIGN SIDE Grace Banda +260 97… NRC 1234… real people, real records THE VEIL WHAT THE MODEL SEES person:pr_8f21 phone:ph_4c07 id:nr_b933 stable · namespaced · meaningless mask rehydrate The model anywhere, incl. cloud Aliases are stable, so the model can still correlate the same actor across events. It simply never learns who they are.
Mask on the way out, rehydrate on the way back. Operators read real names; the model only ever saw pseudonyms.
PROPERTYWHAT IT MEANS
Stable aliasesThe same real identifier always maps to the same alias, so a model can correlate one actor across many events without ever learning the identity
NamespacedEvery alias carries its kind (person:, phone:), so a single pass over a reply finds all of them for rehydration
Free-text scrubberA safety net over payload values, catching emails and phone numbers that leak through unstructured text
Rehydration on replyOperators see real names; the model never did. Resolution runs through a pluggable resolver
Lock-free hot pathForward lookups hit ETS in microseconds; only a first-encounter mint takes a process call

This is the mechanism that makes cloud AI compatible with a sovereign platform, and it materially widens what we can place with you.

It is worth stating plainly, because it changes the shape of our ask: a great deal of the inference we want to run is not residency-constrained once it passes the Veil, because there is nothing identifying left in the prompt. What stays sovereign is the mapping, the alias table itself, which never leaves.

AN SDK FOR DEVELOPERS

The fourth commercial tier is other people building on the rails. Today that surface is real but raw, and we should be precise about which is which:

TODAYSTATUS
OpenAPI specification + Swagger UILive, machine-readable, published
Developer portal at /developersLive, invite and one-time-code onboarding
Scoped API keys, quotas, rate limits, CIDR allowlistsLive, per client, metered and billed
Webhooks, signed, with replay and dedupeLive
Sandbox with provider simulationLive, simulated by design
Typed SDKs (JS, Python, PHP)Not built. The next step, not a current claim

An integrator today reads a spec and writes HTTP calls. That works, and several do it. But it is friction, and friction is what decides whether an ecosystem forms. Generating typed clients from the spec we already publish is a small, well-understood piece of work with a disproportionate effect on tier-4 adoption.

08 · THE DECADE

Connect the hidden regions, quietly.

Zambia's economy is not evenly visible. A corridor town has prices, records and counterparties. A ward two hours off that corridor has all the same economic activity and almost none of the infrastructure that would let anyone see it, price it, or lend against it.

The ten-year work is closing that gap, and the method matters more than the ambition. We do not arrive with a programme. We put a node where trade already happens and let it become useful.

now2 years 5 years10 years H1 · CORRIDORS Lusaka, Copperbelt, border posts H2 · DISTRICT TOWNS provincial centres, depots, markets H3 · RURAL WARDS cooperatives, clinics, out-grower schemes REACH COMPOUNDS WHAT GOES IN Regional nodes on the corridor Lean ARM64 nodes at depots Offline-first nodes, days between syncs
Each horizon reuses the same release image. Reaching a rural ward is a deployment decision, not a development project.

WHY THIS COMPOUNDS ECONOMICALLY

Connecting a hidden region is not charity and it is not coverage for its own sake. Three specific things change, and they compound:

1 · ACTIVITY BECOMES VISIBLE

A cooperative that sells through the rail accrues a transaction history. That history is the precondition for credit, which does not currently exist for most of the country regardless of how well people actually trade.

2 · PRICE DISCOVERY IMPROVES

When a ward can see what its produce fetches two districts away, the information asymmetry that suppresses rural prices starts to close. That is margin moving toward the producer.

3 · THE END OF A CORRIDOR BECOMES A POINT ON IT

A place that can be ordered from, dispatched to and settled with is no longer the end of the line. It joins the network rather than depending on it.

WHY IT HAS TO BE QUIET

Loud national rollouts fail here, and they fail expensively. They require a cutover date, they assume digitisation that is not there, and when they stumble the whole idea is discredited for a decade.

Nobody should ever have to be told the platform arrived. They should notice that the truck can be tracked, and that the money landed.

So expansion is deliberately unremarkable: one depot, one cooperative, one clinic at a time. Each is invisible nationally and decisive locally. That is slower, and it is the only version of this that survives contact with reality.

09 · WHY OCI

Three needs: early adoption, usage capacity, AI acceleration.

EARLY ADOPTION

The platform is built. The constraint is no longer engineering. It is capacity bought ahead of revenue.

Onboarding an operator means a configured estate, seeded data, a UAT environment and a parallel-run period: weeks of infrastructure consumed before the first invoice. Self-funded, that cost is the actual throttle on how fast we can say yes. Not demand. Not engineering. And every tier-3 licence multiplies estates to build, test and support from one team.

USAGE CAPACITY

Our load is not shaped like our steady state.

PEAKTRIGGERSHAPE
Settlement runsMonth-end netting and reconciliationHours, heavy, predictable
Tax filingZRA deadlinesDays, everyone at once
SeasonalHarvest and certification windowsWeeks
Build & testEvery release, every new editionBursty, embarrassingly parallel

The BEAM handles concurrency well on modest hardware, which is exactly why buying permanently for the peak is such poor economics for us. We would be paying for 40× headroom that sits idle most of the month.

There is a second capacity argument, and we should raise it before you do: a single Lusaka cluster is a concentration risk. A warm standby is the cheapest credible DR available to us: encrypted, with keys held sovereign, and with certain tenants excluded from replication entirely rather than fudged.

AI ACCELERATION

Our AI posture today is deliberately frugal: all traffic passes through an internal provider-agnostic router; an intent router answers routine requests on fast deterministic paths and escalates to a model only when genuinely required; usage is metered token → credit → kwacha with double-entry ledger integration, so cost is attributable per tenant and an agent's wallet refuses to overspend before the model can.

That design cuts spend at source. What it cannot do is these five things, all of which need real compute:

1 · TENANT-FACING INFERENCE AT VOLUME

With predictable latency as tenant count grows. The current path is not a production-grade answer at scale.

2 · PII-BOUND INFERENCE

Some tenant data cannot leave the sovereign boundary, which means self-hosted small models on GPU in a defined, contractually bounded location.

3 · EMBEDDINGS AT CORPUS SCALE

For knowledge-graph and search across tenant document estates.

4 · DOCUMENT EXTRACTION

Invoices, delivery notes and customs paperwork photographed at a border post on a poor connection.

5 · LANGUAGE ADAPTATION

Small-model adaptation to Zambian language and idiom, so the platform speaks the way its users actually speak. Occasional GPU-heavy work, not continuous.

10 · WHAT RUNS WHERE

State stays. Compute travels.

SOVEREIGN CORE · LUSAKA System of record Settlement finality Layer-0 authorities Identity, KYC, PII Tenant cockpits Edge & lean nodes THE BOUNDARY CLOUD · ELASTIC Build & CI fleet Batch settlement peaks Corridor telemetry AI inference & embeddings Model adaptation Warm DR, encrypted jobs out results back THE LEDGER NEVER CROSSES A burst node is not permitted to boot into a settlement role, the signed partition licence will not allow it.
State stays. Compute travels. The boundary is a property of the architecture, not a policy we wrote down.

SOVEREIGN, ALWAYS

  • System of record: identity, wallets, ledgers
  • Settlement finality (trust layer 12)
  • Layer-0 authorities, tax, central bank, regulator interfaces
  • Identity, KYC and PII, encrypted at the domain boundary
  • Live tenant cockpits, latency to Zambian users
  • Edge and lean nodes, offline-first at the tenant

CANDIDATES FOR OCI

  • Build and CI fleet: parallel, bursty, zero data sensitivity
  • Batch settlement and reconciliation peaks
  • Corridor telemetry and route computation
  • AI inference, non-PII
  • Embeddings and search indexing
  • Model adaptation, occasional, interruption-tolerant
  • Warm DR standby, encrypted, keys sovereign

WHY THIS BOUNDARY IS CREDIBLE

Every vendor hears "we'll keep the sensitive part on-prem" from every prospect. What makes ours different is that the boundary is enforced in code, not in policy:

DECLARED PER PRIMITIVE

Trust layers 0–12 are declared by primitive_layer/0 and validated at every service boundary by validate_envelope/1.

ROLE FIXED AT BOOT

A node's role is set by UNITYZM_NODE_ROLE plus a partition licence signed by the root CA. Role mismatch and the node refuses to start.

BOUND TO HARDWARE

Nodes carry a forensic boot lock tied to host hardware identity. A stolen disk image will not boot on unknown hardware.

A burst node cannot silently become a settlement node because someone changed an environment variable. It is not permitted to boot into that role.

THE SHAPE OF THE TRAFFIC

This is not a bulk-data platform. It is millions of very small events, in bursts, with a hard latency expectation on a handful of them. Sizing it like a data warehouse would get the answer badly wrong in both directions.

PROPERTYWHAT IT MEANS FOR SIZING
Micro-transactionsA telemetry ping is tens of bytes. A settlement exchange is a few kilobytes. Bandwidth is almost never the constraint
Very high event countRequest handling, connection concurrency and database write IOPS are the constraints. This is why the runtime choice matters
Bursty, not smoothMonth-end, tax deadlines, payroll dates, harvest windows. Hours at 10 to 40 times the steady rate, then quiet
Latency is asymmetricSettlement finality must feel instant. A telemetry ping can be seconds late and nobody notices. Only a fraction of traffic needs the fast path
Long-lived connectionsLiveView and WebSocket channels hold sockets open. Concurrency is measured in open connections, not requests per second
Egress returns to the coreWork sent to cloud comes back. Egress is a structural line item rather than an edge case

EXPECTED THROUGHPUT BY FEATURE

Relative event volume at a modest deployment. Bars are logarithmic, because the range spans five orders of magnitude and a linear scale would show only one bar.

Telemetry pings ~100k / day
Notification fan-out ~18k / day
Chat & agent messages ~9k / day
Audit & ledger events ~6k / day
Transaction events ~2.5k / day
Orders & dispatch ~700 / day
Invoices & tax filings ~300 / day
Settlement finality ~120 / day
Document extraction ~60 / day
Model adaptation runs ~1 / quarter

Latency-critical. Everything else can absorb seconds of delay without anyone noticing.

The two bars that matter are not the tall ones. Telemetry dominates the count and is entirely tolerant of delay; settlement is a rounding error in volume and tolerates none. An architecture that cannot separate those two ends up buying fast infrastructure for pings.

HOW THE AI AGENTS SPEND

Agents do not call a model whenever they feel like it. Every call passes through a metering path that makes spend attributable and bounded before it happens.

Agent wants to act Intent router deterministic path? most stop here ANSWERED FOR FREE Capability gate is it allowed to? single-use grant Credit wallet can it afford it? per-tier cap THE MODEL via the Veil EVERY CALL, BEFORE IT HAPPENS AFTERWARDS Tokens are recorded to a usage ledger, converted token to credit to kwacha, and attributed to the tenant that caused them
The wallet is the part that matters. An agent that has spent its allowance stops, rather than producing a surprise invoice.

AVOID THE CALL FIRST

The cheapest model call is the one not made. Routine requests resolve on deterministic paths and never reach a model, which is why marginal AI cost is near zero today rather than merely small.

BOUNDED BEFORE, ATTRIBUTED AFTER

Capability gates and time-boxed single-use grants bound what an agent may do. The usage ledger records what it cost and which tenant caused it, in kwacha.

WHY THIS MATTERS FOR A GPU ASK

We can put a hard ceiling on inference spend and prove where it went. That makes a GPU commitment a sizing question rather than an open-ended risk.

12 · HAVE vs NEED

What a valid production environment would actually require.

The platform is real and serving tenants. The environment around it is not yet what a settlement platform should run on, and we would rather set that out precisely than let it be discovered. Everything below is measured, not estimated.

A single node with one database is a deployment. It is not yet a production environment.

ENVIRONMENT TIERS

TIERWHAT WE HAVEWHAT A VALID ESTATE NEEDSGAP
Local developmentDeveloper workstation, full compose stack available locallySame, with parity to production✅ adequate
Cloud developmentNone. There is no shared or ephemeral dev environmentPer-branch ephemeral environments so work is reviewable before merge❌ absent
Continuous integrationGitHub Actions: compile and format are blocking gatesThe same, plus a blocking test suite🟡 partial
Automated testing1,014 test files. In CI the suite runs advisory, non-blocking because the full umbrella cascades false failuresPer-app test slices that run fast and block the merge🟡 real tests, wrong gate
Staging / UATNone. Code goes from a workstation to productionA production-mirror with anonymised data, where migrations and releases are rehearsedthe critical gap
ProductionOne VPS, one PostgreSQL, no standby, no poolerAt least two nodes, hot standby, connection pooling, object store, cache, search🟡 single point of failure
Disaster recoveryNone. No second siteA second region with a tested restore, and a stated recovery objective❌ absent
Partner sandboxProvider simulation and UAT scenarios in the gatewayIsolated sandbox tenancy integrators can be given safely🟡 partial

THE ONE THAT MATTERS MOST

Everything above is a degree of maturity except one row, and we will not soften it: there is no staging environment. A change to a platform that moves money, files tax and holds identity is validated by compiling, then applied to production, where migrations and an idempotent seed run on boot.

It has not bitten us yet. That is not the same as it being safe, and it is the first thing we would build with capacity we do not currently have.

AND THE MACHINE IT IS ALL BUILT ON

The whole platform, 303,000 lines across 39 applications, is written on one laptop. Here is its state as measured today, because it is the most binding constraint on this project and pretending otherwise would be silly.

PROPERTYMEASUREDCONSEQUENCE
Machine11th-gen Intel i7 mobile, 4 cores / 8 threadsThe build host is a laptop, not a workstation
Memory14 GB total, 2 GB availableCompiling the umbrella and running the stack do not comfortably coexist
SwapNone configuredMemory pressure goes straight to the OOM killer with no cushion
Out-of-memory kills9 in the last 30 daysProcesses are killed mid-work. This is the "machine restarts" problem, and it is measurable
Load average7.39 on 8 threadsEffectively saturated. Builds queue behind each other
Disk468 GB, 89% usedDocker layers and build caches compete with the working tree
OSUbuntu 26.04 LTSCurrent; not the problem

Nine out-of-memory kills a month is not a preference for better hardware. It is work being lost.

This is why cloud development is on the have-versus-need list rather than filed under nice-to-have. A remote build environment would take compilation, the test suite and the local service stack off a saturated laptop. It is also the cheapest item in this entire briefing, and the one that would most immediately change delivery rate.

ENTERPRISE CAPABILITIES

CAPABILITYWHAT WE HAVEWHAT WE NEED
Backup & restorepgBackRest is configured and a backup worker exists. The most recent backup on the box is dated 26 June; WAL archiving is offNightly base backup, continuous WAL archiving, and a restore rehearsed on a schedule. An untested backup is a hypothesis
High availabilityNone. One database, one nodeHot standby with defined failover, and a pooler in front
ObservabilityHost metrics via netdata; PromEx and telemetry instrumented in the codeMetrics, logs and traces in one place, with alerts that reach a human at 3am
Secrets managementA single rendered env file into the orchestratorA managed secret store with access control and an audit trail
Key custodyData-encryption key and blind-index salt held as environment variables. They cannot be rotated once data is writtenKMS or HSM-backed custody. This is the highest-consequence item on the page
Change managementPush to main deploys. Rollback via the orchestrator's version listA staging gate, and an approval for anything touching money or identity
Load & performance testingA settlement-network load generator exists and is used ad hocScheduled load tests against staging, with regression thresholds
Vulnerability managementDependency updates by handAutomated dependency and image scanning, an SBOM per release
Incident responseOne engineer. A kill-switch with scoped, scheduled downtimeRunbooks, an on-call rotation of more than one, a status page
Capacity managementAn autoscaler exists, but the only lever it can pull is job-queue concurrencyReal horizontal scaling of application replicas

THE DYNAMIC PARAMETERS

The mission expands along four axes. Each one makes a different gap binding, which is why the answer is not simply "a bigger box":

PARAMETERAS IT GROWSWHAT BECOMES BINDING FIRST
TenantsEach is provisioned before it paysStaging, so an onboarding cannot break a live tenant. Then connection pooling
Nodes & provincesRegional and edge nodes multiplyThe transport mesh between them, which is designed and not deployed. Then cluster observability
Licensed editionsEvery edition is a separate estateAn elastic build fleet. One team cannot hand-build estates
AI intensityMore work touches a modelGPU capacity, and the Identity Veil already lets most of it run off-shore
Settled valueThe ledger carries more consequenceHA, tested restore and key custody. Above a threshold these stop being good practice and start being obligations

WHAT WE WOULD BUILD FIRST

ORDERWHATWHY IT IS FIRST
1Backup, WAL archiving and a rehearsed restoreCheapest thing here and the largest reduction in risk. Nothing else matters if the data cannot come back
2Staging that mirrors productionEvery subsequent change becomes safer. It is also the environment a migration is rehearsed in
3Database standby and poolingRemoves the single point of failure under the whole platform
4Build and CI fleetTurns the advisory test suite into a blocking gate, and makes editions buildable
5Observability with real alertingYou cannot operate what you cannot see, and one engineer cannot watch it manually
6Warm DR in a second regionConcentration risk stops being acceptable as settled value grows

None of this is exotic and none of it is research. It is the ordinary scaffolding a platform of this consequence is supposed to stand on, and it is what we mean when we say the constraint is capacity rather than engineering.

13 · IMPACT & INFRASTRUCTURE

Move the sliders. Watch the boundary pay for itself.

This is a model, not a measurement, every coefficient is shown and every one is arguable. Its purpose is to make one claim testable: that owning the peak is what makes coverage unaffordable, and that renting it is what makes rural reach possible.

DEPLOYMENT

LOAD

YOUR PRICES · OVERWRITE THESE

Defaults are indicative list prices and almost certainly wrong for a negotiated account. Type your own and the model re-costs instantly.

CONSTRAINTS

RESULT · PER MONTH

as at 29 Jul 2026
PEOPLE WITHIN REACH
TOTAL INFRASTRUCTURE COST
COST PER PERSON REACHED

WHERE THE MONEY GOES

The coefficients, so you can argue with them
ASSUMPTIONVALUEBASIS
Rural population density12 / km²Order-of-magnitude for non-urban Zambia
Urban population density3,800 / km²Order-of-magnitude for Zambian urban districts
Urban core radius8 kmAn urban node is a dense core inside a sparse ring, not a whole disc at urban density
National population ceiling21,000,000Reach is capped here; the model cannot reach more people than exist
Regional node$60 / monthModest VM or on-prem equivalent
Elastic burst, per tenant$4 / month × peak factorRented only while the peak lasts
Owning the peak instead× 3.2Capacity held permanently for a peak used hours per month
Inference, per tenant at 100%$9 / monthMetered token → credit → kwacha, as we already bill it
GPU footprint$320 / monthSmallest credible always-available inference shape ⚠ to confirm
USD → ZMW18.74Live mid-market rate at 29 July 2026. Editable above; the platform runs its own daily FX fetcher for billing
Warm DR35% of sovereign costSized for restore time, not full capacity
Identity Veil off× 2.4 on inferencePII-bound work must run on dedicated sovereign hardware instead

Coverage is modelled as non-overlapping discs, which overstates reach where nodes cluster. Cost excludes people, connectivity and the existing sovereign core. Treat outputs as an order of magnitude and a direction, not a quotation.

14 · THE ASKS

Three questions, in the order they matter to us.

1

GPU options at our scale

We are not asking about H100 clusters. We are asking what the bottom of the ladder looks like, and how it climbs.

  • What is the smallest credible inference footprint, a single-GPU shape, or is bare metal the entry point?
  • Is fractional or time-shared GPU available, or is the smallest unit a whole card?
  • Billing granularity, and minimum commitment?
  • Are preemptible instances available? Our inference and adaptation work is interruption-tolerant, which should make us a good fit for cheaper capacity.
  • Could we start on CPU inference with small quantised models and migrate as volume justifies it?
2

Connectivity between our infrastructure and OCI

Our core stays in Lusaka. The burst path has to be dependable.

  • Which is the nearest region, and what round-trip latency should we plan for from Lusaka?
  • Is FastConnect reachable through any carrier with Zambian presence, or only via a Johannesburg point of presence?
  • If direct interconnect is impractical at our size, what site-to-site VPN posture would you recommend, and what should we realistically expect from it?
  • Egress terms. Results return to the sovereign core by design, so egress is a structural line item for us, not an edge case.
  • Our edge images are already ARM64, are Ampere shapes a drop-in? If so, our build fleet moves with no rebuild.
  • We call plain REST from Elixir. Can we assume everything we need is reachable without a vendor SDK?
3

Startup and partner programmes

Our profile does not match the template most startup programmes assume.

  • What fits a self-funded, revenue-generating company rather than a VC-backed pre-revenue one?
  • Typical credit levels and term, and what happens at the cliff when credits expire?
  • Is there an ISV or partner track? Our licensing model means that as we grow we bring other companies' workloads onto OCI, not only our own.
  • Anything specific for sovereign or national-infrastructure platforms in emerging markets?
  • Would Oracle want a reference case, a hybrid sovereign-core / cloud-burst deployment in a market where the pattern is not yet established? We are willing to be documented.

15 · WHERE WE ACTUALLY ARE

The honest grading.

We publish our own assessment of how complete this is, because velocity without disclosure is marketing. The disclosure is what makes the velocity trustworthy.

Functional breadth8.5
Test coverage8.0
Production readiness4.0
Operability4.0
Overall6.0

A real platform, roughly 6/10 complete, with hardening waves between here and go-live. Not "40 person-years of production-grade, done". The solo-plus-AI build bought breadth and speed and deferred some hardening. That is real debt, not a free lunch.

That gap between breadth and hardening is the reason for this conversation. A meaningful part of the remaining work is literally infrastructure.

Disaster recovery. A transport mesh between nodes. Load headroom for the peaks we can already predict. GPU capacity for the five AI workloads we cannot currently attempt. These are not features we need to invent. They are capacity we need to place.

WHAT WE WOULD LIKE TO AGREE TODAY

HORIZONWHAT WE WOULD RUNSHAPE
Now → 3 monthsBuild fleet, first inference footprintSmallest viable; ARM compute, interruption-tolerant
3 → 9 monthsBatch burst, warm DR standbyScheduled and predictable; DR sized for restore-time
9 months +Per-edition estates as licences landGrows with signed contracts, not with hope

WHAT KIND OF CUSTOMER THIS MAKES US

We are not a startup looking for a runway. We are infrastructure looking for a decade.

MISSION PROPERTYWHAT IT MEANS FOR A CLOUD PARTNER
Ten-year horizon, not a funding cycleConsumption that compounds, not a spike, then churn
Expansion along real corridorsEvery border is more estates, more compute, more settlement volume
Research and data as a core pillarA structurally growing, GPU-shaped, elastic workload
Adoption is config-shapedCapacity converts almost directly into onboarded tenants
The sovereign core is permanentHybrid is our end state, not a stepping stone. We will not "eventually move everything", and we would rather say so than imply otherwise

That last row deserves to be said plainly. Some vendors want hybrid to be a phase. For us it is the architecture, permanently. A partner comfortable with that gets a customer who grows steadily for a decade, and should know it now rather than later.

The ledger does not move. Identity, tax and settlement finality stay on infrastructure we control. That is the product, not a preference. Everything else has no residency constraint at all, and that is what we would like to place with you.

WHO IS BUILDING IT

PHILIP CHANI, CO-FOUNDER & PRINCIPAL ENGINEER

Architecture and engineering, the primitives model, the settlement network, and the node mesh. LinkedIn →

YIMBANJI M., CO-FOUNDER

Zambian-owned and Zambian-built. The platform is developed and operated from Lusaka, on infrastructure we control. LinkedIn →

UnityZM Technologies
philipchani@unityzm.co · +260 975 266 094 · portal.unityzm.co · Lusaka, Zambia