Developer Documentation – Sparks for Teams
App store and Teams widgets
Sparks provides its own app store in chats and channels (search, categories, built-in apps, website URL). You can also import a Microsoft Teams manifest.json. There is no full Microsoft Teams App Store parity — professional SSO apps need the partner to authorize the Sparks Azure client ID.
| Scenario | Effort / note |
|---|---|
| Your own widgets (self-hosted) | Low — TeamsJS as in Teams; same-origin in Sparks |
| Tabs already pinned in Teams | Shown via Graph in MS chat/channels (and linked Matrix rooms) when signed in with Microsoft and optional TeamsTab.Read.All |
| Simple third-party tabs | Import the manifest; works well without strict token-audience checks |
| Professional SSO store apps | App must whitelist Sparks as an authorized client; otherwise limited token support |
User help: Add Tab dialog, Custom Tabs.
Adapting MS Teams Widgets for Sparks for Teams
Sparks supports tabs and widgets that follow the Microsoft Teams App Manifest schema. Many Teams tab apps can be embedded with little or no change.
Prerequisites
- Manifest: A valid Teams App Manifest (JSON) — import in the app store (“Import Teams manifest”)
- Tabs: Static tabs (
staticTabs) or configurable tabs (configurableTabs) - Domains: All URLs used must be listed in
validDomains(HTTPS)
Manifest Structure (Excerpt)
{
"id": "your-app-id",
"version": "1.0.0",
"manifestVersion": "1.16",
"name": { "short": "App Name", "full": "Full App Name" },
"description": { "short": "...", "full": "..." },
"developer": {
"name": "Your Company",
"websiteUrl": "https://example.com",
"privacyUrl": "https://example.com/privacy",
"termsOfUseUrl": "https://example.com/terms"
},
"icons": { "outline": "outline.png", "color": "color.png" },
"staticTabs": [
{
"entityId": "tab1",
"name": "Tab Name",
"contentUrl": "https://your-domain.com/tab",
"websiteUrl": "https://your-domain.com/tab",
"scopes": ["personal", "groupchat", "team"]
}
],
"validDomains": ["your-domain.com"]
}
Package and hosting overview
The figures below summarize how the manifest, tab URLs, and the Sparks shell fit together.
Package contents: manifest.json, icons, and HTTPS tab web content; the manifest ties staticTabs / configurableTabs to validDomains.
Sparks loads the tab in a sandboxed iframe; call microsoftTeams.app.initialize() in that context, as in Teams.
Key Adaptations
| Aspect | Note |
|---|---|
| Teams JavaScript SDK | Sparks injects a compatible polyfill (initialize, getContext, getAuthToken, theme, pages.config, notify). Call microsoftTeams.app.initialize() after load. |
| contentUrl / websiteUrl | Must use HTTPS and be listed in validDomains. |
| Scopes | personal, groupchat, team – Sparks supports these contexts. |
| iframe sandbox | Tabs run in iframes; no native plugins. |
SSO (getAuthToken) | Without webApplicationInfo, Sparks returns a generic MSAL token. With webApplicationInfo, it requests the app-specific scope — your Azure app must authorize the Sparks client ID. |
| Import | In a room: Add tab / Apps → “Import Teams manifest” (JSON file). |
Partner SSO (Azure)
- In the tab app’s app registration: Expose an API → Authorized client applications → add the Sparks client ID.
- Set
webApplicationInfo.idandresourcecorrectly in the manifest. - Import the manifest in Sparks; sign in with Microsoft.
Microsoft Documentation (Original)
- Build tabs for Teams – Tabs overview
- App manifest schema for Microsoft Teams – Manifest schema
- Create a personal tab – Static tabs
- Create a channel or group tab – Configurable tabs
- Teams JavaScript client library – SDK reference
- Create tab pages (content, configuration, removal) – Content page
Meeting video and background effects (Vistameet-Teams)
For work on the Vistameet-Teams client repository:
| Topic | Note |
|---|---|
@livekit/track-processors | Blur and virtual background. In-repo: ^0.7.2; npm latest checked 0.7.2 (before bumps run npm view @livekit/track-processors version). Exact pins: root package.json (also livekit-client, etc.). |
| Stopping the processor | Remove background effects cleanly: LocalVideoTrack.stopProcessor() (LiveKit). Without it, the camera preview may stay frozen after turning blur/virtual background off. |
User-facing docs: Join Meeting.
n8n and automation
Comprehensive developer guide (API keys, REST /api/v1/automation, incoming/outgoing webhooks, custom nodes, operations):
Short technical reference and OpenAPI live in the Vistameet-Teams app repo under docs/N8N.md and docs/openapi/sparks-automation-v1.yaml.