-
Notifications
You must be signed in to change notification settings - Fork 205
Supported Web Features
Note: This document is current as of Ultralight v1.4.1.
Ultralight is a custom fork of WebKit designed for embedding in games and native applications. This document outlines which web features Ultralight supports and does not support, helping you design web content that works well within the Ultralight environment.
| Property | Value |
|---|---|
| WebKit Version | 615.1.18.100.1 |
| Safari Equivalent | ~16.4.1 (March 2023) |
| JavaScript Engine | JavaScriptCore |
Ultralight inherits most modern web features from Safari 16.4.1. For a comprehensive list of features supported by this Safari version, see the Can I Use browser support tables (filter by Safari 16.4).
JavaScript JIT compilation and WebAssembly support vary by license and platform:
| Platform | JIT | WebAssembly |
|---|---|---|
| Pro/Enterprise License (Windows, macOS, Linux) | ✅ | ✅ |
| Free License (all platforms) | ❌ | ❌ |
| PlayStation 4/5 | ❌ | ❌ |
| Xbox | ❌ | ❌ |
| Nintendo Switch 1/2 | ❌ | ❌ |
On platforms without JIT, JavaScript executes via the interpreter, which is slower but still fully functional. Design your application with this in mind if targeting console platforms or using the Free license.
Ultralight supports the majority of modern HTML5, CSS3, and JavaScript features available in Safari 16.4, including:
- HTML5 semantic elements (
<article>,<section>,<nav>,<header>,<footer>, etc.) - Custom Elements & Shadow DOM (Web Components)
- Declarative Shadow DOM
-
<template>and<slot>elements -
<canvas>element (2D context—see limitations below) - SVG (inline and as images)
-
<iframe>(including lazy loading) - Form elements (text inputs, textareas, checkboxes, radio buttons, select dropdowns, buttons)
-
contenteditableattribute
- CSS Filter Effects Module Level 1 and 2 (
filter: blur(5px),backdrop-filter, etc.) - CSS
mask-image - CSS Grid & Subgrid
- CSS Custom Properties (variables)
- CSS Transforms (2D / affine only)
- CSS Transitions & Animations
- Flexbox
-
@supportsqueries -
@mediaqueries -
:has()selector - Container Queries
aspect-ratiobox-shadow- Linear gradients (
linear-gradient) - Radial gradients (
radial-gradient) -
@font-faceand web fonts -
calc(),min(),max(),clamp() - Logical properties (
margin-inline,padding-block, etc.) position: stickyscroll-behavior: smooth
- ES2022+ features (classes, modules, async/await, optional chaining, nullish coalescing, etc.)
- Fetch API
- Promises
- Web Workers
- Intersection Observer
- Resize Observer
- Mutation Observer
requestAnimationFrame-
localStorageandsessionStorage - History API
- URL API
- Offscreen Canvas (2D operations)
- Import Maps
- Constructable Stylesheets
structuredClone()
- JPEG, PNG, GIF, WebP
- SVG
- Animated WebP (can be used for short looping video clips—no audio)
-
<picture>element withsrcset
The following features are not supported in Ultralight. When designing web content for Ultralight, avoid relying on these features or provide appropriate fallbacks.
| Feature | Notes |
|---|---|
| WebGL | GPU-accelerated 3D graphics via WebGL 1.0/2.0 is not available. Use SVG or the 2D canvas for visual effects. |
| WebRTC | Real-time peer-to-peer communication is not supported. |
| Web Audio API |
AudioContext, OscillatorNode, and related audio APIs are not available. |
| HTML5 Video/Audio |
<video> and <audio> elements with full media playback are not supported. Animated WebP is supported for short, silent looping clips only. |
| Media Source Extensions (MSE) | Adaptive streaming via MSE is not available. |
| Encrypted Media Extensions (EME) | DRM-protected content playback is not supported. |
| AVIF | AVIF image format is not supported. Use WebP, PNG, or JPEG instead. |
| Color Emojis | Color emoji rendering is not supported. Emojis will display as monochrome glyphs or may not render. Consider using emoji images or icon fonts as alternatives. |
| Feature | Notes |
|---|---|
| CSS 3D Transforms | 3D transform functions (rotateX, rotateY, rotateZ, rotate3d, translateZ, translate3d, scaleZ, scale3d, perspective, etc.) are not supported. Use 2D/affine transforms only. |
| Conic gradients |
conic-gradient() and repeating-conic-gradient() are not supported. Use linear or radial gradients as alternatives. |
text-shadow |
CSS text shadows are not rendered. Use the CSS filter: drop-shadow() property as an alternative. |
| Custom cursor images |
cursor: url(...) with custom images is not supported. Use standard CSS cursor keywords. |
border-image |
CSS border images are not supported. Use solid borders, box-shadow, or background images as alternatives. |
image-rendering |
The image-rendering property (e.g., pixelated, crisp-edges) is not supported. Images are always rendered with default interpolation. |
| Feature | Notes |
|---|---|
CanvasRenderingContext2D.filter |
The filter property on 2D canvas contexts is not available. |
getImageData() / putImageData() |
Direct pixel manipulation on canvas is not supported. |
imageSmoothingEnabled / imageSmoothingQuality |
Image smoothing control on 2D canvas contexts is not available. Images are always rendered with default smoothing. |
| Feature | Notes |
|---|---|
| Web Crypto API | The window.crypto object including crypto.subtle (SubtleCrypto) and crypto.getRandomValues() is not available. Use a pure JavaScript crypto library if needed. |
| Geolocation API |
navigator.geolocation is not available. Location must be provided by the host application if needed. |
| Device Orientation API | Accelerometer and gyroscope data via DeviceOrientationEvent is not supported. |
| Notifications API | Web push notifications and the Notifications API are not available. |
| Fullscreen API |
element.requestFullscreen() is not supported. Fullscreen behavior should be handled by the host application. |
| Feature | Notes |
|---|---|
<input type="color"> |
Color picker input is not available. Implement a custom color picker UI if needed. |
<input type="date"> |
Native date picker is not available. Use a JavaScript date picker library. |
<input type="datetime-local"> |
Native datetime picker is not available. |
<input type="month"> |
Native month picker is not available. |
<input type="time"> |
Native time picker is not available. |
<input type="week"> |
Native week picker is not available. |
<datalist> element |
Autocomplete suggestions via <datalist> are not supported. |
<input type="file"> |
Native file selection dialogs are not supported. File handling must be implemented via the host application. |
| Feature | Notes |
|---|---|
| JavaScript dialogs |
alert(), confirm(), and prompt() are not supported. Implement custom modal dialogs in HTML/CSS/JS. |
| OS Drag and Drop | Native drag-and-drop from the operating system is not available. Implement in-page drag-and-drop using JavaScript. |
| Download attribute | The download attribute on <a> elements is supported, but the host application must handle downloads via View::set_download_listener(). |
| Accessibility APIs | ARIA and platform accessibility hooks are not connected to OS accessibility services. |
| Input Method Editor (IME) | Advanced IME composition APIs are not supported, though external keyboard input and text input notifications are available. |
| MathML | Mathematical Markup Language rendering is not supported. Use images, SVG, or JavaScript-based math rendering (e.g., KaTeX, MathJax). |
| NPAPI Plugins | Legacy browser plugins (Flash, Java applets, etc.) are not supported. |
While full video playback is not supported, animated WebP files can be used for short, silent looping video clips (e.g., UI animations, background effects). Videos can be transcoded to animated WebP with high framerates and bit depth using ffmpeg.
Use JavaScript date picker libraries such as:
Build a custom color picker using:
Replace alert(), confirm(), and prompt() with custom HTML/CSS modal components. Many UI frameworks provide these out of the box.
For cryptographic operations without Web Crypto API:
- crypto-js — Hashing and encryption
- tweetnacl — Public-key cryptography
- seedrandom — Seedable random number generator
- Note: Pure JavaScript crypto libraries are slower than native implementations
For mathematical notation without MathML:
The best way to verify compatibility is to test your web content directly in Ultralight:
- MiniBrowser — The SDK includes a MiniBrowser application that you can use to load and test your web content directly
- Safari 16.4 — As a rough proxy, test in Safari 16.4 and disable any features listed above
- Feature Detection — Use feature detection in JavaScript to gracefully handle unsupported APIs:
// Example: Check for Web Crypto API
if (window.crypto && window.crypto.subtle) {
// Use native Web Crypto
} else {
// Fall back to JavaScript crypto library (e.g., crypto-js)
}
// Example: Check for WebGL
const canvas = document.createElement('canvas');
const hasWebGL = !!(canvas.getContext('webgl') || canvas.getContext('experimental-webgl'));
if (!hasWebGL) {
// Use 2D canvas or CSS fallbacks
}
// Example: Check for Web Audio
if (window.AudioContext || window.webkitAudioContext) {
// Use Web Audio API
} else {
// Audio features unavailable
}- Can I Use — Browser feature support tables (filter by Safari 16.4)
- WebKit Feature Status — WebKit implementation status
- MDN Web Docs — Comprehensive web API documentation
If you encounter a feature that behaves differently than expected, or if you need clarification on support for a specific API, please:
- Check the Ultralight GitHub Issues for known issues
- Open a new issue with a minimal reproduction case
- Join the community discussions for help from other developers