Skip to main content
@bedrock-core
betaMIT

Addons Better Connected

Addons run in isolated realms. @bedrock-core lets yours find each other, call each other, share state, and draw custom UI the whole world can use.

npx @bedrock-core/cli
  • Type-safe by design
  • Zero dependencies at runtime

What you get

Cross-realm plumbing, already solved.

Six pieces that turn a pile of unrelated behavior packs into one coordinated world.

Runtime discovery

Register once. Every other bedrock-core addon in the world sees you, and you see them, the moment they load.

Typed RPC

Request/response calls to another addon, typed from the interface the peer publishes.

Shared state

A declared shape every realm mirrors locally as a typed tree. Reads are synchronous, writes broadcast a delta.

JSX screens

React-like components for forms and containers. Screens compile ahead of time; only state moves at runtime.

Config, guides and translations

Declare a settings schema, ship an MDX guide and a typed translation bundle; the shared UI renders all three for every addon in the world.

One build chain

Regolith filters compile guides, localization and screens, bundle the scripts, and run your GameTests on a real dedicated server.

In practice

Two packs, no imports.

Register, call, show. Each addon ships on its own and finds the others at runtime.

  1. 01
  2. 02
  3. 03
Read the walkthrough

One call brings the addon online: it validates the manifest, joins the world and starts every subsystem. The config schema becomes typed accessors and an in-game settings screen.

import { core } from '@bedrock-core/server';

export interface EconomyRPC {
getBalance(params: { player: string }): number;
}

const { config } = core.register({
manifest: { creator: 'drav0011', pack: 'economy', packName: 'Economy', version: '1.0.0' },
config: {
server: {
economy: {
startingBalance: { type: 'number', default: 100, min: 0, max: 10000, label: 'Starting Balance' },
},
},
} as const,
});

core.rpc.serve<EconomyRPC>({
getBalance: ({ player }) => balances.get(player) ?? config.server.economy.startingBalance.get(),
});

Start with one package.

Pin an exact version, and read the changelog before you upgrade.