Fetching documentation…
Status: future · Priority: medium · Depends on: State/Events/Native
Note: This is a future plan, not a commitment. The syntax and API shown here are proposals — they can be completely different when actually implemented.
An undo button for your entire app — every window included. Because all state transitions in Morph flow through exactly two typed choke points (signal set() and channel emit()), the dev runtime can record them with window IDs and replay any session deterministically. Other frameworks record pixel video of your bug; this records the bug itself.
Dev mode keeps a ring buffer of transitions (bounded, e.g. last 10,000):
t=1042 W2 set shop/cart.ts::count 3 → 4
t=1043 W2 emit evt:toast.ts::toastEvent {message: "Added"}
t=1044 W1 set shop/cart.ts::count 4 → 4 (synced copy catches up)The DevTools timeline renders this as a scrubbable strip per window, with:
morph dev --record session.mlog — save the log to disk; morph replay session.mlog replays headlessly and asserts the final state matches (instant regression test from a real session)cart.ts::count is set, or when any emit crosses windows| Piece | State |
|---|---|
Dev-mode SignalStore (signals survive hot reload by name) |
✅ Shipped |
Hot-reload rewire (morph_logic_rewire, channel clear + re-register) |
✅ Shipped |
| DevTools shell (logs, network tabs) | ✅ Shipped |
| Transition ring buffer + timeline UI | ❌ Not built |
morph replay headless assertions |
❌ Not built |
| Identity breakpoints + snapshot diff | ❌ Not built |
fetch() resolutions, timers, and random values break pure replay; record-and-stub them (like a VCR) or mark replay "best effort" past I/O?fetch()?set/emit tap points — two call sites, that's the whole hook surface)morph replay with final-state assertions (feeds Test Runner)