How-to guides
Register offline providers and Redis online stores for Feature Form workflows.
Perform common Feature Form tasks for secrets, providers, apply, catalog inspection, and serving.
Apply a definitions file
ff apply executes one Python entrypoint, collects the resources it defines, and submits that set as desired state for a single workspace.
What --file can point to
- a Python file
- a package
__init__.py - a package directory that contains
__init__.py
ff apply --workspace <workspace-id> --file examples/featureform/docs/resources.py --plan
Loading order
ff apply loads resources in this order:
resources = [...]from the entry module, if present- the resource registry, if no explicit list exists
Preview with --plan
ff apply \
--workspace <workspace-id> \
--file examples/featureform/docs/resources.py \
--plan
Use this before large changes or whenever the file might be incomplete relative to the workspace's full desired state.
Standard apply
ff apply \
--workspace <workspace-id> \
--file examples/featureform/docs/resources.py \
--wait \
--wait-for finished
Apply modes
- default apply: replacement-oriented desired state
--merge: safer for intentionally partial definition sets--update: exposed in the CLI, but treat as provisional--full-rematerialize: also exposed, but treat as provisional
Only one of --merge, --update, or --full-rematerialize can be used at a time.
If neither an explicit resources list nor any auto-registered resources are present after the entrypoint executes, ff apply fails.
Update resources and rematerialize
After the first successful apply, most Feature Form work is an iteration loop: edit the definitions file, preview the delta, apply the change, and inspect the resulting graph or catalog state.
Typical cycle
- Change a resource definition.
- Run a plan.
- Apply the change.
- Verify the resulting graph or catalog state.
ff apply \
--workspace <workspace-id> \
--file examples/featureform/docs/resources.py \
--plan
When to use --merge
Use --merge when the file you are applying is intentionally partial and omitted resources should not be treated as deletions.
Caution with --update and --full-rematerialize
The CLI exposes both flags, but the current user-facing workflow is not as mature or as well documented as normal apply and merge. Use them only when your deployment has already validated that behavior.
Verify the outcome
ff graph workspace overview --workspace <workspace-id>
ff catalog list --workspace <workspace-id>
Inspect materialized locations
The Feature Form catalog records where resources managed by Feature Form physically landed after apply and materialization. It is distinct from systems such as Unity Catalog, Glue, or an Iceberg catalog.
List catalog entries
ff catalog list --workspace <workspace-id>
Inspect one resource
ff catalog get demo_transactions --workspace <workspace-id>
The catalog shows
- logical resource name
- owning provider
- status
- physical table, path, or namespace
- update timestamps
Use the catalog together with graph views: graph explains why a resource exists; catalog shows where it landed.
Query datasets and training sets
Use this command when the target dataset, training set, or feature view already exists and you want to inspect rows directly.
Query a dataset
ff dataframe query demo_transactions \
--workspace demo-workspace \
--server localhost:9090 \
--kind dataset \
--limit 10 \
--insecure
Supported kinds
datasettraining_setfeature_view
Useful flags
--columns--filter--limit--output table|json|csv
The dataframe command talks to the Flight endpoint on the gRPC side, so transport and endpoint mismatches are common troubleshooting points.
Serve feature view
Use this page after a feature view already exists and the online store is ready. In the quickstart flow, that means demo_customer_feature_view has already been applied successfully.
Verify the feature view exists
ff graph feature-view get demo_customer_feature_view --workspace demo-workspace
Minimal Python workflow
import featureform as ff
client = ff.Client(host="127.0.0.1:9090", insecure=True, workspace="demo-workspace")
features = client.serve("demo_customer_feature_view", entity="C1001")
print(features)
Operational checks
- if the feature view is not ready, serving fails
- if the online provider is unavailable or unsupported, serving fails
- serving-metadata permissions and serving-read permissions are separate RBAC checks
Operate a workspace
Use this how-to for routine operational checks after a workspace is already created and in use.
Day-2 checklist
- verify connectivity with
ff ping - inspect workspace metadata and
last_applied_version - inspect providers and secret providers
- inspect graph overview and stats
- inspect catalog locations
- confirm serving and dataframe clients point at the expected transport and state backend
Useful commands
ff ping
ff workspace get <workspace-id>
ff provider list --workspace <workspace-id>
ff secret-provider list --workspace <workspace-id>
ff graph workspace stats --workspace <workspace-id>
ff catalog list --workspace <workspace-id>
With memory-backed state, check transport mismatches first when users report missing workspaces, providers, or applied resources.