Skip to content
CAI
Software that uses CAICheck a score

fetlife/rollout

65.5

Adequate · 19 September 2026

1.4k

lines of production code

Ruby

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is a feature flag library that manages the activation and rollout of features for specific users, groups, or percentages. It provides a core API for state management and history tracking, backed by pluggable persistence adapters for Redis and Active Record. The architecture separates the core logic from storage implementations, allowing users to choose their preferred backend while maintaining consistent feature lifecycle operations.

Features

Introduce dedicated Redis adapter for feature flag storage

The \rollout-redis-adapter\ gem is now available as a standalone package, providing a \Rollout::Adapters::Redis\ backend that stores feature states and history in Redis. This adapter supports full feature lifecycle management (create, read, update, delete), preserves history timestamps using Redis sorted sets, and includes utilities for exporting feature states and history. Users can now integrate the Rollout library with Redis by requiring the new gem entry point.

rollout-redis-adapter · high confidence

Introduce standalone Active Record adapter for feature flags

A new \rollout-active\_record-adapter\ gem is available, allowing feature flag state and history to be stored in application database tables (PostgreSQL, MySQL, SQLite) instead of Redis. This adapter supports Rails generators for migrations, standalone Active Record setups, and an optional in-process feature-state cache (disabled by default). It also includes a migration tool to copy existing feature data from a Redis adapter to the new database tables.

_rollout-active\record-adapter · high confidence

New Active Record adapter for feature flag storage

Introduces a new \rollout-active\_record-adapter\ gem that allows storing feature flag states and event history in a relational database via Active Record. This includes a Rails generator to create the necessary \rollout\_features\ and \rollout\_events\ tables, a schema definition with MySQL-specific optimizations (utf8mb4 collation, mediumtext limits), and an adapter implementation that supports an optional in-process feature-state cache with configurable TTL and max size. The adapter also provides a migration tool to import feature data from other sources with verification.

_rollout-active\record-adapter/lib · high confidence

Behavioural changes

Project structure modernized with explicit Ruby version and CI configuration

The project now explicitly targets Ruby 2.3.0 via a new .ruby-version file and configures Travis CI to test against Ruby versions 2.0 through 2.6 using both Redis 3 and Redis 4 gemfiles. The build system has been refactored from Jeweler to standard RSpec rake tasks, adding specific tasks for running tests in the Redis and Active Record adapter subdirectories. Documentation has been converted from RDoc to Markdown, and the copyright holder has been updated to BitLove, Inc.

(repo-wide) · high confidence

Refactored feature management with explicit group and user activation methods

The core Rollout API has been restructured to provide distinct methods for managing feature states, replacing the previous overloaded activate/deactivate calls with specific operations. Users can now explicitly activate or deactivate features, groups, and individual users via new methods such as activate\_group, deactivate\_group, activate\_user, deactivate\_user, and activate\_users. The API also introduces bulk user management with set\_users, percentage-based rollout control via activate\_percentage and deactivate\_percentage, and the ability to attach arbitrary metadata to features using set\_feature\_data and clear\_feature\_data. Additionally, the class now supports querying the state of multiple features at once through multi\_get, feature\_states, and active\_features, and provides a clear! method to reset all feature data.

lib · high confidence

Rollout 3.1.0 introduces FeatureState boundary and optional logging

This release updates the library to version 3.1.0 and introduces a new \FeatureState\ class that serves as the canonical persistence boundary for feature metadata, ensuring data is canonicalized through JSON. The \Feature\ class is now isolated in its own file and uses \FeatureState\ to manage state, improving ergonomics and isolation. Additionally, an optional logging system is added, allowing users to track feature changes with context support, history truncation, and the ability to temporarily disable logging per thread.

lib/rollout · high confidence

Test coverage

Added backend contract and history integration tests; Added comprehensive test suite for Rollout feature management and metadata handling; Added test coverage for Rollout feature state, logging, and backend contracts; Added test suite for the new ActiveRecord adapter gem.

Dependencies

Extract Redis and Active Record adapters into separate gems

The project has been restructured to split the feature-flip functionality into three distinct gems: the core \rollout\ gem, \rollout-redis-adapter\ (version 0.3.0), and \rollout-active\_record-adapter\ (version 0.1.0). This separation allows users to install only the persistence backend they need, reducing dependencies for those not using Redis or Active Record. The core \rollout\ gem now depends on the \observer\ library and specifies a Ruby version requirement of \>= 2.3, while the adapter gems define their own specific version constraints for Redis (\>= 4.0, \< 7) and Active Record (\>= 7.1, \< 9).

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 65.

Lenses

  • Code Health 96
  • Architecture 69
  • Maturity 64
  • Readiness 60
  • Security 79

Changes since last survey

  • 300 commits — 283 feature/other, 17 fixes

By area

  • (root) — 100 commits
  • (repo) — 84 commits
  • lib/rollout.rb — 36 commits
  • lib/rollout — 23 commits
  • .circleci/config.yml — 8 commits
  • .github/workflows — 8 commits
  • rollout-active_record-adapter/spec — 8 commits
  • docs/upgrading-to-v3.md — 5 commits
  • spec/rollout_spec.rb — 5 commits
  • rollout-active_record-adapter/lib — 4 commits
  • rollout-redis/spec — 4 commits
  • rollout-active_record-adapter/README.md — 3 commits
  • rollout-redis-adapter/lib — 2 commits
  • rollout-redis-adapter/rollout-redis-adapter.gemspec — 2 commits
  • rollout-redis-adapter/spec — 2 commits
  • spec/rollout — 2 commits
  • misc/check_rollout.rb — 1 commit
  • rollout-redis/rollout-redis.gemspec — 1 commit
  • spec/spec.opts — 1 commit
  • spec/spec_helper.rb — 1 commit

Notable commits

  • fix: Cleanup and fix del command
  • fix: Fix Redis adapter contract spec require path
  • fix: Fix badge links
  • fix: Fix logging of data values
  • fix: Fix redis deprecation warning
  • fix: Fix specs on Ruby 2.3
  • fix: Fix: update variable name in example.
  • fix: Fixed documentation for percentage algorithm
  • fix: Merge pull request #144 from Seitk/fix/empty-features-crash-on-multi-get
  • fix: Merge pull request #149 from fetlife/fix-exists
  • fix: Merge pull request #187 from fetlife/fix/feature-state-json-metadata
  • fix: Merge pull request #194 from fetlife/fix/redis-adapter-gem-entry-point
  • fix: Merge pull request #53 from FetLife/fix-IncludeVersion
  • fix: Merge pull request #54 from FetLife/fix-IncludeVersion
  • fix: Merge pull request #69 from FetLife/hotfix-Gemfilelock
  • fix: Removes regex and fixes raw_data nil case
  • fix: fix(mult-get): fix crash when calling feature_states on a fresh new redis
  • change: Activate/deactivate with a boolean using #set
  • change: Add .rspec with color :P
  • change: Add CircleCI config
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

fetlife/rollout was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 6f26d5bc053383c05686fdca26ed8c43cae35010 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.