|
| 1 | +--- |
| 2 | +name: pricing-feature-audit |
| 3 | +description: Audit src/components/pricing/FeatureList.js for EE/Cloud/Team features that are mentioned in docs or live in the windmill repo but missing from the pricing comparison table. Use when asked to "flag missing pricing features", "audit FeatureList.js", "check if EE features are listed", or to add features (with verified tier flags) to the pricing page. |
| 4 | +--- |
| 5 | + |
| 6 | +# Pricing FeatureList audit |
| 7 | + |
| 8 | +## Context |
| 9 | + |
| 10 | +`src/components/pricing/FeatureList.js` is the source of the feature comparison table on https://www.windmill.dev/pricing. Its rows have five tier columns: |
| 11 | + |
| 12 | +- `tier-free-selfhost` — Community Edition (self-host, no license) |
| 13 | +- `tier-enterprise-selfhost` — Enterprise self-host |
| 14 | +- `tier-enterprise-cloud` — Enterprise cloud |
| 15 | +- `tier-free` — free tier on cloud |
| 16 | +- `tier-team` — Team plan on cloud |
| 17 | + |
| 18 | +Each row also has an optional `link` (must be a real URL on the docs site) and `tooltip`. |
| 19 | + |
| 20 | +This file drifts. Engineering ships EE-gated features that get docs and changelogs but never show up here, and previously-EE features sometimes become available to all editions without the row being updated. Both states mislead customers. |
| 21 | + |
| 22 | +## Goal |
| 23 | + |
| 24 | +Find features that: |
| 25 | + |
| 26 | +1. **Should be in the table but aren't** — EE-gated (or Cloud-only / Team-only) features that have docs or shipped commits but no row in `FeatureList.js`. |
| 27 | +2. **Are in the table with the wrong tier flags** — rows that claim EE-only when the runtime is actually open to CE, or vice versa. |
| 28 | + |
| 29 | +Fix the rows, and update the corresponding doc pages so the EE/CE prose matches reality. |
| 30 | + |
| 31 | +## Sources of truth (in priority order) |
| 32 | + |
| 33 | +When deciding whether a feature is EE-gated, **the code is the source of truth, not the docs**. Doc prose lags shipping changes. Verify in this order: |
| 34 | + |
| 35 | +1. **Engineering confirmation** — if you have a direct answer from a Windmill engineer, that wins. |
| 36 | +2. **Backend code in `../windmill`**: |
| 37 | + - Compile-time gate: `#[cfg(feature = "enterprise")]`, `#[cfg(all(feature = "private", feature = "enterprise"))]` |
| 38 | + - Runtime gate: `LICENSE_KEY` checks, `require_super_admin_or_admin`, "enterprise edition" error strings |
| 39 | + - File hint: handlers under `backend/windmill-api/src/` named `*_ee.rs` or `*_ext.rs` are usually EE |
| 40 | +3. **Frontend gate** in `../windmill/frontend`: |
| 41 | + - `$enterpriseLicense` store, `disabled={!$enterpriseLicense}` |
| 42 | + - `ee_only: true` flag in `frontend/src/lib/components/instanceSettings.ts` |
| 43 | +4. **Cloud-vs-self-host availability** — check `frontend/src/lib/stores.ts` or any `is_cloud_hosted()` checks. Some features (Kubernetes operator, Windows workers, autoscaling on private clusters) are self-host-only regardless of EE. |
| 44 | +5. **Docs prose** — only as a starting hint, never as the final answer. A line like "this feature requires Enterprise Edition" can be stale. |
| 45 | + |
| 46 | +If a feature has no runtime gate but limits behaviour by other means (e.g., workspace forks count toward the CE 3-workspace cap), reflect that in the tier value as a string, not a boolean — see "Tier value patterns" below. |
| 47 | + |
| 48 | +## Workflow |
| 49 | + |
| 50 | +1. **Ask for scope** — date range, specific feature name, or "audit the whole file". |
| 51 | +2. **Inventory candidates**: |
| 52 | + - Grep `docs/` for `enterprise edition`, `/pricing`, `EE only`, `enterprise license`, `$enterpriseLicense` references. |
| 53 | + - Grep recent changelogs in `changelog/` for `ee: true` frontmatter. |
| 54 | + - For a date-bounded audit, also run `git log --oneline --no-merges` in `../windmill` for `feat:` commits and inspect ones with EE-gated changes. |
| 55 | +3. **For each candidate**, verify against the sources above and produce a row plan: name, suggested section (Platform / Security & Support / Observability / Developers & Deployments / Performance / Flows / Apps), tier flags, doc URL, tooltip. |
| 56 | +4. **Verify every doc URL resolves**: |
| 57 | + - Folders use numeric prefixes (`16_roles_and_permissions`) but URLs strip them (`/docs/core_concepts/roles_and_permissions`). |
| 58 | + - Don't fabricate paths — open the file and confirm the exact heading anchor (lower-case, hyphenated, no punctuation) before writing the link. |
| 59 | +5. **Present the plan** to the user before editing. Group additions by section. Flag any rows already in the file whose tier flags conflict with what the code shows. |
| 60 | +6. **On approval**, make the edits to `src/components/pricing/FeatureList.js` (one section at a time, ordered to keep diffs reviewable) and fix any doc pages that mis-state the EE gate. |
| 61 | +7. **Run `npm run build`** and confirm no new broken-link warnings were introduced. Pre-existing warnings (the script-editor / changelog ones) are not yours to fix. |
| 62 | + |
| 63 | +## Tier value patterns |
| 64 | + |
| 65 | +- `true` / `false` for binary availability. |
| 66 | +- A string when the tier has a meaningful limit: `'Up to 2 users'`, `'Counts toward 3-workspace limit'`, `'Maximum 4 groups'`, `'Unlimited'`. Strings render in place of the check/cross icon, so keep them short. |
| 67 | +- Use `tooltip` for self-host vs cloud distinctions that don't fit in the row name (e.g., `'Self-hosted only'`, `'Cloud only'`). |
| 68 | + |
| 69 | +## Common gotchas |
| 70 | + |
| 71 | +- **"EE in docs" ≠ "EE in code"**: a feature page saying "this requires EE" can be wrong. Always grep the backend. |
| 72 | +- **Self-host-only ≠ EE-only**: features like the Kubernetes operator or Windows workers run on CE self-host too — they're absent from cloud, not gated by license. |
| 73 | +- **Cloud Team availability**: features that work on EE cloud usually work on Team unless the backend explicitly blocks Team workspace IDs. Don't copy `tier-enterprise-cloud: true` to `tier-team: false` without checking. |
| 74 | +- **Existing duplicates**: this file has previously had duplicate rows (e.g., a removed Postgres triggers duplicate). Before adding a row, grep the file for the feature name to avoid re-adding it under a different label. |
| 75 | +- **Don't add billing knobs as features**: Non-prod / dev instance mode is a billing affordance, not a feature — skip it. |
| 76 | + |
| 77 | +## When fixing a wrong tier flag |
| 78 | + |
| 79 | +If a row already exists but the tier flags are wrong, also audit any related doc pages — the same misconception that produced the wrong row often shows up as "Enterprise Edition only" prose in the docs. Fix both at once and grep for cross-references in `docs/advanced/23_canonical_deployment_setups/index.mdx` and other "edition requirements" callouts that may inherit the same claim. |
0 commit comments