Browse documentation

Happy Desktop docsFeatures

Models & Subscriptions

No Happy plan for model access, no key to paste. Sign in to Claude Code, Codex, or the Grok CLI on the machine and Happy uses those credentials.

ProviderModelsCredentials from
ClaudeAnthropic's Claude familyClaude Code
CodexOpenAI's GPT familyCodex
GrokxAI's Grok familyThe Grok CLI
BedrockClaude and GPT models through Amazon BedrockA Bedrock API key, or the standard AWS credential chain

Availability is machine-wide, because the daemon owns the catalog. Requests go to the vendor with your credentials; Happy never proxies them.

Switching mid-session

Change a session's model or reasoning effort at any time, from the app or the phone. The transcript stays. Each provider's opaque data (reasoning, response items) is stored verbatim and handed back unchanged, so a switch does not corrupt history. The new model gets its own vendor's prompts and tools; permission mode, sandbox, and workspace do not change.

Several models in one task

Subagents each pick their own model and effort; nothing is inherited. One session can plan on one provider, implement on another, review on a third. See Agents That Never Die.

Compaction

Happy decides when; the provider decides how, using its native compaction or its own compaction prompt. The result is a visible message in the transcript naming what it replaced.

Multiple accounts

[providers.work_codex]
type = "codex"
enabled = true
auth_file = "/Users/me/.codex-work/auth.json"

Named instances appear in the picker as separate providers. To rotate between same-type accounts automatically, pool them behind a smart provider and hide the members:

[providers.codex]
hidden = true

[providers.work_codex]
type = "codex"
enabled = true
hidden = true
auth_file = "/Users/me/.codex-work/auth.json"

[providers.codex_pool]
type = "smart"
strategy = "round_robin"
providers = ["codex", "work_codex"]
enabled = true

A new agent or subagent starts on a random member and stays there; an auth or quota-exhaustion error moves it to the next one. hidden = true only removes an account from the picker, and a pool still routes to it. See Configuration.

Usage

Provider quotas are polled about every fifteen minutes and shown in the app. They are observations, not billing records.