Skip to content
Get Started

① Collect

Provider Overview

The data sources that actually ship with the engine: four theta providers, the Apple Health importer, what switches each one on, and which config keys have no provider behind them.

Two platforms are registered at startup — theta and apple. The theta platform loads its providers from disk, one directory per source; the apple platform is a built-in importer that accepts no plugins. The list below is what the repository contains — no other source is wired in.

SourceSlugPlatformLink typeScheduled pull
Garmin Connecttheta_garminthetaOAUTH1No — push only
Whooptheta_whoopthetaOAUTH2Every 24 hours
Ouratheta_ourathetaOAUTH2Every 5 minutes
PostgreSQLtheta_pgsqlthetaCUSTOMIZEDNo — validation only
Apple Healthapple_healthappleNONENo — the client uploads

For the contract these implement — BasePullProvider, ProviderInfo, LinkType, the pull scheduler — see Pulse Provider System. To connect one, see Using Providers.

Each lives in its own mirobody_<slug>/ directory under mirobody/pulse/providers/, holds exactly one provider_*.py, and is instantiated by its own create_provider(config) factory. A factory that returns None leaves the provider out of the registry entirely — which is how an unconfigured source disables itself.

DirectoryClassSwitched on byPull task
mirobody_garmin_connect/GarminProviderGARMIN_CLIENT_ID + GARMIN_CLIENT_SECRETNone — webhook only
mirobody_whoop/WhoopProviderWHOOP_CLIENT_ID + WHOOP_CLIENT_SECRETinherits the base default — True
mirobody_oura/OuraProviderOURA_CLIENT_ID + OURA_CLIENT_SECRETScheduled
mirobody_pgsql/PgsqlProviderENABLE_PGSQL_DEVICE — any non-empty valueNone — validation only

The metadata each one advertises is a plain ProviderInfo, built without touching the network.

The PostgreSQL provider is the odd one out in two ways. It is the only CUSTOMIZED source — it declares five connect_info_fields (username, password, host, port, database) rather than sending the user through a browser — and it is the only one gated by an explicit feature flag instead of by whether credentials exist.

It also stops at validation: it opens a connection, runs SELECT version(), closes it, and stores the credentials. Fetching and formatting are deliberate no-ops, so linking it produces no records — it exists so a deployment can record a database connection, not to import from one.

Apple Health is not a plugin: the apple platform registers its provider itself, so nothing from PROVIDER_DIRS can be added to it.

Both of its providers declare auth_type NONE and report as permanently connected — there is no account to link, because the client pushes data in rather than the server pulling it out. Three routes accept those pushes:

RouteBodyNotes
POST /api/v1/pulse/apple/healthmetaInfo + healthData[]The main import; Content-Encoding: gzip accepted
POST /api/v1/pulse/apple/statisticsmetaInfo + statistics[]Client-computed aggregates (sum / average / minimum / maximum / mostRecent) written through as summary indicators
POST /api/v1/pulse/apple/cdametaInfo + cdaData[]Clinical Document Architecture documents

All three require a JWT, and both /apple/* and /api/v1/pulse/apple/* answer, because an uploader may point at either mount. The type vocabulary this channel accepts is cross-platform rather than specific to Apple’s health store — see Data Flow.

config.yaml and the pull scheduler both name sources this checkout does not contain. They are leftovers from a wider deployment, and setting the keys will not make a source appear:

LeftoverWhere it appearsWhy nothing happens
VITAL_API_KEY, VITAL_ENVIRONMENTconfig.yamlNo vital platform is registered, so POST /api/v1/pulse/vital/generate-sign-in-token answers 503 Vital platform not available
RENPHO_API_BASE_URL, RENPHO_APP_VERSION, RENPHO_PLATFORM, RENPHO_ENCRYPTION_KEYconfig.yamlThere is no mirobody_renpho/ directory and no Renpho provider class anywhere in the tree
FRONTIERX_CLIENT_ID, FRONTIERX_USER_POOL_IDconfig.yaml, commented outNot read by any provider
theta_renpho, theta_vital, theta_cgmthe cadence tables in pull_task.pyIntervals and lock durations for slugs no shipped provider claims

The providers that ship are the four theta providers above plus the apple platform’s own two. Anything else is not in this branch.