Start here

Providers

Concern TS interface Swift interface Kotlin interface Default adapter
Analytics @botgumi/analytics BotgumiAnalytics botgumi-analytics Amplitude
Feature flags @botgumi/flags BotgumiAnalytics botgumi-analytics Amplitude
Crash and errors @botgumi/crash BotgumiCrash botgumi-crash Sentry
Purchases @botgumi/purchases BotgumiPurchases botgumi-purchases RevenueCat
Email @botgumi/mailer — — Cloudflare
Domain check @botgumi/domain-lookup — — Cloudflare (adapter not started)
Agent runtime @botgumi/agent-runtime — — claude (@botgumi/claude-runtime); also codex (@botgumi/codex-runtime)
Task intake @botgumi/task-source — — GitHub Issues (@botgumi/github) + chat/CLI (@botgumi/runner)
Task board @botgumi/task-board — — GitHub Projects (@botgumi/github)
Event delivery @botgumi/event-relay — — Cloudflare relay (@botgumi/relay) + polling (@botgumi/github)
Code host and merge @botgumi/code-host — — GitHub (@botgumi/github)

The stores are part of the fixed core and have read adapters without an interface: @botgumi/asc (App Store Connect) and @botgumi/google-play (Google Play). So are an app's docs for agents: @botgumi/docs builds them from the app's Markdown and serves them locally and on a Cloudflare Worker, with no vendor to swap (ADR-0005).

Each interface package ships three things: the interface, a no-op adapter, and a contract suite. The dashboard read side (metrics, issues, revenue) lives in the same packages. The readers for the fixed-core sources (store, waitlist, server, website, spend) live in @botgumi/dashboard-ui, each with a no-op and a contract suite (@botgumi/dashboard-ui/contract); @botgumi/asc and @botgumi/google-play implement its StoreReader. See ADR-0003.

Adding an adapter

  1. Create packages/ts/adapters/<vendor> and, for a client side, Botgumi<Concern><Vendor> in Package.swift and botgumi-<concern>-<vendor> in packages/kotlin/settings.gradle.kts.
  2. Implement the interface. Only this package may import the vendor SDK.
  3. Run the contract suite against it: describe<Concern>Contract("<vendor>", make) in TS, <Concern>Contract.run { ... } in Swift, <Concern>Contract.run { ... } in Kotlin. It must pass unchanged.
  4. Add the vendor to ProviderChoices and adapterInstalls in @botgumi/cli.
  5. Add a changeset.