Developer Documentation – Liman
App store and Teams widgets
Liman 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 Liman Azure client ID.
| Scenario | Effort / note |
|---|---|
| Your own widgets (self-hosted) | Low — TeamsJS as in Teams; same-origin in Liman |
| 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 Liman as an authorized client; otherwise limited token support |
User help: Add Tab dialog, Custom Tabs.
Adapting MS Teams Widgets for Liman
Liman 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 Liman shell fit together.
Package contents: manifest.json, icons, and HTTPS tab web content; the manifest ties staticTabs / configurableTabs to validDomains.
Liman loads the tab in a sandboxed iframe; call microsoftTeams.app.initialize() in that context, as in Teams.
Key Adaptations
| Aspect | Note |
|---|---|
| Teams JavaScript SDK | Liman 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 – Liman supports these contexts. |
| iframe sandbox | Tabs run in iframes; no native plugins. |
SSO (getAuthToken) | Without webApplicationInfo, Liman returns a generic MSAL token. With webApplicationInfo, it requests the app-specific scope — your Azure app must authorize the Liman 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 Liman client ID.
- Set
webApplicationInfo.idandresourcecorrectly in the manifest. - Import the manifest in Liman; 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.