diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter
index 260ae32..41a98a9 100644
--- a/ci/licenses_golden/licenses_flutter
+++ b/ci/licenses_golden/licenses_flutter
@@ -1283,6 +1283,10 @@
 FILE: ../../../flutter/lib/web_ui/lib/src/engine/services/message_codecs.dart
 FILE: ../../../flutter/lib/web_ui/lib/src/engine/services/serialization.dart
 FILE: ../../../flutter/lib/web_ui/lib/src/engine/shadow.dart
+FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart
+FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart
+FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart
+FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart
 FILE: ../../../flutter/lib/web_ui/lib/src/engine/svg.dart
 FILE: ../../../flutter/lib/web_ui/lib/src/engine/test_embedding.dart
 FILE: ../../../flutter/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart
diff --git a/lib/web_ui/dev/steps/compile_tests_step.dart b/lib/web_ui/dev/steps/compile_tests_step.dart
index 40656b5..e9931b7 100644
--- a/lib/web_ui/dev/steps/compile_tests_step.dart
+++ b/lib/web_ui/dev/steps/compile_tests_step.dart
@@ -186,11 +186,16 @@
   // different dart2js options.
   final List<FilePath> htmlTargets = <FilePath>[];
   final List<FilePath> canvasKitTargets = <FilePath>[];
+  final List<FilePath> skwasmTargets = <FilePath>[];
   final String canvasKitTestDirectory =
       pathlib.join(environment.webUiTestDir.path, 'canvaskit');
