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 |
@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
- Create
packages/ts/adapters/<vendor>and, for a client side,Botgumi<Concern><Vendor>inPackage.swiftandbotgumi-<concern>-<vendor>inpackages/kotlin/settings.gradle.kts. - Implement the interface. Only this package may import the vendor SDK.
- 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. - Add the vendor to
ProviderChoicesandadapterInstallsin@botgumi/cli. - Add a changeset.