Skip to content

Feature flag improvements#550

Merged
Blaumaus merged 4 commits into
mainfrom
feature-flag-improvements
May 25, 2026
Merged

Feature flag improvements#550
Blaumaus merged 4 commits into
mainfrom
feature-flag-improvements

Conversation

@Blaumaus
Copy link
Copy Markdown
Member

@Blaumaus Blaumaus commented May 24, 2026

Changes

If applicable, please describe what changes were made in this pull request.

Community Edition support

  • Your feature is implemented for the Swetrix Community Edition
  • This PR only updates the Cloud (Enterprise) Edition code (e.g. Paddle webhooks, blog, payouts, etc.)

Database migrations

  • Clickhouse / MySQL migrations added for this PR
  • No table schemas changed in this PR

Documentation

  • You have updated the documentation according to your PR
  • This PR did not change any publicly documented endpoints

Summary by CodeRabbit

  • New Features

    • Schedule feature-flag changes (enable/disable or rollout %) to apply automatically at a future time
    • Kill-switch override and release controls for immediate flag control
    • Richer status, staleness reasons, and last-evaluated timestamps surfaced in the API and UI
    • UI updates for scheduling, kill-switch flows, and status badges/modal dialogs
  • Chores

    • Database migrations and schema additions to persist scheduling, kill-switch state, and timestamps

Review Change Stack

@Blaumaus Blaumaus self-assigned this May 24, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 24, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b9d45f39-027f-4f46-8c31-8fe9dd72d994

📥 Commits

Reviewing files that changed from the base of the PR and between f6faeb7 and 2a8e0be.

📒 Files selected for processing (1)
  • backend/apps/community/src/feature-flag/feature-flag.controller.ts

📝 Walkthrough

Walkthrough

This PR extends feature flags with three interconnected capabilities: scheduled enable/rollout changes (future-dated state overrides), kill-switch overrides (forcing a flag to a specific value), and staleness detection (flagging outdated flags based on evaluation age, targeting changes, and experiment completion). Changes span backend (cloud and community apps) and frontend with schema extensions, evaluation logic, response enrichment, service methods, and UI controls.

Changes

Feature flag scheduling, kill switches, and staleness

