morphic 0.4.0-beta.1 copy "morphic: ^0.4.0-beta.1" to clipboard
morphic: ^0.4.0-beta.1 copied to clipboard

A Flutter desktop runtime for building real multi-window applications in pure Dart: native OS windows, window orchestration, and cross-window messaging.

0.4.0-beta.1 #

BREAKING — fixed-value options are now enums. Every SurfaceSpec / EcologyController option that only ever accepted a closed set of strings is now a typed enum. A typo like backend: 'spatal' used to satisfy the analyzer and then be silently ignored (or rejected) at runtime; it is now a compile error, and the valid values are discoverable from autocomplete.

This is a Dart-only change. The method-channel tokens are byte-identical, the engine ABI stays 0.2.2, and no dart run morphic:init --force is needed.

Before After
kind: 'workspace' kind: SurfaceKind.workspace
kind: 'tool_palette' kind: SurfaceKind.toolPalette
backend: 'spatial' backend: SurfaceBackend.spatial
shape: 'capsule' shape: SurfaceShape.capsule
material: 'acrylic' material: SurfaceMaterial.acrylic
transparency: 'full_glass' transparency: SurfaceTransparency.fullGlass
transparency: 'transparent_content' transparency: SurfaceTransparency.transparentContent
backdrop: 'mica' backdrop: SurfaceBackdrop.mica
corners: 'default' corners: SurfaceCorners.auto (default is a Dart keyword)

Each value exposes the token it sends as .wire (e.g. SurfaceKind.toolPalette.wire == 'tool_palette'), and a test pins every token so a rename can't silently break the protocol.

Two transparency modes the runtime already accepted are now visible in the API: SurfaceTransparency.titlebar and .hybrid. They route but currently project as opaque, pending the material-aware shell paint.

0.3.0-beta.3 #

Fixed: window controls could hang forever. Every identity-dependent API — moveBy, setBounds, minimize, maximize, restore, toggleMaximize, close, hide, setCornerRadius, zoomScene — silently did nothing (its Future never completed and never threw) when it was the first MorphicSurface call in an engine and that call happened after the surface's first frame: from a drag handler, a button tap, a timer. Apps that happened to touch MorphicSurface early worked by luck of timing. This made custom drag-to-move title bars unreliable.

Cause: the runtime pushes each surface's identity exactly once, at first frame, and MorphicSurface only subscribed on its first use — so a late first use missed the one-shot push forever, and every op awaiting currentId() hung.

  • Identity is now pullable. currentId() asks the runtime directly when it doesn't already know the id — one call, no polling, no timeout. It resolves whether it is first called before or after the identity push.
  • AppBus retains one-shot lifecycle facts (surface.identity, surface.created) and replays them to a late subscriber. Ordinary topics are unchanged — a stale event is never re-delivered.
  • MorphicSurface.ensureReady() — optional, idempotent eager wiring, if you want the runtime's push as a guaranteed fast path.

If you worked around this by calling MorphicSurface.currentId() in your surface entrypoints before runApp, you can now drop it (or replace it with ensureReady(), which says what it means and returns nothing to discard).

Runtime ABI 0.2.2. Existing projects: run dart run morphic:init --force to materialize the updated runtime — morphic doctor will flag it.

0.3.0-beta.2 #

Runtime move API + activation snap-back fix. You can now move a surface at runtime, and chromeless windows no longer jump back to their spawn position when focused.

  • MorphicSurface.setBounds(x:, y:, width?, height?) and MorphicSurface.moveBy(dx, dy) — move (and optionally resize) a surface at runtime. The new position is stored as the runtime's authoritative bounds, so it survives activation and focus changes. This is the missing piece for a custom drag-to-move title bar on a chromeless window: feed moveBy the pointer delta, and call it on each companion surface to carry a cluster.
  • Fixed: surfaces snapped back to their SurfaceSpec (x, y) on activation. The runtime re-asserted the authored spawn bounds whenever a surface was focused, clobbering any external move. Moving through the new API keeps the runtime's bounds in sync — no more snap-back.

Runtime ABI 0.2.1 (a runtime bug-fix; the ABI contract is unchanged). Existing projects: run dart run morphic:init --force to materialize the updated runtime — morphic doctor and morphic:init will flag it.

0.3.0-beta.1 #

Runtime Core (ABI 0.2) — the runtime is now headless. The biggest change since the pivot: there is no launcher window. Your app's main() runs on a headless engine and every visible window is one of your Surfaces. The process exits when the last Surface closes. Engine ABI moves 0.1.0 → 0.2.0.

Upgrading from a 0.2.0-dev.x project? Re-materialize the runtime once:

flutter pub upgrade            # or set morphic: ^0.3.0-beta.1
dart run morphic:init --force  # installs the ABI 0.2 runtime

