A browser refuses to put a page inside an iframe when the page sends X-Frame-Options, or a Content-Security-Policy with a frame-ancestors directive that leaves your origin out. This table shows the raw value that each site sends today.
What this does not tell you
A header read proves one thing only: the browser permits the frame. It does not prove that the application works inside one. A login cookie with SameSite=Lax fails in a third-party frame even when the framing headers are open. The "Usable in practice" column therefore stays empty for any app that nobody tried by hand. An empty cell means "not tested". It never means "probably fine".
There is a second limit, and it matters just as much. An unauthenticated request measures whatever page it lands on, and for a site that requires a login, that is often a sign-in screen and not the application itself. Our Gmail request, for example, never reached mail.google.com — it landed on accounts.google.com, Google's own sign-in page. Some hosts also answer differently from one request to the next. Outlook Web sent frame-ancestors 'self' teams.microsoft.com on three fetches in a row, then sent no framing header at all on two later fetches from the same script. Read every row below as a snapshot taken on the date above, not as a permanent fact about the site.
Mail and calendar
| App | Browser allows the frame | Usable in practice | X-Frame-Options | frame-ancestors |
|---|---|---|---|---|
| Gmail | no | — | DENY | — |
| Google Calendar | no | — | DENY | — |
| Outlook Web | no | — | — | 'self' teams.microsoft.com |
| Proton Mail | no | — | — | https://calendar.proton.me https://drive.proton.me |
| Fastmail | no | — | DENY | 'self' |
| Zoho Mail | no | — | SAMEORIGIN | — |
Project boards
| App | Browser allows the frame | Usable in practice | X-Frame-Options | frame-ancestors |
|---|---|---|---|---|
| Trello | yes | — | — | — |
| Asana | no | — | SAMEORIGIN | 'self' https://teams.integrations.asana.plus https://teams-beta.integrations.asana.plus https://teams-uat.integrations.asana.plus https://teams.microsoft.com https://teams.cloud.microsoft |
| Jira | no | — | deny | 'none' |
| Linear | no | — | — | 'self' https://cms.linear.app |
| ClickUp | no | — | — | 'self' https://clickup.com https://stage1-landing.clickup.com |
| Monday.com | yes | — | — | — |
| Todoist | yes | — | — | — |
| Basecamp | no | — | SAMEORIGIN | — |
Notes and documents
| App | Browser allows the frame | Usable in practice | X-Frame-Options | frame-ancestors |
|---|---|---|---|---|
| Notion | no | — | — | 'self' https://app.notion.com notion://app.notion.com notion://www.notion.so https://app.contentful.com |
| Google Docs | no | — | DENY | — |
| Obsidian Publish | no | — | SAMEORIGIN | — |
| Evernote | no | — | DENY | https://docs.google.com https://www.evernote.com https://evernote.com |
| Dropbox Paper | no | — | SAMEORIGIN | 'self' |
| Google Keep | no | — | DENY | — |
| Airtable | yes | — | — | — |
| Figma | no | — | SAMEORIGIN | — |
Chat
| App | Browser allows the frame | Usable in practice | X-Frame-Options | frame-ancestors |
|---|---|---|---|---|
| Slack | no | — | SAMEORIGIN | — |
| Discord | no | — | DENY | — |
| Telegram Web | no | — | deny | — |
| WhatsApp Web | no | — | DENY | — |
| Microsoft Teams | no | — | — | 'self' local.teams.office.com teams.microsoft.com.mcas.ms |
| Element | no | — | SAMEORIGIN | 'self' |
Code hosting
| App | Browser allows the frame | Usable in practice | X-Frame-Options | frame-ancestors |
|---|---|---|---|---|
| GitHub | no | — | deny | 'none' |
| GitLab | yes | — | — | — |
| Bitbucket | no | — | deny | 'none' |
| Codeberg | no | — | SAMEORIGIN | — |
| SourceHut | no | — | — | 'none' |
Analytics
| App | Browser allows the frame | Usable in practice | X-Frame-Options | frame-ancestors |
|---|---|---|---|---|
| Google Analytics | no | — | DENY | — |
| Plausible | yes | — | — | — |
| Grafana Cloud | no | — | DENY | — |
| Sentry | no | — | — | *.sentry.io |
Music and video
| App | Browser allows the frame | Usable in practice | X-Frame-Options | frame-ancestors |
|---|---|---|---|---|
| YouTube | no | — | SAMEORIGIN | — |
| Spotify | no | — | — | 'self' https://adgen-dev.spotify.com/account/*/ad/*/details https://adgen-dev.spotify.com/preview/* https://local.spotify.net/account/*/ad/*/details https://local.spotify.net/preview/* https://app.smartly.io/* |
| SoundCloud | no | — | SAMEORIGIN | — |
| Twitch | no | — | SAMEORIGIN | — |
| Vimeo | no | — | SAMEORIGIN | — |
| Apple Music | no | — | DENY | 'none' |
News
| App | Browser allows the frame | Usable in practice | X-Frame-Options | frame-ancestors |
|---|---|---|---|---|
| BBC News | no | — | SAMEORIGIN | — |
| Hacker News | no | — | DENY | 'self' |
| Reuters | no | — | — | 'self' |
| The Guardian | no | — | SAMEORIGIN | — |
| Ars Technica | no | — | SAMEORIGIN | — |
| Wikipedia | yes | — | — | — |
| Al Jazeera | no | — | SAMEORIGIN | — |
Social
| App | Browser allows the frame | Usable in practice | X-Frame-Options | frame-ancestors |
|---|---|---|---|---|
| X | no | — | SAMEORIGIN | 'self' https://x.com https://x.com:443 https://twitter.com https://twitter.com:443 |
| no | — | SAMEORIGIN | — | |
| Mastodon | no | — | DENY | 'none' |
| Bluesky | no | — | SAMEORIGIN | — |
| no | — | SAMEORIGIN | 'self' *.www.linkedin.com:* *.prod.linkedin.com ciafilestore.corp.linkedin.com |
Finance
| App | Browser allows the frame | Usable in practice | X-Frame-Options | frame-ancestors |
|---|---|---|---|---|
| TradingView | no | — | — | 'none' |
| Yahoo Finance | no | — | DENY | — |
| CoinGecko | no | — | SAMEORIGIN | — |
| Investing.com | no | — | SAMEORIGIN | — |
| Nasdaq | no | — | SAMEORIGIN | — |
How we test
One GET request to each address, with a current Chrome user agent, and redirects followed. The script reads two response headers and writes the raw values to a JSON file that ships with the site. Repeat it yourself:
cd frontend && npm run probe:embedThe next run is due 2026-11-24. Headers change, so a row that is more than a quarter old deserves a fresh check.