Modularity
Featly is a broad platform, but not every deployment needs every part. Feature areas are opt-out toggles (ADR-0024): disable the ones you don’t use and their HTTP endpoints disappear and they vanish from the dashboard nav. Defaults stay everything on, so this is never a breaking change — you opt out.
What you can toggle
Section titled “What you can toggle”Under Featly:Server:Features (all default true):
| Toggle | Turns off |
|---|---|
Flags |
feature flags |
Configs |
dynamic configuration |
Segments |
reusable audiences |
Experiments |
A/B testing + exposure events |
Approvals |
approval workflows / pending changes |
Webhooks |
outbound webhook delivery |
Audit |
the audit log |
Rbac |
role-management UI/API (permission checks always run) |
A small set of endpoints is always on — authentication, bootstrap, meta, environments, projects, API keys, settings, export, and the SDK API — because the rest of the system depends on them.
How to configure it
Section titled “How to configure it”Set the toggles in appsettings.json:
{ "Featly": { "Server": { "Features": { "Experiments": false, "Webhooks": false, "Segments": false } } }}Or in code when you register the server:
builder.Services.AddFeatlyServer(options =>{ options.Features.Experiments = false; options.Features.Webhooks = false;});A flags-only deployment
Section titled “A flags-only deployment”{ "Featly": { "Server": { "Features": { "Configs": false, "Segments": false, "Experiments": false, "Approvals": false, "Webhooks": false } } }}This leaves the always-on core plus flags. The dashboard shows only the Flags
area, and the disabled endpoints return 404 — there is no dead surface.
How it works
Section titled “How it works”The dashboard discovers what’s enabled at runtime from an anonymous
GET /api/meta endpoint that returns the active feature flags. The nav and the
command palette filter themselves to the enabled areas; the server gates the
corresponding endpoint groups at mount time. Toggling an area is a restart, not a
migration — the data model is unchanged, so you can turn an area back on later
without losing anything.