Skip to content

Changelog

All notable changes to Peppy will be documented on this page.

Subscribe to the Atom feed for updates.

v0.17.0 (Alpha): Dependency slots gain explicit cardinality, letting a slot bind to multiple producers through a uniform consumer API.

Dependency-slot cardinality

  • Dependency slots now support explicit cardinality, letting a slot bind to one or more producers instead of exactly one.
  • Bindings can target multiple producers, and consumers read them through a uniform bound_producers() API regardless of cardinality.
  • Generated producer accessors reflect each slot's cardinality: single-producer slots expose bound_producer() while multi-producer slots expose bound_producers().
  • Bindings can now specify explicit service and action targets.
  • Slots declared one_or_more must be non-empty, and this check now applies to programmatically supplied Flags values as well as arrays.
v0.16.0 (Alpha): Renames interfaces to contracts, tightens `depends_on` slot validation, and fixes macOS container builds.

Breaking changes

  • The conforms_to manifest field has been renamed to implements as part of a broader rename of "interfaces" to "contracts"; rename conforms_to to implements in your peppy.json5 and update any "interface" wording to "contract".
  • Dependency slots (depends_on) now require a single producer each, replacing the previous from_any binding model, and peppy now fails validation whenever a depends_on slot is left unfulfilled; update your bindings so every slot names exactly one producer.

Container builds and runs (macOS)

  • macOS container builds no longer silently default to $HOME and now use the current working directory.
  • The peppy data root is now mounted into the Lima VM so container builds and runs can access it.
  • Fixed a hang where restarting the Lima VM blocked the async runtime while registering a host mount for the first time.
  • Container Python bindings no longer ship stale native extensions after shared-crate changes.

Validation and output

  • Contract (implements) validation failures now report per-slot coverage mismatches instead of a single combined string.
  • The CLI info output formatting has been simplified.

Documentation

  • The advanced guides now include Python examples alongside the existing Rust examples.
  • The Python async examples now wrap select! in a loop and hold references to asyncio tasks so they are not cleaned up or garbage-collected prematurely.
v0.15.1 (Alpha): Adds remote core node targeting and collision detection, renames the serve command and the shared-directory variable.

Breaking changes

  • The PEPPYOS_SHARED_DIR environment variable has been renamed to PEPPY_SHARED_DIR; update your environment so the shared directory stays configured.

Core node targeting

  • The --core-node flag can now target a remote core node and is accepted by node add, node sync, and repo add.
  • The --core-node flag is now validated as the command is parsed, so invalid values are reported immediately.
  • peppy now detects core node name collisions.

Serve reliability

  • peppy service serve now shuts down cleanly when an error occurs during startup.
v0.15.0 (Alpha): Nodes can now declare, establish, and dissolve pairings with one another, and serve restarts and shutdowns are more reliable.

Node pairing

  • Nodes can now declare, establish, and dissolve pairings (peer links) with one another at runtime.
  • Each paired node exposes a LINK_ID and a pairings view in its generated module so node code can identify and work with its active links.
  • peppy stack list now shows an "Instance pairings" section listing the active pairings between running instances.
  • Malformed pairing targets are now rejected, and pairing delivery is protected against a link being dissolved concurrently.

Serve reliability

  • peppy serve no longer drops shutdown signals or races when restarting, so restarts and shutdowns now behave reliably.
v0.14.0 (Alpha): Logging in now connects your daemon to a per-user TLS-verified cloud router, and topics move to a new Subscription API.

Breaking changes

  • Topic subscriptions no longer use the per-call on_next_message_received method; subscribing now returns a Subscription that you hold and read messages from, so update your node code to use it.

Authentication and cloud routers

  • Logging in now fetches and caches your per-user cloud (zenoh) router configuration and federates your daemon to it live.
  • peppy verifies the router's TLS certificate when you log in.
  • Logging in or out now takes effect immediately, regenerating and restarting the daemon and propagating your organization namespace through it.
  • Fixed a cross-identity organization cache leak, added a daemon restart when the namespace drifts at startup, and hardened login and logout edge cases.
  • The restart warning is now skipped when your daemon stack has no user nodes.

