What karmax integrations tells you
KARMAX re-checks every 30 minutes on its own. The point is that a dead
credential becomes visible before something depends on it, rather than surfacing
as a loop failing at 4am.
Where credentials live
Three places, in this order — the first one that has a value wins, per value:1
KARMAX's own store
What
karmax login writes. It wins because logging in is an act you just
performed, and it should not be silently overridden by a setting somebody
wrote months ago.2
karmax.yaml
A
token: or a settings: entry, with ${ENV} interpolated. This is the
right place for a container install where you manage config as a file.3
The environment
KARMAX_<INTEGRATION>_<FIELD> — so Slack’s bot token is
KARMAX_SLACK_BOT_TOKEN.karmax.yaml survives a
login that only obtains a token.
The four ways of connecting
An API key — Slack, Telegram, Discord, Notion, GitHub
An API key — Slack, Telegram, Discord, Notion, GitHub
KARMAX prompts for each field the integration declares, without echoing
anything secret, then calls the provider before saving. A key that does
not work fails while you still have the page open, rather than hours later
inside a loop.
A browser sign-in — OAuth
A browser sign-in — OAuth
KARMAX opens a listener on
127.0.0.1, opens your browser, and exchanges
the code when the provider redirects back. Loopback rather than a hosted
redirect, because KARMAX runs behind your router and there is no public URL
to send anyone to. Refresh tokens are stored and used automatically.A session another program holds — WhatsApp, Google Workspace
A session another program holds — WhatsApp, Google Workspace
wacli holds a WhatsApp pairing and gws holds a Google session, each in
its own store. KARMAX cannot log those in and does not keep a second copy of
a secret it does not own — it checks, and tells you the exact command:Nothing at all
Nothing at all
Some integrations need no credentials.
karmax login says so and exits
rather than inventing a question.Several accounts on one provider
A work GitHub and a personal one, both connected at once:github.issues); each named
account gets its own (github.issues@work), so the agent acts as the identity
you meant rather than whichever token loaded first.