- The web app serves the dashboard, REST API, Model Context Protocol (MCP), and live notifications.
- The Temporal worker runs scheduled rank checks and maintenance jobs.
Runtime components
The MCP endpoint uses the same router as REST. Manual and scheduled checks also
use the same rank-check runner. These shared paths keep behavior consistent.
Data model
AProject owns its keywords, provider connections, alert rules,
notifications, and audit entries. Each keyword is unique by text, location, and
device.
Scheduling is stored as intent, not as jobs: ProjectDefaults holds the
project-wide schedule and market, and an optional per-keyword KeywordSchedule
overrides it. Each executed check is a RankCheck row recording status,
position, ranking URL, provider, and cost. Alerts connect AlertRule to
TriggeredAlert and DeliveryAttempt rows.
Rank-check lifecycle
lib/rank-check/)
as scheduled checks. When Temporal is unreachable, interactive manual checks
fall back to inline execution in the app process; the REST API can also start
a check asynchronously and return 202.
Extensibility: providers
Providers are the main extension point, underlib/providers/.
Kinds. Every provider has a kind. serp providers answer “where does this
keyword rank” and are tried in a user-configured fallback chain; analytics
providers add owned-data context such as traffic and clicks, and never set
positions. A new category of data source - social media, for example - would be
a new kind following the same pattern.
Registry. PROVIDER_CATALOG in lib/providers/registry.ts is the single
source of truth for which providers exist, their kind, and the credentials
they require. The user-facing roster and setup details live in
Integrations.
Adapters. Each provider is one adapter module implementing a small
interface: identify itself, test a connection, fetch a rank. Adding a search
engine such as Bing means writing one new serp adapter and registering it in
the catalog - the scheduling, fallback, cost, and alerting machinery is
provider-agnostic and does not change.
Connected credentials are stored encrypted per project. Optional environment
fallbacks for local development are documented in
Integrations.