A feeless blockchain with native tokens, and a TypeScript SDK that puts a browser game's
currency, items, loot and player market on-chain — without the developer ever running
payment infrastructure.
keicoin.org · Docs · Live examples · llms.txt
PlayFab is the category. One primitive is the product.
The reason Kei can exist is a single gap: a card processor cannot take a $0.001 payment, because the fee exceeds the payment. A feeless chain can. Every repository here follows from that one sentence.
import { Kei } from 'kei-transaction'
const kei = await Kei.start() // wallet created, persisted, funded on testnet
await kei.send('kei_3abc...', 0.001) // sub-cent, instant, feelessNo signup, no API key, no wallet extension, no dashboard, no database.
The honest boundaries are stated here as prominently as the capabilities, because someone adopting Kei on a false premise builds something broken and has a worse time than someone who passed.
| Mainnet | Does not exist. It is gated on network security, reserve governance, and a legal conversation — none of them finished. |
| Testnet | One best-effort node at https://testnet.keicoin.org/rpc. Weak consensus, no uptime promise, published keys, and it may be rebuilt without notice. |
| Value | None. There is no sale, no presale, no listing, and no airdrop. Testnet Kei is worth nothing by construction, and no one should hold anything here they would miss. |
| Domain | keicoin.org is the only one. Not .com, not any other suffix. Anything published elsewhere claiming to be Kei is not Kei. |
| Button | A green button on a pole. The smallest thing that exercises every primitive. |
| Carpet Markets | A coin launchpad, pump.fun-shaped, where the difference between a rug and a real one is a transfer policy the chain enforces. |
| World of Wonder | A multiplayer 3D RPG whose gold, items, vendor and bag live on the chain. |
The hosted demos currently run against in-memory mock ledgers rather than the public testnet, so they reset. The code in the repositories talks to the real node.
npm create kei-game # scaffolds a project you own, then gets out of the way
bun add kei-transaction # or add the SDK to a game you already havekei-transaction@0.3.0 is on npm, along with every @keicoin/* package —
core, tokens, claims, market, wallet, and work. The umbrella package is the
default install; the scoped ones exist for people who care about bundle size.
Five products and two supporting repositories. They are deliberately separate: a consensus bug fix and an SDK typo fix must never share a release, and a developer cloning the game template must not download a blockchain.
| Repository | What it is | Stack |
|---|---|---|
| kei-node | The chain. A Banano fork adding a native token primitive, rooted claims, and a Kei genesis. | C++ |
| kei-transaction | The SDK, and the product — what developers actually touch. A monorepo of @keicoin/* packages. |
TypeScript |
| kei-wallet | The standalone wallet, forked from BananoVault. Keys never leave the machine. | TypeScript (Angular) |
| world-of-wonder | The multiplayer 3D RPG template, forked from orion3dgames/t5c and wired to Kei. |
TypeScript, Babylon.js, Colyseus |
| button | The demo game. Ten files, every primitive. | TypeScript |
| carpet-markets | The worked example of @keicoin/market. |
TypeScript |
| keicoin-site | keicoin.org — docs, examples, and the machine-readable surface. |
TypeScript, Cloudflare Workers |
Token balances are enforced by consensus. Not by an SDK ledger, not by the developer's Postgres, and not by an indexer's interpretation of ordinary transactions. That is the whole reason a fork was necessary rather than a meta-protocol.
An item is a native token with supply 1. Ownership is balanceOf — one call, no
crawling, no background indexer. Item transfer is token transfer, so there is one code
path rather than two.
The transfer policy is the argument. Every token declares open, issuer-only, or
none at issuance; the node enforces it and it is immutable thereafter. open means a
permissionless market will eventually appear whatever the developer would prefer.
issuer-only means players genuinely cannot trade with each other. none is soulbound.
There is no fourth option and no way to have two of them.
Loot is one issuer block and a thousand player claims. The issuer publishes a Merkle root committing to an entire batch of entitlements; each player proves membership and writes the claim to their own chain. Because every account in a block-lattice has its own chain, those claims happen in parallel with no ordering contention — a monolithic chain would serialise them and charge gas for the privilege.
Each of these was considered and rejected for cause. Please do not open a pull request adding one.
- No smart contract VM. No EVM, no Solidity, no gas. A native token primitive is not a VM and must not grow into one.
- No play-to-earn. "Earning" requires money to exit, which requires perpetual new buyers. Anyone may build it on Kei; this project does not ship or promise it.
- No on-chain exchange, AMM, or order book. The chain moves assets; it does not price them. A swap settles a trade two parties already agreed on.
- No game world of our own. Anything that needs a population before it has value is out of scope by definition.
- No general game-backend features. Leaderboards, matchmaking, analytics, and cloud save are ordinary database work. Use PlayFab alongside Kei — that is a feature, not a gap.
The test for whether something belongs: does it need consensus or custody? If yes, it is in scope. If no, it is someone else's database.
Contributions are welcome, and the fastest way to have one merged is to know which of these you are working on.
| If you | Start at |
|---|---|
| write TypeScript and games | kei-transaction — read its README first, then button for the smallest working integration |
| write C++ and care about consensus | kei-node, which carries a CONTRIBUTING.md inherited from the Nano lineage |
| care about how keys are handled | kei-wallet — it holds real seeds, so it moves carefully |
| want to build a game on it | world-of-wonder or carpet-markets; both are templates you are meant to own and modify |
| write documentation | keicoin-site — including llms.txt and AGENTS.md, which are read more often than the prose |
- The design specification is the brief, and anything not in it is out of scope until it is in it. If a change needs the scope widened, open an issue arguing for the spec change before writing the code — that conversation is much cheaper than a rejected pull request.
- Open an issue before a large change. A one-line fix needs no ceremony. A new package, a new block type, or a new dependency does.
- CI is the gate.
kei-node,kei-transaction,carpet-markets, andworld-of-wonderbuild in CI; the node's build is slow, so expect a long loop on consensus changes and make each run count. - State what is not true. Status claims across this project are deliberately narrow — "merged" is not "deployed", and "published" is not "in production". Keep that habit in documentation and pull request descriptions.
- Security issues are not normal issues. A defect in block validation, token policy enforcement, or key handling should not go in a public issue tracker. Use private vulnerability reporting on the affected repository, or contact a maintainer directly.
kei-transaction, kei-wallet, and carpet-markets are MIT. kei-node is BSD-3-Clause,
inherited from the Nano and Banano lineage. world-of-wonder carries its upstream terms
from orion3dgames/t5c, with attribution preserved. button and keicoin-site do not
carry a LICENSE file yet — if you intend to reuse either, ask first.
Built on Banano, itself a fork of Nano. Wallet forked from BananoVault, itself forked from NanoVault. Game template forked from orion3dgames/t5c.
