diff --git a/packages/app/src/editor/components/Embed.tsx b/packages/app/src/editor/components/Embed.tsx
index c87bac8e..0067ebe8 100644
--- a/packages/app/src/editor/components/Embed.tsx
+++ b/packages/app/src/editor/components/Embed.tsx
@@ -1,3 +1,4 @@
+import { rewriteEmbedUrl } from '@inkeep/open-knowledge-core';
import { useEffect, useRef } from 'react';
import { useJsxComponentHost } from './jsx-host-context.tsx';
import { ResizeHandles } from './ResizeHandles.tsx';
@@ -87,13 +88,16 @@ export function Embed({ src, title, width, height }: EmbedProps) {
}
};
+ const iframeSrc = rewriteEmbedUrl(src);
+ const referrerPolicy = iframeSrc !== src ? 'strict-origin-when-cross-origin' : 'no-referrer';
+
return (
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index 6f098aae..610619f6 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -917,6 +917,7 @@ export { applyByPrefixSuffix } from './utils/apply-by-prefix-suffix.ts';
export { toDesktopAssetHref } from './utils/asset-href.ts';
export { ChunkedInsertError, chunkedYTextInsert } from './utils/chunked-insert.ts';
export { createCodeFenceTracker } from './utils/code-fence-tracker.ts';
+export { isEmbedUrlRewritable, rewriteEmbedUrl } from './utils/embed-url-rewrite.ts';
export { extensionOf } from './utils/extension.ts';
export { formatFileSize } from './utils/file-size.ts';
export {
diff --git a/packages/core/src/registry/built-ins.ts b/packages/core/src/registry/built-ins.ts
index 221ea56a..0773009b 100644
--- a/packages/core/src/registry/built-ins.ts
+++ b/packages/core/src/registry/built-ins.ts
@@ -779,7 +779,8 @@ export const builtInComponents: JsxComponentMeta[] = [
icon: 'AppWindow',
category: 'media',
displayName: 'Embed',
- description: 'Inline web embed (iframe) — drop a URL, get a resizable preview pane',
+ description:
+ 'Inline web embed (iframe) — drop a URL, get a resizable preview pane. For YouTube / Vimeo / Loom prefer `