Skip to content

Releases

Roc Signals 0.2.0

Choose a tag to compare

@github-actions github-actions released this 24 Oct 09:35
Immutable release. Only release title and notes can be modified.
2eae2d9

0.2.0

Migration: 0.1.1 → 0.2.0

This upgrade changes how applications run effects, build keyed lists, and
handle events. Upgrade the Roc compiler, the platform URL, and the browser
runtime together. Use Roc nightly-2026-10-23-18478ff, as recorded in every
example header and in signals-release.json; a recent but different nightly is
not a compatibility guarantee. The 0.2.0 release candidates are superseded and
need no separate migration.

Effects are actions; tasks are gone

Event handlers, change observers, mounts, and timers now produce an Action.
An action is data the engine interprets: Action.update applies a batch of
state writes, and Action.then applies a batch and then runs effectful Roc
code whose result is the next action. Declared reads are snapshotted when the
event fires and again, freshly, before each effect. Import pf.Action.

The task model has been removed. Signal.from_task, Signal.fold_task,
Signal.fake_task, Signal.task_source, Signal.task_source_with_eq,
Signal.start_str, Signal.done, Signal.failed, Signal.loading, and the
Http task helpers (Http.get, Http.get_text, Http.request,
Http.request_task, Http.get_text_task, Http.start) no longer exist. Keep
a request's result in Ui.state and start it from an action:

  • Action.on_change_initial with Action.sampled for a request driven by a
    signal, such as a route or search query;
  • Action.on_mount for one-shot work;
  • Action.every for polling;
  • Action.run and its run_str, run_bool, run_detail, and run_key
    variants for an event handler that reads signals.

Http.send!, Http.get!, and Http.get_text! are effectful calls made inside
Action.then. They return Try(_, Http.Error), which replaces HttpError:
match InvalidRequest(Str), Network(Str), Timeout, TooLarge(Str),
Status(U16), InvalidUtf8, and Unavailable(Str). Effects admitted before a
scope is disposed still run, and their writes to disposed state are skipped.
Rejecting an obsolete response is application policy;
examples-web/package-explorer keeps a generation beside each result for this.
Native specs script HTTP answers and can hold effects with manual-effects.

Event handlers

Handlers are now Node.Handler rather than Node.Msg. On Ui.State, rename
on_unit → update, on_str → update_str, on_bool → update_bool,
on_detail → update_detail, and on_key → update_key. The *_with
variants (update_with, update_str_with, and so on) also read a second
state. state.set(value) and state.write(f) build state writes for
Action.update or Ui.update_states, which replace several states in one
propagation turn so that derived values and observers see only the settled
result.

Keyed lists

Replace Ui.each_str(items, key_of, row) with Ui.each(rows, row). The
collection now owns and validates its key function:

import pf.Rows

rows = Rows.from_list(items, |item| item.id)?

Handle the Try where the collection is constructed. Duplicate keys, missing
keys, and invalid edit ranges are structured errors, not aliases or silent
fallbacks. For a static list, pass Signal.const(rows) to Ui.each; for a
changing collection, retain Rows in state and edit it with Rows.apply, or
use Rows.replace_all when a complete replacement is the input you have.

The row callback receives one live Ui.Row(item). Use row.key() for identity
and row.signal() or row.map(...) for changing content; do not encode labels
or serialized items in the key. A same-key update preserves the row's scope,
removal ends it, and reintroducing a key after a committed removal creates fresh
local state. Signal.select and Signal.keyed express "is this row selected"
so that a selection change dirties only the old and new rows.

Lazy branches

Ui.when invokes only the selected builder; code in an inactive builder no
longer runs eagerly. Use Ui.switch(case_signal, build) for more than two
cases. A case change disposes the old branch, including its local state; keep
persistent drafts outside the branch.

Imports and new modules

The platform now exposes Elem, Event, Action, Signal, Html, Svg,
Ui, Http, Browser, and Rows. The Elem module is the type: replace
import pf.Elem exposing [Elem] with import pf.Elem, and annotations keep
writing Elem. Svg builds SVG elements that share ordinary attributes,
events, signals, and scopes. Browser.entropy_seed supplies a per-mount seed,
stable under native specs, for a pure PRNG; it is not for secrets.
Signal.combine_map combines and projects in one graph node.

Browser deployment

