Providers plug into Skyline’s type system and runtime. Each provider exports a callable with a .config() method. Register providers in Skyline({ providers: [...] }), then use message.platform to branch when needed.

Built-in providers

iMessage

Cloud or dedicated lines — tapbacks, typing, threaded replies, DMs, and groups.

WhatsApp Business

Official Cloud API for 1:1 customer conversations.

Terminal

Local chat for development, testing, and CLI-style agents.

Combining providers

Drop any combination into providers:
import { Skyline } from "@interactions-hq/skyline";
import { imessage, terminal, whatsappBusiness } from "@interactions-hq/skyline/providers";

const app = await Skyline({
  projectId: process.env.SKYLINE_PROJECT_ID!,
  projectSecret: process.env.SKYLINE_PROJECT_SECRET!,
  providers: [
    imessage.config(),
    whatsappBusiness.config(),
    terminal.config(),
  ],
});
import { Skyline } from "@interactions-hq/skyline";
import { imessage } from "@interactions-hq/skyline/providers/imessage";
import { terminal } from "@interactions-hq/skyline/providers/terminal";
import { whatsappBusiness } from "@interactions-hq/skyline/providers/whatsapp-business";

const app = await Skyline({
  projectId: process.env.SKYLINE_PROJECT_ID!,
  projectSecret: process.env.SKYLINE_PROJECT_SECRET!,
  providers: [
    imessage.config(),
    whatsappBusiness.config(),
    terminal.config(),
  ],
});
app.messages merges inbound from every provider. The message.platform field identifies the source.

Writing your own

If none of the built-ins fit, implement a provider with definePlatform. See Building a custom platform.