NewTyped schemas + AI-assisted diffs

Remote config that respects
your craft. Not your patience.

Typed configs with a real editor, PR-style change review, and rollback that propagates to every device in under 30 seconds. Built by mobile leads who got tired of waiting on Firebase.

Join the waitlistIn development — invites later this year
<30s propagationDrop-in Firebase migration
app.betterconfig.com/halcyon/flags/checkout.express_pay_enabled
45% rolloutboolean#checkout · #payments

checkout.express_pay_enabled

Show Apple Pay / Google Pay buttons on the checkout sheet
value.jsonschema ✓ · 5/5 required
1
2
3
4
5
6
7
{
  "enabled": true,
  "providers": ["apple_pay", "google_pay", "link"],
  "min_client_version": "4.12.0",
  "button_style": "black",
  "max_amount_usd": 2500
}
Rollout · prod
45%+20 today
target 100% · by user.id
Environments
dev
true
staging
true
prod
45% rollout
1 change pending
Ramp to 75% + EU
arjun · 18m ago

A config tool built by people who ship to production.

Everything Firebase Remote Config should have been, executed like Linear. Dense, keyboard-first, and refuses to pretend that "save and pray" is a deploy strategy.

Typed, not stringly-typed

Every flag has a JSON schema. The editor catches type errors, the SDK generates types, the CI gate blocks drift. No more Boolean.parseBoolean(config.getString(...)).

PR-style change review

Diffs, approvers, required reviewers, status checks. Your config changes finally get the same scrutiny as your code — because they are code.

Rollback that actually works

Every value is a git-like commit. One-click revert propagates to every live SDK in under 30 seconds. No waiting on cache TTLs. No re-submitting to the app store.

Your config changes go through the same front door as your code.

Open a change request. Show a unified diff of values and targeting rules. Require N approvers per environment. Gate on typecheck, schema validation, canary synthetics, and crash-free guardrails.

  • Unified diffsValue JSON, schema, and targeting rules — in one review.
  • Required reviewers per envProd gets two. Staging gets one. Dev is yours.
  • Status checksBlock merge on failing canaries, schema errors, or crash-rate guardrails.
  • Auto-merge when readyQueue it and walk away. We ship when the last check goes green.
CR-284Ramp express_pay to 75% + EU+5−2
1
{
2
"enabled": true,
3
"providers": ["apple_pay", "google_pay"],
3
"providers": ["apple_pay", "google_pay", "link"],
4
"min_client_version": "4.11.0",
4
"min_client_version": "4.12.0",
5
"button_style": "black",
6
"max_amount_usd": 1500
6
"max_amount_usd": 2500
7
}
6/6 checks passed·1/2 approvedprod · 18m

A real editor. Keys, types, docs — all hoverable.

Monaco-powered JSON with live schema validation. Hover any property for its type, description, and allowed values. Autocomplete from enums. Autoformat on save. Autogenerate TypeScript, Swift, and Kotlin types from the schema.

  • Hoverable schema docsEvery key documents itself, right where you edit it.
  • Generated SDK typesPush a schema change, get a typed PR against your iOS, Android, and web clients.
  • Structured targetingBuild rules with attributes and operators. Or paste an expression. Both work.
value.json
schema.ts
UTF-8 · JSON · 7 lines
1
2
3
4
5
6
7
{
  "enabled": true,
  "providers": ["apple_pay", "google_pay"],
  "min_client_version": "4.12.0",
  "button_style": "black",
  "max_amount_usd": 2500
}
(property) providers: ('apple_pay' | 'google_pay' | 'link' | 'shop_pay')[]
Wallets to render, in display order.
Schema-validated · 5/5 required properties · hover any key

Every bad deploy is 30 seconds from being a non-event.

Every change is a commit. Pick any version in history, hit revert, and every live SDK has the old config within 30 seconds. No cache TTL. No app store re-review. No Slack thread starting with "who pushed this."

  • Sub-30s propagationLong-poll connections, edge-cached config, signed payloads.
  • Single-approver rollback policyOpt-in: any on-caller can roll back without the usual N-approver gate.
  • Impact previewBefore you revert, see exactly how many users shift and to what value.
Version historycheckout.express_pay_enabled
Bump rollout to 45%
a7f2c91 · maya · 2h ago · HEAD · prod
Add iOS 17+ US/CA targeting rule
3d1e8b0 · arjun · 1d ago · +8 −0
Rollout to 25%
9cc41d5 · maya · 2d ago · +2 −2
Revert — regression on Android < 12rollback
f50b2a6 · sam · 3d ago · +1 −11
Rollout to 50% + widen country allowlist
2be76f8 · jules · 3d ago · +6 −2
"We killed a production incident in 22 secondswith one click. The week before we'd spent four hours rolling back the same kind of bug on Firebase. Never going back."
MC
Maya Chen
Mobile Lead, Halcyon · 180M installs

One line in. Typed values out.

Drop-in SDKs for iOS, Android, React Native, web, Go, and Node. All typed. All cached. All hot-reload in under a second.

checkout.tsbetterconfig@2.4.1
1
2
3
4
5
6
7
8
9
10
11
// Types are generated from your schema — no manual drift.
import { bc } from '@betterconfig/react';

export function CheckoutSheet({ user, cart }: Props) {
  const cfg = bc.use('checkout.express_pay_enabled', { user });

  if (!cfg.enabled || cart.total > cfg.max_amount_usd) {
    return <StandardCheckout />;
  }
  return <WalletButtons providers={cfg.providers} style={cfg.button_style} />;
}

What you get that Firebase Remote Config doesn't.

No shade. Just a feature matrix from the team that used it for six years.

bcbetterconfig
Firebase Remote Config
Typed configs with JSON schema
First-class
Strings only
PR-style change review
Diffs, approvers, checks
Publish-and-pray
Rollback propagation
< 30 seconds
12-hour fetch interval default
Generated client types
TS, Swift, Kotlin, Go
Roll your own
Environment promotion
dev → staging → prod, with diff
Separate projects, manual copy
Audit log
Immutable, exportable, SOC 2
"Change history" (basic)
Keyboard-first UI
⌘K everywhere
Click, click, click

Get in early on config that ships like code.

betterconfig isn't live yet. Drop your email and we'll bring you in as soon as your stack is ready to test.

30 seconds to sign up·first invites later this year