Index

ascent is effect-native reactive UI for Scala 3. It renders straight to the DOM: no virtual DOM, no diffing. The UI is a pure tree built once; the engine surgically patches the exact node, attribute, or child-list behind each reactive boundary. The substrate is ZIO.

Docs pages are Specular DocSpecs: the same source asserts under zio-test and SSR-renders here.

Install (core + browser)

libraryDependencies ++= Seq(
  "rocks.earlyeffect" %%% "ascent-core" % "0.10.2",
  "rocks.earlyeffect" %%% "ascent-js"   % "0.11.1", // Scala.js mount engine
  "rocks.earlyeffect" %%% "ascent-css"  % "0.10.2", // optional typed CSS
)

Optional modules

libraryDependencies ++= Seq(
  "rocks.earlyeffect" %%% "ascent-conduit"       % "0.10.0", // Ctx[M] state bridge
  "rocks.earlyeffect" %%% "ascent-history"       % "0.10.0", // Location as a Squawk
  "rocks.earlyeffect" %%% "ascent-element"       % "0.10.0", // custom elements
  "rocks.earlyeffect" %%% "ascent-mcp-app"       % "0.10.0", // MCP App view
  "rocks.earlyeffect" %%% "ascent-mcp-host"      % "0.10.0", // MCP App host page
  "rocks.earlyeffect" %%% "ascent-datastar"      % "0.10.0", // protocol + SignalStore
  "rocks.earlyeffect" %%% "ascent-datastar-js"   % "0.10.0", // browser datastar
  "rocks.earlyeffect" %%  "ascent-html"          % "0.10.1", // SSR
  "rocks.earlyeffect" %%  "ascent-datastar-http" % "0.10.0", // server datastar
  "rocks.earlyeffect" %%  "ascent-preview"       % "0.11.1", // local static + SSE reload
  "rocks.earlyeffect" %%% "ascent-chekhov"       % "0.11.0" % Test, // typed Chekhov locators
)

Local preview plugin

addSbtPlugin("rocks.earlyeffect" % "sbt-ascent-preview" % "0.11.1")
// enablePlugins(AscentPreviewPlugin) on the module; then:
// sbt todoConduitJS/ascentPreview   or   sbt docs/ascentPreview

Documentation

Continue with: