Datastar

ascent-datastar is the protocol core; DOM-free and platform-neutral. Incoming patch-signals map onto ascent's reactive primitive: a typed signal delta becomes Source.set, and fine-grained boundaries repaint. Focus and caret stay put; no idiomorph required.

SignalStore

Declare each signal with store.squawk(name, init) (or store.source for writable two-way bindings). Patches for unknown names are logged no-ops; decode failures retain the prior value.

for
  store <- SignalStore.make()
  count <- store.squawk("count", 0)
  _     <- store.route(SignalPatch.Put("count", Json.Num(7), onlyIfMissing = false))
  cur   <- count.get
yield cur
7

Modules

ArtifactRole
ascent-datastarProtocol + SignalStore (JVM / JS / Native)
ascent-datastar-jsBrowser: EventSource → store / DOM, action fetch
ascent-datastar-httpServer: AscentDatastar over zio-http datastar SDK

See Datastar HTTP for SSE routes and Hybrid regions for serverRegion + patchRegion.

E.p(
  "Client apps depend on ",
  E.code("ascent-datastar-js"),
  "; servers on ",
  E.code("ascent-datastar-http"),
  ".",
)

Client apps depend on ascent-datastar-js; servers on ascent-datastar-http.