Releasing

  • Added a --skip-prod-cert-check flag to bypass the production-router certificate gate when running a release.

Topics

  • Tightened how subscriptions behave once they are closed, across generated node code and the docs.

Reliability

  • peppy now retries transient ETXTBSY and ENOENT exec errors when extracting the ruff binary during parallel binary extraction.

Documentation

  • Clarified that reconnect_after_secs and repull_after are cache-freshness hints rather than keepalive deadlines.
v0.14.1 (Alpha): Bundle downloads retry transient failures, AppArmor profiles are per-install, and node run drops the legacy --link-id flag.

Breaking changes

  • The legacy --link-id flag has been removed from node run; remove it from any commands or scripts that still pass it.

Node downloads and runtime

  • Transient HTTP failures when downloading node bundles are now retried automatically with bounded backoff, making node setup more resilient to flaky networks.
  • Empty environment variable path overrides are now treated as unset, so an empty value falls back to the default instead of being used as a literal path.

AppArmor

  • AppArmor profiles are now namespaced per Apptainer installation path, so multiple Apptainer installations no longer collide.
  • The AppArmor fix script now shell-escapes the starter path correctly, so installation paths containing special characters work.
v0.13.0 (Alpha): Adds OAuth device-flow sign-in through the new peppy auth commands and moves schema identifiers to a slash-separated form.

Breaking changes

  • Schema identifiers now use a slash separator (node/v1, interface/v1, launcher/v1); update the schema references in your peppy.json5 to the new slash-separated form.

Authentication

  • Added peppy auth login, peppy auth logout, and peppy auth whoami to sign in, sign out, and check your current identity using the OAuth device flow.
v0.12.1 (Alpha): Adds signal handling and bind-mount safety.

Container lifecycle

  • Lima liveness checks now share a bounded wait helper and enforce per-probe timeouts.
  • Native containers now fall back to a host SIGTERM when the in-guest signal is unavailable.
  • In-VM container processes on macOS now receive a cooperative SIGTERM phase before being force-killed.

Stack

  • All container bind mounts are now pre-flighted before any instance is started.
v0.12.0 (Alpha): Remove emit topics API that could cause deadlocks on large payloads

What's Changed

Full Changelog: v0.11.1...v0.12.0

v0.11.1 (Alpha): Fix a bunch of deadlocks on node stop

What's Changed

Full Changelog: v0.11.0...v0.11.1

v0.11.0 (Alpha): Add many fixes to the public APIs, especially with actions

What's Changed

  • Deploy peppylib as a standalone installable project in Python nodes by @godardt in #240
  • Fix producer death block by @godardt in #242
  • Add on_shutdown hook phase with grace-bounded LIFO execution across all node stop paths by @godardt in #243
  • Add stack benchmark improvements by @godardt in #244
  • fix: Replace half-address producer refs with fully-qualified ProducerRef by @godardt in #246
  • Fix force node stop on node build by @godardt in #245
  • Fix node stop targeting wildcard core nodes by @godardt in #247
  • fix: isolate peppy data root per CI run to prevent cross-run collisions by @godardt in #249
  • Return full producer identity (core_node + instance_id) from consumed topic callbacks by @godardt in #248
  • docs: sync with PR #250 by @godardt in #251
  • Release v0.11.0 by @godardt in #250

Full Changelog: v0.10.5...v0.11.0

v0.10.5 (Alpha): Fix `node stop` and daemon kill graceful shutdowns

What's Changed

Full Changelog: v0.10.4...v0.10.5

v0.10.4 (Alpha): Add `peppy stack benchmark`

What's Changed

Full Changelog: v0.10.3...v0.10.4

v0.10.3 (Alpha): Add support for shared datastore

What's Changed

Full Changelog: v0.10.2...v0.10.3

v0.10.2 (Alpha): Fix bidirectional communication design

What's Changed

Full Changelog: v0.10.1...v0.10.2

v0.10.1 (Alpha): Fix stack list display as well as --force flag on node build

What's Changed

  • fix: release gate slot before completing goal to eliminate "action already in progress" race by @godardt in #217
  • Fix zenohd stdout/stderr to file to prevent pipe buffer deadlock by @godardt in #218
  • Improve the output of the stack list command by @godardt in #219
  • Fix zombie processes by @godardt in #220
  • Release v0.10.1 by @godardt in #221

Full Changelog: v0.10.0...v0.10.1

v0.10.0 (Alpha): Add interface conformance along with fixes to action

What's Changed

Full Changelog: v0.9.3...v0.10.0

v0.9.3 (Alpha): Fix peppy actions misalignment

What's Changed

  • feat: bundle gocryptfs alongside apptainer for encrypted overlay support by @godardt in #193
  • Fix action communication misalignment by @godardt in #195

Full Changelog: v0.9.2...v0.9.3

v0.9.2 (Alpha): Add documentation for actions with optional fields

What's Changed

Full Changelog: v0.9.1...v0.9.2

v0.9.1 (Alpha): Fix cancel token during action feedback when the action ends

What's Changed

Full Changelog: v0.9.0...v0.9.1

v0.9.0 (Alpha): Add support for launchers repositories

Main changes

  • schema_version is now peppy_schema: "node_v1" or peppy_schema: "launcher_v1" depending if it's a node or a launcher
  • peppy stack launch <launcher_filename> now works with remote launchers. The https://github.com/Peppy-bot/launchers_hub repository is added by default. Running peppy stack launch ./<launcher_filename> defaults to a local path, while peppy stack launch <launcher_filename> defaults to a launcher in the repositories

What's Changed

Full Changelog: v0.8.5...v0.9.0

v0.8.5 (Alpha): Add ability to use `peppy node sync -r` to use repositories

What's Changed

Full Changelog: v0.8.4...v0.8.5

v0.8.4 (Alpha): Add support for default parameters

What's Changed

Full Changelog: v0.8.3...v0.8.4

v0.8.3 (Alpha): Add wall & sim clock support

What's Changed

Full Changelog: v0.8.2...v0.8.3

v0.8.2 (Alpha): Add core node information available to peppylib

What's Changed

Full Changelog: v0.8.1...v0.8.2

v0.8.1 (Alpha): Fix timeouts for `stack launch`

What's Changed

Full Changelog: v0.8.0...v0.8.1

v0.8.0 (Alpha): Add support for repositories

What's Changed

✨ Highlight: Repositories. This release introduces first-class repositories, a new way to tell peppy where to discover nodes. Register local directories, git repositories (with optional branch/tag pinning via --ref), or HTTP endpoints with peppy repo add, then run peppy repo refresh to build a cached index of every available node. Once indexed, nodes can be added by their short name:tag form (e.g. peppy node add uvc_camera:0.1.0) and launched in the node stack without pointing at a path or URL.

Full Changelog: v0.7.0...v0.8.0

v0.7.0 (Alpha): Separate `node add/start` into `node add/build/run`

What's Changed

Full Changelog: v0.6.2...v0.7.0

v0.6.2 (Alpha): Add code and command optimizations

What's Changed

Full Changelog: v0.6.1...v0.6.2

v0.6.1 (Alpha): Add support for arrays of objects in message format schemas

What's Changed

Full Changelog: v0.6.0...v0.6.1

v0.6.0 (Alpha): Add support for node variants

What's Changed

Full Changelog: v0.5.10...v0.6.0

v0.5.10 (Alpha): Add support for installation in containers

What's Changed

Full Changelog: v0.5.9...v0.5.10

v0.5.9 (Alpha): Remove Apptainer setuid

What's Changed

Full Changelog: v0.5.8...v0.5.9

v0.5.8 (Alpha): Fix architecture mismatch in Apptainer binary

What's Changed

  • Fix compilation of dependencies for correct architectures by @godardt in #138

Full Changelog: v0.5.7...v0.5.8

