Infrastructure-as-Code · for Roblox

Declare your experience.
Deploy it.

Write your game passes, products, and experience config as code. Make changes with confidence from a single source of truth. A spiritual successor to Mantle.

v0.1.1 · pre-1.0 · MIT licensed
bedrock.config.ts
import { defineConfig } from "@bedrock-rbx/core/config";

export default defineConfig({
	environments: {
		production: {
			places: { start: { placeId: "1234567890" } },
			universe: { universeId: "6803861769" },
		},
	},
	passes: {
		"vip-pass": {
			name: "VIP Pass",
			description: "Grants VIP perks.",
			icon: { "en-us": "assets/vip.png" },
			price: 500,
		},
	},
	state: { backend: "gist", gistId: "abc123def456" },
	universe: { voiceChatEnabled: true },
});
01 · Two surfaces · one library

One library, two ways in.

Command line

From the terminal.

Run bedrock deploy against your config and you're done. Need to customise a step? Drop a TypeScript file in .bedrock/ - the CLI calls it instead of the built-in.

# pick your config format
$ bedrock init --format yaml
$ bedrock diff     # preview changes
$ bedrock deploy   # reconcile

# migrating from Mantle?
$ bedrock migrate ./mantle.yaml
bedrock init · diff · deploy · migrate
Programmatic

From your code.

Import any step from @bedrock-rbx/core and call it directly. Trigger deploys from a web backend, a chat bot, or any service in your stack.

import { deploy } from "@bedrock-rbx/core";

/**
 * Triggered from a webhook handler whenever a release tag is pushed.
 * Wraps `deploy` with custom orchestration: structured logging on
 * failure, success reporting back to the caller.
 *
 * @param environment - Target environment from the webhook payload.
 * @returns Whether the deploy completed successfully.
 */
export async function deployFromWebhook(environment: string): Promise<boolean> {
	const result = await deploy({ environment });
	if (!result.success) {
		console.error("bedrock deploy failed", { environment, err: result.err });
		return false;
	}

	console.log("bedrock deploy succeeded", { environment });
	return true;
}
→ public API · typed · semver'd · extensible
02 · Design choices

Four decisions, baked in.

Bedrock only manages what you list. Resources outside the config stay exactly where they are.

→ 01

Typed configs

Luau, TypeScript, JavaScript, YAML, or JSON. Same typed schema underneath. Invalid configs fail before bedrock reaches the API.

→ 02

Result, not throws

Every public function returns Result<T, E>. Failures show up as values to branch on, not exceptions to catch.

→ 03

State on your terms

Store state in a GitHub Gist with just a BEDROCK_GITHUB_TOKEN. S3 is on the way.

→ 04

Bring your mantle.yaml

Run bedrock migrate ./mantle.yaml. You get a Bedrock config back, with unsupported features flagged. Diff before you deploy.

03 · Quickstart

Five minutes, one deploy.

Three things to get you to a live deploy: the package, an Open Cloud API key, and a config file. The steps below walk through each, end-to-end in about five minutes.

  1. Installpnpm add @bedrock-rbx/core (or npm / bun / yarn)
  2. AuthenticateExport BEDROCK_API_KEY from an Open Cloud key with write scopes.
  3. ScaffoldRun bedrock init, pick TS, YAML, or JSON.
  4. Planbedrock diff shows what'll change before anything moves.
  5. Applybedrock deploy reconciles. Rerun any time; nothing unchanged is touched.
~/strata
$ bedrock diff
Loading bedrock.config.ts ...
Fetching current state (gist:bedrock-state) ...
 
Plan: 4 to change
+ create gamePass.vip-pass (new)
~ update gamePass.early-access (price: 300 -> 250)
~ update experience.config (3 fields)
. noop product.coins_100
 
No changes will be applied. Run `bedrock deploy` to reconcile.
04 · The stack

Two libraries on Open Cloud.

Bedrock sits on @bedrock-rbx/ocale, a typed Open Cloud SDK that stands on its own. Use Bedrock for declarative deploys, or call Ocale directly when you want imperative control. Same types. Same error model.

Bedrock
Declarative · deploy tool
Reads your config, previews what will change, applies it through Open Cloud. CLI and library, same API.
/bedrock/guide
Ocale
Imperative · Open Cloud SDK
Typed clients for Open Cloud resources. Every method returns Result<T, OpenCloudError>. Use it directly when you want imperative control.
/ocale/guide
Open Cloud
Roblox · platform API
Roblox's official HTTP API. Bedrock and Ocale both call into it directly, no legacy cookies or scraping.
create.roblox.com/docs/cloud
Ready when you are

Build on solid ground.

Install the package, set an API key, run bedrock deploy.

$ pnpm add @bedrock-rbx/core