Skip to content

v0.9.26

Choose a tag to compare

@depletionmode depletionmode released this 10 May 20:21
· 32 commits to main since this release
78003cc

Patch release fixing the binary-publish path that v0.9.25 stalled on, plus a release-workflow consolidation. Code surface for the runtime is identical to v0.9.25 plus Windows tiny_c portability fixes, standalone Linux release assets, and a Docker image rework.

CI / build changes (since v0.9.25)

Workflow consolidation

The release workflow's build jobs were collapsed into one job per platform so common Rust dependencies are compiled once per OS instead of once per binary:

  • build-linux (ubuntu-22.04): one cargo invocation builds praxis_node + praxis_cli + praxis_service; make builds tiny_c.
  • build-macos (macos-26): one cargo invocation builds praxis_node + praxis_cli; make builds tiny_c.
  • build-windows (windows-latest): one cargo invocation builds praxis_node + praxis_cli; msys2 make builds tiny_c.
  • release (depends on the three platforms in parallel): downloads artifacts and repackages the standalone binaries into the Linux server tarball — no extra cargo build needed.

Net effect: each platform shares its cargo dep cache; the longest path is the slowest single platform build instead of (slowest matrix) + build-server.

Windows tiny_c portability

Verified locally with make windows against x86_64-w64-mingw32-gcc 16.1.0 — clean build, zero warnings, ~229 KB binary.

  • setsockopt casts: conn.c and amqp.c cast &one to (const char *) because Winsock's argument 4 is const char *, not POSIX's const void *.
  • strndup shim: MinGW's msvcrt-based libc does not ship strndup; tiny.h now provides a portable inline implementation, with <string.h> and <stdlib.h> added to the Windows include block.
  • Zero-init struct tm in main.c and util.c so the snprintf path is well-defined even if gmtime() returns NULL.
  • STARTUPINFOA initializer: praxis.c switches to {0}; si.cb = sizeof(si); to silence MinGW's -Wmissing-field-initializers.
  • BearSSL -Wno-unknown-pragmas: the Makefile passes the flag to the vendored BearSSL build so MinGW does not warn on the MSVC-only #pragma comment(lib, ...) in sysrng.c.

Standalone Linux release assets

  • build-linux now uploads praxis_cli-linux-x86_64 and praxis_service-linux-x86_64 as standalone release assets alongside the existing tarball.
  • install.sh Linux CLI install switches to the standalone download — no more extracting from the server tarball just to get the CLI.

Docker rework

  • Dockerfile drops the cargo-chef multi-stage build. Image is now debian:bookworm-slim; binaries are downloaded from the GitHub release tarball at build time. New build args:

    • PRAXIS_VERSION (default 0.9.26)
    • PRAXIS_RELEASE_BASE (default GitHub releases URL — override for forks/mirrors)

    Net effect: Docker builds become much faster and smaller — no Rust/mingw toolchains in the image build.

  • docker-compose.yml drops SKIP_NODE_BUILD and CARGO_PROFILE build args, replaces with PRAXIS_VERSION.

  • docs/src/reference/config.md env-var table updated to match.

Highlights (carried over from v0.9.24/v0.9.25)

  • Pure-C minimal node (node/tiny_c): ~46 KB stripped on Linux, ~229 KB on Windows (with statically-linked BearSSL TLS), libc-only at runtime.
  • TUI visual overhaul: opencode-inspired aesthetic (single heavy-bar panels, layered tints, in-place tool entries).
  • Stateless orchestrator: service no longer holds session state; the TUI persists each turn under ~/.praxis/sessions/ and resumes via --continue / --resume.
  • ~/.praxis/ consolidated layout for the operations DB and bridge CA files.
  • Web UI dropped from the default build.
  • macOS prebuilt binaries are arm64-only (Apple Silicon).

Breaking changes (carried over from v0.9.24)

  • Service no longer exposes session/list or session/load; orchestrator history is client-side only.
  • ~/.praxis_* dotfiles moved under ~/.praxis/. No automatic migration.
  • Default cargo build does not build praxis_web. Build it explicitly with cargo build -p praxis_web.
  • TUI orchestrator is single-session per process. Use --continue / --resume to reopen prior conversations.
  • Node type field renamed from native to full.
  • macOS prebuilt binaries are arm64-only.
  • Docker build args SKIP_NODE_BUILD and CARGO_PROFILE removed (replaced by PRAXIS_VERSION + PRAXIS_RELEASE_BASE).

Full Changelog: v0.9.23...v0.9.26