v0.5.7 (Alpha): Official support for more Linux distros

What's Changed

Full Changelog: v0.5.6...v0.5.7

v0.5.6 (Alpha): Add support for mounted devices in containers

What's Changed

Full Changelog: v0.5.5...v0.5.6

v0.5.5 (Alpha): Fix issues with installation script on some systems

What's Changed

Full Changelog: v0.5.4...v0.5.5

v0.5.0 (Alpha): Bidirectional communication support

What's Changed

Full Changelog: v0.4.0...v0.5.0

v0.5.1 (Alpha): Add more explanatory logs for add_cmd and start_cmd failures

What's Changed

  • Include command name in spawn and execution failure error messages by @godardt in #116
  • Add more explanatory logs for add_cmd and start_cmd failures by @godardt in #117

Full Changelog: v0.5.0...v0.5.1

v0.5.2 (Alpha): Fix daemon installation in Linux

What's Changed

Full Changelog: v0.5.1...v0.5.2

v0.5.3 (Alpha): Fix Linux .so Python lib not available for x86_64 systems

What's Changed

Full Changelog: v0.5.2...v0.5.3

v0.5.4 (Alpha): Add various fixes to the install script

What's Changed

Full Changelog: v0.5.3...v0.5.4

v0.4.0 (Alpha): Containers support

What's Changed

  • Feature/fix cross compilation by @godardt in #90
  • Add fakeroot pre-flight check and service stop/uninstall commands by @godardt in #91
  • Final implementation for containers by @godardt in #88
  • fix: auto-create host-side bind mount source directories by @godardt in #92
  • Replace fixed timeouts with idle + max timeout model for node by @godardt in #93
  • Fix python libs by @godardt in #95
  • Optimize codegen by @godardt in #96
  • Fix containers warnings by @godardt in #97
  • fix: move DEBIAN_FRONTEND export to %post section in apptainer templates by @godardt in #98
  • rename: daemon-node crate and related identifiers renamed to core-node by @godardt in #99
  • Add Lima VM cross-compilation for multi-target releases by @godardt in #100
  • Release v0.4.0 by @godardt in #101

Full Changelog: https://github.com/Peppy-bot/peppy/commits/v0.4.0

v0.3.6 (Alpha): Optimize PeppyOS internal behavior
  • sccache support
  • Optimize node add command
  • Update Python node template to use direct venv execution
  • Add external JSON parameter loading for standalone nodes in Python and Rust
v0.3.5 (Alpha): Trim Rust nodes size
v0.3.4 (Alpha): Optimize crates boundary crossing with Rust nodes
v0.3.0 (Alpha): Python support
  • Add python support
  • Rust codegen refactor
  • Rename master-node to daemon-node
  • Remove extra deps in nodes
v0.3.1 (Alpha): Add Python support with macOS (aarch64) and Linux (x86_64/aarch64) support
  • Add python support
  • Rust codegen refactor
  • Rename master-node to daemon-node
  • Remove extra deps in nodes
v0.3.2 (Alpha): Fix missing binaries for Python
v0.3.3 (Alpha): Support dataclass instances in with_parameters method in Python
v0.2.17 (Alpha): Fix for names-generator
v0.2.18 (Alpha): Update all dependencies
v0.2.15 (Alpha): Add interfaces integrity
v0.2.13 (Alpha): Add dependency check to add command
v0.2.14 (Alpha): Add user defined timeouts to add/start and launch cmd
v0.2.12 (Alpha): Fix add_cmd and start_cmd user vars

Fixed user variables not being properly applied in add_cmd and start_cmd operations.

v0.2.11 (Alpha): Update docs & add optimizations

Implement internal code optimizations

v0.2.10 (Alpha): Initial alpha release of PeppyOS
Features
  • Core node system with Rust support
  • Topic-based communication between nodes
  • Service and action patterns
  • Parameter system for node configuration
  • Launch files for multi-node orchestration
  • Node stack management
  • Standalone node execution mode
  • CLI tools for project management