Familiar model, different SDK.
Do not remove Flipper, swap a constant, or copy production percentages without a staged verification period.
ToggleFleet currently supports five gates: boolean, actor, group, percentage of actors, and percentage of time. Flipper's current first-party documentation lists those five plus experimental expressions. ToggleFleet has no expression language, but most expressions translate directly: property comparisons become group predicates in your application, and time windows become scheduled flags. Expressions whose rules change frequently without a deploy may be better left on Flipper.
There is no automatic Flipper adapter import. Recreate supported flags deliberately so gate state, actor identity, and environment selection are reviewed rather than guessed.
Classify before changing code.
- List active flags with
Flipper.featuresand record each stable key. - For each environment, record which gates are enabled and the current values.
- For expression-based flags, note which are property comparisons or time windows (both translate) and which depend on other features or change without a deploy (keep on Flipper).
- Identify the actor classes and the value returned by
flipper_id. - Choose one non-critical boolean flag for the first migration.
| Flag | Environment | Gates | Actor ID | Decision |
|---|---|---|---|---|
checkout_v2 | Staging | Boolean off · actors 2 | User;id | Migrate first |
spring_sale | Production | Expression / time window | None | Keep on Flipper |
Rows above are worksheet examples, not customer or production data.
Map only behavior that both systems implement.
| Flipper behavior | ToggleFleet control | Migration note |
|---|---|---|
| Boolean | Boolean | Direct on/off concept; verify the target environment. |
| Actors | Target actors | Copy stable IDs only after reviewing actor identity. |
| Groups | Target groups + register_group | Re-register predicates in application code. |
| Percentage of actors | Percentage of actors | The same percentage does not promise the same cohort. |
| Percentage of time | Percentage of time | Both are non-sticky; verify expected sampling behavior. |
| Expressions (experimental in Flipper) | Group predicates · scheduled flags | Most translate directly — see expressions below. |
Most expressions become a predicate.
Flipper expressions evaluate properties of an actor — Flipper.property(:age).gte(21) — composed with all and any. Flipper's own documentation currently marks them experimental and subject to change. ToggleFleet has no JSON expression language, and deliberately so: the same logic is expressed as a predicate in your application, which is ordinary Ruby with no operator vocabulary to outgrow.
| Flipper expression | ToggleFleet equivalent |
|---|---|
property(:age).gte(21) | register_group(:over_21) { |u| u.age >= 21 } |
all(over_21, any(paid, vip)) | One predicate containing the same boolean logic. |
now.gte(time("2026-03-01")) | A scheduled flag — set enable at on the flag. |
feature_enabled(:other_flag) | No direct equivalent; compose the two checks in application code. |
# Flipper: Flipper.all(Flipper.property(:age).gte(21), Flipper.any(paid, vip)) ToggleFleet.register_group(:club_eligible) do |user| user.age >= 21 && (user.paid? || user.vip?) end
An expression can be changed in a dashboard without deploying. A predicate is code, so changing the rule requires a deploy — you can still flip the flag itself, target actors, and adjust rollout percentages from ToggleFleet without one. Decide per flag: rules that change often may be better left on Flipper.
Predicates also keep actor attributes inside your process. Nothing about a user's age, plan, or status is sent to ToggleFleet — only the flag key and the resulting decision matter, and the decision is computed locally.
Preserve the identifier before copying actor gates.
Flipper's actor documentation uses flipper_id. ToggleFleet checks togglefleet_id first, then id, then the actor's string value. If your Flipper ID contains a class prefix or custom UUID, relying on ToggleFleet's default id can change actor matches and rollout buckets.
class User < ApplicationRecord def togglefleet_id flipper_id end end
Verify this value for representative actors before copying an actor allowlist. Even with the same actor ID, percentage-of-actors parity is not promised because the two SDKs use different bucketing inputs and implementations.
Keep both gems during verification.
gem "flipper" gem "togglefleet", "~> 0.1"
ToggleFleet.configure do |config| config.sdk_key = ENV.fetch("TOGGLEFLEET_SDK_KEY") config.default = false end ToggleFleet.start
Create the same flag key in ToggleFleet's Development or Staging environment. Start with all gates off, then reproduce only the supported state you inventoried.
Compare in parallel; keep Flipper authoritative.
Run both local evaluations for a limited period. Return the Flipper result while recording mismatches. Do not log personal actor data; use aggregate mismatch counts or an internal stable identifier with an appropriate lawful basis.
def checkout_v2_enabled?(user) flipper_result = Flipper.enabled?(:checkout_v2, user) toggle_result = ToggleFleet.enabled?(:checkout_v2, actor: user) FeatureFlagMetrics.increment("checkout_v2.mismatch") if flipper_result != toggle_result flipper_result end
Expected mismatches are not always defects. Percentage rollouts can produce different cohorts. For the first pass, use boolean, explicit actor, or explicit group gates where the desired result can be checked directly.
Change authority only after a quiet verification window.
- Confirm the ToggleFleet environment's connection timestamp is current.
- Exercise true and false paths in automated and staging tests.
- Review mismatch metrics; explain every remaining mismatch.
- Change the wrapper to return the ToggleFleet result.
- Keep the Flipper call and configuration available for one release window.
- If behavior regresses, return the Flipper result immediately; no flag-data rewrite is required.
- After the rollback window, remove the old call and the flag from Flipper.
A per-flag sequence limits blast radius and makes rollback a code-path choice rather than a database migration.
Compatibility claims come from the products' own docs.
- Flipper feature and gate documentation ↗
- Flipper actor and
flipper_iddocumentation ↗ - Flipper group documentation ↗
- Flipper expression documentation ↗
- ToggleFleet Ruby SDK and REST documentation →
Flipper and Flipper Cloud are trademarks of their respective owners. ToggleFleet is independent and is not affiliated with, endorsed by, or sponsored by them.