See doc/MIGRATION.md. Your app code (surfaces, entrypoints, AppBus) does not change.

  • New MorphicRuntime.run(app: ...) entrypoint. runMorphicApp(app: ...) still works as a thin deprecated shim — no app changes required.
  • Launcher removed. The runtime no longer owns a visible window; the only windows on screen are your application Surfaces. MorphicApp.dissolveRootIntoScene is gone (it only dissolved the old launcher root) — delete any override.
  • morphic:init is version-aware. On an older install it now reports that an upgrade is available and points to --force, instead of silently doing nothing.
  • Runtime Core is frozen at ABI 0.2 — see doc/internals/runtime/RUNTIME_CORE_INVARIANTS.md.

0.2.0-dev.17 #

  • Fix flutter run failing after install with CMake "Cannot find source file: src/examples/workflow_patterns.h / No SOURCES given to target: morphic_plugin". The generated .pubignore excluded examples/ unanchored, which (by gitignore semantics) also stripped the plugin's windows/src/examples/ sources from the published package while CMakeLists.txt still referenced them — so the plugin couldn't build. The rule is now anchored to /examples/ (only the top-level showcase dir is excluded). No API or runtime changes.

0.2.0-dev.16 #

A deliberately small stabilization / developer-experience release. No runtime changes, no ABI changes, no re-init required.

  • Hot restart no longer stacks duplicate windows. Pressing R re-runs your main(); Morphic now reconciles the previous generation of surfaces, so you always end with exactly one running app instead of accumulating windows.
  • Clearer morphic:init output — the apply summary ends with an Installed components block (Package version, Runtime ABI, Tier) so there's one unambiguous place to confirm what's active.
  • Development workflow guide (doc/DEVELOPMENT.md) — explains the multi-engine dev loop honestly: hot restart is reconciled; hot reload updates the primary isolate but not separately-spawned surface engines (with the recommended iterate-then-wire workflow).

0.2.0-dev.15 #

  • Fix dart run morphic:init --spatial building with "Cannot open include file 'compositor_ng/projection_reconciler.h'". The spatial compositor sources (compositor_ng/, 19 files) were never vendored into runtime_assets/, so they were missing from manifest_spatial.json and from the delivered runtime ZIP — yet the spatial CMake defines MORPHIC_SPATIAL, which #includes them. They are now part of the spatial tier, which is a true superset of native.
  • Spatial install now materializes from the delivered artifact. init --spatial previously read from the bundled (premium-stripped) package, which by design can never contain compositor_ng/. It now extracts the license-gated ZIP and materializes the runtime from it. The free package stays compositor_ng-free; manifest_spatial.json is delivered in the ZIP and no longer shipped to pub.dev.
  • The release-integrity gate stays strict on the private tree and the ZIP (both manifests, full superset) and is tier-aware for the public package.

0.2.0-dev.14 #

  • morphic:init output now removes any doubt about what was installed. The spatial flow is shown as two clearly separated steps — Step 1: Spatial runtime delivery and Step 2: project integration — and the install summary explicitly confirms ✓ Spatial runtime <version> installed — active in this project, so it's unmistakable the delivered runtime is the one now hosting the project. The version block is aligned (Package / Runtime ABI / License / Spatial runtime), Tier is relabelled License, project changes render as a checklist, and the delivery step says the ZIP was "cached" (not "installed", which happens in step 2).

0.2.0-dev.13 #

  • Clearer morphic:init version output. init printed only runtime version: 0.1.0 (the engine ABI), which read like a downgrade right after delivering spatial runtime v0.2.0-dev.12. It now leads with the package version and labels the engine ABI distinctly (Morphic 0.2.0-dev.13 (package) / Runtime engine 0.1.0 (ABI)). The package version is now carried in the manifest (packageVersion), sourced from pubspec.yaml.

0.2.0-dev.12 #

  • Fix dart run morphic:init --spatial failing with "asset hash mismatch for windows/runner_morphic/engine_state.h". manifest_spatial.json carried stale (pre-line-ending-normalization) checksums for 5 runtime files — the dev.9 fix regenerated only the native manifest.json. Both manifests are now regenerated from the source tree via tool/gen_manifest.dart. Native init was unaffected.
  • Release-integrity gate (tools/verify-manifests.mjs + CI): every release path now fails if any runtime asset hash differs from manifest.json or manifest_spatial.json — so a runtime whose files don't match the packaged manifest can no longer be synced, zipped, or published.

0.2.0-dev.11 #

Easier to discover, install, and learn. No public API changes.

  • Clear positioning — Morphic is now described consistently everywhere as a Flutter Desktop runtime for building real multi-window applications in pure Dart: README, pub.dev, the website, and a new What is Morphic? page, plus a developer FAQ (what it is, why not desktop_multi_window, Win32?, platforms).
  • pub.dev metadata — sharper description; topics now flutter-desktop, multi-window, window-management, desktop, runtime; homepage points to getmorphic.space with a documentation link.
  • Canonical exampleexample/ is now a minimal, runnable two-window + AppBus quickstart. The fuller showcase lives in examples/notes_workspace.
  • Docs corrections — every install/spatial command uses --apply (including the morphic:login/morphic:license CLI hints); commands verified against the example.
  • Smaller, cleaner package — removed internal/validation, quarantined-legacy, and generated artifacts from the published package.

0.2.0-dev.10 #

  • Docs/onboarding: the README now leads with the Notes Workspace example (screenshot + clone-&-run) before any architecture, and the Quickstart gains a "What you'll build." No code changes.

0.2.0-dev.9 #

  • Fix dart run morphic:init failing with "asset hash mismatch … regenerate manifest". The bundled runtime manifest had stale checksums for 5 runtime source files, so init aborted before hosting the runtime. Checksums are regenerated to match the shipped sources; init applies cleanly again. Found by building the notes_workspace example from a clean checkout.

0.2.0-dev.8 #

  • New dart run morphic:license — shows your tier (Developer Preview), projects, spatial access and activation status.

0.2.0-dev.7 #

  • Fix README onboarding bugs (from a cold-start audit): morphic:init needs --apply to install (without it, it's a dry run); the first-window example now includes its @pragma('vm:entry-point') function; use the real .toolPalette constructor and MorphicSurface.minimize/close.
  • Add the missing Visual Studio “Desktop development with C++” prerequisite to the README and Quickstart.
  • morphic:init "Next" hint now uses the correct runMorphicApp(app: ...).

0.2.0-dev.6 #

  • CLI now surfaces optional Spatial Mode in morphic:init, morphic:doctor and morphic --help — a free Developer Preview pointer (morphic:login + learn-more link), no paywall or pricing.
  • README rewritten as a pub.dev quickstart (install → first window → multi-window → AppBus → lifecycle) with a small Spatial teaser.

0.2.0-dev.5 #

  • The licensing CLI now defaults to the hosted Morphic backend at https://www.getmorphic.space (overridable via MORPHIC_API_URL). The native dart run morphic:init is unchanged and needs no backend.

0.2.0-dev.4 #

  • Fix: morphic:login opens the browser reliably on Windows — PowerShell Start-Process preserves the & in the login URL (the old cmd start truncated the query string at &state=, landing on the wrong page).
  • Docs: add the CLI / licensing guide (doc/CLI.md). The licensing commands (login / whoami / logout / init --spatial) are experimental and read MORPHIC_API_URL; the native dart run morphic:init is unaffected.

0.2.0-dev.3 #

  • CLI authentication: dart run morphic:login, morphic:logout, morphic:whoami.
  • dart run morphic:init --spatial securely delivers the spatial runtime — sign in, authorize, download over a short-lived signed URL, verify the SHA-256 checksum, then install. No license keys to copy or paste.
  • Browser-based login via a localhost loopback; credentials are stored per-platform and access tokens refresh automatically.

0.2.0-dev.2 #

  • Moved to a clean public repository with sanitized public history
  • Reworked onboarding and documentation structure
  • Added dart run morphic:init Dart-first workflow
  • Re-synced runtime assets with the stabilized native runtime
  • Added native/spatial runtime mode separation
  • Added runtime invariant enforcement and lifecycle hardening
  • Added engine-retention model to avoid Flutter teardown crashes during realistic usage
  • Refined install/remove tooling and runtime integration flow
  • Cleaned public package boundaries and excluded premium/internal artifacts

0.2.0-dev.1 #

  • Reworked public SDK and documentation structure
  • Added Dart-first dart run morphic:init workflow
  • Re-synced runtime assets with stabilized native runtime
  • Added native/spatial runtime mode separation
  • Added lifecycle hardening, invariant enforcement, and retention model
  • Refined onboarding and package structure

0.1.0 #

Initial public release.

Features #

  • Native multi-surface Flutter desktop runtime
  • dart run morphic:init Windows runtime installer
  • Native and spatial runtime modes
  • Engine retention lifecycle model
  • Multi-window orchestration APIs
3
likes
0
points
384
downloads

Documentation

Documentation

Publisher

verified publishergetmorphic.space

Weekly Downloads

A Flutter desktop runtime for building real multi-window applications in pure Dart: native OS windows, window orchestration, and cross-window messaging.

Homepage
Repository (GitHub)
View/report issues

Topics

#flutter-desktop #multi-window #window-management #desktop #runtime

License

unknown (license)

Dependencies

archive, args, crypto, flutter, http, path, plugin_platform_interface

More

Packages that depend on morphic

Packages that implement morphic