Layer / File(s) Summary
Evaluation types and scheduling/kill-switch logic
backend/apps/cloud/src/feature-flag/evaluation.ts, backend/apps/community/src/feature-flag/evaluation.ts
New types (FeatureFlagSchedule, FeatureFlagStatus, FeatureFlagStaleReason) and evaluation helpers (applyDueScheduledChange, isScheduledChangeDue) extend flag evaluation to short-circuit on active kill-switch and apply due scheduled changes before evaluating targeting/rollout.
Entity and database schema extensions
backend/apps/cloud/src/feature-flag/entity/feature-flag.entity.ts, backend/apps/community/src/feature-flag/entity/feature-flag.entity.ts, backend/migrations/clickhouse/*, backend/migrations/mysql/*
Cloud and community entities add scheduledChange, killSwitchActive, killSwitchValue, killedAt, targetingUpdatedAt, and updated fields. Migrations extend ClickHouse and MySQL schemas with corresponding columns and defaults.
Request/response DTOs and API types
backend/apps/cloud/src/feature-flag/dto/feature-flag.dto.ts, backend/apps/community/src/feature-flag/dto/feature-flag.dto.ts, web/app/api/api.server.ts
New FeatureFlagScheduleDto and KillFeatureFlagDto for create/update. Extended FeatureFlagDto and ProjectFeatureFlag to include scheduled-change, kill-switch, experiment, and staleness fields.
Cloud service implementation
backend/apps/cloud/src/feature-flag/feature-flag.service.ts
Service extends formatting to parse/serialize scheduledChange JSON. Adds applyDueScheduledChanges to update due-scheduled flags and getLastEvaluatedAtByFlagIds to query ClickHouse for evaluation timestamps.
Community service implementation
backend/apps/community/src/feature-flag/feature-flag.service.ts
Service extends formatting and create/update to handle scheduled-change and kill-switch fields. Adds same applyDueScheduledChanges and getLastEvaluatedAtByFlagIds methods with ClickHouse persistence details.
Cloud controller decoration
backend/apps/cloud/src/feature-flag/feature-flag.controller.ts
Controller adds decoration pipeline: validates scheduled changes, detects targeting-rule changes, computes stale reasons and derived status (killed/scheduled/stale/enabled/disabled). All endpoints apply due changes and enrich responses with pid, lastEvaluatedAt, staleReasons, and status.
Community controller decoration
backend/apps/community/src/feature-flag/feature-flag.controller.ts
Controller adds same decoration pipeline and enrichment. Evaluation path switches from loading only enabled flags to loading all flags before evaluating.
Scheduling UI in feature flag settings modal
web/app/pages/Project/tabs/FeatureFlags/FeatureFlagSettingsModal.tsx
Modal adds scheduling form with datetime-local input, scheduled enable/rollout fields, and validation (required, valid parse, strictly future). Constructs scheduledChange payload on submit. Refactors implementation code snippets to use CodeBlock components.
Frontend display: status badges, staleness, and kill-switch controls
web/app/pages/Project/tabs/FeatureFlags/FeatureFlagsView.tsx
Flag row adds status/stale badges, kill-switch indicators, scheduled-change details, and stale-reason text. Kill-switch button conditionally opens kill or release modal. Action fetcher handles kill-switch intents and emits toasts.
Route handlers and localization
web/app/routes/projects.$id.tsx, web/public/locales/en.json
Route actions parse scheduledChange JSON for create/update and add kill-feature-flag and release-feature-flag-kill-switch intents. Locales add UI strings for scheduling, kill-switch flows, and stale-reason labels.

Sequence Diagram

sequenceDiagram
  participant Client as Client/UI
  participant Controller as Controller
  participant Service as Service
  participant DB as Database
  participant Evaluation as Evaluation
  Client->>Controller: GET/PUT /feature-flag
  Controller->>Service: applyDueScheduledChanges(projectId)
  Service->>DB: SELECT flags WHERE scheduledChange.applyAt <= now
  DB-->>Service: flags with due changes
  Service->>DB: UPDATE enabled/rolloutPercentage, clear scheduledChange
  Controller->>Service: create/update flag
  Service->>DB: INSERT/UPDATE with scheduledChange, killSwitch fields
  DB-->>Service: persisted flag
  Controller->>Evaluation: evaluateFlag(flag)
  alt killSwitchActive
    Evaluation-->>Controller: killSwitchValue
  else
    Evaluation->>Evaluation: applyDueScheduledChange if needed
    Evaluation->>Evaluation: check enabled and targeting rules
    Evaluation-->>Controller: boolean or rollout result
  end
  Controller->>Service: getLastEvaluatedAtByFlagIds(flagIds)
  Service->>DB: SELECT max(created) per flagId from evaluations
  DB-->>Service: Map<flagId, timestamp>
  Controller->>Controller: decorateFlags: compute staleReasons, derive status
  Controller-->>Client: enriched flags with status, staleness, lastEvaluatedAt
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • Swetrix/swetrix#536: Overlaps with FeatureFlagsView changes (UI-level experiment badge/navigation and row rendering).
  • Swetrix/swetrix#528: Related to evaluation and targeting changes, including matchesTargetingRules adjustments and experiment metadata.
  • Swetrix/swetrix#451: Prior feature-flag foundation changes that this PR extends with scheduling and kill-switch fields.

"🐰 I hopped through code at break of day,
Scheduling flags to change their way.
Kill-switch tucked, staleness shown bright,
Flags now dance at the scheduled light.
Hooray — deploy, and may tests go right!"

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 41.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'Feature flag improvements' is too vague and generic to clearly convey the specific changes made in this large, multi-faceted pull request. Use a more descriptive title that highlights the primary changes, such as 'Add scheduled feature flag changes, kill-switch controls, and staleness tracking' or focus on the main feature introduced.
✅ Passed checks (3 passed)
Check name Status Explanation
Description check ✅ Passed The PR description follows the provided template structure with all required checkbox sections completed, including Community Edition support, database migrations, and documentation status.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature-flag-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
backend/apps/community/src/feature-flag/feature-flag.controller.ts (1)

671-702: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Apply overdue scheduled changes before updating the flag.

This write path can preserve a past-due scheduledChange when the user edits some other field. The next read/evaluate request will then apply that stale schedule and overwrite the newer manual state. Please run applyDueScheduledChanges(flag.projectId) before building the update payload, like the other mutation/read paths already do.

Suggested fix
     this.validateScheduledChange(flagDto.scheduledChange)
+    await this.featureFlagService.applyDueScheduledChanges(flag.projectId)
 
     const updatePayload: Partial<FeatureFlag> = {
       ..._pick(flagDto, [
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/apps/community/src/feature-flag/feature-flag.controller.ts` around
lines 671 - 702, The update path can preserve a past-due scheduledChange; call
applyDueScheduledChanges(flag.projectId) before validating/building the update
payload to ensure overdue schedules are applied first. Specifically, in the
controller method that currently calls
validateScheduledChange(flagDto.scheduledChange) and builds updatePayload (look
for validateScheduledChange, hasTargetingRulesChanged,
featureFlagService.update, decorateFeatureFlags), insert an awaited call to
applyDueScheduledChanges(flag.projectId) immediately before
validateScheduledChange and constructing updatePayload so the payload and
subsequent featureFlagService.update operate on the latest applied state.
backend/apps/cloud/src/feature-flag/feature-flag.controller.ts (1)

723-755: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Apply due schedules before mutating an existing flag.

If this flag already has a past-due scheduledChange, updating another field here leaves that stale schedule in storage, and the next read/evaluate path will apply it and overwrite this manual edit. The get/kill/release flows already guard against that; this update path should do the same.

Suggested fix
     this.validateScheduledChange(flagDto.scheduledChange)
+    await this.featureFlagService.applyDueScheduledChanges(flag.project.id)
 
     const updatePayload: Partial<FeatureFlag> = {
       ..._pick(flagDto, [
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/apps/cloud/src/feature-flag/feature-flag.controller.ts` around lines
723 - 755, Before persisting updates, ensure any past-due scheduled change for
this flag is applied/cleared just like the get/kill/release flows do: load the
current flag (the existing flag variable used here), call the shared routine
that applies due schedules (or implement one on featureFlagService, e.g.,
applyDueScheduledChange(flag.id) if it doesn't exist), wait for it to complete,
then proceed to build updatePayload and call this.featureFlagService.update(id,
updatePayload); this prevents a stale scheduledChange from being applied after
the manual update. Reference symbols: validateScheduledChange,
hasTargetingRulesChanged, featureFlagService.update, decorateFeatureFlags,
findOne.
🧹 Nitpick comments (2)
web/app/components/ToolsNav.tsx (2)

323-323: 💤 Low value

Navigation spacing changes appear unrelated to feature flag improvements.

These padding adjustments reduce spacing in the tools navigation but don't seem connected to the PR's stated purpose of adding feature flag scheduling, kill switches, and staleness tracking. Consider whether this styling change should be in a separate PR for clearer change tracking.

Also applies to: 380-380

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/app/components/ToolsNav.tsx` at line 323, The padding/classname changes
in ToolsNav.tsx ('flex items-start gap-3 px-3 py-2 transition-colors' and the
similar occurrence around line ~380) are unrelated to the feature-flag
scheduling work; revert those spacing edits in the ToolsNav component back to
their original className values (undo the px-3/py-2/gap-3 change) or remove them
from this PR and put the styling tweak into a separate PR for clearer history,
making sure to update both occurrences within the ToolsNav component so only the
feature-flag logic remains in this branch.

380-380: 💤 Low value

Consider consistent padding across mobile navigation elements.

The mobile button (line 380) now uses px-3 py-2, but the dropdown items (line 414) still use px-4 py-3. If the goal is tighter spacing throughout, the dropdown items could also be updated for visual consistency.

Suggested consistency fix
                 <Link
                   key={tool.id}
                   to={tool.href}
                   className={cn(
-                    'flex items-start gap-3 px-4 py-3 transition-colors hover:bg-gray-50 dark:hover:bg-slate-700/30',
+                    'flex items-start gap-3 px-3 py-2 transition-colors hover:bg-gray-50 dark:hover:bg-slate-700/30',
                     index !== 0 &&
                       'border-t border-gray-100 dark:border-slate-700',
                   )}

Also applies to: 414-414

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/app/components/ToolsNav.tsx` at line 380, The mobile button in ToolsNav
uses tighter padding ('px-3 py-2') while the dropdown items use larger padding
('px-4 py-3'), causing inconsistent spacing; pick one spacing scheme and update
the other to match (either change the mobile button className to 'px-4 py-3' or
change the dropdown item className to 'px-3 py-2') so visual spacing is
consistent across elements—locate the mobile button className in ToolsNav (the
element with "flex w-full items-center justify-between gap-3 px-3 py-2") and the
dropdown item className around the dropdown rendering (the element using "px-4
py-3") and make the padding values equal.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@backend/apps/cloud/src/feature-flag/feature-flag.service.ts`:
- Around line 116-155: The current getLastEvaluatedAtByFlagIds method swallows
ClickHouse errors (catch block returns an empty Map) which is indistinguishable
from "never evaluated"; change this so failures are surfaced: remove the catch
that returns result and instead catch the error from clickhouse.query (or let it
bubble) and either log full error context (include projectId and flagIds) using
your service logger, then rethrow the error so the caller can skip
evaluation-based staleness, or return a Map populated with a clear sentinel
value (e.g. "__CLICKHOUSE_ERROR__") for each requested flagId; make the change
in getLastEvaluatedAtByFlagIds around the clickhouse.query/resultSet.json call
so failures are not collapsed into an empty Map.

In
`@backend/migrations/clickhouse/selfhosted_2026_05_24_feature_flag_operations.js`:
- Around line 4-10: The first ALTER that adds the scheduledChange column is
anchored to a non-guaranteed column (`experimentId`) which breaks upgrades;
change the statement that adds `scheduledChange` to remove the "AFTER
experimentId" clause (i.e. use `ADD COLUMN IF NOT EXISTS scheduledChange
Nullable(String)`), and ensure subsequent column additions either don't rely on
that anchor or explicitly use safe anchors (refer to the ALTER statements adding
`killSwitchActive`, `killSwitchValue`, `killedAt`, `targetingUpdatedAt`, and
`updated` and the `UPDATE targetingUpdatedAt = created` line) so the migration
will succeed even when `experimentId` is absent.

In `@web/app/pages/Project/tabs/FeatureFlags/FeatureFlagSettingsModal.tsx`:
- Around line 745-746: The datetime input's min currently uses
dayjs().format('YYYY-MM-DDTHH:mm') which allows selecting the current minute
while your submit validation requires a strictly future time; update the min to
match validation by using dayjs().add(1, 'minute').format('YYYY-MM-DDTHH:mm')
(or the same helper/format used by your validation) so the picker disallows the
currently-invalid value — change the min prop near the input in
FeatureFlagSettingsModal (the line with min={...} and the adjacent onChange
handler) to use the +1 minute value.

In `@web/app/routes/projects`.$id.tsx:
- Around line 1738-1741: Wrap the JSON.parse of scheduledChange in a try/catch
to prevent a thrown SyntaxError from bubbling as a 500; specifically, when
reading scheduledChangeRaw from formData.get and when parsing the other
occurrence around lines 1784-1788, attempt JSON.parse and on failure return or
throw a controlled 400 response (e.g., throw new Response or return a
badRequest-like response) with a clear error message so the action responds with
400 instead of 500.
- Around line 1819-1825: The code currently coerces a missing or invalid
killSwitchValue to false before calling serverFetch; update the form handling to
require an explicit value: read the raw value via
formData.get('killSwitchValue') into a variable (e.g. rawKillSwitch), if
rawKillSwitch is null or not equal to 'true' or 'false' return a
bad-request/error response (do not call serverFetch), otherwise set
killSwitchValue = rawKillSwitch === 'true' and pass that to serverFetch for
feature-flag/{flagId}/kill; use the existing flagId and serverFetch identifiers
to locate where to implement this validation.

---

Outside diff comments:
In `@backend/apps/cloud/src/feature-flag/feature-flag.controller.ts`:
- Around line 723-755: Before persisting updates, ensure any past-due scheduled
change for this flag is applied/cleared just like the get/kill/release flows do:
load the current flag (the existing flag variable used here), call the shared
routine that applies due schedules (or implement one on featureFlagService,
e.g., applyDueScheduledChange(flag.id) if it doesn't exist), wait for it to
complete, then proceed to build updatePayload and call
this.featureFlagService.update(id, updatePayload); this prevents a stale
scheduledChange from being applied after the manual update. Reference symbols:
validateScheduledChange, hasTargetingRulesChanged, featureFlagService.update,
decorateFeatureFlags, findOne.

In `@backend/apps/community/src/feature-flag/feature-flag.controller.ts`:
- Around line 671-702: The update path can preserve a past-due scheduledChange;
call applyDueScheduledChanges(flag.projectId) before validating/building the
update payload to ensure overdue schedules are applied first. Specifically, in
the controller method that currently calls
validateScheduledChange(flagDto.scheduledChange) and builds updatePayload (look
for validateScheduledChange, hasTargetingRulesChanged,
featureFlagService.update, decorateFeatureFlags), insert an awaited call to
applyDueScheduledChanges(flag.projectId) immediately before
validateScheduledChange and constructing updatePayload so the payload and
subsequent featureFlagService.update operate on the latest applied state.

---

Nitpick comments:
In `@web/app/components/ToolsNav.tsx`:
- Line 323: The padding/classname changes in ToolsNav.tsx ('flex items-start
gap-3 px-3 py-2 transition-colors' and the similar occurrence around line ~380)
are unrelated to the feature-flag scheduling work; revert those spacing edits in
the ToolsNav component back to their original className values (undo the
px-3/py-2/gap-3 change) or remove them from this PR and put the styling tweak
into a separate PR for clearer history, making sure to update both occurrences
within the ToolsNav component so only the feature-flag logic remains in this
branch.
- Line 380: The mobile button in ToolsNav uses tighter padding ('px-3 py-2')
while the dropdown items use larger padding ('px-4 py-3'), causing inconsistent
spacing; pick one spacing scheme and update the other to match (either change
the mobile button className to 'px-4 py-3' or change the dropdown item className
to 'px-3 py-2') so visual spacing is consistent across elements—locate the
mobile button className in ToolsNav (the element with "flex w-full items-center
justify-between gap-3 px-3 py-2") and the dropdown item className around the
dropdown rendering (the element using "px-4 py-3") and make the padding values
equal.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3bc9c5f0-efad-4289-b607-5e358bd7907f

📥 Commits

Reviewing files that changed from the base of the PR and between 934b688 and ef17058.

📒 Files selected for processing (20)
  • backend/apps/cloud/src/feature-flag/dto/feature-flag.dto.ts
  • backend/apps/cloud/src/feature-flag/entity/feature-flag.entity.ts
  • backend/apps/cloud/src/feature-flag/evaluation.ts
  • backend/apps/cloud/src/feature-flag/feature-flag.controller.ts
  • backend/apps/cloud/src/feature-flag/feature-flag.service.ts
  • backend/apps/community/src/feature-flag/dto/feature-flag.dto.ts
  • backend/apps/community/src/feature-flag/entity/feature-flag.entity.ts
  • backend/apps/community/src/feature-flag/evaluation.ts
  • backend/apps/community/src/feature-flag/feature-flag.controller.ts
  • backend/apps/community/src/feature-flag/feature-flag.service.ts
  • backend/migrations/clickhouse/initialise_selfhosted.js
  • backend/migrations/clickhouse/selfhosted_2025_12_10_feature_flags.js
  • backend/migrations/clickhouse/selfhosted_2026_05_24_feature_flag_operations.js
  • backend/migrations/mysql/2026_05_24_feature_flag_operations.sql
  • web/app/api/api.server.ts
  • web/app/components/ToolsNav.tsx
  • web/app/pages/Project/tabs/FeatureFlags/FeatureFlagSettingsModal.tsx
  • web/app/pages/Project/tabs/FeatureFlags/FeatureFlagsView.tsx
  • web/app/routes/projects.$id.tsx
  • web/public/locales/en.json

Comment thread backend/apps/cloud/src/feature-flag/feature-flag.service.ts
Comment thread backend/apps/community/src/feature-flag/feature-flag.service.ts
Comment thread backend/migrations/clickhouse/selfhosted_2026_05_24_feature_flag_operations.js Outdated
Comment thread web/app/pages/Project/tabs/FeatureFlags/FeatureFlagSettingsModal.tsx Outdated
Comment thread web/app/routes/projects.$id.tsx Outdated
Comment thread web/app/routes/projects.$id.tsx
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@backend/apps/community/src/feature-flag/feature-flag.controller.ts`:
- Around line 671-673: The controller currently calls
applyDueScheduledChanges(flag.projectId) before
validateScheduledChange(flagDto.scheduledChange), which can persist project-wide
changes even if the incoming payload is invalid; move the validation so
validateScheduledChange(flagDto.scheduledChange) runs before calling
this.featureFlagService.applyDueScheduledChanges(flag.projectId) (i.e., validate
the scheduledChange payload up front and return the 400 on failure), ensuring no
side-effectful writes occur prior to successful validation.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c56b0c8e-0a85-4b43-a3f9-fcbc635f3a07

📥 Commits

Reviewing files that changed from the base of the PR and between ef17058 and f6faeb7.

📒 Files selected for processing (6)
  • backend/apps/cloud/src/feature-flag/feature-flag.controller.ts
  • backend/apps/cloud/src/feature-flag/feature-flag.service.ts
  • backend/apps/community/src/feature-flag/feature-flag.controller.ts
  • backend/migrations/clickhouse/selfhosted_2026_05_24_feature_flag_operations.js
  • web/app/pages/Project/tabs/FeatureFlags/FeatureFlagSettingsModal.tsx
  • web/app/routes/projects.$id.tsx

Comment thread backend/apps/community/src/feature-flag/feature-flag.controller.ts Outdated
@Blaumaus Blaumaus merged commit 36327f9 into main May 25, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant