Team development secrets

Service Federation Cloud can fill the manual credentials declared by a project during fed start. One teammate sets a value in the dashboard, or an admin sets it with fed secrets set NAME. Other authorized teammates fetch it without passing around an env file.

Use this for development credentials only. The service can decrypt values in order to deliver them to authorized clients. It is not an end-to-end encrypted vault, a production secrets manager, or a compliance product.

What the open-source CLI needs

Local stacks, worktree isolation, generated secrets, and scripts do not require a Service Federation Cloud account. Cloud is an optional source for type: secret, source: manual parameters.

Set up a team

  1. Sign in at app.service-federation.com with GitHub.
  2. Create an organization and a project. A Cloud project normally maps to one repository.
  3. Add teammates by email. New users receive an invite link.
  4. Add the development credentials the project needs.

Link a repository

fed login
fed link acme/web
git add .fed/cloud.yaml
git commit -m "Link fed development secrets"

For a new link, fed link writes .fed/cloud.yaml with secret_cache: memory, the default cache policy. Re-linking preserves the project's configured policy. Commit the file so every checkout points at the same Cloud project and uses the same policy. If .gitignore ignores the whole .fed/ directory, add an exception for .fed/cloud.yaml.

Sign-in works over SSH: open the printed URL on any machine, approve, and the terminal finishes on its own. --no-browser skips the browser attempt and just prints the URL. CI can supply FED_TOKEN instead of storing credentials on disk.

Declare a manual secret

parameters:
  STRIPE_SECRET_KEY:
    type: secret
    source: manual
    description: "Development key from the Stripe dashboard"

Add STRIPE_SECRET_KEY in the Cloud dashboard. An organization admin can also run fed secrets set STRIPE_SECRET_KEY. fed reads the value from stdin, or asks for it with a hidden prompt. A linked and signed-in teammate can then run fed start without creating a local env file first.

Private container images

To pull private team images, store one read-only registry token in the vault. Every teammate's fed start then pulls those images without a personal docker login.

1. Create a pull-only token

2. Add the token to fed.yaml

parameters:
  REGISTRY_TOKEN:
    type: secret
    source: manual
    optional: true
    description: Read-only token for team images on ghcr.io

registry_auth:
  ghcr.io:
    username: acme-bot
    password: '{{REGISTRY_TOKEN}}'

Each key under registry_auth is a registry host. Set username to the account that owns the token. The password must reference a type: secret parameter. fed rejects a literal password, because fed.yaml is committed to git.

3. Set the secret in the dashboard

Open the project in the dashboard. Under Development secrets, set REGISTRY_TOKEN to the token. The name must match the parameter in fed.yaml.

What fed does with the token

Keep the token safe

Everyone with access to the project can read the token. So:

fed never runs docker login with the token and never writes it to ~/.docker.

Resolution and caching

A value from a declared env_file always wins. For each required manual secret still missing locally, fed applies the linked project's cache policy:

If a required value is still missing after applying the selected policy, startup stops and lists it.

The secret_cache setting controls fed's local handling of plaintext values; it does not change how Service Federation Cloud stores them. The vault returns requested plaintext values to an authorized CLI with Cache-Control: no-store and keeps no in-process plaintext cache.

In file mode, fed writes the cache atomically with mode 0600 and manages .fed/.gitignore. If the cache path becomes eligible for Git, fed disables caching and removes an existing commit-eligible cache.

To enable the file cache for every checkout, set the linked project's shared policy in .fed/cloud.yaml. A cloud.yaml without the key, including one written by an older fed, uses memory mode.

org: acme
project: web
secret_cache: file

The --secret-cache file|memory flag overrides the committed policy for one invocation. The policy applies only to values fetched from the team vault. It does not change locally generated secrets in .fed/secrets.generated.env or values supplied through an explicit env_file.

Removing access does not erase a laptop

Removing an organization member blocks their next server fetch immediately. It cannot delete values already fetched to that person's machine. Under the file policy those values can still support offline startup.

Rotate every credential the person could read. This is the only way to revoke a value that may already exist outside the service.

Security model

Accepted limits

Pricing and failure behavior

The first three people in an organization are free. Each additional seat costs €8 per month. Billing only gates adding members. Billing state does not disable existing memberships or secret reads, so it does not by itself block fed start.

A machine with a valid local cache under the file policy can keep using those cached values while Cloud is unavailable. It cannot fetch rotations, new values, or membership changes until the service returns. Under the default memory policy, a start that needs a vault value waits for the service.

Compare with local generated secrets →