Skip to content
Get started

Core concepts

f69’s domain has six building blocks plus two billing axes. Understanding them is enough to model almost any rollout.

A workspace is the top-level container for billing, human members, and projects. Workspace members get a WorkspaceRole (viewer, member, admin, owner) that controls who can manage members, create projects, or delete the workspace.

Workspace owner and admin automatically have owner privileges on every project in the workspace. Other users need explicit project membership to see project resources.

A project lives inside a workspace and owns the things you work with day-to-day:

  • Environments
  • Features (flags) and segments
  • Entities
  • Service accounts

Every workspace has a default project and a default project membership ladder (viewer, member, admin, owner). Most teams will use a single project; multiple projects are useful when you want to isolate billing axes or membership across products.

An environment is a per-project stage - typically dev, staging, prod, but you can name them however you like (lowercase, hyphenated, unique within the project). A flag has a different rule set per environment, and a service-account token is bound to exactly one environment for the life of the token.

A flag has:

  • A key (unique within the project, e.g. new-checkout).
  • A default value (true / false) used when no rule matches.
  • An ordered list of rules per environment. The first rule whose predicates all hold wins.

A rule’s outcome is either a fixed boolean (Outcome::Value) or a deterministic rollout that hashes the entity into a basis-point bucket and picks a variant.

A segment is a reusable named group of entities that you can reference from rules via in_segment. Segment membership is computed by checking exclusions first, then explicit inclusions, then any of its rule groups (ORed groups of ANDed predicates). Segments may reference other segments, but the reference graph must be acyclic.

An entity is a thing you evaluate flags for - usually a user or workspace. Entities are upserted via POST /v1/identify (edge) and are keyed (environment, type, external_id). Identifying an entity persists its attributes; the evaluation API uses those stored attributes server-side, so request bodies don’t have to ship the full context every time.

flowchart LR
Workspace --> Project
Project --> Environment
Project --> Flag
Project --> Segment
Project --> Entity
Project --> ServiceAccount["Service account"]
Environment -->|binds| ServiceAccount

The manifest is the snapshot of flags, rules, and segments for a given project + environment, plus a version string. The dashboard publishes manifests; the edge evaluator reads them. Because the manifest is versioned and the evaluator is pure, every runtime that holds the same manifest produces the same answer.

A service account is the credential your servers use to talk to edge. Each account has:

  • A role: reader (evaluate only) or writer (also identify).
  • An environment binding: requests resolve flags against this environment automatically.
  • A bearer token of the shape xxxxxxxx@f69:<uuid>.<secret>. The secret is shown once at creation and stored as an Argon2 hash; if you lose it, mint a new one.

f69 meters usage on three axes:

AxisWhat it counts
MTEs (monthly tracked entities)Distinct entities evaluated in a billing period
EvaluationsEach flag result returned counts as one evaluation
Service accountsThe number of active workspace API keys

Plans gate environments, retention, seats, SSO, and advanced rule types on top of those numbers - see the pricing page for the public limits.