# Safari 27.0 adds 80 features and 844 fixes

> WebKit's Safari 27.0 post counts 80 features and 844 resolved issues, including service worker static routing, scroll anchoring, and customizable select.

Safari 27.0 includes 80 features and 844 resolved issues, according to WebKit's feature post of 2026-09-17. The feature count grew from 58 in the first beta. WebKit's chart classifies Safari 27 items as 86% resolved issues, 11% improved features, 2% brand-new features, and less than 1% deprecations. The changes cover APIs for page and worker code as well as Safari and its developer tools
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

<span id="what-the-release-counts"></span>

## API changes and developer tools

WebKit places static routing and the three stream additions in its Web API
section, while Safari MCP has its own section as a browser-development tool
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

### The parts a web app can call

WebKit describes the Service Worker static routing API as letting a service
worker declare routing rules so that certain
requests bypass the service worker altogether. MDN's reference for the method
that does it, `InstallEvent.addRoutes()`, describes static routes as rules "for
fetching specified resources that will be used even before service worker
startup", with a `source` of `network`, `cache`, `fetch-event`, or
`race-network-and-fetch-handler`, and a `condition` that can match on a
`URLPattern`, a request method, a request mode, a request destination, or the
service worker's own running status
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/); [MDN](https://developer.mozilla.org/en-US/docs/Web/API/InstallEvent/addRoutes)).

Streams get three additions in the same release. WebKit lists async iteration
over a readable stream with `for await...of`, the static
`ReadableStream.from()` method, and the ability to transfer a stream through
`postMessage()`. MDN describes `ReadableStream.from()` as returning a readable
stream from a provided iterable or async iterable object. Transferring a stream
over `postMessage()` gives the receiving context a readable stream. The Streams
Standard says the receiving side gets a
transferred stream that "can be used exactly like the original", while "the
original will become locked and no longer directly usable"
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/); [MDN](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/from_static); [Streams Standard](https://streams.spec.whatwg.org/#rs-transfer)).

Scroll anchoring changes browser behaviour without a method call. WebKit
describes it as adjusting the scroll position when content loads above the
viewport, so the page does not jump under the reader, and names the
`overflow-anchor` CSS property as the control. MDN's reference for that
property documents exactly two values, `auto` and `none`, and frames the
property as the way to turn the behaviour off for an element. Enabling it requires no call, since anchoring is on by default where supported
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/); [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-anchor)).

WebKit reports that `<select>` now supports full customization through
`appearance: base-select`, new pseudo-elements including `::picker-icon` and
`::checkmark`, and the ability to put HTML inside an `<option>`
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

Safari 27.0 also adds the `<selectedcontent>` element for controlling what the
selected option displays. WebKit says the customizable control remains a real
form control, retaining support for keyboard navigation, screen readers, form
submission, validation, and `change` events. Its new user-agent styles cover
light and dark modes as well as forced colors and disabled states
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

For images, the release adds the `auto` keyword for `sizes` on lazy-loaded
images. WebKit says this lets Safari calculate the image size from its actual
layout width once that width is known. Declarative shadow roots gain the
`shadowrootslotassignment` attribute, which selects `named` or `manual` slot
assignment directly in HTML
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

### The parts that change the environment

The Safari MCP server is a developer tool with no web API. WebKit says it is
available in Safari 27.0 and gives coding agents access to the DOM, network
requests, screenshots, and console output. To enable it, WebKit directs users to
Safari > Settings > Developer and the "Allow remote automation and external
agents" option; its Codex example starts `/usr/bin/safaridriver` with `--mcp`
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

The HTML `<model>` element is in the release for iOS and iPadOS as well as macOS, with
attributes WebKit names as `environmentmap` and `stagemode`. On visionOS the
same element plus a JavaScript Immersive API lets a site provide a custom
immersive environment, replacing the developer preview WebKit had shipped under
the name Spatial Backdrop
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

WebKit describes WebAssembly JSPI as allowing WebAssembly code written in a
synchronous style to suspend and wait for JavaScript promises
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

Safari 27.0's Web Inspector shows color-contrast information inside the Color
Picker. The Network tab shows every request in a redirect chain, the Elements
tab adds badges for Subgrid and Grid Lanes, and Timeline event details include
the layout root element. WebKit also says Safari MCP runs locally, makes no
network calls of its own, and sends captured data directly to the configured
agent; Apple does not receive it
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

The networking section adds support for setting `Secure` cookies on loopback
hosts over plain HTTP through JavaScript or `Set-Cookie`. The WebGPU section
adds the WGSL `clip_distances` built-in, which lets vertex shaders define custom
clipping planes before rasterization
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

Media changes include allowing `TextTrackCue.endTime` to be set to `Infinity`
for an unbounded cue and letting a hardware `VideoDecoder` override the color
space used for WebCodecs video when embedded color-space metadata is missing or
wrong. Canvas gains `srgb-linear` and
`display-p3-linear` predefined color spaces, while `CanvasPath.roundRect()` can
omit its `radii` argument to draw a rectangle with square corners
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

## Where the quality work went

WebKit describes its quality work through five themes: Compatibility,
Foundations, Depth, Alignment, and Integration. The detailed resolved-issues
list is organized by technology area. The post discusses the all-new ES module
loader under Foundations, and it also lists the standards-compliant loader
rewrite in the JavaScript feature section, where WebKit says the rewrite fixes
module ordering and initialization problems associated with top-level `await`
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

<span id="why-it-matters-for-pwa-developers"></span>

## Impact on service worker routing and streams

Static routing lets an installed service worker declare rules that are used
before service worker startup. Transferable streams let one context receive a
readable stream while the original becomes locked and no longer directly usable
([MDN](https://developer.mozilla.org/en-US/docs/Web/API/InstallEvent/addRoutes); [Streams Standard](https://streams.spec.whatwg.org/#rs-transfer)).

Scroll anchoring adjusts the scroll position when content loads above the
viewport, and `overflow-anchor: none` opts an element out. Customizable
`select` adds `appearance: base-select` and related pseudo-elements. It also allows HTML
content inside `<option>`
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/); [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-anchor)).

WebKit's article reports 80 features and 844 resolved issues for Safari 27.0
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

## Related entries on this site

- [Platforms](/reference/platforms/): see platform reference.
- [Baseline support overview](/reference/platforms/baseline-2026/): see Baseline 2026 coverage.
- [Compatibility by browser](/compatibility/by-browser/): see browser-by-browser compatibility view.

## Open and unverified

- How WebKit classified each item as resolved, improved, new, or deprecated is
  not confirmed.
- The complete per-platform availability matrix for the full Safari 27.0 feature set
  is not confirmed.
- Whether the full set of static-routing conditions and sources documented by MDN behaves
  identically in Safari 27.0 is not confirmed.
- The complete set of customizable-select pseudo-elements and `<model>`
  attributes shipped in Safari 27.0 is not enumerated here.
- Whether third-party coding agents all support the same Safari MCP workflow
  is not confirmed.

## Correction (2026-10-14)

The feature post was published on 2026-09-17 and reports 80 features. Its chart counts
items, without measuring effort. WebKit discusses the module-loader rewrite in both
the quality themes and the feature list, and provides the Safari MCP configuration
([WebKit](https://webkit.org/blog/18325/webkit-features-for-safari-27-0/)).

## Sources

- [WebKit's Safari 27.0 feature post, published 2026-09-17](https://webkit.org/blog/18325/) (webkit.org)
- [InstallEvent: addRoutes() method](https://developer.mozilla.org/en-US/docs/Web/API/InstallEvent/addRoutes) (developer.mozilla.org)
- [overflow-anchor](https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-anchor) (developer.mozilla.org)
- [ReadableStream: from() static method](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/from_static) (developer.mozilla.org)
- [Streams Standard: transferring a ReadableStream](https://streams.spec.whatwg.org/#rs-transfer) (streams.spec.whatwg.org)