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.
{ "enabled": true, "providers": ["apple_pay", "google_pay", "link"], "min_client_version": "4.12.0", "button_style": "black", "max_amount_usd": 2500 }
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.
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(...)).
Diffs, approvers, required reviewers, status checks. Your config changes finally get the same scrutiny as your code — because they are code.
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.
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.
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.
{ "enabled": true, "providers": ["apple_pay", "google_pay"], "min_client_version": "4.12.0", "button_style": "black", "max_amount_usd": 2500 }
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."
Drop-in SDKs for iOS, Android, React Native, web, Go, and Node. All typed. All cached. All hot-reload in under a second.
// 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} />; }
No shade. Just a feature matrix from the team that used it for six years.
betterconfig isn't live yet. Drop your email and we'll bring you in as soon as your stack is ready to test.