---
title: "Providers"
source: "docs/providers.md"
---

> Part of [botgumi docs](https://www.botgumi.com/docs/llms.txt). Every page: [llms.txt](https://www.botgumi.com/llms.txt).

# 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.
