{"id":50112516,"url":"https://github.com/morzan1001/mattermost-plugin-opentalk","last_synced_at":"2026-05-23T13:05:50.156Z","repository":{"id":356889101,"uuid":"1230184412","full_name":"morzan1001/mattermost-plugin-opentalk","owner":"morzan1001","description":"Mattermost plugin for OpenTalk video conferencing. Start meetings from any channel or DM with Keycloak/OIDC auth and a Calls-style in-app UX. Replaces external tabs with a native conferencing experience – audio, video, screenshare, dial-in.","archived":false,"fork":false,"pushed_at":"2026-05-17T13:34:30.000Z","size":1147,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-17T15:46:32.849Z","etag":null,"topics":["mattermost","mattermost-plugin"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/morzan1001.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-05T18:59:07.000Z","updated_at":"2026-05-17T13:34:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/morzan1001/mattermost-plugin-opentalk","commit_stats":null,"previous_names":["morzan1001/mattermost-plugin-opentalk"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/morzan1001/mattermost-plugin-opentalk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morzan1001%2Fmattermost-plugin-opentalk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morzan1001%2Fmattermost-plugin-opentalk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morzan1001%2Fmattermost-plugin-opentalk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morzan1001%2Fmattermost-plugin-opentalk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/morzan1001","download_url":"https://codeload.github.com/morzan1001/mattermost-plugin-opentalk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morzan1001%2Fmattermost-plugin-opentalk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33396642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T04:15:53.637Z","status":"ssl_error","status_checked_at":"2026-05-23T04:15:53.242Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mattermost","mattermost-plugin"],"created_at":"2026-05-23T13:05:47.633Z","updated_at":"2026-05-23T13:05:50.137Z","avatar_url":"https://github.com/morzan1001.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenTalk for Mattermost\n\nA Mattermost server plugin that deeply integrates the OpenTalk video-conferencing platform into the Mattermost web app. Audio, video, and screen sharing from channels and DMs — similar to `mattermost-plugin-calls` — but backed by OpenTalk's stack (Roomserver + LiveKit) instead of a custom WebRTC server.\n\n## Features\n\n- Start a meeting from any channel via header button or `/opentalk start`. Floating widget with mic, camera, screen-share, hand-raise, mini, and leave controls — drag to reposition, resizes to its natural content width.\n- Expanded view with three layouts (speaker, grid, screen-focus); choice persists per user.\n- DM ringing — incoming-call modal with ringtone, 30-second auto-decline; switch-call prompt when already in a meeting; push notification per recipient (DND respected).\n- Mobile handoff — meeting posts carry a Slack-style card with a `[Join]` markdown link, dial-in info, and End / Decline action buttons. Mattermost mobile users tap to open the OpenTalk web client in the system browser.\n- Native screen-share in Mattermost Desktop via the platform's `desktopAPI.getDesktopSources()` IPC; standard `getDisplayMedia()` in browsers.\n- End-for-all kicks remaining participants (moderation `debrief`) and revokes the OpenTalk invite.\n- Channel toast above the thread when a meeting is live in a public/private channel.\n- User settings: ringtone toggle, mute-on-join, mic and camera pickers.\n- Custom status \"In OpenTalk-Meeting\" while connected.\n- German + English UI, auto-selected from the user's Mattermost locale.\n\n## Architecture\n\n- **Server (Go):** OAuth bridge against Keycloak, calls the OpenTalk Controller REST API on behalf of the user, posts custom posts with a join link and action buttons, sends push notifications for DM ringing, runs a reaper that ends orphaned meetings (heartbeat-based for webapp hosts, 30-minute grace for mobile-only hosts).\n- **Webapp (TS + React):** Channel-header button, custom post renderer, floating widget, expanded view, incoming-call modal, signaling client, and LiveKit client for the in-Mattermost conference UI.\n- **OpenTalk:** Room creation and auth via the Controller REST API, live signaling over Roomserver WebSocket, media over LiveKit.\n- **Auth:** Per-user OIDC authorization-code flow against Keycloak (the same realm that OpenTalk uses).\n\n## Build\n\nPrerequisites:\n- Go ≥ 1.25 (version pinned in `.go-version`; recommended: `goenv`)\n- Node ≥ 24 (version pinned in `.nvmrc`; recommended: `nvm`)\n- GNU Make\n\n```bash\nmake dist\n```\n\nThis produces `dist/com.github.morzan1001.mattermost-plugin-opentalk-\u003cversion\u003e.tar.gz`. Upload it in the Mattermost System Console under **Plugin Management → Upload Plugin**.\n\n## Keycloak setup\n\nThe plugin authenticates each Mattermost user via an **OIDC authorization-code flow** against the same Keycloak instance that OpenTalk uses. You need to create one **OIDC client** in the Keycloak realm of your OpenTalk deployment.\n\n\u003e **Permissions required:** Realm-admin access. If you don't have it, forward this section to your OpenTalk operator.\n\n### What the client does\n\n- Receives user browser redirects from the Mattermost plugin and issues OIDC auth codes.\n- Exchanges auth codes for access/refresh tokens (authenticated with a client secret).\n- Issues refresh tokens (via the `offline_access` scope) so the plugin can renew tokens without prompting the user again.\n\n### 1. Log in to the Keycloak Admin Console\n\nOpen `https://accounts.\u003cyour-opentalk-domain\u003e/auth/admin/`. Select the OpenTalk realm from the top-left dropdown (typically `opentalk`).\n\n### 2. Create the client\n\nLeft nav: **Clients → Create client**.\n\n**General Settings:** Client type **OpenID Connect**, Client ID `mattermost-plugin-opentalk`, Name `Mattermost OpenTalk Plugin`.\n\n**Capability Config:** Enable **Client authentication** (confidential client with client secret) and **Standard flow** (authorization-code flow). Optionally enable **Service accounts roles** for the bot-model fallback. Leave the rest off.\n\n**Login Settings:**\n\nReplace `MM_URL` with your Mattermost server URL (e.g. `http://localhost:8065` for local dev or `https://chat.example.com` for production):\n\n| Field | Value |\n|---|---|\n| Root URL | `MM_URL` |\n| Home URL | `MM_URL` |\n| Valid redirect URIs | `MM_URL/plugins/com.github.morzan1001.mattermost-plugin-opentalk/oauth/callback` |\n| Valid post logout redirect URIs | `MM_URL/*` |\n| Web origins | `MM_URL` (the exact Mattermost URL — no wildcard `*`) |\n\nSave.\n\n### 3. Copy the client secret\n\nGo to the **Credentials** tab and copy the **Client secret**. You will enter this value in the Mattermost System Console plugin settings (field: _OIDC Client Secret_).\n\n### 4. (Optional) Refresh token lifetime\n\nIf your realm enforces strict token lifetimes, check **Realm settings → Tokens** and ensure _SSO Session Idle_ and _Offline Session Idle_ are long enough that refresh tokens do not expire after 30 minutes. The default is usually fine.\n\n### Plugin settings\n\nAfter creating the client, enter the following in the Mattermost System Console (**System Console → Plugins → OpenTalk**):\n\n| Plugin setting | Value |\n|---|---|\n| OpenTalk Controller URL | URL of your OpenTalk Controller, e.g. `https://controller.opentalk.example` |\n| OpenTalk Frontend URL | URL of the OpenTalk frontend, e.g. `https://opentalk.example` |\n| OIDC Authority | Issuer URL, e.g. `https://accounts.opentalk.example/auth/realms/opentalk` |\n| OIDC Client ID | `mattermost-plugin-opentalk` |\n| OIDC Client Secret | _Value from step 3_ |\n| OIDC Scopes | `openid email profile offline_access` (default is fine) |\n\nActivate the plugin. An OpenTalk button should appear in the channel header; the first click starts the OAuth flow.\n\n### Troubleshooting\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| `unauthorized_client` during smoke test | Direct access grants not enabled | Enable in Capability Config (step 2) |\n| `invalid_grant` + `Account is not fully set up` | Test user has pending required actions (e.g. Verify Email, Update Profile) | User details → clear _Required user actions_, set _Email verified_, fill in first/last/email |\n| `invalid_grant` (no account message) | Wrong username or password | Check the user's credentials |\n| `invalid_client` | Client authentication is `off` (public client) | Enable in Capability Config (step 2) |\n| Browser redirect lands on Keycloak error page | Redirect URI mismatch | Check Login Settings exactly — no trailing slash |\n| Plugin settings save fails with `OIDCAuthority must not be empty` | Issuer URL not entered | See plugin settings table above |\n| Plugin cannot load OIDC discovery | Issuer URL has wrong subpath (`/auth/` missing or extra) | Use exactly the URL shown in Keycloak's Realm Settings as _Issuer_ |\n\n## Slash commands\n\n| Command | What it does |\n|---|---|\n| `/opentalk connect` | Link the current Mattermost user to OpenTalk via OIDC. |\n| `/opentalk disconnect` | Remove the link. |\n| `/opentalk info` | Show the current connection status. |\n| `/opentalk start` | Start a meeting in the current channel. |\n| `/opentalk join` | Join the active meeting in the current channel. |\n| `/opentalk end` | End the meeting (host only). |\n| `/opentalk dial-in` | Show the SIP dial-in number and PIN for the active meeting. |\n| `/opentalk ring on\\|off` | Toggle the ringtone for incoming DM calls. |\n| `/opentalk help` | Show the command list. |\n\n## Development\n\n```bash\nmake deploy\n```\n\nDeploys directly to a local Mattermost dev server (endpoint configured via `MM_SERVICESETTINGS_SITEURL` + admin token).\n\n```bash\nmake test       # go test + jest\nmake lint       # golangci-lint + eslint\nmake watch      # webapp in watch mode\n```\n\nThe webapp suite covers components, store slices, conference signaling, and the LiveKit wrapper; the server suite covers slash-command handlers, the OIDC flow, the OpenTalk client, the post helpers, the reaper, and the store.\n\n## Credits\n\nThe incoming-call ringtone is [\"Digital Phone Ring\" by Perkin](https://freesound.org/people/Perkin/sounds/178377/), released under CC0 1.0.\n\n## License\n\nThree licenses apply, identified per file via SPDX headers; full texts are in [`LICENSES/`](LICENSES/):\n\n- **Apache-2.0** — plugin code authored in this repository (default).\n- **EUPL-1.2** — files under `webapp/src/conference/signaling/` ported from the OpenTalk web frontend; each carries an SPDX header crediting OpenTalk GmbH.\n- **CC0-1.0** — `webapp/src/sounds/incoming_call.ogg`, declared via the adjacent `.license` sidecar.\n\nThe top-level [`LICENSE`](LICENSE) file (Apache-2.0) is preserved at the root so GitHub auto-detection works.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorzan1001%2Fmattermost-plugin-opentalk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmorzan1001%2Fmattermost-plugin-opentalk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorzan1001%2Fmattermost-plugin-opentalk/lists"}