morphic 0.4.0-beta.1
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. AppBusretains 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?)andMorphicSurface.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 achromelesswindow: feedmoveBythe 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.dissolveRootIntoSceneis gone (it only dissolved the old launcher root) — delete any override. morphic:initis 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 runfailing after install with CMake "Cannot find source file: src/examples/workflow_patterns.h / No SOURCES given to target: morphic_plugin". The generated.pubignoreexcludedexamples/unanchored, which (by gitignore semantics) also stripped the plugin'swindows/src/examples/sources from the published package whileCMakeLists.txtstill 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
Rre-runs yourmain(); Morphic now reconciles the previous generation of surfaces, so you always end with exactly one running app instead of accumulating windows. - Clearer
morphic:initoutput — 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 --spatialbuilding with "Cannot open include file 'compositor_ng/projection_reconciler.h'". The spatial compositor sources (compositor_ng/, 19 files) were never vendored intoruntime_assets/, so they were missing frommanifest_spatial.jsonand from the delivered runtime ZIP — yet the spatial CMake definesMORPHIC_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 --spatialpreviously read from the bundled (premium-stripped) package, which by design can never containcompositor_ng/. It now extracts the license-gated ZIP and materializes the runtime from it. The free package stays compositor_ng-free;manifest_spatial.jsonis 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:initoutput 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),Tieris relabelledLicense, 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:initversion output.initprinted onlyruntime version: 0.1.0(the engine ABI), which read like a downgrade right after deliveringspatial 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 frompubspec.yaml.
0.2.0-dev.12 #
- Fix
dart run morphic:init --spatialfailing with "asset hash mismatch for windows/runner_morphic/engine_state.h".manifest_spatial.jsoncarried stale (pre-line-ending-normalization) checksums for 5 runtime files — the dev.9 fix regenerated only the nativemanifest.json. Both manifests are now regenerated from the source tree viatool/gen_manifest.dart. Nativeinitwas unaffected. - Release-integrity gate (
tools/verify-manifests.mjs+ CI): every release path now fails if any runtime asset hash differs frommanifest.jsonormanifest_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;homepagepoints to getmorphic.space with adocumentationlink. - Canonical example —
example/is now a minimal, runnable two-window +AppBusquickstart. The fuller showcase lives inexamples/notes_workspace. - Docs corrections — every install/spatial command uses
--apply(including themorphic:login/morphic:licenseCLI 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:initfailing 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 thenotes_workspaceexample 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:initneeds--applyto install (without it, it's a dry run); the first-window example now includes its@pragma('vm:entry-point')function; use the real.toolPaletteconstructor andMorphicSurface.minimize/close. - Add the missing Visual Studio “Desktop development with C++” prerequisite to the README and Quickstart.
morphic:init"Next" hint now uses the correctrunMorphicApp(app: ...).
0.2.0-dev.6 #
- CLI now surfaces optional Spatial Mode in
morphic:init,morphic:doctorandmorphic --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 viaMORPHIC_API_URL). The nativedart run morphic:initis unchanged and needs no backend.
0.2.0-dev.4 #
- Fix:
morphic:loginopens the browser reliably on Windows — PowerShellStart-Processpreserves the&in the login URL (the oldcmd starttruncated 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 readMORPHIC_API_URL; the nativedart run morphic:initis unaffected.
0.2.0-dev.3 #
- CLI authentication:
dart run morphic:login,morphic:logout,morphic:whoami. dart run morphic:init --spatialsecurely 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:initDart-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:initworkflow - 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