v152 · enabled by default · isolated web apps
Unframed display mode for Isolated Web Apps
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.
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:
- Use desktop Chrome 152+ (Windows, macOS, Linux, ChromeOS — the flag is
kOsDesktop; Android, WebView, and iOS have no milestone in the detail record, and mobile OSs are an explicit explainer non-goal). - The window must belong to an installed Isolated Web App — signed web bundle,
isolated-app://scheme. For development installs, the demo project documents enablingchrome://flags/#enable-isolated-web-app-dev-modeplus#enable-unframed-iwaand installing throughchrome://web-app-internals(unframed-demo README, ChromeOS flow). - The app must hold the
window-managementpermission, requested in the manifest and granted by the user or an administrator policy (see requirements). - If the base feature is disabled in your build/channel, override with
chrome://flags/#enable-unframed-iwaor--enable-features=UnframedIwa.
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
| What it is | A 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 listing | Chrome 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 detail | Desktop 152; Android, WebView, iOS: no milestone; status text “In developer trial (Behind a flag)” (ChromeStatus API record) |
| Developer surface | Manifest: 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 feature | blink::features::kUnframedIwa — FEATURE_ENABLED_BY_DEFAULT at trunk (features.cc); flag entry enable-unframed-iwa, desktop OSes only (about_flags.cc) |
| Restriction | User agents MUST restrict unframed to Isolated Web Apps (Manifest Incubations); non-IWA apps silently fall back through the display-mode chain |
| Standards status | WICG Manifest Incubations — Community Group draft (CG-DRAFT); TAG review not required for IWA features per the Chromium IWA launch process |
| ChromeStatus | 5551475195904000 — Unframed display mode for Isolated Web Apps |
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):
- Window Controls Overlay shrinks the title bar to an overlay but keeps a system-drawn region for the window controls. A VDI client streaming a remote desktop ends up with two stacked title bars — the remote OS's and Chrome's overlay.
fullscreendisplay mode hides all browser UI but maximizes the window to the whole display — unframed windows must be able to be various sizes — and thefullscreendisplay mode is not available outside mobile.
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 motivationSyntax
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:
DisplayOverrideEntryObject— the object form of adisplay_overrideentry: thedisplayandurl_patternsmembers, the URL-pattern grammar and its no-regular-expression restriction, the processing algorithm, and the fallback chain.app-region— the CSS property that marks regions of an unframed (or window-controls-overlay) window as draggable, so the app can build a working custom title bar.
Inputs
| Input | Contract |
|---|---|
"unframed" string in display_override | Requests the mode for every window of the app; entries are tried in list order and the first supported candidate wins |
DisplayOverrideEntryObject in display_override | display (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 declarations | drag / no-drag on elements to build the draggable title bar — reference |
| Administrator policies | Enterprise policy can preset or block the mode per origin — see security and privacy |
Outputs
- Window appearance — when
unframedis the chosen display mode, the window has no window frame: no host-native title bar, no visible window controls (minimize/maximize/close), and the web contents extend to the entire window area (spec definition, quoted verbatim on the child page). - Media query —
@media (display-mode: unframed)matches inside an unframed window, so the app can restyle itself (for example to show its own title bar and window buttons) only when the frame is actually absent. - Dragging behaviour — regions marked
app-region: dragbecome the draggable surface that replaces the removed title bar. - Window operations move to the app — with no UA-drawn controls, closing, minimizing, and dragging are implemented by the app programmatically where applicable; the explainer points to the companion Additional Windowing Controls proposal for those APIs.
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.
unframed value, verified 2026-07-28)
Errors and fallback behaviour
| Situation | Behaviour |
|---|---|
| App is not an IWA | The 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 support | Same chain: unsupported entries are passed over; if no display_override entry applies, the display member is used |
Malformed display_override entries | During 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_patterns | That object entry produces no candidate for the window; the next entry in the fallback chain is considered |
| Navigation to an out-of-scope URL | The user agent MUST NOT allow it inside the unframed window — the destination opens in a new, regular window instead (see lifecycle) |
| Permission not granted | The 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) |
Context and requirements
- Isolated Web Apps only — the user agent MUST restrict
unframedto IWAs (spec). IWAs are signed web bundles served from theisolated-app://scheme (WICG/isolated-web-apps), so unframed windows never appear in normal web browsing. - Permission gate — the feature is gated behind the
window-managementpermission, “granted by the user or via admin policies” (explainer).window-managementis the powerful feature defined by the Window Management API (its Permission API integration section); the manifest request uses the IWApermissions_policymember (IWA Permissions explainer). - Desktop platforms only — the chrome://flags entry is
kOsDesktop; the ChromeStatus record lists no Android, WebView, or iOS milestone; mobile OSs are an explainer non-goal (“little distinction from full-screen mode”). The demo's install flow is documented for ChromeOS (unframed-demo, requires Chrome 146.0.7648.0+). - Secure package context — because the app is an IWA, its content is already integrity-verified by the bundle signature; the unframed request travels in the signed manifest inside the bundle.
Window lifecycle
- 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. - 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_patternsdoes not transition the window in and out of unframed mode, and the same holds for URL changes throughhistory.pushState()orwindow.location. (The explainer notes this may be revisited to allow dynamic changes in the future.) - 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.
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:
unframed only matches inside an actual unframed IWA window.Source: chrome-platform-showcaseA 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 unframed — BCD 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.
| Browser / platform | Support | Evidence |
|---|---|---|
| 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 default | milestone=152 listing; ChromeStatus API record; features.cc |
| Chrome Android / WebView / iOS | No milestone — not applicable (mobile OSs are an explainer non-goal) | ChromeStatus API record; explainer — non-goals |
| Edge | Not separately reported | Chromium-based; no separate position on the ChromeStatus record |
| Firefox | No signal | ChromeStatus API record vendor views |
| Safari | N/A | ChromeStatus 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.
Security and privacy
- Spoofing risk and mitigation — a frameless window lets the app draw over what was previously a trusted, UA-controlled region, enabling spoofing of other apps or of the user agent itself. Mitigations: the mode is restricted to IWAs (signed, integrity-verified packages) and gated behind the
window-managementpermission granted by the user or an administrator (spec — security and privacy considerations). - Relocated indicators — user agents normally show the app origin and privacy indicators (camera/microphone in use) in the title bar. With no title bar, those indicators move elsewhere, at a platform-dependent location chosen by the UA; the explainer shows Chrome on ChromeOS displaying the origin in app settings and privacy indicators on the OS shelf.
- Administrator control — the ChromeStatus record lists three enterprise policies that manage the feature: DefaultWindowManagementSetting (default window-management state for all apps), WindowManagementAllowedForUrls (listed IWA origins may enter unframed mode without user interaction), and WindowManagementBlockedForUrls (listed origins are blocked, forcing fallback to other display modes).
- No new data exposure — the mode changes window chrome, not information flow: the app learns nothing about the user it did not already know, and the display-mode media query reveals only the window state of the app's own window.
Specifications
| Document | Status |
|---|---|
| WICG Manifest Incubations — unframed display mode, display_override processing, draggable regions | Community Group draft (CG-DRAFT); the normative home of the unframed extension, DisplayOverrideEntryObject, the media query, and app-region |
| Unframed Windows explainer | Proposer 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 Manifest | Base 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 API | Defines the window-management powerful feature that gates unframed |
| URL Pattern Standard | Grammar used by url_patterns (regular expressions excluded — details) |
See also
- Chrome Platform Status — Unframed display mode for Isolated Web Apps (API record)
- Chromium tracking bug — crbug.com/477512407
- edman/unframed-demo — runnable demo IWA (ChromeOS install instructions)
- Additional Windowing Controls explainer — programmatic minimize/maximize/close/drag for frameless windows
- MDN — Window Controls Overlay API (adjacent: the closest existing alternative; MDN covers WCO but not
unframed— itsdisplay-modepage lists nounframedvalue, verified 2026-07-28) - Chrome Platform Showcase — demos for this feature
- chromeos.dev — Isolated Web Apps (platform documentation linked from the ChromeStatus summary)