The browser protocol is now version 17 (0.1.1 used 11). Rebuild the
application's Wasm and replace the runtime modules (signals.mjs,
wasm_memory_views.mjs, and controlled_input_policy.mjs) from this release's
signals-examples.zip, where they are under browser/. The runtime checks the
module's protocol version at mount and refuses a mismatch. Commands that fail
after a DOM event now contain the mount: listeners and behaviours detach,
later dispatch is rejected, and recovery requires a fresh mount.

Build Wasm applications with --opt=size. The pinned compiler's wasm32 dev
backend never re-selects a Ui.when branch it has left
(roc-lang/roc#12560); native
builds and roc test are unaffected.

The GUI platform lives in roc-gui

The native desktop GUI platform developed during the 0.2.0 release candidates
is not part of this repository or this release. It is now developed in
lukewilliamboswell/roc-gui.
Applications pinned to a GUI package URL from an earlier release candidate keep
building against that immutable archive but receive no further updates from
here.

Engine and runtime

Updates do work proportional to the changed set rather than to the graph, row,
or DOM size, and the Wasm command buffer has bounded retention. Scope retirement
releases every node, closure, effect, retained value, and keyed-list
registration it owns. Sequence fuzzers and an allocation-failure campaign
exercise the engine, and their regression corpus runs on every pull request.

Release artifacts

The release contains the web platform package, signals-examples.zip (complete
applications, their native specs, and the matching browser runtime), and
signals-release.json. Host binaries and the Linux musl linker inputs are
built in separate attested workflows, admitted by SHA-256 through reviewed
locks, and bundled without rebuilding; the release builds no Zig code. Every
example is built and smoke-tested from the exact archive on Linux and macOS
before one job publishes those tested bytes.

Tested assets

Source revision 2eae2d9ae648d3f936ad4427809226c247891d61, built and tested with Roc nightly-2026-10-23-18478ff. Example builds use --max-transitive-mb=512.

Locked inputs

  • web-host-arm64mac: deps-web-hosts-20261024.1 web-host-arm64mac.tar — SHA-256 febe99c8241fe3f059d05c70d89b6196497141b7f19f4b56dae0335dc81af3c4
  • web-host-arm64musl: deps-web-hosts-20261024.1 web-host-arm64musl.tar — SHA-256 c970b2635bed66a60234d4021a16b44220fe89aab6876f51b481d098c2525d80
  • web-host-wasm32: deps-web-hosts-20261024.1 web-host-wasm32.tar — SHA-256 8f414e113a5e6f6660a3a14707f5ca60b788088cfc9806a2b42c2b9c142fe72c
  • web-host-x64mac: deps-web-hosts-20261024.1 web-host-x64mac.tar — SHA-256 b40a70e4da8e4d3553a16f5ec93e78930cb9416fea3a1830cdfdfe964b38d009
  • web-host-x64musl: deps-web-hosts-20261024.1 web-host-x64musl.tar — SHA-256 97a43dad8117b8076fa39324f6872cbcb58cd05ff0fa59f2e378869271aa95eb
  • musl-arm64musl: deps-musl-1.2.6-20260909.1 musl-arm64musl.tar — SHA-256 c9b3b1fc85b4441c1ff8e4e2822dc3f7adf511315c2fdf366aa67d96cd7c093b
  • musl-x64musl: deps-musl-1.2.6-20260909.1 musl-x64musl.tar — SHA-256 24d89921ac75d953f7bf5f84bf0445556a9477e85a930922cc49c8fa8874d4b1

web-hosts link inputs deps-web-hosts-20261024.1

Choose a tag to compare

@github-actions github-actions released this 24 Oct 07:47
Immutable release. Only release title and notes can be modified.
c38f25e

Dependency inputs built and tested from platform repository commit c38f25e33fd77a59e32e03478aeb1c00db93a1ed.

Each archive contains its upstream source identity, build recipe identity, exact file hashes, and copyright notices. The complete prebuilt web native-spec and Wasm host set passed producer validation. GitHub build attestations bind the archive digests to the producer.

Review and commit dependencies.lock.json in the consuming platform; use scripts/dependency_artifacts.py to verify and fetch it. External musl linker inputs remain independently released dependencies.

macos-interfaces link inputs deps-macos-interfaces-20260912.1

Choose a tag to compare

@github-actions github-actions released this 11 Sep 21:38
Immutable release. Only release title and notes can be modified.
2fd9177

Dependency inputs built and tested from platform repository commit 2fd9177dcf95cbf2775e2f58cda7e50ab0961e1d.

Each archive contains its upstream source identity, build recipe identity, exact file hashes, and copyright notices. The catalog-derived interfaces passed final Roc application links and native GUI specs against the reviewed released host; two independent generations produced identical archives. GitHub build attestations bind the archive digests to the producer.

Review and commit dependencies.lock.json in the consuming platform; use scripts/dependency_artifacts.py to verify and fetch it. This release contains no platform host or application code.

macos-interfaces link inputs deps-macos-interfaces-20260911.1

Choose a tag to compare

@github-actions github-actions released this 11 Sep 06:40
Immutable release. Only release title and notes can be modified.
adf580c

Dependency inputs built and tested from platform repository commit adf580c4390cc6b591e65d1c0ce35fe987193c37.

Each archive contains its upstream source identity, build recipe identity, exact file hashes, and copyright notices. The catalog-derived interfaces passed final Roc application links and native GUI specs against the reviewed released host; two independent generations produced identical archives. GitHub build attestations bind the archive digests to the producer.

Review and commit dependencies.lock.json in the consuming platform; use scripts/dependency_artifacts.py to verify and fetch it. This release contains no platform host or application code.

Roc Signals 0.2.0-rc3

Roc Signals 0.2.0-rc3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 10 Sep 06:36
Immutable release. Only release title and notes can be modified.
188b9c0

0.2.0-rc3

Migration: 0.2.0-rc2 → 0.2.0-rc3

This is the first combined Roc Signals release candidate. It publishes two
distinct platform packages under one immutable GitHub Release: a web package
for browser applications and native semantic tests, and a fat GUI package for
Linux x86_64, Apple Silicon macOS, and Windows x86_64 applications. Web and GUI
remain different platform APIs. Use separate application roots and the separate
platform URLs recorded in signals-examples.zip.

Use Roc nightly-2026-09-04-c125b82, as recorded in every example header and
signals-release.json. The fat GUI package expands beyond Roc's default package
budget, so GUI builds from its URL currently require
--max-transitive-mb=512. This is an explicit release-candidate workaround;
future host-size work should remove it.

Immutable build inputs

The release workflow builds no Rust or Zig host code. It downloads and
SHA-256-verifies independently published web hosts, GUI hosts, and external
linker inputs, including the reviewed macOS TBD catalog, then runs roc bundle
once for each platform. Linux, macOS, and Windows runners serve those same two
candidate archives on localhost and run the extracted example smoke tests before
one publishing job can create the prerelease.

The release manifest records the exact input locks, platform and example asset
digests, source commit, compiler pin, and final URLs. GitHub attestations accompany
the final assets as optional provenance; normal consumption relies on the
reviewed content hashes and does not require an attestation service.

Tested assets

Example builds use --max-transitive-mb=512 for this fat RC.

web-hosts link inputs deps-web-hosts-20260910.1

Choose a tag to compare

@github-actions github-actions released this 10 Sep 04:18
Immutable release. Only release title and notes can be modified.
e209fe4

Dependency inputs built and tested from platform repository commit e209fe4b62541fba5388a29c6a7735863b2ff073.

Each archive contains its upstream source identity, build recipe identity, exact file hashes, and copyright notices. The complete prebuilt web native-spec and Wasm host set passed producer validation. GitHub build attestations bind the archive digests to the producer.

Review and commit dependencies.lock.json in the consuming platform; use scripts/dependency_artifacts.py to verify and fetch it. External musl linker inputs remain independently released dependencies.

macos-interfaces link inputs deps-macos-interfaces-20260910.1

Choose a tag to compare

@github-actions github-actions released this 10 Sep 02:34
Immutable release. Only release title and notes can be modified.
cc19c28

Dependency inputs built and tested from platform repository commit cc19c282efcace4308f2c4abeee9f848c0781a07.

Each archive contains its upstream source identity, build recipe identity, exact file hashes, and copyright notices. The catalog-derived interfaces passed final Roc application links and native GUI specs against the reviewed released host; two independent generations produced identical archives. GitHub build attestations bind the archive digests to the producer.

Review and commit dependencies.lock.json in the consuming platform; use scripts/dependency_artifacts.py to verify and fetch it. This release contains no platform host or application code.

gui-host link inputs deps-gui-host-20260910.1

Choose a tag to compare

@github-actions github-actions released this 10 Sep 00:51
Immutable release. Only release title and notes can be modified.
2ab48cf

Dependency inputs built and tested from platform repository commit 2ab48cf2f3ffdb22176cda7c4200a1b81c04329f.

Each archive contains its upstream source identity, build recipe identity, exact file hashes, and copyright notices. Each extracted host candidate passed native GUI application specs with the pinned Roc compiler. GitHub build attestations bind the archive digests to the producer.

Review and commit dependencies.lock.json in the consuming platform; use scripts/dependency_artifacts.py to verify and fetch it. This release contains platform host code; external link dependencies are released separately.

0.2.0-rc2

0.2.0-rc2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 09 Sep 05:56
Immutable release. Only release title and notes can be modified.
0009616

0.2.0-rc2

Migration: 0.2.0-rc1 → 0.2.0-rc2

Use Roc nightly-2026-09-04-c125b82, as recorded in the example app headers
and release manifest. Update the platform URL, rebuild the application's Wasm,
and deploy the browser runtime from this release together. Do not mix a new Roc
platform module with an older native host archive.

Http.Error now includes ResourceLimit(Str) for capacity refusal. Add a case
when matching HTTP errors exhaustively. Explicit task cancellation publishes
the task's declared cancellation value, and late results from canceled requests
are ignored. Signal.cancel(task) exposes cancellation as a command.

Use the Http service helpers and Signal.fake_task for application task
construction. The low-level Signal.task_source_with_eq now takes a
Signal.TaskConfig record containing name, reset_on_start, canceled, and
refused, followed by the decoders and equality functions. Code using that
platform constructor must supply its cancellation and capacity-refusal values
explicitly. Task types are associated with Signal as Signal.Task and
Signal.TaskStatus.

Ui.State.update_cmd adds a pure transformation of the state's settled value
when the command executes. Its callback must be pure because preparation may
evaluate it again after refusal.

For repository consumers, platform/ is now platform-web/, browser examples
are under examples-web/, and shared Roc modules live in platform-shared/.
Run python3 scripts/prepare_platforms.py to stage shared sources for local
builds. Published platform archives remain self-contained.

Dependency and release provenance

The Linux musl libc and startup objects are built from pinned source in their
own CI workflow and released independently of the platform. Platform builds
verify the locked archive digest, signing workflow, source commit, and source
ref, including on cache hits. Changing the platform host no longer requires
rebuilding these external inputs. Compiled dependency binaries are no longer
checked into the repository.

Platform, browser runtime, starter, and site artifacts receive build attestations
after their candidate checks. Publication uses those tested bytes, and the
workflow verifies actual downloads before updating public URLs. New releases
are immutable. Historical releases are not retroactively attested by this work.

Source builds now need an authenticated GitHub CLI to verify dependency
attestations. Users of the complete published platform do not need Zig or a
repository checkout. Downloadable examples include the exact Roc compiler pin.

Native GUI development

The repository now includes a GPUI host and six maintained GUI examples sharing
the reactive engine with the browser host. Linux CI builds the applications and
opens them under a virtual Wayland desktop with software Vulkan; Windows CI
builds the applications and runs their native semantic specs. These checks do
not require a physical GPU.

Windows ADVAPI32 import libraries have their own pinned, attested dependency
release. Linux GUI FreeType is built independently from pinned source with Zig
and admitted through its verified release lock. GUI headers list Rust and Zig
archives separately for Roc's final link. Cargo tracks checkout identity so
unchanged host builds stay cached without reusing another checkout's host.
The release profile avoids cross-crate LTO. Other Linux GUI system libraries, macOS SDK
stubs, and prebuilt GUI host admission still have provenance gaps documented in
dependencies/README.md. The web release artifacts do not constitute a complete
verified cross-platform GUI distribution.

Validated artifacts

Source: 00096165a07738fdbaacb8e04c14313bba86d8f1. Compiler: nightly-2026-09-04-c125b82 (nightly bootstrap).

xkbcommon link inputs deps-xkbcommon-1.13.2-20260909.1

Choose a tag to compare

@github-actions github-actions released this 09 Sep 06:31
Immutable release. Only release title and notes can be modified.
d06261d

Dependency inputs built and tested from platform repository commit d06261d13a8bf2f1155db481354510790e99054e.

Each archive contains its upstream source identity, build recipe identity, exact file hashes, and copyright notices. The extracted candidate parsed and translated a self-contained keyboard map, and two clean builds produced identical archives. GitHub build attestations bind the archive digests to the producer.

Review and commit dependencies.lock.json in the consuming platform; use scripts/dependency_artifacts.py to verify and fetch it. This release contains no platform host or application code.