Installation
Install both dart_monty (the API) and dart_monty_core (the
package that owns the native/WASM build outputs) from pub.dev:
dart pub add dart_monty dart_monty_core
Or in pubspec.yaml:
dependencies:
dart_monty: ^0.17.0
dart_monty_core: ^0.17.0
Both must be listed directly. dart_monty_core is already a
transitive dependency of dart_monty, but Flutter's asset bundler
does not chase transitive references — flutter.assets entries must
name the package that physically owns the files (see
Flutter Web below). Listing dart_monty_core
explicitly also keeps the two versions in lockstep.
For local worktree development, swap the version constraints for
path: deps.
Bleeding edge (git main)
Use this only if you need an unreleased fix on main:
dependencies:
dart_monty:
git:
url: https://github.com/runyaga/dart_monty.git
ref: main
dart_monty_core:
git:
url: https://github.com/runyaga/dart_monty_core.git
ref: main
Pin both — without an explicit dart_monty_core git entry, pub will
resolve the transitive dep from pub.dev and the APIs may drift.
Platform Requirements
Native (Desktop/Server)
- macOS, Linux, Windows: No manual setup. The native binary
(built by
dart_monty_core'shook/build.dart) is compiled automatically when you rundart pub get— requires a working Rust toolchain (cargo + rustc). - iOS/Android: Not yet supported. Planned once the FFI/WASM story stabilises.
Flutter Web
Flutter consumers depend on both dart_monty (the API) and
dart_monty_core (the package whose pubspec physically declares the
WASM/JS assets). Flutter's asset resolver does not chase transitive
references — - package: X under flutter.assets must name the
package that owns the files.
# pubspec.yaml
dependencies:
dart_monty: ^0.17.0
# Required — Flutter's asset bundler needs this listed directly.
# Do not remove; it is not redundant with dart_monty.
dart_monty_core: ^0.17.0
# Flutter only — instructs the asset bundler to include
# dart_monty_core's WASM/JS bridge files. Plain-Dart consumers
# ignore this stanza.
flutter:
assets:
- package: dart_monty_core
// main.dart
import 'package:dart_monty/dart_monty.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await DartMonty.ensureInitialized(); // loads bridge on web; no-op native
runApp(const MyApp());
}
DartMonty.ensureInitialized() dynamically injects the
dart_monty_core JS bridge into document.head and awaits load. No
manual <script> tag in web/index.html is required;
--base-href is honoured automatically.
Security headers. Serve your web app with:
Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp
(Required for SharedArrayBuffer, which the WASM worker uses for
zero-copy communication.)
Plain Dart web (no Flutter)
Without Flutter's asset bundler, copy the three asset files from the
dart_monty_core package into your own web/ dir and add a
<script> tag:
# Pub.dev install — assets live under the hosted cache.
# (For a git-installed dart_monty_core, swap `hosted/pub.dev` for `git`.)
CORE_ASSETS=$(dart pub cache dir)/hosted/pub.dev/dart_monty_core-*/lib/assets
cp $CORE_ASSETS/dart_monty_core_bridge.js web/
cp $CORE_ASSETS/dart_monty_core_worker.js web/
cp $CORE_ASSETS/dart_monty_core_native.wasm web/
<!-- web/index.html — must load before your compiled Dart app -->
<script src="dart_monty_core_bridge.js"></script>
dart_monty_core's own packages/dart_monty_web/ is a working
reference example for this pattern.