Skip to content

Limits

DevPul runs in debug builds, and in native profile builds built with DEVPUL_PROFILE. Release builds have no VM service, and every DevPul call is a no-op there, so it cannot help with a bug that shows only in release, or on a tester's device with no debugger attached.

Configuration, the session, tags, actions, handlers, plugins and limits are per isolate. An event from a background isolate carries none of the main isolate's tags and follows its own DevpulConfig. Call Devpul.configure and Devpul.session again in a long-lived isolate when you need them there. Each isolate also keeps its own backlog.

Browsers keep storage per origin, so each place DevPul runs from has its own settings, history, saved URLs and plugin approvals:

Origin Store
The hosted site One, across every run and IDE. Connects to Dart 3.13 and older.
devpul on 127.0.0.1:<port> One per port. The port stays 7171 unless you pass --port or it is taken.
DevTools One per DevTools server. The IDE keeps one per session; DevTools served by DDS from the printed link gets a new port, and starts empty, every run.

Nothing moves between them. Approve a plugin once in each.

Events are encoded as JSON on the app's isolate, about 0.1 ms for a 2 KB event in a Linux profile build. Very large or very frequent events cost frame time and memory.

  • Each event field is cut at maxValueLength, 1,048,576 characters of JSON by default.
  • The app keeps a backlog of up to backlogSize, 16,777,216 characters of JSON by default, per isolate, so DevPul can catch up when it connects late. Older events are gone.
  • DDS keeps only the last 10,000 events of the Extension stream, shared with Flutter's own per-frame events.
  • developer.log records sent before DevPul connects come from DDS, which keeps the last 10,000 for all isolates. Without DDS they are gone.
  • The VM cuts developer.log messages at 128 characters. The rest is read from the app when the row opens, so only while that run is alive and the VM still holds the string.
  • With HTTP without an adapter on, dart:io keeps every request and its bodies in the app's memory until the app restarts, and DevPul reads new ones every second.
  • Busy kinds can be muted or capped with limits, in the app or from Settings.
  • HTTP calls show through an adapter, or from dart:io's HttpClient with HTTP without an adapter on. On Flutter web only adapters see them, and native clients outside dart:io only when they record into package:http_profile.
  • print output, platform logs and native crashes are not captured. debugPrint is, with DevpulFlutter.captureDebugPrint().
  • Flutter web does not report uncaught async errors; see Flutter.
  • The widget behind a Flutter error and the screen widget of an unnamed route need widget creation tracking, which only debug builds have.
  • No request replay, mocking or breakpoints on requests.
  • Calls from the UI into the app, such as actions and plugin requests, are disabled while the app is paused in the debugger and fail after 5 s without an answer.
  • Plugin sources are limited to 512 KB.
  • From Dart 3.14 the hosted site cannot connect to apps; use devpul or DevTools. Safari does not let it reach 127.0.0.1 on any version.
  • Flutter web prints no connect link.