Slack integration: links on self-hosted domains never unfurl (parseCapShareUrl only accepts cap.so / cap.link)
Les mainteneurs répondent en général sous 1 jour
@mangeshraut712 y travaille déjà.
Depuis le 14/10/2026.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 72/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- nextjs, typescript
Piste de recherche
Commence par parseCapShareUrl dans apps/web/lib/oembed.ts, appelée par processSlackEvent et /api/oembed, puis vérifie comment serverEnv().WEB_URL est déjà lu ailleurs dans apps/web. Confirme qu'un lien /s/<id> sur un hôte autre que cap.so renvoie aujourd'hui null. C'est terminé lorsqu'un lien de partage sur l'hôte WEB_URL configuré se résout en ID de vidéo dans les deux chemins, et que les liens sur les autres hôtes renvoient toujours null.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Description
On a self-hosted Cap server, the Slack integration never shows a preview or inline player for share links on the server's own domain.
The Slack app installs and connects fine, Slack sends link_shared events, and /api/integrations/slack/events returns 200, but Cap never calls chat.unfurl. Nothing is logged, so it fails silently.
Expected: a public link like https://video.example.com/s/<id> unfurls in Slack with the title, thumbnail and inline player, the same as cap.so links.
Actual: Slack shows a plain link. Because the app claims the domain, Slack also skips its own Open Graph preview, so it's worse than having no app installed.
Cause: processSlackEvent passes each link through parseCapShareUrl (apps/web/lib/oembed.ts), which only accepts Cap's hosted domains:
if (hostname === "cap.so" && segments.length === 2 && segments[0] === "s") {
videoId = segments[1];
}
if (hostname === "cap.link" && segments.length === 1 && segments[0] !== "video") {
videoId = segments[0];
}
For any other host it returns null, so the link is dropped before the video is looked up. /api/oembed uses the same function, so it returns 400 for the server's own links, even though the share page advertises that oEmbed URL.
Suggested fix: also accept the host of WEB_URL with the /s/<id> path:
const webHost = new URL(serverEnv().WEB_URL).hostname.toLowerCase().replace(/^www\./, "");
if ((hostname === "cap.so" || hostname === webHost) && segments.length === 2 && segments[0] === "s") {
videoId = segments[1];
}
This fixes both Slack unfurls and /api/oembed on self-hosted servers.
Reproduction
- Run Cap self-hosted with
WEB_URL=https://video.example.com(officialcap-webDocker image). - Create a Slack app from
apps/web/slack-app-manifest.json, replacingcap.sowithvideo.example.comin the unfurl domain, redirect URL and event URL. - Set
SLACK_CLIENT_ID,SLACK_CLIENT_SECRETandSLACK_SIGNING_SECRET, restart cap-web, and verify the event URL in Slack (it verifies). - In Cap: Organization Settings → Integrations → Slack → Connect (it connects).
- Use a public video with no password; the organization has no access email domain.
- Paste
https://video.example.com/s/<id>in a Slack channel. - No preview appears. The server receives the Slack event (200), and Slack never loads
/embed/<id>.
Quick check without Slack:
curl -s -o /dev/null -w "%{http_code}\n" \
"https://video.example.com/api/oembed?url=https%3A%2F%2Fvideo.example.com%2Fs%2F<id>&format=json"
# returns 400 (expected 200 with oEmbed JSON)
Additional Context
- Cap version: official
ghcr.io/capsoftware/cap-webDocker image built 2026-09-07 (arm64sha256:5b65d137f7f7ddd767e1acb37380a4609f43287458410515a013157b56cfa83d). The sameparseCapShareUrlcode is onmaintoday. - Operating system, version: server is Linux arm64 (AWS ECS Fargate), self-hosted with Aurora MySQL and S3,
NEXT_PUBLIC_IS_CAPnot set. Slack desktop app on macOS. - Device (optional): n/a (server-side issue)
- Related: #2058 (Slack integration), #2122 / #2123 (share metadata on custom domains). Those fixed the Open Graph tags; this is the separate Slack-app path.
- Langage dominant
- Rust
- Étoiles
- 23.2k
- Forks
- 2k
- Merge moyen
- 1 j 10 h
- PR mergées (30 j)
- 100
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de CapSoftware/Cap
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
CapSoftware/Cap#2384 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Dashboard pagination causes full page reloads on self-hosted CapPeut-être pris @Dewin l’a pris il y a 27 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
CapSoftware/Cap#2305 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
CapSoftware/Cap#1714 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
perf: investigate redundant caption lookup passes during renderingPeut-être pris @KrishCodesw l’a pris aujourd’hui. Ouverte
Difficulté 4/5 3-5 jours Accessibilité débutants 25/100
CapSoftware/Cap#2523 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
GPUI playback hitches during background edits on long recordingsPeut-être pris @AksharP5 l’a pris il y a 1 jour. Ouverte
Difficulté 3/5 Une demi-journée Accessibilité débutants 45/100
CapSoftware/Cap#2506 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de CapSoftware/Cap
Issues similaires
-
agent:iq3-xxs area: cli duplication enhancement priority: P3 ready-for-agent
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
bytecodealliance/rustix#1703 ·
Les mainteneurs répondent en général sous 3 jours
-
bug discussion
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
medialab/xan#1201 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
farion1231/cc-switch#8298 ·
Les mainteneurs répondent en général sous 1 jour