diff --git a/docs/COMMAND_LINE_ARGS.md b/docs/COMMAND_LINE_ARGS.md
deleted file mode 100644
index 80626fdf5fa..00000000000
--- a/docs/COMMAND_LINE_ARGS.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Command line arguments
-
-Moved to the Servo book:
-
-- [Running servoshell](https://book.servo.org/running-servoshell.html)
-- Hacking on Servo
- - [Running servoshell](https://book.servo.org/hacking/running-servoshell.html)
diff --git a/docs/HACKING_QUICKSTART.md b/docs/HACKING_QUICKSTART.md
deleted file mode 100644
index 94a247b128b..00000000000
--- a/docs/HACKING_QUICKSTART.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Hacking Servo - Quickstart
-
-Moved to the Servo book:
-
-- [Hacking on Servo](https://book.servo.org/hacking/mach.html)
diff --git a/docs/ORGANIZATION.md b/docs/ORGANIZATION.md
deleted file mode 100644
index 4f955b33c2a..00000000000
--- a/docs/ORGANIZATION.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Servo’s directory structure
-
-Moved to the Servo book:
-
-- Servo’s architecture
- - [Directory structure](https://book.servo.org/architecture/directory-structure.html)
diff --git a/docs/STYLE_GUIDE.md b/docs/STYLE_GUIDE.md
deleted file mode 100644
index 8f011f5a64f..00000000000
--- a/docs/STYLE_GUIDE.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Style Guide
-
-Moved to the Servo book:
-
-- Pre-book docs
- - [docs/STYLE_GUIDE.md](https://book.servo.org/old/STYLE_GUIDE.html)
diff --git a/docs/components/style.md b/docs/components/style.md
deleted file mode 100644
index 6b63b9a96ba..00000000000
--- a/docs/components/style.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Servo's style system overview
-
-Moved to the Servo book:
-
-- Servo’s architecture
- - [Style](https://book.servo.org/architecture/style.html)
diff --git a/docs/components/webxr.md b/docs/components/webxr.md
deleted file mode 100644
index 85faba5e5d9..00000000000
--- a/docs/components/webxr.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# How WebXR works in Servo
-
-Moved to the Servo book:
-
-- Servo’s architecture
- - [WebXR](https://book.servo.org/architecture/webxr.html)
diff --git a/docs/debugging.md b/docs/debugging.md
deleted file mode 100644
index ed93c46cd2d..00000000000
--- a/docs/debugging.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Servo debugging guide
-
-Moved to the Servo book:
-
-- Hacking on Servo
- - [Debugging](https://book.servo.org/hacking/debugging.html)
diff --git a/docs/glossary.md b/docs/glossary.md
deleted file mode 100644
index b6bea10a1f9..00000000000
--- a/docs/glossary.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Glossary
-
-Moved to the Servo book:
-
-- Pre-book docs
- - [docs/glossary.md](https://book.servo.org/old/glossary.html)
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 00000000000..aa1380859fc
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,1211 @@
+
+
+
+
+
+ Servo-ML WebNN Conformance Report
+
+
+
+
+
+
+
+
Servo-ML WebNN Conformance
+
Test Report
+
Generated: 2026-04-24 07:53:17 UTC
+
+
+
+
+
+
+
+ Total Tests
+ 11244
+
+
+ Passed
+ 4998
+
+
+ Pass Rate
+ 44.5%
+
+
+
+
+
+ Conformance Tests
+
+ Total: 7512 | Passes: 2994 |
+ Rate: 39.9%
+
+
+
+
+ Test
+ Total
+ Passes
+ Pass Rate
+
+
+
+
+ abs
+ 57
+ 24
+ 42.1%
+
+
+ arg_min_max
+ 108
+ 54
+ 50.0%
+
+
+ averagePool2d
+ 120
+ 27
+ 22.5%
+
+
+ batch_normalization
+ 78
+ 27
+ 34.6%
+
+
+ batch_normalization_constant
+ 12
+ 6
+ 50.0%
+
+
+ byob_readtensor
+ 12
+ 0
+ 0.0%
+
+
+ cast
+ 90
+ 27
+ 30.0%
+
+
+ ceil
+ 48
+ 24
+ 50.0%
+
+
+ clamp
+ 144
+ 54
+ 37.5%
+
+
+ concat
+ 141
+ 63
+ 44.7%
+
+
+ constant-reshape-optimization
+ 9
+ 6
+ 66.7%
+
+
+ conv2d
+ 126
+ 42
+ 33.3%
+
+
+ conv_transpose2d
+ 132
+ 48
+ 36.4%
+
+
+ cos
+ 48
+ 24
+ 50.0%
+
+
+ cumulative_sum
+ 27
+ 15
+ 55.6%
+
+
+ dequantizeLinear
+ 45
+ 6
+ 13.3%
+
+
+ div
+ 66
+ 36
+ 54.5%
+
+
+ elu
+ 66
+ 30
+ 45.5%
+
+
+ equal
+ 72
+ 36
+ 50.0%
+
+
+ erf
+ 48
+ 24
+ 50.0%
+
+
+ exp
+ 48
+ 24
+ 50.0%
+
+
+ expand
+ 138
+ 57
+ 41.3%
+
+
+ floor
+ 48
+ 24
+ 50.0%
+
+
+ gather
+ 120
+ 54
+ 45.0%
+
+
+ gatherElements
+ 33
+ 15
+ 45.5%
+
+
+ gatherND
+ 42
+ 6
+ 14.3%
+
+
+ gelu
+ 45
+ 6
+ 13.3%
+
+
+ gemm
+ 144
+ 30
+ 20.8%
+
+
+ graph_devices
+ 6
+ 3
+ 50.0%
+
+
+ greater
+ 72
+ 33
+ 45.8%
+
+
+ greater_or_equal
+ 72
+ 36
+ 50.0%
+
+
+ gru
+ 78
+ 6
+ 7.7%
+
+
+ gru_cell
+ 30
+ 6
+ 20.0%
+
+
+ hard_sigmoid
+ 96
+ 48
+ 50.0%
+
+
+ hard_swish
+ 48
+ 24
+ 50.0%
+
+
+ identity
+ 102
+ 12
+ 11.8%
+
+
+ inputs-are-not-modified
+ 24
+ 18
+ 75.0%
+
+
+ inputs-with-special-names
+ 30
+ 9
+ 30.0%
+
+
+ instance_normalization
+ 48
+ 15
+ 31.2%
+
+
+ is_infinite
+ 51
+ 6
+ 11.8%
+
+
+ is_nan
+ 42
+ 6
+ 14.3%
+
+
+ l2Pool2d
+ 90
+ 6
+ 6.7%
+
+
+ layer_normalization
+ 81
+ 24
+ 29.6%
+
+
+ leaky_relu
+ 66
+ 33
+ 50.0%
+
+
+ lesser
+ 72
+ 33
+ 45.8%
+
+
+ lesser_or_equal
+ 72
+ 33
+ 45.8%
+
+
+ linear
+ 84
+ 42
+ 50.0%
+
+
+ log
+ 48
+ 24
+ 50.0%
+
+
+ logical_and
+ 39
+ 30
+ 76.9%
+
+
+ logical_not
+ 27
+ 24
+ 88.9%
+
+
+ logical_or
+ 39
+ 30
+ 76.9%
+
+
+ logical_xor
+ 39
+ 30
+ 76.9%
+
+
+ lstm
+ 90
+ 6
+ 6.7%
+
+
+ lstm_cell
+ 36
+ 6
+ 16.7%
+
+
+ matmul
+ 72
+ 42
+ 58.3%
+
+
+ max
+ 66
+ 36
+ 54.5%
+
+
+ maxPool2d
+ 84
+ 27
+ 32.1%
+
+
+ min
+ 66
+ 36
+ 54.5%
+
+
+ mlNumber
+ 12
+ 6
+ 50.0%
+
+
+ mul
+ 66
+ 36
+ 54.5%
+
+
+ neg
+ 57
+ 24
+ 42.1%
+
+
+ not_equal
+ 72
+ 33
+ 45.8%
+
+
+ operations-with-special-names
+ 18
+ 18
+ 100.0%
+
+
+ pad
+ 75
+ 6
+ 8.0%
+
+
+ parallel-dispatch
+ 66
+ 36
+ 54.5%
+
+
+ pow
+ 60
+ 27
+ 45.0%
+
+
+ prelu
+ 78
+ 9
+ 11.5%
+
+
+ qdq_subgraph
+ 228
+ 12
+ 5.3%
+
+
+ quantizeLinear
+ 48
+ 6
+ 12.5%
+
+
+ reciprocal
+ 48
+ 24
+ 50.0%
+
+
+ reduce_l1
+ 138
+ 63
+ 45.7%
+
+
+ reduce_l2
+ 135
+ 63
+ 46.7%
+
+
+ reduce_log_sum
+ 123
+ 57
+ 46.3%
+
+
+ reduce_log_sum_exp
+ 135
+ 63
+ 46.7%
+
+
+ reduce_max
+ 117
+ 54
+ 46.2%
+
+
+ reduce_mean
+ 135
+ 63
+ 46.7%
+
+
+ reduce_min
+ 117
+ 54
+ 46.2%
+
+
+ reduce_product
+ 117
+ 54
+ 46.2%
+
+
+ reduce_sum
+ 135
+ 63
+ 46.7%
+
+
+ reduce_sum_square
+ 138
+ 63
+ 45.7%
+
+
+ relu
+ 51
+ 24
+ 47.1%
+
+
+ resample2d
+ 45
+ 6
+ 13.3%
+
+
+ reshape
+ 198
+ 93
+ 47.0%
+
+
+ reverse
+ 30
+ 18
+ 60.0%
+
+
+ round_even
+ 36
+ 18
+ 50.0%
+
+
+ scalars
+ 48
+ 6
+ 12.5%
+
+
+ scatterElements
+ 30
+ 6
+ 20.0%
+
+
+ scatterND
+ 18
+ 6
+ 33.3%
+
+
+ shared_arraybuffer_constant
+ 15
+ 6
+ 40.0%
+
+
+ sigmoid
+ 48
+ 24
+ 50.0%
+
+
+ sign
+ 21
+ 18
+ 85.7%
+
+
+ sin
+ 48
+ 24
+ 50.0%
+
+
+ slice
+ 60
+ 27
+ 45.0%
+
+
+ softmax
+ 33
+ 21
+ 63.6%
+
+
+ softplus
+ 48
+ 24
+ 50.0%
+
+
+ softsign
+ 60
+ 27
+ 45.0%
+
+
+ split
+ 3
+ 0
+ 0.0%
+
+
+ sqrt
+ 48
+ 24
+ 50.0%
+
+
+ sub
+ 72
+ 36
+ 50.0%
+
+
+ subgraph
+ 306
+ 174
+ 56.9%
+
+
+ tan
+ 48
+ 24
+ 50.0%
+
+
+ tanh
+ 42
+ 24
+ 57.1%
+
+
+ tensor
+ 12
+ 0
+ 0.0%
+
+
+ tile
+ 24
+ 12
+ 50.0%
+
+
+ transpose
+ 3
+ 0
+ 0.0%
+
+
+ triangular
+ 102
+ 39
+ 38.2%
+
+
+ where
+ 108
+ 6
+ 5.6%
+
+
+
+
+
+
+ Validation Tests
+
+ Total: 3732 | Passes: 2004 |
+ Rate: 53.7%
+
+
+
+
+ Test
+ Total
+ Passes
+ Pass Rate
+
+
+
+
+ argMinMax
+ 54
+ 30
+ 55.6%
+
+
+ batchNormalization
+ 72
+ 72
+ 100.0%
+
+
+ build-more-than-once
+ 66
+ 60
+ 90.9%
+
+
+ cast
+ 12
+ 9
+ 75.0%
+
+
+ clamp
+ 33
+ 15
+ 45.5%
+
+
+ concat
+ 45
+ 24
+ 53.3%
+
+
+ constant-changed-buffer
+ 36
+ 24
+ 66.7%
+
+
+ constant
+ 276
+ 126
+ 45.7%
+
+
+ conv2d
+ 165
+ 60
+ 36.4%
+
+
+ convTranspose2d
+ 162
+ 48
+ 29.6%
+
+
+ createContext
+ 72
+ 60
+ 83.3%
+
+
+ cumulativeSum
+ 30
+ 24
+ 80.0%
+
+
+ dequantizeLinear
+ 51
+ 27
+ 52.9%
+
+
+ destroyContext
+ 78
+ 54
+ 69.2%
+
+
+ destroyGraph
+ 30
+ 24
+ 80.0%
+
+
+ elementwise-binary
+ 252
+ 147
+ 58.3%
+
+
+ elementwise-logical
+ 189
+ 135
+ 71.4%
+
+
+ elementwise-unary
+ 141
+ 51
+ 36.2%
+
+
+ elu
+ 24
+ 18
+ 75.0%
+
+
+ expand
+ 39
+ 24
+ 61.5%
+
+
+ gather
+ 39
+ 24
+ 61.5%
+
+
+ gatherElements
+ 33
+ 18
+ 54.5%
+
+
+ gatherND
+ 30
+ 15
+ 50.0%
+
+
+ gelu
+ 15
+ 9
+ 60.0%
+
+
+ gemm
+ 63
+ 30
+ 47.6%
+
+
+ gru
+ 78
+ 24
+ 30.8%
+
+
+ gruCell
+ 93
+ 24
+ 25.8%
+
+
+ hardSigmoid
+ 24
+ 18
+ 75.0%
+
+
+ hardSwish
+ 15
+ 9
+ 60.0%
+
+
+ input
+ 66
+ 54
+ 81.8%
+
+
+ instanceNormalization
+ 60
+ 30
+ 50.0%
+
+
+ invalid-rank
+ 24
+ 18
+ 75.0%
+
+
+ layerNormalization
+ 66
+ 39
+ 59.1%
+
+
+ leakyRelu
+ 24
+ 18
+ 75.0%
+
+
+ linear
+ 24
+ 18
+ 75.0%
+
+
+ lstm
+ 78
+ 30
+ 38.5%
+
+
+ lstmCell
+ 117
+ 30
+ 25.6%
+
+
+ matmul
+ 48
+ 27
+ 56.2%
+
+
+ opSupportLimits
+ 18
+ 6
+ 33.3%
+
+
+ pad
+ 39
+ 15
+ 38.5%
+
+
+ pooling-and-reduction-keep-dims
+ 30
+ 24
+ 80.0%
+
+
+ pooling
+ 126
+ 69
+ 54.8%
+
+
+ prelu
+ 33
+ 12
+ 36.4%
+
+
+ quantizeLinear
+ 48
+ 27
+ 56.2%
+
+
+ reduction
+ 186
+ 102
+ 54.8%
+
+
+ relu
+ 15
+ 9
+ 60.0%
+
+
+ resample2d
+ 87
+ 36
+ 41.4%
+
+
+ reshape
+ 36
+ 24
+ 66.7%
+
+
+ reverse
+ 21
+ 15
+ 71.4%
+
+
+ scatterElements
+ 48
+ 24
+ 50.0%
+
+
+ scatterND
+ 33
+ 15
+ 45.5%
+
+
+ sigmoid
+ 15
+ 9
+ 60.0%
+
+
+ slice
+ 39
+ 15
+ 38.5%
+
+
+ softmax
+ 24
+ 15
+ 62.5%
+
+
+ softplus
+ 15
+ 9
+ 60.0%
+
+
+ softsign
+ 15
+ 9
+ 60.0%
+
+
+ split
+ 36
+ 15
+ 41.7%
+
+
+ tanh
+ 15
+ 9
+ 60.0%
+
+
+ tile
+ 30
+ 21
+ 70.0%
+
+
+ transpose
+ 27
+ 18
+ 66.7%
+
+
+ triangular
+ 12
+ 9
+ 75.0%
+
+
+ unprintableNames
+ 18
+ 6
+ 33.3%
+
+
+ where
+ 42
+ 24
+ 57.1%
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/media/avplayback.md b/docs/media/avplayback.md
deleted file mode 100644
index 90e5235e394..00000000000
--- a/docs/media/avplayback.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# A/V Playback through HTMLMediaElement
-
-Media elements are used to present audio and/or video data to the user. The [HTMLMediaElement](https://html.spec.whatwg.org/multipage/media.html#htmlmediaelement) interface adds to [HTMLElement](https://html.spec.whatwg.org/multipage/dom.html#htmlelement) the properties and methods needed to support basic media-related capabilities that are common to audio and video. The [HTMLVideoElement](https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement) (``) and [HTMLAudioElement](https://html.spec.whatwg.org/multipage/media.html#htmlaudioelement) (``) elements both inherit this interface.
-
-
-`servo-media` exposes a Rust `Player` API that provides audio and video playback capabilities and it is used by Servo to [implement](https://github.com/servo/servo/blob/7bfa9179319d714656e7184e5159ea42595086e5/components/script/dom/htmlmediaelement.rs#L1) the HTMLMediaElement API.
-```rust
-/*
- This is an example of a very basic Player playing media from a file.
- NOTE: Some boilerplate has been removed for simplicity.
- Please, visit the examples folder for a more complete version.
-*/
-
-// Create Player instance
-let (sender, receiver) = ipc::channel().unwrap();
-let player = servo_media.create_player(
- &ClientContextId::build(1, 1),
- StreamType::Seekable,
- sender,
- None,
- None,
- Box::new(PlayerContextDummy()),
-);
-
-// Open file and set input size.
-let file = match File::open(&path)?;
-if let Ok(metadata) = file.metadata() {
- player
- .lock()
- .unwrap()
- .set_input_size(metadata.len())
- .unwrap();
-}
-
-// Read from file and push buffers to the player.
-let player_clone = Arc::clone(&player);
-thread::spawn(move || {
- let player = &player_clone;
- let mut buf_reader = BufReader::new(file);
- let mut buffer = [0; 1024];
- let mut read = |offset| {
- match buf_reader.read(&mut buffer[..]) {
- Ok(0) => {
- println!("Finished pushing data");
- break;
- }
- Ok(size) => player
- .lock()
- .unwrap()
- .push_data(Vec::from(&buffer[0..size]))
- .unwrap(),
- Err(e) => {
- eprintln!("Error: {}", e);
- break;
- }
- }
- };
-});
-
-// Start playing.
-player.lock().unwrap().play().unwrap();
-
-// Listen for Player events.
-while let Ok(event) = receiver.recv() {
- match event {
- PlayerEvent::EndOfStream => {
- println!("\nEOF");
- break;
- }
- PlayerEvent::Error(ref s) => {
- println!("\nError {:?}", s);
- break;
- }
- PlayerEvent::MetadataUpdated(ref m) => {
- println!("\nMetadata updated! {:?}", m);
- }
- PlayerEvent::DurationChanged(d) => {
- println!("\nDuration changed! {:?}", d);
- },
- PlayerEvent::StateChanged(ref s) => {
- println!("\nPlayer state changed to {:?}", s);
- }
- PlayerEvent::VideoFrameUpdated => eprint!("."),
- PlayerEvent::PositionChanged(p) => {}
- PlayerEvent::SeekData(_, _) => {}
- PlayerEvent::SeekDone(_) => {},
- PlayerEvent::NeedData => println!("\nNeedData"),
- PlayerEvent::EnoughData => println!("\nEnoughData"),
- }
-}
-```
-
-## Implementation
-The entry point of the media player implementation is the [ServoMedia.create_player()](https://github.com/servo/media/blob/b64b86b727ade722eaf571e65ff678364b69fc08/servo-media/lib.rs#L34) method that, among others, takes as argument an `IpcSender` to get events from the `Player` instance, and shared references to instances of [VideoFrameRenderer](https://github.com/servo/media/blob/main/player/video.rs#L71) and [AudioFrameRenderer](https://github.com/servo/media/blob/b64b86b727ade722eaf571e65ff678364b69fc08/player/audio.rs#L1) that will receive the video and audio frames respectively as they are produced by the media player.
-
-Backends are required to implement the [Player](https://github.com/servo/media/blob/main/player/lib.rs#L92) trait, which exposes a basic API to control a/v playback.
-
-The media player implementation does not deal with fetching the media data from any source. That task is left to the client. The `Player` trait exposes a [push_data()](https://github.com/servo/media/blob/b64b86b727ade722eaf571e65ff678364b69fc08/player/lib.rs#L101) method that gets a buffer of media data. The code that deals with fetching the media data in Servo lives within the [HTMLMediaElement implementation](https://github.com/servo/servo/blob/7bfa9179319d714656e7184e5159ea42595086e5/components/script/dom/htmlmediaelement.rs#L900). As Servo fetches data from the network or from a file, it [feeds](https://github.com/servo/servo/blob/7bfa9179319d714656e7184e5159ea42595086e5/components/script/dom/htmlmediaelement.rs#L2702) the media backend with media buffers. The media player decodes the given media data and builds the audio and/or video frames to be rendered by Servo. In the case of video frames, `servo-media` outputs frames either as raw images, by default, or as GL textures, if hardware acceleration is available. [WebRender](https://github.com/servo/webrender) is responsible for [rendering](https://github.com/servo/servo/blob/b41f5f97f26895f874514ce88cb359d65915738c/components/layout/display_list/builder.rs#L1883) the images that `servo-media` [outputs](https://github.com/servo/servo/blob/7bfa9179319d714656e7184e5159ea42595086e5/components/script/dom/htmlmediaelement.rs#L179).
-
-The [GStreamer](https://github.com/servo/media/blob/main/backends/gstreamer/player.rs#L776) implementation is mostly a wrapper around [GstPlayer](https://gstreamer.freedesktop.org/documentation/player/gstplayer.html?gi-language=c), which is a very convenient media playback API that hides many of the complex GStreamer details. It is built on top of the [playbin](https://gstreamer.freedesktop.org/documentation/playback/playbin3.html?gi-language=c) element, which provides a stand-alone everything-in-one abstraction for an audio and/or video player and that dynamically builds the appropriate decoding pipeline for the given media content.
-
-### Hardware acceleration
-TODO
-
diff --git a/docs/media/images/modular-routing1.png b/docs/media/images/modular-routing1.png
deleted file mode 100644
index f63746e9277..00000000000
Binary files a/docs/media/images/modular-routing1.png and /dev/null differ
diff --git a/docs/media/images/webaudiopipeline.png b/docs/media/images/webaudiopipeline.png
deleted file mode 100644
index d345387521c..00000000000
Binary files a/docs/media/images/webaudiopipeline.png and /dev/null differ
diff --git a/docs/media/images/webaudiopipeline_decoder.png b/docs/media/images/webaudiopipeline_decoder.png
deleted file mode 100644
index 48890634909..00000000000
Binary files a/docs/media/images/webaudiopipeline_decoder.png and /dev/null differ
diff --git a/docs/media/overview.md b/docs/media/overview.md
deleted file mode 100644
index eaaa69baeff..00000000000
--- a/docs/media/overview.md
+++ /dev/null
@@ -1,12 +0,0 @@
- # Servo Media - Overview
-
- The `servo-media` crate contains the backend implementation to support all [Servo](https://github.com/servo/servo) multimedia related functionality. This is:
- - the [HTMLMediaElement](https://html.spec.whatwg.org/multipage/media.html#htmlmediaelement) and the `` and `` elements.
- - the [WebAudio API](https://webaudio.github.io/web-audio-api).
- - the [WebRTC API](https://w3c.github.io/webrtc-pc/).
- - the [Media Capture and Streams APIs](https://w3c.github.io/mediacapture-main/#dom-mediadeviceinfo-groupid).
-
-`servo-media` is supposed to run properly on Linux, macOS, Windows and Android. Check the [build](https://github.com/servo/media/tree/f96c33b7374d5b9915b8bae8623723b2d23ec457#build) instructions for each specific platform.
-
-`servo-media` is built modularly from different crates and it provides an abstraction that allows the implementation of multiple media backends. For now, the only functional backend is [GStreamer](https://github.com/servo/media/tree/f96c33b7374d5b9915b8bae8623723b2d23ec457/backends/gstreamer). New backend implementations are required to implement the [Backend](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/servo-media/lib.rs#L33) trait. This trait is the public API that `servo-media` exposes to clients through the [ServoMedia](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/servo-media/lib.rs#L90) entry point. Check the [examples](https://github.com/servo/media/tree/f96c33b7374d5b9915b8bae8623723b2d23ec457/examples) folder to get a sense of how to use it effectively. Alternatively, you can also check how `servo-media` is integrated and used in [Servo](https://github.com/servo/servo).
-
diff --git a/docs/media/webaudio.md b/docs/media/webaudio.md
deleted file mode 100644
index cd6c78bd587..00000000000
--- a/docs/media/webaudio.md
+++ /dev/null
@@ -1,87 +0,0 @@
-# WebAudio
-
-The [WebAudio API](https://webaudio.github.io/web-audio-api/) is a high-level JavaScript API for processing and synthesizing audio in web applications.
-
-WebAudio uses a [Modular Routing](https://webaudio.github.io/web-audio-api/#ModularRouting) based model for processing audio, that allows connecting multiple different [AudioNode](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/node.rs#L122) inputs and/or outputs and make the audio flow through these connected nodes. In this model, nodes can be `sources` (no inputs and a single output), `destinations` (one input and no output) or `filters` (one or multiple inputs and outputs). The simplest example is a single source routed directly to the output.
-
-
-
-In WebAudio everything happens within an [AudioContext](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/context.rs#L105) instance that manages and plays all sounds to its single [AudioDestinationNode](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/destination_node.rs#L6). The audio can be rendered to hardware or to a buffer, for example, through [OfflineAudioContext](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/context.rs#L94).
-
-The `servo-media` Rust API for WebAudio is deliverately close to the actual WebAudio JavaScript API.
-
-```rust
-/*
- This is an example of a very basic WebAudio pipeline with an OscillatorNode connected to a GainNode.
- ------------------------------------------------------------
- | AudioContext |
- | OscillatorNode -> GainNode -> AudioDestinationNode |
- ------------------------------------------------------------
- NOTE: Some boilerplate has been removed for simplicity.
- Please, visit the examples folder for a more complete version.
-*/
-
-// Context creation.
-let context =
- servo_media.create_audio_context(&ClientContextId::build(1, 1), Default::default());
-
-// Create and configure nodes.
-let osc = context.create_node(
- AudioNodeInit::OscillatorNode(Default::default()),
- Default::default(),
-).expect("Failed to create oscillator node");
-let mut options = GainNodeOptions::default();
-options.gain = 0.5;
-let gain = context.create_node(AudioNodeInit::GainNode(options), Default::default())
- .expect("Failed to create gain node");
-
-// Connect nodes.
-let dest = context.dest_node();
-context.connect_ports(osc.output(0), gain.input(0));
-context.connect_ports(gain.output(0), dest.input(0));
-
-// Start playing.
-context.message_node(
- osc,
- AudioNodeMessage::AudioScheduledSourceNode(AudioScheduledSourceNodeMessage::Start(0.)),
-);
-```
-
-## Implementation
-
-### Threading model
-
-Following the [WebAudio API specification](https://webaudio.github.io/web-audio-api/#control-thread-and-rendering-thread), `servo-media` implements the concepts of [control thread](https://webaudio.github.io/web-audio-api/#control-thread) and [rendering thread](https://webaudio.github.io/web-audio-api/#rendering-thread).
-
-The `control thread` is the thread from which the `AudioContext` is instantiated and from which authors manipulate the audio graph. In Servo's case, this is the [script](https://github.com/servo/servo/blob/594ea14d5bd7b76d09b679fd0454165259ffbe7a/components/script/script_thread.rs#L5) thread.
-
-The `rendering thread` is where the magic and the actual audio processing happens. This thread keeps an [event loop](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/render_thread.rs#L250) that listens and handles control messages coming from the `control thread` and the audio backend and processes the audio coming from the audio graph in blocks of 128 samples-frames called [render quantums](https://webaudio.github.io/web-audio-api/#render-quantum). For each spin of the loop, the [AudioRenderThread.process](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/render_thread.rs#L233) method is called. This method internally runs a [DFS](https://en.wikipedia.org/wiki/Depth-first_search) traversal on the internal graph calling the [process](https://github.com/servo/media/blob/main/audio/node.rs#L126) method for each node. The resulting chunk of audio data is [pushed](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/render_thread.rs#L337) to the audio sink.
-
-### Audio Playback
-
-WebAudio allows clients to render the processed audio to hardware or to an audio buffer. To abstract this behavior, `servo-media` exposes the [AudioSink](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/sink.rs#L16) trait.
-
-For offline rendering to an audio buffer, there is an [OfflineAudioSink](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/offline_sink.rs#L38) implementation of the `AudioSink` trait.
-
-For hardware rendering, the `AudioSink` trait is expected to be implemented by the media backends. For `GStreamer` the [implementation](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/backends/gstreamer/audio_sink.rs#L73) creates a simple audio pipeline as the following:
-
-
-
-The core piece of the audio sink is the initial [appsrc](https://gstreamer.freedesktop.org/documentation/applib/gstappsrc.html?gi-language=c) element, that we use to insert the audio chunks into the GStreamer pipeline. We use the `appsrc` in push mode, where we repeatedly call the [push-buffer](https://gstreamer.freedesktop.org/documentation/applib/gstappsrc.html?gi-language=c#gst_app_src_push_buffer) method with a new buffer.
-To make audio playback nice and smooth and to continue processing control events coming from the `control thread`, we cannot use the appsrc's `block` property, that would essentially block the render thread when we fill the appsrc internal queue. Instead, we set the maximum amount of bytes that can be queued in the appsrc to 1 and use a combination of [get_current_level_bytes](https://gstreamer.freedesktop.org/documentation/applib/gstappsrc.html?gi-language=c#gst_app_src_get_current_level_bytes) and the [need-data](https://gstreamer.freedesktop.org/documentation/applib/gstappsrc.html?gi-language=c#GstAppSrc::need-data) signal to decide whether we should push the new audio buffer or not.
-
-### Audio Decoding
-
-WebAudio also supports decoding audio data.
-
-`servo-media` exposes a very simple [AudioDecoder](https://github.com/ferjm/media/blob/a95e063729324c359976236104d825244bb180e8/servo-media/src/audio/decoder.rs#L92) trait, that exposes a single `decode` method taking among other arguments the audio data to be decoded and an instance of [AudioDecoderCallbacks](https://github.com/ferjm/media/blob/a95e063729324c359976236104d825244bb180e8/servo-media/src/audio/decoder.rs#L1) containing the callbacks for the end-of-stream, error and progress events that are triggered during the decoding process.
-
-`servo-media` backends are required to implement this trait.
-
-The GStreamer backend implementation of the `AudioDecoder` trait creates a pipeline that has this form:
-
-
-
-The `decodebin` element is the core element of this pipeline and it auto-magically constructs a decoding pipeline using available decoders and demuxers via auto-plugging.
-
-