Providers are config-driven (~/.config/authama/providers.json) and pluggable. A host
names a provider; the provider's kind selects the adapter and its
host points it at a specific instance - so the same adapter serves
github.com and GitHub Enterprise, gitlab.com and a self-hosted GitLab, etc.
For a public key the universal path is "open the keys page, paste, record" - which works for every VCS. CLI/API automation is a convenience on top:
- Named adapter with a CLI + token → automated add/list/remove
(GitHub via
gh, GitLab viaglab; cloud and enterprise/self-hosted are selected by the instancehost, passed to the CLI via its environment -GH_HOST/GH_ENTERPRISE_TOKENfor gh,GITLAB_HOST/GITLAB_TOKENfor glab). - Generic SSH →
ssh-copy-idto any reachable server. - Web-panel / manual → the tool opens the correct per-instance keys URL, you paste, it records the deployment. This is the universal fallback.
The full catalog below ships with the package and is used as-is - you don't
need a providers.json for it to work. To customize, materialize an editable copy
into your home and edit it:
authama ssh providers --export # writes <home>/providers.json (the shipped catalog)
authama ssh providers # shows the active catalog + which credentials are setResolution: <home>/providers.json if you created one, else the shipped default
(kept byte-identical to the repo's src/config/providers.json). authama doctor prints
which source is active. Delete your file to track the shipped default again.
| Provider name | kind | category | automated? | notes |
|---|---|---|---|---|
github |
github | vcs | gh |
github.com |
github-enterprise |
github | vcs | gh (GH_HOST) |
set host + GHE_TOKEN |
gitlab |
gitlab | vcs | glab |
gitlab.com |
gitlab-self-hosted |
gitlab | vcs | glab (GITLAB_HOST) |
set host + GLAB_TOKEN |
bitbucket |
bitbucket | vcs | web-panel | bitbucket.org |
bitbucket-server |
bitbucket-server | vcs | web-panel | Data Center / Server |
gitea / gitea-self-hosted |
gitea | vcs | web-panel | |
codeberg |
codeberg | vcs | web-panel | |
forgejo |
forgejo | vcs | web-panel | self-hosted |
gogs |
gogs | vcs | web-panel | self-hosted |
sourcehut |
sourcehut | vcs | web-panel | meta.sr.ht |
azure-devops |
azure-devops | vcs | web-panel | |
aws-codecommit |
aws-codecommit | vcs | web-panel | IAM SSH key |
digitalocean |
digitalocean | vps | REST API | DIGITALOCEAN_TOKEN (account keys) |
vultr |
vultr | vps | REST API | VULTR_API_KEY |
hetzner |
hetzner | vps | REST API | HCLOUD_TOKEN |
linode |
linode | vps | REST API | LINODE_TOKEN |
scaleway |
scaleway | vps | REST API | SCW_SECRET_KEY + SCW_PROJECT_ID |
| your own | rest | vps | REST API | config-driven - define any REST provider in providers.json |
ploi / forge / cpanel |
web-panel | panel | web-panel | hosting panels |
generic-ssh |
ssh | server | ssh-copy-id |
any reachable server |
manual |
web-panel | generic | manual | anything else |
The vps adapters manage account keys (the ones in your provider dashboard,
used when creating servers) via REST; for keys on a running server use
generic-ssh (authorized_keys). See vps.md for the full
DigitalOcean / Vultr / Hetzner / Linode / GCP / AWS workflow.
list --type vcs queries by category, so it spans every provider above.
Copy a template entry, set host + (optionally) token_env, and reference its
name from a host:
// ~/.config/authama/providers.json
"gitlab-acme": {"category": "vcs", "kind": "gitlab", "host": "gitlab.acme.io",
"cli": "glab", "token_env": "GLAB_ACME_TOKEN"}// ~/.config/authama/manifest.json - a host using it
{"alias": "acme", "hostname": "gitlab.acme.io", "user": "git",
"provider": "gitlab-acme", "token_env": "GLAB_ACME_TOKEN",
"key_name": "work_acme-ed25519"}Then authama ssh deploy work_acme-ed25519. With glab + the token it adds the key
to your self-hosted GitLab; without them it opens
https://gitlab.acme.io/-/user_settings/ssh_keys for you to paste.
A brand-new service the tool has never heard of? Add an entry with
"kind": "web-panel" and a "keys_url", or just use provider: "manual".
Nothing is hardcoded - any VCS or service works.
Any cloud with a simple key API (one auth header, a list field, create/delete by id) can be added purely in config - no adapter class:
// ~/.config/authama/providers.json
"acme-cloud": {"category": "vps", "kind": "rest", "token_env": "ACME_TOKEN",
"rest": {"base_url": "https://api.acme.com/v1", "list_path": "/ssh_keys",
"list_field": "ssh_keys", "id_field": "id", "name_field": "name",
"public_key_field": "public_key", "create_path": "/ssh_keys",
"delete_path": "/ssh_keys/{id}",
"auth_header_name": "Authorization", "auth_header_prefix": "Bearer "}}deploy/verify/rotate/delete then work against that API like any built-in
VPS provider. For an API with a non-Bearer header (e.g. Scaleway's
X-Auth-Token), set auth_header_name/auth_header_prefix accordingly. Add a
rename_path (+ optional rename_method/rename_field) to support relabeling.
If the API paginates, set next_field to the dotted path of the next-page URL in
the response (e.g. "next_field": "links.next"); authama then follows it. Without
next_field the list is assumed to be a single page - set a large page size in
list_path if your API needs one, or the listing may be truncated.