Skip to content

Supported Web Features

Adam Simmons edited this page Dec 8, 2025 · 3 revisions

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.

WebKit Baseline

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).


⚡ JIT & WebAssembly Availability

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.


✅ Supported Features

Ultralight supports the majority of modern HTML5, CSS3, and JavaScript features available in Safari 16.4, including:

HTML & DOM

  • 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)
  • contenteditable attribute

CSS

  • 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
  • @supports queries
  • @media queries
  • :has() selector
  • Container Queries
  • aspect-ratio
  • box-shadow
  • Linear gradients (linear-gradient)
  • Radial gradients (radial-gradient)
  • @font-face and web fonts
  • calc(), min(), max(), clamp()
  • Logical properties (margin-inline, padding-block, etc.)
  • position: sticky
  • scroll-behavior: smooth

JavaScript & Web APIs

  • ES2022+ features (classes, modules, async/await, optional chaining, nullish coalescing, etc.)
  • Fetch API
  • Promises
  • Web Workers
  • Intersection Observer
  • Resize Observer
  • Mutation Observer
  • requestAnimationFrame
  • localStorage and sessionStorage
  • History API
  • URL API
  • Offscreen Canvas (2D operations)
  • Import Maps
  • Constructable Stylesheets
  • structuredClone()

Images & Media

  • JPEG, PNG, GIF, WebP
  • SVG
  • Animated WebP (can be used for short looping video clips—no audio)
  • <picture> element with srcset

❌ Unsupported Features

The following features are not supported in Ultralight. When designing web content for Ultralight, avoid relying on these features or provide appropriate fallbacks.

Graphics & Media

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.

CSS

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.

Canvas

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.

JavaScript APIs

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.

Form Elements

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.

Browser Features & Platform APIs

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.

⚠️ Partial Support & Workarounds

Video Content

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.

Date/Time Inputs

Use JavaScript date picker libraries such as:

Color Pickers

Build a custom color picker using:

  • Pickr
  • iro.js
  • Custom canvas-based implementation (using supported 2D canvas features)

Modal Dialogs

Replace alert(), confirm(), and prompt() with custom HTML/CSS modal components. Many UI frameworks provide these out of the box.

Cryptography

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

Math Rendering

For mathematical notation without MathML:

  • KaTeX — Fast, lightweight math rendering
  • MathJax — Full-featured math rendering

Testing Your Content

The best way to verify compatibility is to test your web content directly in Ultralight:

  1. MiniBrowser — The SDK includes a MiniBrowser application that you can use to load and test your web content directly
  2. Safari 16.4 — As a rough proxy, test in Safari 16.4 and disable any features listed above
  3. 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
}

Feature Reference Links


Questions & Support

If you encounter a feature that behaves differently than expected, or if you need clarification on support for a specific API, please:

  1. Check the Ultralight GitHub Issues for known issues
  2. Open a new issue with a minimal reproduction case
  3. Join the community discussions for help from other developers