flutter-multi-environment
Skill8 starsChanged 48 days agoMITView on GitHub
Design, implement, migrate, review, debug, test, and maintain production Flutter development/staging/production environments and flavors while keeping exactly one Dart app entry point at lib/main.dart. Use whenever a Flutter task mentions flavors, environments, dev/staging/prod, --flavor, appFlavor, productFlavors, Xcode schemes, --dart-define, --dart-define-from-file, environment-specific API endpoints, bundle/application IDs, Firebase per environment, flavor-aware CI/CD, IDE launch configs, or eliminating main_dev.dart/main_staging.dart/main_prod.dart. Also use it to decide whether a value belongs in native flavor configuration, Dart compile-time configuration, runtime configuration, or secret management. Version-gate Windows/Linux flavor behavior against the project's pinned Flutter SDK.
- Reads credentials
In this repository70 other files it gives its agents.
- camerawesome-flutterSkill
- dart-args-production-cliSkill
- dart-flutter-equatable-engineeringSkill
- dart-flutter-ffi-systems-engineeringSkill
- dart-metaSkill
- document-camera-frameSkill
- document-scan-flutterSkill
- figma-to-flutter-expertSkill
- flutter-animations-production-engineeringSkill
- flutter-app-hardening-reverse-engineeringSkill
- flutter-app-icon-engineeringSkill
- flutter-application-security-engineeringSkill
- flutter-app-links-deep-link-engineeringSkill
- flutter-cachingSkill
- flutter-concurrency-memory-performanceSkill
- flutter-confetti-engineeringSkill
- flutter-dart-package-engineeringSkill
- flutter-design-system-from-design-mdSkill
- flutter-dio-cache-interceptor-engineeringSkill
- flutter-dio-engineeringSkill
- flutter-doc-scannerSkill
- flutter-drift-persistence-engineeringSkill
- flutter-expert-tipsSkill
- flutter-firebase-analyticsSkill
- flutter-firebase-core-engineeringSkill
- flutter-firebase-messagingSkill
- flutter-get-it-injectable-dependency-injectionSkill
- flutter-go-router-engineeringSkill
- flutter-hive-persistence-engineeringSkill
- flutter-image-performanceSkill
- flutter-image-picker-production-engineeringSkill
- flutter-lints-static-analysis-engineeringSkill
- flutter-local-notifications-production-engineeringSkill
- flutter-memory-leak-engineeringSkill
- flutter-mobile-developmentSkill
- flutter-motion-engineeringSkill
- flutter-native-splash-engineeringSkill
- flutter-package-plugin-selectionSkill
- flutter-path-provider-production-storageSkill
- flutter-performance-jank-optimizationSkill
- flutter-permission-handler-engineeringSkill
- flutter-pinputSkill
- flutter-production-build-releaseSkill
- flutter-production-engineeringSkill
- flutter-production-loggingSkill
- flutter-pro-image-editor-engineeringSkill
- flutter-secure-storage-security-engineeringSkill
- flutter-sentry-engineeringSkill
- flutter-share-plus-engineeringSkill
- flutter-skeletonizer-engineeringSkill
- flutter-squadron-concurrency-engineeringSkill
- flutter-supabase-engineeringSkill
- flutter-svg-engineeringSkill
- flutter-ui-performance-engineeringSkill
- flutter-url-launcher-engineeringSkill
- flutter-video-player-production-engineeringSkill
- flutter-webview-production-engineeringSkill
- freezed-production-engineeringSkill
- html-to-flutterSkill
- hydrated-blocSkill
- The first 60 shown.
The file
Show its rules and text
We split this skill into the rules it gives an agent
62 rules. About 0 are common, 37 are distinctive, and 25 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈37
Distinctive · estimate
This author's own choices. Worth a look.
25
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 17
Never create environment-specific Dart entry points such as:
- Distinctive: line 25
Treat these as four separate concerns:
- Very specific: line 36
Keep lib/main.dart as the only Dart application entry point.
- Very specific: line 37
Use a canonical environment vocabulary everywhere: development, staging, production unless an existing public build contract requires a …
- Very specific: line 38
Use a typed immutable AppEnvironment + AppConfig boundary rather than scattered string checks.
- Very specific: line 39
Use APP_ENV as the authoritative Dart-side environment declaration.
- Distinctive: line 40
Use native flavor/build configuration for native identity, resources, signing references, entitlements, manifests, native SDK files, and …
- Distinctive: line 41
Use Dart compile-time definitions for client-visible Dart configuration that is fixed per artifact.
- Very specific: line 43
When appFlavor is available, validate it against APP_ENV and fail startup on mismatch.
- Very specific: line 44
Keep build mode (debug, profile, release) independent from deployment environment (development, staging, production).
- Very specific: line 46
Never treat --dart-define, .env input files, obfuscation, or compiled client values as secret storage.
- Distinctive: line 48
Prefer targeted edits to an existing native project.
- Very specific: line 50
Do not use flutter build web --flavor ....
- Distinctive: line 80
Use one orchestration source (developer command or CI matrix row) to select the canonical environment and feed both native and Dart …
- Distinctive: line 100
Before changing code, inspect:
- Distinctive: line 140
Use the same names for:
- Very specific: line 150
Avoid translating dev → development, prod → production unless preserving an existing external contract during migration.
- Very specific: line 183
Do not put a large environment switch or environment-specific initialization graph in main().
- Very specific: line 187
Prefer --dart-define-from-file for normal multi-value environment contracts:
- Very specific: line 195
Use individual --dart-define for a small number of explicit overrides or debugging:
- Very specific: line 220
Never infer APP_ENV from API URL, package ID, display name, or build mode.
- Very specific: line 221
Never make missing APP_ENV mean production.
- Distinctive: line 223
Keep the configuration object immutable.
- Very specific: line 225
Read references/architecture-and-configuration.md for the complete typed parser, config classes, bootstrap implementation, validation …
- Distinctive: line 242
Do not rely on this runtime check alone for production.
- Distinctive: line 248
Use Gradle product flavors for native application identity/resources.
- Distinctive: line 275
Use source sets or build settings for native variant resources/files instead of scripts that mutate one shared file in place.
- Distinctive: line 279
Use shared lowercase Xcode schemes with custom build configurations:
- Distinctive: line 287
Keep custom configurations chained to Flutter's existing xcconfig setup.
- Distinctive: line 295
Do not model web builds as Android/Xcode-style native flavors.
- Distinctive: line 303
If one built artifact must switch backend/environment after deployment, that is a separate runtime-configuration architecture with explicit …
- Very specific: line 305
Read references/platforms-and-native-integration.md before editing any native platform or Firebase/native SDK setup.
- Very specific: line 334
Keep every IDE launch configuration pointed at lib/main.dart.
- Very specific: line 336
Read references/workflow-ci-testing-performance.md for Android/iOS/macOS/Windows/Linux/Web commands, IDE examples, integration-test …
- Distinctive: line 353
Use backend/server secret management for backend secrets and CI/signing infrastructure for signing/store credentials.
- Distinctive: line 359
Treat Firebase as an example of native environment configuration, not as the flavor architecture itself.
- Distinctive: line 365
Never ship service-account or privileged server credentials in the app.
- Very specific: line 367
Read references/platforms-and-native-integration.md for full native SDK guidance.
- Distinctive: line 390
Do not build every Cartesian product automatically.
- Distinctive: line 408
Keep the parser pure so unit tests do not require Flutter engine/platform startup.
- Distinctive: line 412
Do not micro-optimize environment parsing.
- Distinctive: line 416
no expensive I/O during configuration declaration.
- Distinctive: line 418
no SDK initialization before configuration validation.
- Distinctive: line 419
no environment-driven service graph duplication when a configured dependency is enough.
- Very specific: line 425
When converting a project that already has main_dev.dart, main_staging.dart, etc.:
- Distinctive: line 434
update IDE/CI commands to pass flavor + define file where applicable.
- Distinctive: line 436
only then remove obsolete entry points.
- Distinctive: line 438
Do not collapse native distinctions that are still required.
- Very specific: line 440
Read references/migration-validation-troubleshooting.md for the full migration phases, validation checklist, failure modes, anti-patterns, …
- Very specific: line 467
add one canonical AppEnvironment wire value.
- Distinctive: line 468
add its public Dart config file.
- Distinctive: line 469
add native variant/scheme only where native differentiation is required.
- Distinctive: line 470
add matching CI/IDE build rows.
- Distinctive: line 472
verify identifiers, native SDK registrations, deep links/OAuth redirect registrations, push setup, and store/distribution implications.
- Very specific: line 473
do not create another main_*.dart.
- Distinctive: line 477
Before shipment, enforce all of these:
- Distinctive: line 499
Read only what the task requires:
- Distinctive: line 509
When asked to implement flavors/environments in a repository:
- Distinctive: line 516
Add or adapt native variants only where required.
- Very specific: line 518
Update developer/IDE/CI commands.
- Distinctive: line 519
Test configuration parsing and each required platform/environment combination.
- Very specific: line 522
Do not report success merely because one local flutter run command compiled.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Flutter Multi-Environment Architecture
Purpose
Implement and maintain multi-environment Flutter applications—normally development, staging, and production—with exactly one Dart application entry point:
lib/main.dartNever create environment-specific Dart entry points such as:
lib/main_dev.dart
lib/main_staging.dart
lib/main_prod.dartTreat these as four separate concerns:
native build flavor / scheme
≠ Dart compile-time configuration
≠ runtime configuration
≠ secret managementMandatory Operating Rules
- Keep
lib/main.dartas the only Dart application entry point. - Use a canonical environment vocabulary everywhere:
development,staging,productionunless an existing public build contract requires a migration period. - Use a typed immutable
AppEnvironment+AppConfigboundary rather than scattered string checks. - Use
APP_ENVas the authoritative Dart-side environment declaration. - Use native flavor/build configuration for native identity, resources, signing references, entitlements, manifests, native SDK files, and other values that must exist before Dart starts.
- Use Dart compile-time definitions for client-visible Dart configuration that is fixed per artifact.
- Fail closed on missing or malformed required configuration. Never silently default to production.
- When
appFlavoris available, validate it againstAPP_ENVand fail startup on mismatch. - Keep build mode (
debug,profile,release) independent from deployment environment (development,staging,production). A staging release build is valid. - Parse configuration once at startup and pass typed values through the composition root. Do not repeatedly read environment globals in features/services.
- Never treat
--dart-define,.envinput files, obfuscation, or compiled client values as secret storage. - CI/CD owns deterministic environment selection, release gates, signing/store credentials, artifact identity checks, and publication policy.
- Prefer targeted edits to an existing native project. Never regenerate platform directories blindly to “get flavors”.
- Version-gate Windows/Linux flavor work against the project's pinned Flutter SDK.
- Do not use
flutter build web --flavor ...; web environment selection is primarily Dart-define driven.
First Decision: What Kind of Configuration Is This?
Does the value need to be fixed into a separately buildable artifact?
|
+-- No
| `-- Runtime configuration. Do not model it as a build flavor merely for convenience.
|
`-- Yes
|
+-- Does it affect native identity/resources/signing/entitlements/native SDK setup?
| `-- Native flavor/scheme/build configuration.
|
+-- Is it client-visible Dart behavior/configuration?
| `-- Dart compile-time configuration.
|
`-- Is it actually confidential?
`-- Do not embed it in the Flutter client. Keep it server-side or in CI/signing infrastructure.Typical runtime concerns include user-selectable server/tenant, remotely managed rollout percentages, authenticated provisioning, region discovery, and server-driven experiments.
Typical native concerns include Android application ID, Apple bundle ID, app name/icon, manifest/plist values, entitlements, URL schemes, source-set resources, native SDK config, signing references, desktop packaging identity.
Typical Dart compile-time concerns include APP_ENV, public API base URL, client logging policy, analytics enablement policy, public client identifiers, and build-specific client feature policy.
Required Architecture
Use one orchestration source (developer command or CI matrix row) to select the canonical environment and feed both native and Dart configuration consistently:
canonical environment selection
|
+--> native flavor / scheme / build config
| `--> identity, resources, signing refs, native SDK config
|
`--> Dart compile-time configuration
`--> APP_ENV, API endpoint, typed client behaviorDart-side source of truth: APP_ENV.
Native-side source of truth: each platform's native build system.
Consistency check: appFlavor vs typed APP_ENV on flavored targets.
Repository Inspection Before Editing
Before changing code, inspect:
pubspec.yaml,pubspec.lock, Flutter version managers/pins, CI images,flutter --versionevidence;lib/main.dartand everymain_*.dartor other app entry point;- current bootstrap/DI/service initialization order;
- all
String.fromEnvironment,bool.fromEnvironment,int.fromEnvironment,appFlavor,kDebugMode, environment enums,.envloaders, config assets; android/app/build.gradle(.kts), manifests, source sets, signing config, Firebase/native SDK files;- iOS/macOS Xcode schemes, build configurations, xcconfig chains, plist/entitlement setup, Podfile mappings;
- Windows/Linux CMake/runner/template age before assuming
--flavorsupport; - web bootstrap/deployment config and cache/deployment topology;
- VS Code/JetBrains/Xcode launch configurations;
- CI matrices, release scripts, artifact naming, publication credentials and gates.
Preserve deliberate existing behavior. Migrate incrementally.
For the full inspection sequence, read references/agent-workflow-and-sources.md.
Canonical Environment Model
Prefer:
enum AppEnvironment {
development('development'),
staging('staging'),
production('production');
const AppEnvironment(this.wireName);
final String wireName;
static AppEnvironment? tryParse(String value) {
for (final environment in values) {
if (environment.wireName == value) return environment;
}
return null;
}
}Use the same names for:
APP_ENV;- Flutter
--flavorwhere supported; - Android product flavors;
- Apple schemes;
- Windows/Linux flavors where supported;
- CI matrix values;
- public config filenames.
Avoid translating dev → development, prod → production unless preserving an existing external contract during migration.
Single main.dart Boundary
main.dart should orchestrate only:
- read compile-time configuration;
- read
appFlavor; - parse/validate typed configuration;
- reject native/Dart mismatch;
- enter shared bootstrap/composition root.
Canonical shape:
import 'package:flutter/services.dart' show appFlavor;
import 'app/app.dart';
import 'app/bootstrap.dart';
import 'config/environment_config.dart';
Future<void> main() async {
final config = EnvironmentConfig.fromCompileTime(
nativeFlavor: appFlavor,
);
await bootstrap(
config: config,
appFactory: (config) => App(config: config),
);
}Do not put a large environment switch or environment-specific initialization graph in main().
Dart Compile-Time Configuration
Prefer --dart-define-from-file for normal multi-value environment contracts:
flutter run \
--flavor staging \
--dart-define-from-file=config/staging.jsonUse individual --dart-define for a small number of explicit overrides or debugging:
flutter run \
--dart-define=APP_ENV=development \
--dart-define=API_BASE_URL=https://api.dev.example.comCentralize String.fromEnvironment/bool.hasEnvironment reads in one configuration adapter. Do not scatter them across features.
For safety-critical booleans or numbers, prefer strict string parsing when fallback semantics would hide malformed configuration.
Configuration Contract
A practical baseline:
| Key | Required | Example/allowed values | Default policy |
APP_ENV | yes | development, staging, production | none |
API_BASE_URL | yes | absolute HTTP(S) URI | none |
LOG_LEVEL | optional | app-defined enum | environment policy |
ANALYTICS_ENABLED | optional | exact true / false | conservative default |
Rules:
- Never infer
APP_ENVfrom API URL, package ID, display name, or build mode. - Never make missing
APP_ENVmean production. - Validate URL shape and environment-specific transport policy before connecting to services.
- Keep the configuration object immutable.
Read references/architecture-and-configuration.md for the complete typed parser, config classes, bootstrap implementation, validation policy, configuration precedence, and dependency-injection guidance.
Native Flavor Consistency
On targets where Flutter provides a flavor, perform an independent check:
if (nativeFlavor != null &&
nativeFlavor.isNotEmpty &&
nativeFlavor != configuration.environment.wireName) {
throw ConfigurationException(
'Native flavor "$nativeFlavor" does not match '
'APP_ENV "${configuration.environment.wireName}".',
);
}Do not rely on this runtime check alone for production. CI must validate the pair before building/publishing, and release pipelines should inspect final artifact identity where practical.
Platform Routing
Android
Use Gradle product flavors for native application identity/resources. Common pattern:
android {
flavorDimensions += "environment"
productFlavors {
create("development") {
dimension = "environment"
applicationIdSuffix = ".dev"
versionNameSuffix = "-dev"
resValue("string", "app_name", "Example Dev")
}
create("staging") {
dimension = "environment"
applicationIdSuffix = ".staging"
versionNameSuffix = "-staging"
resValue("string", "app_name", "Example Staging")
}
create("production") {
dimension = "environment"
resValue("string", "app_name", "Example")
}
}
}Use source sets or build settings for native variant resources/files instead of scripts that mutate one shared file in place.
iOS / macOS
Use shared lowercase Xcode schemes with custom build configurations:
development -> Debug-development / Profile-development / Release-development
staging -> Debug-staging / Profile-staging / Release-staging
production -> Debug-production / Profile-production / Release-productionKeep custom configurations chained to Flutter's existing xcconfig setup. Inspect CocoaPods mappings and signing/entitlement behavior rather than inventing a generic copy-script solution.
Windows / Linux
Flavor support is SDK-version sensitive. With Flutter 3.47.0, build/run flavor plumbing exists; older projects/templates may need targeted native adoption. Never assume an old repository has the required CMake/runner integration merely because the installed global Flutter SDK is new.
Web
Do not model web builds as Android/Xcode-style native flavors. Build separate artifacts using Dart defines:
flutter build web \
--release \
--dart-define-from-file=config/production.jsonIf one built artifact must switch backend/environment after deployment, that is a separate runtime-configuration architecture with explicit loading, validation, caching, and version semantics.
Read references/platforms-and-native-integration.md before editing any native platform or Firebase/native SDK setup.
Build Commands
Native flavored target example:
flutter run \
--flavor development \
--dart-define-from-file=config/development.json
flutter build appbundle \
--release \
--flavor production \
--dart-define-from-file=config/production.jsonWeb:
flutter run \
-d chrome \
--dart-define-from-file=config/development.json
flutter build web \
--release \
--dart-define-from-file=config/production.jsonKeep every IDE launch configuration pointed at lib/main.dart.
Read references/workflow-ci-testing-performance.md for Android/iOS/macOS/Windows/Linux/Web commands, IDE examples, integration-test invocation, CI/CD matrix design, artifact naming, and release gates.
Security Boundary
Assume every value compiled or bundled into a Flutter client is recoverable.
Never embed:
- database passwords;
- service-account private keys;
- privileged backend API secrets;
- confidential OAuth client secrets;
- signing private keys;
- keystore/signing passwords;
- cloud administrative credentials;
- long-lived privileged bearer tokens.
Use backend/server secret management for backend secrets and CI/signing infrastructure for signing/store credentials.
Client-visible configuration such as API endpoints, public client IDs, Firebase client configuration, and non-authoritative feature policy may be build-specific, but it is not secret merely because CI injected it.
Firebase / Native SDK Rule
Treat Firebase as an example of native environment configuration, not as the flavor architecture itself.
- Register native apps against the correct environment-specific application/bundle IDs.
- On Android, prefer build-variant source-set placement for
google-services.jsonrather than a script that repeatedly overwrites one shared file. - On Apple platforms, inspect actual FlutterFire/native initialization, target membership, plist behavior, Analytics/Crashlytics/notifications, and build configurations before selecting a strategy.
- Validate app configuration before connecting to the selected backend/native project.
- Never ship service-account or privileged server credentials in the app.
Read references/platforms-and-native-integration.md for full native SDK guidance.
CI/CD Contract
Model build intent as a deliberate tuple:
environment × platform × build modeCI should:
- pin the Flutter SDK/toolchain;
- select one canonical environment;
- select matching public Dart config;
- select matching native flavor/scheme where supported;
- preflight
APP_ENV, native variant, expected app identity, endpoint policy, and signing identity; - inject signing/store credentials separately from Dart config;
- run analysis/tests;
- build artifact;
- inspect artifact identity/provenance;
- publish only after release gates pass.
Do not build every Cartesian product automatically. Build only combinations that serve a deployment/testing purpose.
Testing Requirements
At minimum unit-test pure configuration parsing for:
- each valid environment;
- missing/unknown
APP_ENV; - missing/invalid API URL;
- staging/production transport policy;
- native/Dart mismatch;
- exact boolean parsing;
- unknown enum/log values;
- whitespace/canonical-name errors;
- default policy behavior.
Then use environment-aware integration/native build tests where they materially prove native packaging/SDK selection.
Keep the parser pure so unit tests do not require Flutter engine/platform startup.
Performance Rules
Do not micro-optimize environment parsing. Prefer:
- compile-time configuration rather than runtime asset parsing when runtime mutability is unnecessary;
- one parse/validation at startup;
- no expensive I/O during configuration declaration;
- no duplicated bootstraps;
- no SDK initialization before configuration validation;
- no environment-driven service graph duplication when a configured dependency is enough.
Measure startup before claiming performance improvements.
Migration Rules
When converting a project that already has main_dev.dart, main_staging.dart, etc.:
- inventory all entry points and platform build variants;
- capture initialization ordering and environment-specific behavior;
- extract shared bootstrap without changing behavior;
- introduce typed immutable configuration;
- make
lib/main.dartthe shared entry point; - move Dart values to the compile-time configuration contract;
- preserve native identity/resources/build setup;
- update IDE/CI commands to pass flavor + define file where applicable;
- validate each environment and final artifact;
- only then remove obsolete entry points.
Do not collapse native distinctions that are still required.
Read references/migration-validation-troubleshooting.md for the full migration phases, validation checklist, failure modes, anti-patterns, and troubleshooting tree.
Critical Anti-Patterns
Reject these patterns unless a documented repository constraint makes them temporarily necessary:
main_dev.dart,main_staging.dart,main_prod.dart;- duplicated bootstrap functions per environment;
- build mode (
kDebugMode) used to infer deployment environment; - silent fallback to production;
String.fromEnvironmentscattered throughout features;- services branching on environment everywhere instead of receiving configured dependencies;
- hardcoded production/staging URLs in feature code;
- runtime
.envasset parsing when configuration is truly build-time fixed; - build-time secrets embedded with Dart defines;
- scripts that copy/mutate native config files in place before every build;
- manually editing Flutter-generated/ephemeral config as the source of truth;
- assuming web supports
--flavorlike Android/iOS; - assuming Windows/Linux flavor support on older Flutter versions/templates;
- using unrelated names (
dev,stage,prod) across layers without a migration need; - releasing a production-identity artifact with staging Dart configuration.
New Environment Procedure
To add qa, preview, or another persistent build environment:
- decide whether it truly needs a separate build identity;
- add one canonical
AppEnvironmentwire value; - add its public Dart config file;
- add native variant/scheme only where native differentiation is required;
- add matching CI/IDE build rows;
- add validation/tests;
- verify identifiers, native SDK registrations, deep links/OAuth redirect registrations, push setup, and store/distribution implications;
- do not create another
main_*.dart.
Release Invariants
Before shipment, enforce all of these:
exactly one Dart app entry point
APP_ENV explicitly supplied
strict environment parsing
no silent production fallback
native flavor checked against APP_ENV when available
build mode independent from environment
client config contains no privileged secrets
native identity controlled by native build/package config
CI validates complete build tuple
web does not pretend to have native product flavors
Windows/Linux flavor behavior version-gated
configuration parsed once and passed explicitly
services do not repeatedly inspect global environment state
new environments do not duplicate startup
production artifact verified before distributionReference Loading Guide
Read only what the task requires:
references/architecture-and-configuration.md— architecture decisions, typed config implementation, compile-time definitions, bootstrap, dependency boundaries.references/platforms-and-native-integration.md— Android/iOS/macOS/Web/Windows/Linux implementation, identifiers/resources, Firebase/native SDKs, security.references/workflow-ci-testing-performance.md— build commands, IDE configs, CI/CD, tests, performance, adding environments.references/migration-validation-troubleshooting.md— migration, validation, failure modes, anti-patterns, troubleshooting, decision matrix.references/agent-workflow-and-sources.md— exact AI repository-inspection workflow, final consistency rules, and authoritative source list.
AI Execution Workflow
When asked to implement flavors/environments in a repository:
- Inspect the repository and pinned Flutter version first.
- Build an environment/platform/mode matrix before editing.
- Decide what belongs in native build config vs Dart compile-time config vs runtime config vs secret management.
- Preserve existing native identities, signing, entitlements, SDK initialization, and working bootstrap order.
- Implement the typed Dart configuration boundary and single
main.dartfirst. - Add or adapt native variants only where required.
- Add mismatch validation.
- Update developer/IDE/CI commands.
- Test configuration parsing and each required platform/environment combination.
- Inspect production artifact identity and endpoint policy before declaring the migration complete.
Do not report success merely because one local flutter run command compiled.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

