Portal Community

Minimal Example

{
  "id": "external-dashboard",
  "type": "iframe-viewer",
  "label": "Live Dashboard",
  "width": "full",
  "settings": {
    "src": "https://dashboards.example.com/embed/kpi",
    "height": "500px"
  }
}

Settings Reference

SettingTypeDefaultDescription
srcstringURL to embed. Supports template expressions: {{context.reportUrl}}
heightstring (CSS)"400px"iframe height
widthstring (CSS)"100%"iframe width
sandboxstring""Space-separated sandbox permission tokens (see table below). Empty string = maximum restriction.
allowFullscreenbooleanfalseAllow the embedded page to enter fullscreen mode
scrollingauto | yes | noautoiframe scroll behaviour
loadingeager | lazyeagerBrowser lazy-load hint for below-the-fold iframes
titlestringAccessible title attribute for the iframe element

Sandbox Permission Tokens

TokenWhat It AllowsRisk Level
allow-scriptsJavaScript execution in the iframeMedium
allow-formsForm submission inside the iframeLow
allow-same-originTreat content as same origin — can access parent cookiesHigh — use sparingly
allow-popupsOpen new windows from within the iframeMedium
allow-top-navigationNavigate the top-level frameHigh — avoid
allow-downloadsTrigger file downloadsLow

Embedding a Grafana Dashboard

Grafana supports anonymous embedding via the /d-solo/ route. The embedded panel requires allow-scripts for its React UI to run:

{
  "id": "grafana-panel",
  "type": "iframe-viewer",
  "label": "Infrastructure Health",
  "width": "full",
  "settings": {
    "src": "https://grafana.internal/d-solo/abc123/health?orgId=1&panelId=2",
    "height": "400px",
    "sandbox": "allow-scripts allow-same-origin",
    "allowFullscreen": true,
    "title": "Infrastructure Health Panel"
  }
}

Dynamic URL from Context

{
  "id": "report-viewer",
  "type": "iframe-viewer",
  "settings": {
    "src": "{{context.report.embedUrl}}",
    "height": "600px",
    "sandbox": "allow-scripts",
    "loading": "lazy"
  }
}

X-Frame-Options Limitation

Many websites set the X-Frame-Options: DENY or X-Frame-Options: SAMEORIGIN HTTP header, which prevents embedding. If the iframe shows a blank panel or a browser error, the target site has blocked embedding. Solutions:

Never use allow-same-origin with allow-scripts together Combining allow-same-origin and allow-scripts effectively removes the sandbox — the iframe can read the parent's cookies and localStorage. Only do this for fully trusted internal content hosted on your own domain.