Skip to content

StartOS

vstart-sdk/v2.0.4 Breaking

This release includes 2 breaking changes for platform teams planning a safe upgrade.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

bitcoin bitcoin-node lightning-node p2p personal-server privacy-enhancing-technologies
+1 more
self-hosted

ReleasePort's take

Moderate signal
editorial:auto 12d

`Daemons.dynamic` now accepts an `effects` parameter and returns a `DaemonReconciler`, breaking prior usage patterns.

Why it matters: This change breaks existing code that relied on the previous signature; developers must update calls to supply `effects` and handle the new `DaemonReconciler` return type in start-sdk v2.0.4.

Summary

AI summary

Daemons.dynamic now takes effects and returns a reconciler, breaking previous usage patterns.

Changes in this release

Breaking High

`Daemons.dynamic` now takes `effects` and returns a `DaemonReconciler` instead of replacing `main`.

`Daemons.dynamic` now takes `effects` and returns a `DaemonReconciler` instead of replacing `main`.

Source: llm_adapter@2026-07-14

Confidence: high

Breaking Medium

'setupMain' callback now accepts any DaemonBuildable rather than requiring a Daemons.

'setupMain' callback now accepts any DaemonBuildable rather than requiring a Daemons.

Source: granite4.1:30b@2026-07-14-audit

Confidence: low

Full changelog

What's Changed

Fixed

  • Daemons.dynamic now composes with setupMain instead of replacing it. main is always sdk.setupMain(...); what varies is the DaemonBuildable you return from it — a static sdk.Daemons.of(...) chain, or the reconciler for a runtime-varying daemon set. The OS ABI has always said as much (ExpectedExports.main returns a DaemonBuildable, and both Daemons and DaemonsReconciler implement it), but two signatures made that composition unwritable: setupMain demanded a Daemons rather than the ABI's DaemonBuildable, and Daemons.dynamic(fn) returned a main export — burying the DaemonsReconciler it constructs inside a closure. The only shape that compiled was the wrong one: replace main with Daemons.dynamic(...), then nest Daemons.of() inside its builder. Packages adopting dynamic daemons were funnelled straight into it. Now:

    • Breaking — Daemons.dynamic takes effects and returns the reconciler: sdk.Daemons.dynamic(effects, fn): DaemonsReconciler (was sdk.Daemons.dynamic(fn): main). Return it from setupMain.
    • setupMain's callback is widened to the ABI: it accepts any T.DaemonBuildable.

    Migration — wrap the builder in setupMain and pass effects:

    // before (2.0.0–2.0.3)
    export const main = sdk.Daemons.dynamic(async ({ effects }) => {
      return sdk.Daemons.of(effects).addDaemon(...)
    })
    
    // after
    export const main = sdk.setupMain(async ({ effects }) => {
      return sdk.Daemons.dynamic(effects, async ({ effects }) => {
        return sdk.Daemons.of(effects).addDaemon(...)
      })
    })
    

    Reconcile semantics are unchanged: inside the builder, constRetry reruns-and-reconciles rather than firing effects.restart(), so a watched-state change touches only the daemons whose configHash moved and the service stays running. Reported in #3470

Breaking Changes

  • `Daemons.dynamic` signature changed from `sdk.Daemons.dynamic(fn): main` to `sdk.Daemons.dynamic(effects, fn): DaemonsReconciler`; it now returns a reconciler instead of constructing a `main` export.
  • `setupMain` callback widened to accept any `DaemonBuildable` rather than requiring a `Daemons` instance.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track StartOS

Get notified when new releases ship.

Sign up free

About StartOS

Browser-based, graphical Operating System (OS) that makes running a personal server as easy as running a personal computer.

All releases →

Related context

Earlier breaking changes

  • v0.4.0-beta.9 Previous backups incompatible with v0.4.0; create fresh backup after updating.

Beta — feedback welcome: [email protected]