+  final String skwasmTestDirectory =
+      pathlib.join(environment.webUiTestDir.path, 'skwasm');
   for (final FilePath testFile in testFiles) {
     if (pathlib.isWithin(canvasKitTestDirectory, testFile.absolute)) {
       canvasKitTargets.add(testFile);
+    } else if (pathlib.isWithin(skwasmTestDirectory, testFile.absolute)) {
+      skwasmTargets.add(testFile);
     } else {
       htmlTargets.add(testFile);
     }
@@ -198,9 +203,11 @@
 
   await Future.wait(<Future<void>>[
     if (htmlTargets.isNotEmpty)
-      _compileTestsInParallel(targets: htmlTargets, forCanvasKit: false),
+      _compileTestsInParallel(targets: htmlTargets),
     if (canvasKitTargets.isNotEmpty)
       _compileTestsInParallel(targets: canvasKitTargets, forCanvasKit: true),
+    if (skwasmTargets.isNotEmpty)
+      _compileTestsInParallel(targets: skwasmTargets, forSkwasm: true),
   ]);
 
   stopwatch.stop();
@@ -220,11 +227,12 @@
 /// Spawns multiple dart2js processes to compile [targets] in parallel.
 Future<void> _compileTestsInParallel({
   required List<FilePath> targets,
-  required bool forCanvasKit,
+  bool forCanvasKit = false,
+  bool forSkwasm = false,
 }) async {
   final Stream<bool> results = _dart2jsPool.forEach(
     targets,
-    (FilePath file) => compileUnitTest(file, forCanvasKit: forCanvasKit),
+    (FilePath file) => compileUnitTest(file, forCanvasKit: forCanvasKit, forSkwasm: forSkwasm),
   );
   await for (final bool isSuccess in results) {
     if (!isSuccess) {
@@ -250,7 +258,7 @@
 /// directory before test are build. See [_copyFilesFromTestToBuild].
 ///
 /// Later the extra files will be deleted in [_cleanupExtraFilesUnderTestDir].
-Future<bool> compileUnitTest(FilePath input, {required bool forCanvasKit}) async {
+Future<bool> compileUnitTest(FilePath input, {required bool forCanvasKit, required bool forSkwasm}) async {
   final String targetFileName = pathlib.join(
     environment.webUiBuildDir.path,
     '${input.relativeToWebUi}.browser_test.dart.js',
@@ -277,6 +285,7 @@
     // renderer explicitly.
     '-DFLUTTER_WEB_AUTO_DETECT=false',
     '-DFLUTTER_WEB_USE_SKIA=$forCanvasKit',
+    '-DFLUTTER_WEB_USE_SKWASM=$forSkwasm',
 
     '-O2',
     '-o',
diff --git a/lib/web_ui/lib/src/engine/configuration.dart b/lib/web_ui/lib/src/engine/configuration.dart
index 948404a..395e3f8 100644
--- a/lib/web_ui/lib/src/engine/configuration.dart
+++ b/lib/web_ui/lib/src/engine/configuration.dart
@@ -68,6 +68,9 @@
   static const bool flutterWebAutoDetect =
       bool.fromEnvironment('FLUTTER_WEB_AUTO_DETECT', defaultValue: true);
 
+  static const bool flutterWebUseSkwasm =
+      bool.fromEnvironment('FLUTTER_WEB_USE_SKWASM');
+
   /// Enable the Skia-based rendering backend.
   ///
   /// Using flutter tools option "--web-render=canvaskit" would set the value to
diff --git a/lib/web_ui/lib/src/engine/renderer.dart b/lib/web_ui/lib/src/engine/renderer.dart
index e66d77f..41523b3 100644
--- a/lib/web_ui/lib/src/engine/renderer.dart
+++ b/lib/web_ui/lib/src/engine/renderer.dart
@@ -15,6 +15,7 @@
 import 'fonts.dart';
 import 'html/renderer.dart';
 import 'html_image_codec.dart';
+import 'skwasm/skwasm_stub/renderer.dart' if (dart.library.ffi) 'skwasm/skwasm_impl/renderer.dart';
 
 final Renderer _renderer = Renderer._internal();
 Renderer get renderer => _renderer;
@@ -26,6 +27,9 @@
 /// of functionality needed by the rest of the generic web engine code.
 abstract class Renderer {
   factory Renderer._internal() {
+    if (FlutterConfiguration.flutterWebUseSkwasm) {
+      return SkwasmRenderer();
+    }
     bool useCanvasKit;
     if (FlutterConfiguration.flutterWebAutoDetect) {
       if (requestedRendererType != null) {
@@ -154,27 +158,27 @@
   ui.Path combinePaths(ui.PathOperation op, ui.Path path1, ui.Path path2);
 
   ui.TextStyle createTextStyle({
-    ui.Color? color,
-    ui.TextDecoration? decoration,
-    ui.Color? decorationColor,
-    ui.TextDecorationStyle? decorationStyle,
-    double? decorationThickness,
-    ui.FontWeight? fontWeight,
-    ui.FontStyle? fontStyle,
-    ui.TextBaseline? textBaseline,
-    String? fontFamily,
-    List<String>? fontFamilyFallback,
-    double? fontSize,
-    double? letterSpacing,
-    double? wordSpacing,
-    double? height,
-    ui.TextLeadingDistribution? leadingDistribution,
-    ui.Locale? locale,
-    ui.Paint? background,
-    ui.Paint? foreground,
-    List<ui.Shadow>? shadows,
-    List<ui.FontFeature>? fontFeatures,
-    List<ui.FontVariation>? fontVariations,
+    required ui.Color? color,
+    required ui.TextDecoration? decoration,
+    required ui.Color? decorationColor,
+    required ui.TextDecorationStyle? decorationStyle,
+    required double? decorationThickness,
+    required ui.FontWeight? fontWeight,
+    required ui.FontStyle? fontStyle,
+    required ui.TextBaseline? textBaseline,
+    required String? fontFamily,
+    required List<String>? fontFamilyFallback,
+    required double? fontSize,
+    required double? letterSpacing,
+    required double? wordSpacing,
+    required double? height,
+    required ui.TextLeadingDistribution? leadingDistribution,
+    required ui.Locale? locale,
+    required ui.Paint? background,
+    required ui.Paint? foreground,
+    required List<ui.Shadow>? shadows,
+    required List<ui.FontFeature>? fontFeatures,
+    required List<ui.FontVariation>? fontVariations,
   });
 
   ui.ParagraphStyle createParagraphStyle({
diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart
new file mode 100644
index 0000000..554302e
--- /dev/null
+++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart
@@ -0,0 +1,7 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+library skwasm_impl;
+
+export 'skwasm_impl/renderer.dart';
diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart
new file mode 100644
index 0000000..ff240be
--- /dev/null
+++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart
@@ -0,0 +1,168 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:math' as math;
+import 'dart:typed_data';
+
+import 'package:ui/ui.dart' as ui;
+
+import '../../embedder.dart';
+import '../../fonts.dart';
+import '../../html_image_codec.dart';
+import '../../renderer.dart';
+
+// TODO(jacksongardner): Actually implement skwasm renderer.
+class SkwasmRenderer implements Renderer {
+  @override
+  ui.Path combinePaths(ui.PathOperation op, ui.Path path1, ui.Path path2) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.ImageFilter composeImageFilters({required ui.ImageFilter outer, required ui.ImageFilter inner}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.Path copyPath(ui.Path src) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.ImageFilter createBlurImageFilter({double sigmaX = 0.0, double sigmaY = 0.0, ui.TileMode tileMode = ui.TileMode.clamp}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.Canvas createCanvas(ui.PictureRecorder recorder, [ui.Rect? cullRect]) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.Gradient createConicalGradient(ui.Offset focal, double focalRadius, ui.Offset center, double radius, List<ui.Color> colors, [List<double>? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix]) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.ImageFilter createDilateImageFilter({double radiusX = 0.0, double radiusY = 0.0}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.ImageFilter createErodeImageFilter({double radiusX = 0.0, double radiusY = 0.0}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.ImageShader createImageShader(ui.Image image, ui.TileMode tmx, ui.TileMode tmy, Float64List matrix4, ui.FilterQuality? filterQuality) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.Gradient createLinearGradient(ui.Offset from, ui.Offset to, List<ui.Color> colors, [List<double>? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix4]) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.ImageFilter createMatrixImageFilter(Float64List matrix4, {ui.FilterQuality filterQuality = ui.FilterQuality.low}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.Paint createPaint() {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.ParagraphBuilder createParagraphBuilder(ui.ParagraphStyle style) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.ParagraphStyle createParagraphStyle({ui.TextAlign? textAlign, ui.TextDirection? textDirection, int? maxLines, String? fontFamily, double? fontSize, double? height, ui.TextHeightBehavior? textHeightBehavior, ui.FontWeight? fontWeight, ui.FontStyle? fontStyle, ui.StrutStyle? strutStyle, String? ellipsis, ui.Locale? locale}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.Path createPath() {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.PictureRecorder createPictureRecorder() {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.Gradient createRadialGradient(ui.Offset center, double radius, List<ui.Color> colors, [List<double>? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix4]) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.SceneBuilder createSceneBuilder() {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.StrutStyle createStrutStyle({String? fontFamily, List<String>? fontFamilyFallback, double? fontSize, double? height, ui.TextLeadingDistribution? leadingDistribution, double? leading, ui.FontWeight? fontWeight, ui.FontStyle? fontStyle, bool? forceStrutHeight}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.Gradient createSweepGradient(ui.Offset center, List<ui.Color> colors, [List<double>? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, double startAngle = 0.0, double endAngle = math.pi * 2, Float32List? matrix4]) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.TextStyle createTextStyle({ui.Color? color, ui.TextDecoration? decoration, ui.Color? decorationColor, ui.TextDecorationStyle? decorationStyle, double? decorationThickness, ui.FontWeight? fontWeight, ui.FontStyle? fontStyle, ui.TextBaseline? textBaseline, String? fontFamily, List<String>? fontFamilyFallback, double? fontSize, double? letterSpacing, double? wordSpacing, double? height, ui.TextLeadingDistribution? leadingDistribution, ui.Locale? locale, ui.Paint? background, ui.Paint? foreground, List<ui.Shadow>? shadows, List<ui.FontFeature>? fontFeatures, List<ui.FontVariation>? fontVariations}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.Vertices createVertices(ui.VertexMode mode, List<ui.Offset> positions, {List<ui.Offset>? textureCoordinates, List<ui.Color>? colors, List<int>? indices}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  ui.Vertices createVerticesRaw(ui.VertexMode mode, Float32List positions, {Float32List? textureCoordinates, Int32List? colors, Uint16List? indices}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  void decodeImageFromPixels(Uint8List pixels, int width, int height, ui.PixelFormat format, ui.ImageDecoderCallback callback, {int? rowBytes, int? targetWidth, int? targetHeight, bool allowUpscaling = true}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  FontCollection get fontCollection => throw UnimplementedError('Not yet implemented');
+
+  @override
+  FutureOr<void> initialize() {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  Future<ui.Codec> instantiateImageCodec(Uint8List list, {int? targetWidth, int? targetHeight, bool allowUpscaling = true}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  Future<ui.Codec> instantiateImageCodecFromUrl(Uri uri, {WebOnlyImageCodecChunkCallback? chunkCallback}) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  void renderScene(ui.Scene scene) {
+    throw UnimplementedError('Not yet implemented');
+  }
+
+  @override
+  String get rendererTag => throw UnimplementedError('Not yet implemented');
+
+  @override
+  void reset(FlutterViewEmbedder embedder) {
+    throw UnimplementedError('Not yet implemented');
+  }
+}
diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart
new file mode 100644
index 0000000..32f7960
--- /dev/null
+++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart
@@ -0,0 +1,7 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+library skwasm_stub;
+
+export 'skwasm_stub/renderer.dart';
diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart
new file mode 100644
index 0000000..6858335
--- /dev/null
+++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart
@@ -0,0 +1,167 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:math' as math;
+import 'dart:typed_data';
+
+import 'package:ui/ui.dart' as ui;
+
+import '../../embedder.dart';
+import '../../fonts.dart';
+import '../../html_image_codec.dart';
+import '../../renderer.dart';
+
+class SkwasmRenderer implements Renderer {
+  @override
+  ui.Path combinePaths(ui.PathOperation op, ui.Path path1, ui.Path path2) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.ImageFilter composeImageFilters({required ui.ImageFilter outer, required ui.ImageFilter inner}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.Path copyPath(ui.Path src) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.ImageFilter createBlurImageFilter({double sigmaX = 0.0, double sigmaY = 0.0, ui.TileMode tileMode = ui.TileMode.clamp}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.Canvas createCanvas(ui.PictureRecorder recorder, [ui.Rect? cullRect]) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.Gradient createConicalGradient(ui.Offset focal, double focalRadius, ui.Offset center, double radius, List<ui.Color> colors, [List<double>? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix]) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.ImageFilter createDilateImageFilter({double radiusX = 0.0, double radiusY = 0.0}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.ImageFilter createErodeImageFilter({double radiusX = 0.0, double radiusY = 0.0}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.ImageShader createImageShader(ui.Image image, ui.TileMode tmx, ui.TileMode tmy, Float64List matrix4, ui.FilterQuality? filterQuality) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.Gradient createLinearGradient(ui.Offset from, ui.Offset to, List<ui.Color> colors, [List<double>? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix4]) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.ImageFilter createMatrixImageFilter(Float64List matrix4, {ui.FilterQuality filterQuality = ui.FilterQuality.low}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.Paint createPaint() {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.ParagraphBuilder createParagraphBuilder(ui.ParagraphStyle style) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.ParagraphStyle createParagraphStyle({ui.TextAlign? textAlign, ui.TextDirection? textDirection, int? maxLines, String? fontFamily, double? fontSize, double? height, ui.TextHeightBehavior? textHeightBehavior, ui.FontWeight? fontWeight, ui.FontStyle? fontStyle, ui.StrutStyle? strutStyle, String? ellipsis, ui.Locale? locale}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.Path createPath() {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.PictureRecorder createPictureRecorder() {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.Gradient createRadialGradient(ui.Offset center, double radius, List<ui.Color> colors, [List<double>? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix4]) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.SceneBuilder createSceneBuilder() {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.StrutStyle createStrutStyle({String? fontFamily, List<String>? fontFamilyFallback, double? fontSize, double? height, ui.TextLeadingDistribution? leadingDistribution, double? leading, ui.FontWeight? fontWeight, ui.FontStyle? fontStyle, bool? forceStrutHeight}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.Gradient createSweepGradient(ui.Offset center, List<ui.Color> colors, [List<double>? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, double startAngle = 0.0, double endAngle = math.pi * 2, Float32List? matrix4]) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.TextStyle createTextStyle({ui.Color? color, ui.TextDecoration? decoration, ui.Color? decorationColor, ui.TextDecorationStyle? decorationStyle, double? decorationThickness, ui.FontWeight? fontWeight, ui.FontStyle? fontStyle, ui.TextBaseline? textBaseline, String? fontFamily, List<String>? fontFamilyFallback, double? fontSize, double? letterSpacing, double? wordSpacing, double? height, ui.TextLeadingDistribution? leadingDistribution, ui.Locale? locale, ui.Paint? background, ui.Paint? foreground, List<ui.Shadow>? shadows, List<ui.FontFeature>? fontFeatures, List<ui.FontVariation>? fontVariations}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.Vertices createVertices(ui.VertexMode mode, List<ui.Offset> positions, {List<ui.Offset>? textureCoordinates, List<ui.Color>? colors, List<int>? indices}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  ui.Vertices createVerticesRaw(ui.VertexMode mode, Float32List positions, {Float32List? textureCoordinates, Int32List? colors, Uint16List? indices}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  void decodeImageFromPixels(Uint8List pixels, int width, int height, ui.PixelFormat format, ui.ImageDecoderCallback callback, {int? rowBytes, int? targetWidth, int? targetHeight, bool allowUpscaling = true}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  FontCollection get fontCollection => throw UnimplementedError('Skwasm not implemented on this platform.');
+
+  @override
+  FutureOr<void> initialize() {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  Future<ui.Codec> instantiateImageCodec(Uint8List list, {int? targetWidth, int? targetHeight, bool allowUpscaling = true}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  Future<ui.Codec> instantiateImageCodecFromUrl(Uri uri, {WebOnlyImageCodecChunkCallback? chunkCallback}) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  void renderScene(ui.Scene scene) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+
+  @override
+  String get rendererTag => throw UnimplementedError('Skwasm not implemented on this platform.');
+
+  @override
+  void reset(FlutterViewEmbedder embedder) {
+    throw UnimplementedError('Skwasm not implemented on this platform.');
+  }
+}
diff --git a/lib/web_ui/test/skwasm/smoke_test.dart b/lib/web_ui/test/skwasm/smoke_test.dart
new file mode 100644
index 0000000..74c5a30
--- /dev/null
+++ b/lib/web_ui/test/skwasm/smoke_test.dart
@@ -0,0 +1,27 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+@TestOn('chrome || safari || firefox')
+
+import 'dart:async';
+
+import 'package:test/bootstrap/browser.dart';
+import 'package:test/test.dart';
+import 'package:ui/src/engine/renderer.dart';
+import 'package:ui/src/engine/skwasm/skwasm_stub/renderer.dart';
+
+void main() {
+  internalBootstrapBrowserTest(() => testMain);
+}
+
+Future<void> testMain() async {
+  group('Skwasm stub tests', () {
+    test('Skwasm stub renderer throws', () {
+      expect(renderer, isA<SkwasmRenderer>());
+      expect(() {
+        renderer.initialize();
+      }, throwsUnimplementedError);
+    });
+  });
+}
diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn
index ba7d190..1c653d5 100644
--- a/web_sdk/BUILD.gn
+++ b/web_sdk/BUILD.gn
@@ -19,17 +19,6 @@
                              ],
                              "list lines")
 
-web_engine_sources =
-    exec_script("//third_party/dart/tools/list_dart_files.py",
-                [
-                  "absolute",
-                  rebase_path("//flutter/lib/web_ui/lib/src/engine"),
-                ],
-                "list lines")
-
-web_engine_sources +=
-    [ rebase_path("//flutter/lib/web_ui/lib/src/engine.dart") ]
-
 group("web_sdk") {
   deps = [
     ":flutter_dartdevc_canvaskit_html_kernel_sdk",
@@ -43,60 +32,100 @@
   ]
 }
 
-prebuilt_dart_action("web_ui_sources") {
-  inputs = web_ui_sources + [ "sdk_rewriter.dart" ]
+template("sdk_rewriter") {
+  ui = defined(invoker.ui) && invoker.ui
+  if (!ui) {
+    assert(defined(invoker.library_name), "Must pass 'library_name'")
+    assert(defined(invoker.api_file), "Must pass 'api_file'")
+  }
+  assert(defined(invoker.input_dir), "Must pass 'input_dir'")
+  assert(defined(invoker.output_dir), "Must pass 'output_dir'")
 
-  packages = dart_sdk_package_config
-  script = "sdk_rewriter.dart"
-  output_dir = rebase_path("$root_out_dir/flutter_web_sdk/lib/ui/")
-  input_dir = rebase_path("//flutter/lib/web_ui/lib/")
-  pool = "//flutter/build/dart:dart_pool"
+  source_dart_files = exec_script("//third_party/dart/tools/list_dart_files.py",
+                                  [
+                                    "absolute",
+                                    rebase_path(invoker.input_dir),
+                                  ],
+                                  "list lines")
 
-  outputs = [
-    "$target_gen_dir/$target_name.stamp",
-    "$root_out_dir/flutter_web_sdk/lib/ui/",
-  ]
+  if (defined(invoker.exclude_patterns)) {
+    filtered_files = filter_exclude(source_dart_files, invoker.exclude_patterns)
+    source_dart_files = []
+    source_dart_files = filtered_files
+  }
 
-  args = [
-    "--output-dir=$output_dir",
-    "--input-dir=$input_dir",
-    "--ui",
-    "--stamp",
-    rebase_path(outputs[0], root_build_dir),
-  ]
+  prebuilt_dart_action(target_name) {
+    packages = dart_sdk_package_config
+    pool = "//flutter/build/dart:dart_pool"
 
-  foreach(source_file, web_ui_sources) {
-    path = rebase_path(source_file)
-    args += [ "--input=$path" ]
+    script = "sdk_rewriter.dart"
+    inputs = source_dart_files + [ "sdk_rewriter.dart" ]
+
+    stamp_location = "$target_gen_dir/$target_name.stamp"
+    outputs = [
+      stamp_location,
+      invoker.output_dir,
+    ]
+
+    input_dir = rebase_path(invoker.input_dir)
+    output_dir = rebase_path(invoker.output_dir)
+
+    args = [
+      "--output-dir=$output_dir",
+      "--input-dir=$input_dir",
+      "--stamp",
+      rebase_path(stamp_location, root_build_dir),
+    ]
+    if (ui) {
+      args += [ "--ui" ]
+    } else {
+      library_name = invoker.library_name
+      api_file = rebase_path(invoker.api_file)
+      args += [
+        "--library-name=$library_name",
+        "--api-file=$api_file",
+      ]
+    }
+
+    foreach(source_file, source_dart_files) {
+      path = rebase_path(source_file)
+      args += [ "--source-file=$path" ]
+    }
   }
 }
 
-prebuilt_dart_action("web_engine_sources") {
-  inputs = web_engine_sources + [ "sdk_rewriter.dart" ]
+sdk_rewriter("web_ui_library_sources") {
+  ui = true
+  input_dir = "//flutter/lib/web_ui/lib/"
+  output_dir = "$root_out_dir/flutter_web_sdk/lib/ui/"
 
-  packages = dart_sdk_package_config
-  script = "sdk_rewriter.dart"
-  output_dir = rebase_path("$root_out_dir/flutter_web_sdk/lib/_engine/")
-  input_dir = rebase_path("//flutter/lib/web_ui/lib/src/")
-  pool = "//flutter/build/dart:dart_pool"
+  # exclude everything in the engine directory, it will be a separate internal library
+  exclude_patterns = [ rebase_path("//flutter/lib/web_ui/lib/src/*") ]
+}
 
-  outputs = [
-    "$target_gen_dir/$target_name.stamp",
-    "$root_out_dir/flutter_web_sdk/lib/_engine/",
-  ]
+sdk_rewriter("web_engine_library") {
+  library_name = "engine"
+  api_file = "//flutter/lib/web_ui/lib/src/engine.dart"
+  input_dir = "//flutter/lib/web_ui/lib/src/engine/"
+  output_dir = "$root_out_dir/flutter_web_sdk/lib/_engine/"
 
-  args = [
-    "--output-dir=$output_dir",
-    "--input-dir=$input_dir",
-    "--engine",
-    "--stamp",
-    rebase_path(outputs[0], root_build_dir),
-  ]
+  # exclude skwasm, it will be a separate internal library
+  exclude_patterns =
+      [ rebase_path("//flutter/lib/web_ui/lib/src/engine/skwasm/*") ]
+}
 
-  foreach(source_file, web_engine_sources) {
-    path = rebase_path(source_file)
-    args += [ "--input=$path" ]
-  }
+sdk_rewriter("skwasm_stub_library") {
+  library_name = "skwasm_stub"
+  api_file = "//flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart"
+  input_dir = "//flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/"
+  output_dir = "$root_out_dir/flutter_web_sdk/lib/_skwasm_stub/"
+}
+
+sdk_rewriter("skwasm_impl_library") {
+  library_name = "skwasm_impl"
+  api_file = "//flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart"
+  input_dir = "//flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/"
+  output_dir = "$root_out_dir/flutter_web_sdk/lib/_skwasm_impl/"
 }
 
 copy("web_ui_library") {
@@ -119,9 +148,11 @@
     action(target_name) {
       not_needed(invoker, [ "packages" ])
       deps = [
-        ":web_engine_sources",
+        ":skwasm_impl_library",
+        ":skwasm_stub_library",
+        ":web_engine_library",
         ":web_ui_library",
-        ":web_ui_sources",
+        ":web_ui_library_sources",
         "//flutter:dart_sdk",
       ]
       script = "//build/gn_run_binary.py"
@@ -148,9 +179,11 @@
       forward_variables_from(invoker, "*")
 
       deps = [
-        ":web_engine_sources",
+        ":skwasm_impl_library",
+        ":skwasm_stub_library",
+        ":web_engine_library",
         ":web_ui_library",
-        ":web_ui_sources",
+        ":web_ui_library_sources",
         "//flutter:dart_sdk",
         "//third_party/dart/pkg:pkg_files_stamp",
         "//third_party/dart/utils/dartdevc:dartdevc_files_stamp",
@@ -177,9 +210,11 @@
   if (flutter_prebuilt_dart_sdk) {
     action(target_name) {
       deps = [
-        ":web_engine_sources",
+        ":skwasm_impl_library",
+        ":skwasm_stub_library",
+        ":web_engine_library",
         ":web_ui_library",
-        ":web_ui_sources",
+        ":web_ui_library_sources",
         "//flutter:dart_sdk",
       ]
       script = "//build/gn_run_binary.py"
@@ -207,9 +242,11 @@
       forward_variables_from(invoker, "*")
 
       deps = [
-        ":web_engine_sources",
+        ":skwasm_impl_library",
+        ":skwasm_stub_library",
+        ":web_engine_library",
         ":web_ui_library",
-        ":web_ui_sources",
+        ":web_ui_library_sources",
         "//flutter:dart_sdk",
         "//third_party/dart/pkg:pkg_files_stamp",
         "//third_party/dart/utils/dartdevc:dartdevc_files_stamp",
@@ -225,7 +262,7 @@
 
 # Compile the unsound DDC SDK's summary.
 _kernel_worker("flutter_dartdevc_kernel_sdk_outline") {
-  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources
+  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources
 
   outputs = [ sdk_dill ]
 
@@ -257,7 +294,7 @@
 
 # Compiles the unsound html only renderer.
 _dartdevc("flutter_dartdevc_kernel_sdk") {
-  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources
+  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources
 
   packages = dart_sdk_package_config
 
@@ -303,7 +340,7 @@
 
 # Compiles the unsound canvaskit only renderer.
 _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk") {
-  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources
+  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources
 
   packages = dart_sdk_package_config
 
@@ -351,7 +388,7 @@
 
 # Compiles the unsound autodetect renderer.
 _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk") {
-  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources
+  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources
 
   packages = dart_sdk_package_config
 
@@ -399,7 +436,7 @@
 
 # Compiles the sound html only renderer.
 _dartdevc("flutter_dartdevc_kernel_sdk_sound") {
-  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources
+  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources
 
   packages = dart_sdk_package_config
 
@@ -446,7 +483,7 @@
 
 # Compiles the sound canvaskit only renderer.
 _dartdevc("flutter_dartdevc_canvaskit_kernel_sdk_sound") {
-  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources
+  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources
 
   packages = dart_sdk_package_config
 
@@ -494,7 +531,7 @@
 
 # Compiles the sound autodetect renderer.
 _dartdevc("flutter_dartdevc_canvaskit_html_kernel_sdk_sound") {
-  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources
+  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources
 
   packages = dart_sdk_package_config
 
@@ -542,7 +579,7 @@
 
 # Compile the sound DDC SDK's summary.
 _kernel_worker("flutter_dartdevc_kernel_sdk_outline_sound") {
-  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources + web_engine_sources
+  inputs = [ "sdk_rewriter.dart" ] + web_ui_sources
 
   outputs = [ sdk_dill_sound ]
 
@@ -585,9 +622,11 @@
       ":flutter_dartdevc_kernel_sdk_outline",
       ":flutter_dartdevc_kernel_sdk_outline_sound",
       ":flutter_dartdevc_kernel_sdk_sound",
-      ":web_engine_sources",
+      ":skwasm_impl_library",
+      ":skwasm_stub_library",
+      ":web_engine_library",
       ":web_ui_library",
-      ":web_ui_sources",
+      ":web_ui_library_sources",
     ]
     sources = get_target_outputs(":flutter_dartdevc_canvaskit_html_kernel_sdk")
     sources +=
@@ -600,8 +639,10 @@
     sources += get_target_outputs(":flutter_dartdevc_kernel_sdk_outline_sound")
     sources += get_target_outputs(":flutter_dartdevc_kernel_sdk_sound")
     sources += get_target_outputs(":web_ui_library")
-    sources += get_target_outputs(":web_ui_sources")
-    sources += get_target_outputs(":web_engine_sources")
+    sources += get_target_outputs(":web_ui_library_sources")
+    sources += get_target_outputs(":skwasm_stub_library")
+    sources += get_target_outputs(":skwasm_impl_library")
+    sources += get_target_outputs(":web_engine_library")
     tmp_files = []
     foreach(source, sources) {
       tmp_files += [
diff --git a/web_sdk/libraries.json b/web_sdk/libraries.json
index 01a9fec..7f9c878 100644
--- a/web_sdk/libraries.json
+++ b/web_sdk/libraries.json
@@ -14,6 +14,9 @@
       },
       "_engine": {
         "uri": "lib/_engine/engine.dart"
+      },
+      "_skwasm_stub": {
+        "uri": "lib/_skwasm_stub/skwasm_stub.dart"
       }
     }
   },
@@ -30,6 +33,9 @@
       },
       "_engine": {
         "uri": "lib/_engine/engine.dart"
+      },
+      "_skwasm_stub": {
+        "uri": "lib/_skwasm_stub/skwasm_stub.dart"
       }
     }
   },
@@ -46,6 +52,9 @@
       },
       "_engine": {
         "uri": "lib/_engine/engine.dart"
+      },
+      "_skwasm_impl": {
+        "uri": "lib/_skwasm_impl/skwasm_impl.dart"
       }
     }
   }
diff --git a/web_sdk/libraries.yaml b/web_sdk/libraries.yaml
index 46bb23f..5a95df9 100644
--- a/web_sdk/libraries.yaml
+++ b/web_sdk/libraries.yaml
@@ -7,7 +7,7 @@
 # Note: if you edit this file, you must also edit libraries.json in this
 # directory:
 #
-#.    python third_party/dart/tools/yaml2json.py flutter/web_sdk/libraries.yaml flutter/web_sdk/libraries.json
+#.    dart third_party/dart/tools/yaml2json.dart flutter/web_sdk/libraries.yaml flutter/web_sdk/libraries.json
 #
 # We currently have several different files that needs to be updated when
 # changing libraries, sources, and patch files.  See
@@ -24,6 +24,9 @@
     _engine:
       uri: "lib/_engine/engine.dart"
 
+    _skwasm_stub:
+      uri: "lib/_skwasm_stub/skwasm_stub.dart"
+
 dart2js:
   include:
     - {path: "../dart-sdk/lib/libraries.json", target: dart2js}
@@ -35,6 +38,9 @@
     _engine:
       uri: "lib/_engine/engine.dart"
 
+    _skwasm_stub:
+      uri: "lib/_skwasm_stub/skwasm_stub.dart"
+
 wasm:
   include:
     - {path: "../dart-sdk/lib/libraries.json", target: wasm}
@@ -45,3 +51,6 @@
 
     _engine:
       uri: "lib/_engine/engine.dart"
+
+    _skwasm_impl:
+      uri: "lib/_skwasm_impl/skwasm_impl.dart"
diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart
index bacc768..cb383b6 100644
--- a/web_sdk/sdk_rewriter.dart
+++ b/web_sdk/sdk_rewriter.dart
@@ -11,8 +11,9 @@
   ..addOption('output-dir')
   ..addOption('input-dir')
   ..addFlag('ui')
-  ..addFlag('engine')
-  ..addMultiOption('input')
+  ..addOption('library-name')
+  ..addOption('api-file')
+  ..addMultiOption('source-file')
   ..addOption('stamp');
 
 final List<Replacer> uiPatterns = <Replacer>[
@@ -33,10 +34,11 @@
   ),
 ];
 
-final List<Replacer> engineLibraryPatterns = <Replacer>[
-  AllReplacer(RegExp(r'library\s+engine;'), '''
+List<Replacer> generateApiFilePatterns(String libraryName, String extraImports) {
+  return <Replacer>[
+    AllReplacer(RegExp('library\\s+$libraryName;'), '''
 @JS()
-library dart._engine;
+library dart._$libraryName;
 
 import 'dart:async';
 import 'dart:collection';
@@ -47,27 +49,33 @@
 import 'dart:math' as math;
 import 'dart:typed_data';
 import 'dart:ui' as ui;
-'''),
-  // Replace exports of engine files with "part" directives.
-  MappedReplacer(RegExp(r'''
-export\s*'engine/(.*)';
+$extraImports
+'''
+    ),
+    // Replace exports of engine files with "part" directives.
+    MappedReplacer(RegExp('''
+export\\s*'$libraryName/(.*)';
 '''), (Match match) => '''
-part 'engine/${match.group(1)}';
-'''),
-];
+part '$libraryName/${match.group(1)}';
+'''
+    ),
+  ];
+}
 
-final List<Replacer> enginePartsPatterns = <Replacer>[
-  AllReplacer(RegExp(r'part\s+of\s+engine;'), 'part of dart._engine;'),
-  // Remove library-level JS annotations.
-  AllReplacer(RegExp(r'\n@JS(.*)\nlibrary .+;'), ''),
-  // Remove library directives.
-  AllReplacer(RegExp(r'\nlibrary .+;'), ''),
-  // Remove imports/exports from all engine parts.
-  AllReplacer(RegExp(r'\nimport\s*.*'), ''),
-  AllReplacer(RegExp(r'\nexport\s*.*'), ''),
-];
+List<Replacer> generatePartsPatterns(String libraryName) {
+  return <Replacer>[
+    AllReplacer(RegExp('part\\s+of\\s+$libraryName;'), 'part of dart._$libraryName;'),
+    // Remove library-level JS annotations.
+    AllReplacer(RegExp(r'\n@JS(.*)\nlibrary .+;'), ''),
+    // Remove library directives.
+    AllReplacer(RegExp(r'\nlibrary .+;'), ''),
+    // Remove imports/exports from all part files.
+    AllReplacer(RegExp(r'\nimport\s*.*'), ''),
+    AllReplacer(RegExp(r'\nexport\s*.*'), ''),
+  ];
+}
 
-final List<Replacer> sharedPatterns = <Replacer>[
+final List<Replacer> stripMetaPatterns = <Replacer>[
   AllReplacer(RegExp(r"import\s*'package:meta/meta.dart';"), ''),
   AllReplacer('@required', ''),
   AllReplacer('@protected', ''),
@@ -82,38 +90,75 @@
   final ArgResults results = argParser.parse(arguments);
   final Directory directory = Directory(results['output-dir'] as String);
   final String inputDirectoryPath = results['input-dir'] as String;
-  for (final String inputFilePath in results['input'] as Iterable<String>) {
-    final File inputFile = File(inputFilePath);
-    final File outputFile = File(path.join(
-        directory.path, inputFile.path.substring(inputDirectoryPath.length)))
-      ..createSync(recursive: true);
-    final String source = inputFile.readAsStringSync();
-    final String rewrittenContent = rewriteFile(
-      source,
-      filePath: inputFilePath,
-      isUi: results['ui'] as bool,
-      isEngine: results['engine'] as bool,
-    );
-    outputFile.writeAsStringSync(rewrittenContent);
-    if (results['stamp'] != null) {
-      File(results['stamp'] as String).writeAsStringSync('stamp');
+
+  String Function(String source)? preprocessor;
+  List<Replacer> replacementPatterns;
+  String? libraryName;
+  if (results['ui'] as bool) {
+    replacementPatterns = uiPatterns;
+  } else {
+    libraryName = results['library-name'] as String;
+    if (libraryName == null) {
+      throw Exception('library-name must be specified if not rewriting ui');
     }
+    preprocessor = (String source) => preprocessPartFile(source, libraryName!);
+    replacementPatterns = generatePartsPatterns(libraryName);
+  }
+  for (final String inputFilePath in results['source-file'] as Iterable<String>) {
+    String pathSuffix = inputFilePath.substring(inputDirectoryPath.length);
+    if (libraryName != null) {
+      pathSuffix = path.join(libraryName, pathSuffix);
+    }
+    final String outputFilePath = path.join(directory.path, pathSuffix);
+    processFile(inputFilePath, outputFilePath, preprocessor, replacementPatterns);
+  }
+
+  if (results['api-file'] != null) {
+    if (libraryName == null) {
+      throw Exception('library-name must be specified if api-file is specified');
+    }
+
+    final String inputFilePath = results['api-file'] as String;
+    final String outputFilePath = path.join(
+        directory.path, path.basename(inputFilePath));
+    String extraImports = '';
+    if (libraryName == 'engine') {
+      extraImports = "import 'dart:_skwasm_stub' if (dart.library.ffi) 'dart:_skwasm_impl';\n";
+    } else if (libraryName == 'skwasm_stub' || libraryName == 'skwasm_impl') {
+      extraImports = "import 'dart:_engine';\n";
+    }
+    replacementPatterns = generateApiFilePatterns(libraryName, extraImports);
+
+    processFile(
+      inputFilePath,
+      outputFilePath,
+      (String source) => validateApiFile(inputFilePath, source, libraryName!),
+      replacementPatterns
+    );
+  }
+
+
+  if (results['stamp'] != null) {
+    File(results['stamp'] as String).writeAsStringSync('stamp');
   }
 }
 
-String rewriteFile(String source, {required String filePath, required bool isUi, required bool isEngine}) {
-  final List<Replacer> replacementPatterns = <Replacer>[];
-  replacementPatterns.addAll(sharedPatterns);
-  if (isUi) {
-    replacementPatterns.addAll(uiPatterns);
-  } else if (isEngine) {
-    if (filePath.endsWith('lib/src/engine.dart')) {
-      _validateEngineSource(filePath, source);
-      replacementPatterns.addAll(engineLibraryPatterns);
-    } else {
-      source = _preprocessEnginePartFile(source);
-      replacementPatterns.addAll(enginePartsPatterns);
-    }
+void processFile(String inputFilePath, String outputFilePath, String Function(String source)? preprocessor, List<Replacer> replacementPatterns) {
+  final File inputFile = File(inputFilePath);
+  final File outputFile = File(outputFilePath)
+    ..createSync(recursive: true);
+  outputFile.writeAsStringSync(processSource(
+    inputFile.readAsStringSync(),
+    preprocessor,
+    replacementPatterns));
+}
+
+String processSource(String source, String Function(String source)? preprocessor, List<Replacer> replacementPatterns) {
+  if (preprocessor != null) {
+    source = preprocessor(source);
+  }
+  for (final Replacer replacer in stripMetaPatterns) {
+    source = replacer.perform(source);
   }
   for (final Replacer replacer in replacementPatterns) {
     source = replacer.perform(source);
@@ -121,17 +166,17 @@
   return source;
 }
 
-// Enforces a particular structure in engine.dart source code.
+// Enforces a particular structure in top level api files for sublibraries.
 //
-// Code in `engine.dart` must only be made of the library directive, exports,
+// Code in api files must only be made of the library directive, exports,
 // and code comments. Imports are disallowed. Instead, the required imports are
 // added by this script during the rewrite.
-void _validateEngineSource(String engineDartPath, String engineDartCode) {
-  const List<String> expectedLines = <String>[
-    'library engine;',
+String validateApiFile(String apiFilePath, String apiFileCode, String libraryName) {
+  final List<String> expectedLines = <String>[
+    'library $libraryName;',
   ];
 
-  final List<String> lines = engineDartCode.split('\n');
+  final List<String> lines = apiFileCode.split('\n');
   for (int i = 0; i < lines.length; i += 1) {
     final int lineNumber = i + 1;
     final String line = lines[i].trim();
@@ -157,20 +202,21 @@
     }
 
     throw Exception(
-      'on line $lineNumber: unexpected code in $engineDartPath. This file '
+      'on line $lineNumber: unexpected code in $apiFilePath. This file '
       'may only contain comments and exports. Found:\n'
       '$line'
     );
   }
+  return apiFileCode;
 }
 
-String _preprocessEnginePartFile(String source) {
-  if (source.startsWith('part of engine;') || source.contains('\npart of engine;')) {
+String preprocessPartFile(String source, String libraryName) {
+  if (source.startsWith('part of $libraryName;') || source.contains('\npart of $libraryName;')) {
     // The file hasn't been migrated yet.
     // Do nothing.
   } else {
     // Insert the part directive at the beginning of the file.
-    source = 'part of engine;\n$source';
+    source = 'part of $libraryName;\n$source';
   }
   return source;
 }
diff --git a/web_sdk/test/sdk_rewriter_test.dart b/web_sdk/test/sdk_rewriter_test.dart
index 4e17279..22a424a 100644
--- a/web_sdk/test/sdk_rewriter_test.dart
+++ b/web_sdk/test/sdk_rewriter_test.dart
@@ -35,6 +35,8 @@
 import 'dart:math' as math;
 import 'dart:typed_data';
 import 'dart:ui' as ui;
+import 'dart:extra';
+
 
 
 // Comment 2
@@ -44,11 +46,13 @@
 part 'engine/file3.dart';
 ''';
 
-    final String result = rewriteFile(
+    final String result = processSource(
       source,
-      filePath: '/path/to/lib/web_ui/lib/src/engine.dart',
-      isUi: false,
-      isEngine: true,
+      (String source) => validateApiFile(
+        '/path/to/lib/web_ui/lib/src/engine.dart',
+        source,
+        'engine'),
+      generateApiFilePatterns('engine', "import 'dart:extra';\n"),
     );
     expect(result, expected);
   });
@@ -64,11 +68,13 @@
 
     Object? caught;
     try {
-      rewriteFile(
+      processSource(
         source,
-        filePath: '/path/to/lib/web_ui/lib/src/engine.dart',
-        isUi: false,
-        isEngine: true,
+        (String source) => validateApiFile(
+          '/path/to/lib/web_ui/lib/src/engine.dart',
+          source,
+          'engine'),
+        generateApiFilePatterns('engine', ''),
       );
     } catch(error) {
       caught = error;
@@ -112,11 +118,10 @@
 }
 ''';
 
-    final String result = rewriteFile(
+    final String result = processSource(
       source,
-      filePath: '/path/to/lib/web_ui/lib/src/engine/my_file.dart',
-      isUi: false,
-      isEngine: true,
+      (String source) => preprocessPartFile(source, 'engine'),
+      generatePartsPatterns('engine'),
     );
     expect(result, expected);
   });
@@ -138,11 +143,10 @@
 }
 ''';
 
-    final String result = rewriteFile(
+    final String result = processSource(
       source,
-      filePath: '/path/to/lib/web_ui/lib/src/engine/my_file.dart',
-      isUi: false,
-      isEngine: true,
+      (String source) => preprocessPartFile(source, 'engine'),
+      generatePartsPatterns('engine'),
     );
     expect(result, expected);
   });
