Every feature flag check reads from your local adapter. Zero calls to Flipper Cloud. Zero external dependency. If Flipper Cloud goes offline, your app doesn’t notice.
Flipper.enabled?(:feature)
Every call to Flipper.enabled? follows this path, never calling Flipper Cloud.
Multiple independent mechanisms ensure your app is never affected by external failures.
The DualWrite adapter routes every read to your local adapter, typically ActiveRecord backed by your own database. Feature flag checks never call Flipper Cloud. Reads are fast and always available.
The background poller runs in its own thread, rescues all exceptions, and retries on the next interval. Sync frequency is based on your plan. A failed sync never propagates to your application code.
If Cloud is unreachable at boot, the initial sync is rescued and the process starts anyway. With ActiveRecord, your app boots with the last known flag state from your database. Your deploys are never blocked.
Conditional HTTP requests with If-None-Match headers. When nothing has changed, the response is a tiny 304. Minimal bandwidth, minimal CPU. Only actual changes transfer data.
Webhooks push changes instantly via signed POST requests. When webhooks are enabled, polling slows to a 1-hour safety net. If a webhook is ever missed, the poller eventually catches it.
2-second open timeout, 5-second read timeout, zero retries. If Cloud is slow, connections fail fast. Your app threads are never blocked waiting on external services.
Every failure mode has been accounted for. Here's how each one plays out.
| Scenario | What happens | App impact |
|---|---|---|
| ☁️Cloud goes down | Poller gets errors, silently rescues them. Local adapter retains last known state. Poller retries next interval. | Zero impact |
| 🌐Network timeout | 2s open / 5s read timeouts. Connection fails fast. Poller thread stays alive, tries again next interval. | Zero impact |
| 🚀Boot without Cloud | Initial sync is rescued. With a persistent adapter like ActiveRecord, your app boots with the last known flag state. Poller keeps trying in background. | Zero impact |
| 🔄Poller thread error | Exception rescued in run loop. Thread stays alive. Same data served until next successful sync. | Zero impact |
| 🍴Process fork (Puma) | Fork detection via Process.pid check. New poller thread started automatically in child process. | Zero impact |
| ⚡Webhook missed | Background polling acts as safety net. With webhooks on, the poller runs hourly and catches any missed changes. | Zero impact |
Feature flags that never slow you down. Get started free, no credit card required.
Try Flipper Cloud free