← Chrome 152 reference

v152 · enabled by default · isolated web apps

Unframed display mode for Isolated Web Apps

Limited availability

  • Chrome · 152 desktop
  • Edge · not separately reported
  • Firefox · no signal
  • Safari · N/A

Not on the Baseline register: a webstatus.dev query returns zero features (2026-07-28), and the ChromeStatus record marks the Web Feature ID as missing. The mode is restricted to Isolated Web Apps on desktop operating systems; it is not a general-web feature.

The unframed display mode lets an Isolated Web App (IWA) window occupy its entire window area: no host-native title bar, no visible window controls, no borders. The app draws — and wires up — its own title bar, dragging regions, and window buttons, matching the look and behaviour of a native application.

Incubating feature — IWA-only, desktop-only, surface may move

The Chrome 152 milestone listing (authoritative per gendn invariant #2, verified 2026-07-28) files this feature under two categories for the same feature id — “Enabled by default” and “Stepped rollout” — while the feature detail record still carries the status text “In developer trial (Behind a flag)” (desktop 152). At Chromium trunk the base feature is BASE_FEATURE(kUnframedIwa, base::FEATURE_ENABLED_BY_DEFAULT) in blink/common/features.cc (fetched 2026-07-28), and the chrome://flags/#enable-unframed-iwa entry remains available as an override on desktop OSes (about_flags.cc, kOsDesktop). To try it:

The specification is a WICG Community Group draft; the manifest grammar may change before it is adopted elsewhere. A request for feedback on per-window control (the mechanism formerly called “borderless”) is still open.

at a glance

At a glance
What it isA display mode extension, unframed, requested through the web app manifest's display_override member: the app window has no window frame — no host-native title bar and no visible window controls — and the web contents extend to the entire window area
Milestone listingChrome 152 — listed under “Enabled by default” and “Stepped rollout” (same feature id, two categories; milestone=152 listing, verified 2026-07-28; the listing is authoritative per gendn invariant #2)
Feature detailDesktop 152; Android, WebView, iOS: no milestone; status text “In developer trial (Behind a flag)” (ChromeStatus API record)
Developer surfaceManifest: unframed in display_override (string or object entry with url_patterns) · CSS: @media (display-mode: unframed) and app-region for draggable regions · Prerequisite: window-management permission
Runtime featureblink::features::kUnframedIwaFEATURE_ENABLED_BY_DEFAULT at trunk (features.cc); flag entry enable-unframed-iwa, desktop OSes only (about_flags.cc)
RestrictionUser agents MUST restrict unframed to Isolated Web Apps (Manifest Incubations); non-IWA apps silently fall back through the display-mode chain
Standards statusWICG Manifest Incubations — Community Group draft (CG-DRAFT); TAG review not required for IWA features per the Chromium IWA launch process
ChromeStatus5551475195904000 — Unframed display mode for Isolated Web Apps
Source: chromestatus.com/feature/5551475195904000; Manifest Incubations — unframed; Chromium features.cc

why it exists

Standard window decorations — the title bar and the system minimize/maximize/close buttons — impose fixed UI constraints that consume screen real estate and conflict with an application's own branding and layout. The two pre-existing answers both fall short (explainer — existing alternatives):

Unframed mode removes the frame entirely for IWAs: fully custom title bars (Steam-on-Windows, Discord-on-macOS style), fully app-controlled secondary windows (drop-down menus, tooltips with no draggable area), and streamed remote windows without a duplicated title bar. Access is restricted to IWAs because a frameless window can spoof other applications or the user agent itself — IWAs are signed, versioned packages with a stricter trust model.

Source: unframed explainer — introduction, existing alternatives, what apps could benefit; ChromeStatus motivation

Syntax

The simplest configuration requests unframed for every window of the app. unframed is a display mode extension: it is valid inside display_override, not in the base display member — the base member keeps a normal mode (standalone here) as the fallback for user agents without unframed support. The permissions_policy manifest member requests the window-management permission that gates the feature:

{
  // 1. Request the window-management permission policy.
  "permissions_policy": { "window-management": ["self"] },
  "display": "standalone",
  // 2. Add unframed to the display_override list.
  "display_override": ["unframed"]
}

To unframe only specific windows, an entry in display_override can be a JSON object — a DisplayOverrideEntryObject — carrying the mode plus the URL patterns it applies to. That object grammar, its processing algorithm, and its fallback rules have their own reference page: display_override object entries (DisplayOverrideEntryObject).

{
  "permissions_policy": { "window-management": ["self"] },
  "display": "standalone",
  "display_override": [
    {
      "display": "unframed",
      "url_patterns": [
        "/some/path/*",
        { "pathname": "/some/other/path/*" }
      ]
    }
  ]
}

The active mode is exposed to CSS through the display-mode media feature, and draggable regions for a custom title bar are declared with the app-region property:

@media (display-mode: unframed) {
  .example-class {
    margin: 5px;
  }
}
Source: unframed explainer — proposed solution, CSS media query; Manifest Incubations — display mode extensions, CSS media query

Member reference

The feature's developer-facing surface is the display mode value itself (this page), plus two substantial contracts with stable child routes:

Source: Manifest Incubations — display_override processing, defining draggable regions

Inputs

Developer-supplied inputs
InputContract
"unframed" string in display_overrideRequests the mode for every window of the app; entries are tried in list order and the first supported candidate wins
DisplayOverrideEntryObject in display_overridedisplay (a display modes list value, extensions included) plus optional url_patterns scoping the entry to matching window URLs — full grammar
permissions_policy manifest member{ "window-management": ["self"] } requests the permission; the member and its interaction with the Permissions-Policy header are defined for IWAs in the IWA Permissions explainer
app-region CSS declarationsdrag / no-drag on elements to build the draggable title bar — reference
Administrator policiesEnterprise policy can preset or block the mode per origin — see security and privacy
Source: unframed explainer — proposed solution, manifest changes; Manifest Incubations — display_override member

Outputs

Source: Manifest Incubations — unframed display mode, CSS media query; unframed explainer — introduction, related proposals

CSS media query

The applied mode is exposed to CSS through the standard display-mode media feature: “The unframed display mode can be queried using the display-mode media feature” (spec). The query is a boolean context check over the window's own applied display mode — it takes no arguments and has no error path: it simply does not match when the window is framed. Because an unframed window's mode is fixed for its lifetime (see lifecycle), the match state of a given window does not change on navigation.

@media (display-mode: unframed) {
  /* styles for unframed mode, e.g. reveal the app's own title bar */
}

The canonical use is progressive: ship one stylesheet that keeps the custom title bar hidden in framed windows (where it would duplicate the system one) and reveals it only when the frame is actually absent. The embedded Display Mode Probe demo reports which display-mode value matches the current window.

Source: Manifest Incubations — CSS media query; unframed explainer — CSS media query; base feature per MDN — @media/display-mode (adjacent documentation; lists no unframed value, verified 2026-07-28)

Errors and fallback behaviour

Fallback and rejection paths
SituationBehaviour
App is not an IWAThe display-mode selection algorithm only returns unframed when “the user agent supports this, and the application is an Isolated Web Application” — otherwise the candidate is skipped and the chain falls through to the next display_override entry, then to the display member (e.g. standalone). No error is surfaced to the page.
User agent without unframed supportSame chain: unsupported entries are passed over; if no display_override entry applies, the display member is used
Malformed display_override entriesDuring manifest processing, an object entry whose url_patterns exists but is not a list is skipped (“iteration/continue”); invalid members do not abort processing of the remaining entries — details
Window URL matches no url_patternsThat object entry produces no candidate for the window; the next entry in the fallback chain is considered
Navigation to an out-of-scope URLThe user agent MUST NOT allow it inside the unframed window — the destination opens in a new, regular window instead (see lifecycle)
Permission not grantedThe feature is “gated behind a window management permission granted by the user or via admin policies”; without the grant the mode is not applied (the explainer does not define a page-observable rejection signal — recorded as an open question in the critique)
Source: Manifest Incubations — determining the chosen display mode, processing display_override; unframed explainer — security & privacy considerations

Context and requirements

Source: Manifest Incubations — unframed; Window Management API — Permission API integration; unframed-demo README

Window lifecycle

  1. Creation without flicker — if a new IWA window's URL matches one of the unframed url_patterns, “the window should be created in unframed mode from the very beginning without flicker”: it must not show another visible display mode before switching to unframed.
  2. Fixed for the window's lifetime — “once an unframed window has been created, its display mode is fixed for the lifetime of the window.” Navigating to and from URLs matching url_patterns does not transition the window in and out of unframed mode, and the same holds for URL changes through history.pushState() or window.location. (The explainer notes this may be revisited to allow dynamic changes in the future.)
  3. No out-of-scope navigation — navigation to URLs outside the IWA's defined scope (including cross-origin navigation) is not permitted inside an IWA window; the user agent opens a new, regular window for the destination instead. The spec states it as a MUST NOT: the UA must not allow navigation to out-of-scope URLs to take place within the unframed window. An unframed window therefore cannot navigate across origins.
Source: unframed explainer — window creation, window navigation or URL change, out-of-scope navigation; Manifest Incubations — unframed display mode

Examples

The Chrome Platform Showcase demo probes which display mode the current window reports — open it inside an unframed IWA window to see display-mode: unframed match:

Live example from the Chrome Platform Showcase (route HEAD-checked 200, 2026-07-28). Note: the probe runs as a normal page here, so it reports this browser window's mode — unframed only matches inside an actual unframed IWA window.Source: chrome-platform-showcase

A complete manifest requesting unframed only for windows under /remote/, with a custom title bar that is draggable except over its buttons:

{
  "name": "VDI Client",
  "start_url": "/session/",
  "permissions_policy": { "window-management": ["self"] },
  "display": "standalone",
  "display_override": [
    {
      "display": "unframed",
      "url_patterns": ["/remote/*"]
    },
    "window-controls-overlay"
  ]
}
/* CSS shipped inside the IWA */
.title-bar { app-region: drag; }
.title-bar button { app-region: no-drag; }

@media (display-mode: unframed) {
  /* No system title bar: reveal the app's own. */
  .title-bar { display: flex; }
}
Source: manifest shape per the unframed explainer — proposed solution; media query per Manifest Incubations — CSS media query; app-region per Manifest Incubations — defining draggable regions; a runnable signed-bundle project at github.com/edman/unframed-demo

Browser compatibility

Interim table. There is no BCD entry for unframedBCD css/at-rules/media.json lists fullscreen, minimal-ui, picture-in-picture, standalone, and window-controls-overlay under display-mode but no unframed key (checked 2026-07-28) — and no web-features entry (webstatus.dev query, zero matches). Rows below are compiled from the linked primary sources, not from BCD.

Interim compatibility (source-derived)
Browser / platformSupportEvidence
Chrome desktop (Windows, macOS, Linux, ChromeOS)152 — listing: “Enabled by default” + “Stepped rollout”; detail record: developer trial behind a flag; trunk base feature enabled by defaultmilestone=152 listing; ChromeStatus API record; features.cc
Chrome Android / WebView / iOSNo milestone — not applicable (mobile OSs are an explainer non-goal)ChromeStatus API record; explainer — non-goals
EdgeNot separately reportedChromium-based; no separate position on the ChromeStatus record
FirefoxNo signalChromeStatus API record vendor views
SafariN/AChromeStatus API record vendor views

WPT: no upstream test covers unframed as of 2026-07-28 — appmanifest/display-override-member/ carries manual tentative tests for browser, fullscreen, minimal-ui, standalone, tabbed, and window-controls-overlay, but none for unframed.

Source: chromestatus.com/feature/5551475195904000; BCD media.json; WPT display-override-member directory

Security and privacy

Source: unframed explainer — security & privacy considerations; ChromeStatus API record — summary (policy list)

Specifications

Specifications and proposals
DocumentStatus
WICG Manifest Incubations — unframed display mode, display_override processing, draggable regionsCommunity Group draft (CG-DRAFT); the normative home of the unframed extension, DisplayOverrideEntryObject, the media query, and app-region
Unframed Windows explainerProposer documentation: goals, lifecycle rules, security rationale
WICG/manifest-incubations #118 — per-window control over unframed mode (f.k.a. borderless)Request for feedback, open (2026-07-28)
W3C Web Application ManifestBase spec: display, display_override, display-mode selection extension point
WICG Isolated Web Apps (Permissions explainer)IWA model and the permissions_policy manifest member
Window Management APIDefines the window-management powerful feature that gates unframed
URL Pattern StandardGrammar used by url_patterns (regular expressions excluded — details)
Source: documents fetched 2026-07-28

See also