CONFIGURATION
Parameters
Define values and assign condition-based overrides.
TARGETING
Conditions
Conditions are checked from top to bottom. The first matching override wins.
PREVIEW
Test targeting
Check which values an app installation would receive before publishing.
Resolved values
Results use the current draft and the same rule order as the SDK.
VERSIONS
History & rollback
Every publish is a Git commit. Compare a version before restoring it.
REFERENCE
SDK & targeting values
Exact fields your Flutter app uses when it evaluates a condition.
Where each value comes from
| Target | Exact value | Source |
|---|---|---|
| Platform | ios or android | Detected by the SDK |
| App ID, version, build | For example com.example.app, 2.5.74, 36 | Read from app metadata unless you override them in TargetingContext |
| Device locale | For example en_US or ar_SA | OS locale, or the value you supply |
| Country / region | Uppercase two-letter code, for example SA | Your app supplies it; a public GitHub file cannot infer location from a request |
| Installation ID | 32-character lowercase hexadecimal ID | Generated by this SDK and stored in app preferences |
| First SDK open | UTC timestamp | Saved by the SDK at first initialization |
| Date / time | UTC timestamp | Device clock when the config was fetched |
| Any app installation | true | Every initialized SDK installation |
| User ID, audiences, user properties, custom signals | Keys and values defined by your app | Pass them in TargetingContext; they are not discovered from Firebase Analytics |
See the exact values in your app
The SDK produces the targeting snapshot on the device. Show it on a private diagnostics screen to see the exact keys and values used by conditions, including the installation ID. The dashboard cannot discover device IDs or app-supplied fields from a public file.
import 'dart:convert';
import 'package:flutter/widgets.dart';
import 'package:remote_config_kit/remote_config_kit.dart';
Widget configDebugView(RemoteConfigKit config) {
final snapshot = const JsonEncoder.withIndent(' ')
.convert(config.targetingSnapshot().toJson());
return SelectableText(
'Installation ID: ${config.installationId}\n'
'Targeting: $snapshot',
);
}Copy the installation_id value into an Installation ID condition. This is an ID created by this SDK and stored in app preferences; a Firebase Installation ID will not match. The snapshot uses exact field names such as platform, app_version, build_number, locale, and custom_signal.plan. Values are case-sensitive. Optional built-in fields are null when unavailable; app-defined keys are absent until supplied. Neither matches a rule.
Target custom values
config.updateContext(
const TargetingContext(
country: 'SA',
audienceIds: {'beta_testers'},
customSignals: {'plan': 'premium'},
),
);Use the same key (plan) and value (premium) in the condition editor. Call targetingSnapshot().toJson() again after changing context to verify the value your app now evaluates.
What GitHub alone cannot provide
There is no backend collecting fetch counts, discovering device IDs, measuring A/B results, building Analytics audiences, personalizing with machine learning, or pushing real-time config updates. Your app fetches the public JSON on its schedule. Anyone can read that JSON, so keep secrets and authorization checks elsewhere.
GITHUB
GitHub repositories
Sign in, choose a public repository, and publish its config file.
GitHub account
Checking GitHub sign-in…
GitHub sign-in uses a private GitHub App installed only on the repositories you select. The dashboard never receives the OAuth token in JavaScript.
App read URL
Your Flutter app uses this public URL. It never needs GitHub sign-in or a token.
Connect a repository to see the URL.Use a fine-grained token instead
First-time setup
- Create a public GitHub repository.
- Add the starter files from the public-repo folder.
- Connect it here and publish the config file.
- Use the public URL in the Flutter SDK.
Anyone can read values in a public config. Keep secrets and authorization decisions on your server.