source

Sources are reusable import connections stored in your config file. Once saved, reference one with realm import --source-ref <name> instead of repeating its URL and credentials. See Import for how they’re consumed.

ferris-ctl source <subcommand>

These subcommands only read and write the config file. They make no network call. They honor -o.

source list

List configured sources.

ferris-ctl source list

Table columns: NAME, KIND, URL, SECRET (yes when a secret or token is stored). The JSON and YAML forms carry has_secret instead of the secret itself; the secrets are never printed.

source add

Add a source. Adding a name that already exists overwrites it without asking.

ferris-ctl source add <name> --kind <kind> --url <url> [auth flags]
ArgumentRequiredDescription
<name>yesSource name
--kindyeskeycloak, zitadel, or supabase. A config file is not a storable source: it is a path, passed with --file at import time
--urlyesBase URL of the source instance
--realmnoKeycloak: the realm to read. Supabase, and Zitadel with a pinned organization: the name of the realm to create in FerrisKey, used when the import gives no --target-realm or --source-realm
--client-idnoClient id for source auth (Keycloak)
--client-secretnoClient secret for source auth (Keycloak)
--tokennoBearer token (a Zitadel personal access token, a Supabase service_role key, or a ready Keycloak token)
--org-idnoOrganization id (Zitadel); omit to import all orgs
ferris-ctl source add keycloak-prod \
  --kind keycloak \
  --url https://keycloak.example.com \
  --realm acme \
  --client-id ferriskey-import \
  --client-secret "$KC_SECRET"
ferris-ctl realm import --source-ref keycloak-prod --target-realm acme

A stored source holds the connection only. The Supabase options (--source-passwords, --source-preserve-ids, and the --source-include-* flags) are not stored; pass them on each import. The supabase kind exists only in builds newer than 0.3.0, see From Supabase.

Secrets are stored in plain text

Source secrets and tokens are written to config.toml without redaction, and the file is created with your default umask, usually readable by other users on the machine. Restrict the directory with chmod 700 ~/.config/ferriskey (a chmod on the file alone is lost when the CLI next saves it), and prefer short-lived tokens where possible.

source remove

Remove a stored source.

ferris-ctl source remove <name>
ArgumentRequiredDescription
<name>yesSource name