diff --git a/.github/workflows/sdk-release.yml b/.github/workflows/sdk-release.yml
index 88e312b..812e254 100644
--- a/.github/workflows/sdk-release.yml
+++ b/.github/workflows/sdk-release.yml
@@ -422,9 +422,142 @@ jobs:
path: dist/*
if-no-files-found: error
+ build-sdk-windows:
+ name: build-sdk-full (windows / x86_64)
+ runs-on: windows-2022
+
+ env:
+ BUILD_DIR: build-sdk-full
+ INSTALL_DIR: install-sdk-full
+ ASSET: vix-sdk-windows-x86_64.zip
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ fetch-depth: 0
+
+ - name: Checkout tag (manual input)
+ if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag != '' }}
+ shell: pwsh
+ run: |
+ git fetch --tags --force
+ git checkout "tags/${{ github.event.inputs.tag }}"
+
+ - name: Setup vcpkg
+ shell: pwsh
+ run: |
+ git clone https://github.com/microsoft/vcpkg $env:GITHUB_WORKSPACE\vcpkg
+ "VCPKG_ROOT=$env:GITHUB_WORKSPACE\vcpkg" | Out-File -FilePath $env:GITHUB_ENV -Append
+ cd $env:GITHUB_WORKSPACE\vcpkg
+ .\bootstrap-vcpkg.bat
+
+ - name: Vcpkg install
+ shell: pwsh
+ run: |
+ cd $env:GITHUB_WORKSPACE
+ & "$env:VCPKG_ROOT\vcpkg.exe" install --triplet x64-windows --x-manifest-root "$env:GITHUB_WORKSPACE"
+ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
+
+ - name: Configure SDK full
+ shell: pwsh
+ run: |
+ cmake -S . -B "$env:BUILD_DIR" -A x64 `
+ -DCMAKE_INSTALL_PREFIX="$env:GITHUB_WORKSPACE\$env:INSTALL_DIR" `
+ -DVIX_ENABLE_INSTALL=ON `
+ -DVIX_BUILD_EXAMPLES=OFF `
+ -DVIX_BUILD_TESTS=OFF `
+ -DVIX_ENABLE_WARNINGS=ON `
+ -DVIX_ENABLE_HTTP_COMPRESSION=OFF `
+ -DVIX_ENABLE_DB=ON `
+ -DVIX_DB_USE_SQLITE=ON `
+ -DVIX_DB_USE_MYSQL=OFF `
+ -DVIX_DB_USE_POSTGRES=OFF `
+ -DVIX_DB_USE_REDIS=OFF `
+ -DVIX_CORE_WITH_MYSQL=OFF `
+ -DVIX_ENABLE_ORM=ON `
+ -DVIX_ENABLE_WEBSOCKET=ON `
+ -DVIX_ENABLE_CLI=ON `
+ -DVIX_ENABLE_MIDDLEWARE=ON `
+ -DVIX_ENABLE_P2P=ON `
+ -DVIX_ENABLE_P2P_HTTP=ON `
+ -DVIX_ENABLE_CACHE=ON `
+ -DVIX_ENABLE_ASYNC=ON `
+ -DVIX_ENABLE_VALIDATION=ON `
+ -DVIX_ENABLE_CRYPTO=ON `
+ -DVIX_ENABLE_WEBRPC=ON `
+ -DVIX_ENABLE_TIME=ON `
+ -DVIX_ENABLE_TESTS_MODULE=ON `
+ -DVIX_ENABLE_TEMPLATE=ON `
+ -DVIX_ENABLE_PROCESS=ON `
+ -DVIX_ENABLE_THREADPOOL=ON `
+ -DVIX_ENABLE_KV=ON `
+ -DVIX_ENABLE_AGENT=ON `
+ -DVIX_ENABLE_GAME=OFF `
+ -DVCPKG_TARGET_TRIPLET=x64-windows `
+ -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT\scripts\buildsystems\vcpkg.cmake"
+
+ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
+
+ - name: Build SDK
+ shell: pwsh
+ run: |
+ cmake --build "$env:BUILD_DIR" --config Release
+ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
+
+ - name: Install SDK
+ shell: pwsh
+ run: |
+ cmake --install "$env:BUILD_DIR" --config Release
+ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
+
+ - name: Verify installed SDK tree
+ shell: pwsh
+ run: |
+ if (!(Test-Path "$env:INSTALL_DIR\bin\vix.exe")) { throw "missing bin\vix.exe" }
+ if (!(Test-Path "$env:INSTALL_DIR\include\vix.hpp")) { throw "missing include\vix.hpp" }
+ if (!(Test-Path "$env:INSTALL_DIR\include\vix\websocket.hpp")) { throw "missing include\vix\websocket.hpp" }
+ if (!(Test-Path "$env:INSTALL_DIR\lib\cmake\Vix\VixConfig.cmake")) { throw "missing VixConfig.cmake" }
+ if (!(Test-Path "$env:INSTALL_DIR\lib\cmake\Vix\VixTargets.cmake")) { throw "missing VixTargets.cmake" }
+
+ & "$env:INSTALL_DIR\bin\vix.exe" --version
+ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
+
+ - name: Package SDK
+ shell: pwsh
+ run: |
+ New-Item -ItemType Directory -Force -Path dist | Out-Null
+ Compress-Archive -Path "$env:INSTALL_DIR\*" -DestinationPath "dist\$env:ASSET" -Force
+ if (!(Test-Path "dist\$env:ASSET")) { throw "missing SDK archive" }
+
+ - name: Validate packaged SDK
+ shell: pwsh
+ run: |
+ Remove-Item -Recurse -Force smoke-sdk -ErrorAction SilentlyContinue
+ New-Item -ItemType Directory -Force -Path smoke-sdk | Out-Null
+
+ Expand-Archive -LiteralPath "dist\$env:ASSET" -DestinationPath smoke-sdk -Force
+
+ if (!(Test-Path "smoke-sdk\bin\vix.exe")) { throw "archive missing bin\vix.exe" }
+ if (!(Test-Path "smoke-sdk\include\vix.hpp")) { throw "archive missing include\vix.hpp" }
+ if (!(Test-Path "smoke-sdk\lib\cmake\Vix\VixConfig.cmake")) { throw "archive missing VixConfig.cmake" }
+
+ & "smoke-sdk\bin\vix.exe" --version
+ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
+
+ - name: Upload dist
+ uses: actions/upload-artifact@v4
+ with:
+ name: sdk-dist-windows-x86_64
+ path: dist/*
+ if-no-files-found: error
+
publish-sdk:
name: publish-sdk
- needs: build-sdk
+ needs:
+ - build-sdk
+ - build-sdk-windows
runs-on: ubuntu-24.04
steps:
@@ -441,8 +574,10 @@ jobs:
mkdir -p dist
find dist-all -type f -name "vix-sdk-linux-x86_64.tar.gz" -exec cp -f {} dist/ \;
+ find dist-all -type f -name "vix-sdk-windows-x86_64.zip" -exec cp -f {} dist/ \;
test -f dist/vix-sdk-linux-x86_64.tar.gz
+ test -f dist/vix-sdk-windows-x86_64.zip
ls -lah dist
@@ -453,7 +588,7 @@ jobs:
cd dist
- for f in vix-sdk-*.tar.gz; do
+ for f in vix-sdk-*.tar.gz vix-sdk-*.zip; do
[ -f "$f" ] || continue
sha256sum "$f" > "$f.sha256"
done
@@ -488,7 +623,7 @@ jobs:
printf "%s" "$MINISIGN_PRIVATE_KEY_B64" | base64 -d > "$keyfile"
test -s "$keyfile"
- for f in vix-sdk-*.tar.gz; do
+ for f in vix-sdk-*.tar.gz vix-sdk-*.zip; do
[ -f "$f" ] || continue
"$MS" -S -s "$keyfile" -m "$f"
done
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 52331ba..a6c1bf4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,43 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## v2.6.2
+
+### Added
+
+- Added constant-time byte comparison helpers to the crypto module for security-sensitive comparisons.
+- Added PBKDF2-HMAC-SHA256 password hashing and verification helpers to the crypto module.
+
+### Fixed
+
+- Fixed `vix run` for generic CMake projects by detecting and running the executable produced by the build instead of assuming the folder name is the target name.
+- Kept default `vix run` output cleaner during normal execution.
+- Fixed `vix update` so it updates only dependencies with newer resolved versions instead of reprocessing every dependency in the project.
+- Fixed `vix update` so it respects the version constraints declared in `vix.json` instead of always resolving direct dependencies to the latest registry version.
+- Improved `vix update` so it can refresh lockfile metadata and package hashes even when dependency versions do not change.
+- Improved `vix update` summaries by separating version changes from lockfile metadata updates.
+- Improved `vix update` output so already-current dependencies are no longer repeated in the main update summary.
+- Improved `vix outdated` so the default view shows only direct project dependencies from `vix.json`, with `--all` available for the full locked dependency graph.
+- Improved `vix list` so the default view shows only direct project dependencies from `vix.json`, with `--all` available for transitive locked dependencies.
+- Added pagination and JSON output support to `vix list`.
+- Fixed `vix install` output so it reports only dependencies that were actually installed or relinked instead of counting every dependency from `vix.lock` as newly installed.
+- Fixed `vix install` output to keep dependency installation messages shorter and cleaner.
+- Fixed project dependency installation by handling stale or broken `.vix/deps` links more reliably.
+- Fixed transitive registry dependency propagation so packages like `rix/rix` can expose dependencies such as `rix/csv`, `rix/debug`, and `rix/auth` without requiring every app to list them manually.
+- Improved `vix publish` diagnostics when a tag exists locally but has not been pushed to `origin`.
+- Fixed `vix publish` registry preparation so stale local publish branches and untracked registry entry files are cleaned before checking whether a version already exists.
+- Improved registry dependency workflows after testing the registry install, update, and generated CMake integration flow in production with `pico.vixcpp.com`.
+- Fixed the Windows SDK release pipeline so `vix-sdk-windows-x86_64.zip` is built, packaged, checksummed, signed, and uploaded to GitHub Releases.
+- Fixed the Windows installer failure where `install.ps1` attempted to download `vix-sdk-windows-x86_64.zip` but the asset was missing from the release.
+- Improved CMake error parsing so multi-line `message(FATAL_ERROR ...)` diagnostics are displayed clearly instead of collapsing into unreadable one-line reasons.
+- Improved `vix build` verbose behavior so `-v` remains readable while `--cmake-verbose` is reserved for raw CMake/Ninja output.
+- Improved `vix tests` failure diagnostics so test runner output is summarized with clearer failed test names, source locations, focused error messages, and compact code frames.
+- Improved `vix.app` diagnostics when `.vix/vix_deps.cmake` is missing.
+- Improved `vix.app` resource validation so missing resources fail early with a clear error instead of a long post-build CMake command.
+- Fixed build toolchain behavior by using absolute system archiver paths.
+- Exposed middleware app integration helpers through the public aggregate header.
+- Kept middleware aggregate header cache independent.
+
## v2.6.1
### Changed
diff --git a/README.md b/README.md
index e2afa3d..1f580dd 100644
--- a/README.md
+++ b/README.md
@@ -16,12 +16,13 @@
Build real applications with modern C++.
- Vix.cpp is a modern C++ runtime for building fast, reliable, production-ready applications.
+ Vix.cpp is a modern C++ runtime and developer toolkit for building fast, reliable, production-ready applications.
Website ·
Docs ·
+ Rix ·
Registry ·
Engineering notes
@@ -31,9 +32,9 @@
|
@@ -41,20 +42,20 @@
Vix.cpp removes friction from C++ application development.
+
It gives C++ a modern application workflow while keeping native performance, explicit control, and production-oriented architecture.
-Vix is not just a web framework.
-It is a runtime foundation for backend services, AI agents, games, P2P systems, local-first applications, fast builds, templates, and production-ready C++ projects.
+Vix is not only a web framework. It is a runtime foundation for backend services, WebSocket applications, AI agents, games, P2P systems, local-first applications, fast builds, templates, package-based projects, and production-ready C++ services.
## Install
-Shell, Linux and macOS:
+Linux and macOS:
```bash
curl -fsSL https://vixcpp.com/install.sh | bash
```
-PowerShell, Windows:
+Windows PowerShell:
```powershell
irm https://vixcpp.com/install.ps1 | iex
@@ -62,7 +63,9 @@ irm https://vixcpp.com/install.ps1 | iex
More installation options:
+```text
https://vixcpp.com/install
+```
## Quick start
@@ -70,13 +73,12 @@ Create `server.cpp`:
```cpp
#include
-using namespace vix;
int main()
{
vix::App app;
- app.get("/", [](Request &req, Response &res) {
+ app.get("/", [](vix::Request &req, vix::Response &res) {
res.send("Hello from Vix.cpp");
});
@@ -105,17 +107,21 @@ C++ is powerful, but building real applications often means rebuilding the same
Vix gives you that foundation:
- run C++ files with `vix run`
-- create projects with `vix new`
-- build fast with `vix build`
-- build backend services
+- create structured projects with `vix new`
+- build projects with `vix build`
+- run tests with `vix tests`
+- manage packages through the Vix registry
+- build HTTP backend services
- build WebSocket applications
- build P2P systems
-- build AI agents
+- build AI agent projects
- build game-oriented projects
-- use threadpool and async runtime modules
-- use KV, cache, database, ORM, middleware, crypto, validation, and template modules
+- use async and threadpool modules
+- use KV, cache, database, ORM, middleware, crypto, validation, JSON, template, and process modules
- generate production-ready backend projects
-- integrate backend projects with frontend apps such as Vue.js
+- integrate backend projects with frontend applications such as Vue.js
+
+Vix is designed to make C++ feel usable for real application development without hiding what makes C++ powerful.
## Runtime modules
@@ -131,37 +137,263 @@ utils validation webrpc websocket
Vix.cpp is designed as an application runtime layer, not only as an HTTP server.
+## Vix Reply
+
+Vix Reply is the interactive REPL engine for Vix.
+
+It powers the interactive `vix` and `vix repl` experience, with support for expressions, variables, JSON values, runtime helpers, and real C++ snippets powered by the normal `vix run` pipeline.
+
+Start the REPL:
+
+```bash
+vix
+```
+
+Or explicitly:
+
+```bash
+vix repl
+```
+
+Run real C++ from the REPL:
+
+```text
+>>> :cpp
+C++ mode. Type :run to execute or :cancel to exit.
+cpp> #include
+... int main() {
+... vix::print("Hello from C++");
+... }
+Hello from C++
+```
+
+Vix Reply is not a fake C++ interpreter. C++ snippets are written to a temporary `.cpp` file and executed through `vix run`, so the code goes through the real compiler, Vix diagnostics, and the normal runtime behavior.
+
+## Registry and packages
+
+Vix includes registry integration for package-based C++ projects.
+
+```bash
+vix add rix/csv
+vix install
+vix build
+```
+
+The registry makes it possible to build a larger ecosystem around Vix without forcing every library into the core runtime.
+
+## Rix
+
+Rix is the official userland library layer for Vix.cpp.
+
+It provides optional public libraries that live in the registry and can evolve independently from Vix Core.
+
+Vix stays focused on the runtime, CLI, build workflow, registry integration, and existing core modules.
+
+Rix provides reusable libraries for application developers.
+
+Examples:
+
+```bash
+vix add rix/csv
+vix add rix/debug
+vix add rix/auth
+vix add rix/pdf
+```
+
+Rix packages can be used independently, or through a unified facade package when a project wants one clean entry point.
+
+```cpp
+rix.csv.parse(...)
+rix.debug.print(...)
+rix.auth.register_user(...)
+rix.pdf.document()
+```
+
+Rix does not replace Vix.
+
+It grows around Vix as the public library layer for real applications.
+
+## Cnerium
+
+Cnerium is a reliability-first backend layer for Vix.
+
+It attaches to an existing Vix backend and adds durable route behavior for critical write operations.
+
+Cnerium is designed for routes that must stay correct under retries, timeouts, lost responses, process restarts, and unstable networks.
+
+```cpp
+#include
+#include
+
+int main()
+{
+ vix::App app;
+
+ auto c = cnerium::attach(app);
+
+ c.durable_post(
+ "/orders",
+ "orders.create",
+ [](cnerium::DurableRequest &request) {
+ return cnerium::created({
+ {"ok", true}
+ });
+ });
+
+ c.start();
+ app.run();
+}
+```
+
+Cnerium does not replace Vix. Vix remains the backend runtime, HTTP server, router, WebSocket transport, build workflow, and application foundation.
+
+Cnerium attaches to Vix and protects selected write operations.
+
## Built with Vix.cpp
-| Project | Description |
-| --------------------------------------------------------- | ----------------------------------------------------------------------------- |
-| [Kordex](https://github.com/softadastra/kordex) | JavaScript and TypeScript runtime layer built on Vix and Softadastra. |
-| [Softadastra](https://github.com/softadastra/softadastra) | Local-first and offline-first runtime foundation for reliable applications. |
-| [Cnerium](https://github.com/softadastra/cnerium) | Reliability-first application framework built on Vix and the Softadastra SDK. |
-| [Softadastra Cloud](https://github.com/softadastra/cloud) | Reliability testing control plane for reports, scores, and dashboard results. |
-| [Converdict](https://github.com/softadastra/converdict) | Reliability verification platform for distributed systems. |
-| [PulseGrid](https://github.com/softadastra/PulseGrid) | Real-time service monitoring built with Vix.cpp. |
-| [Vix Game](https://github.com/vixcpp/vix-game) | Game-oriented project built on the Vix.cpp runtime foundation. |
+| Project | Description |
+| ------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
+| [Rix](https://github.com/rixcpp/rix) | Official userland library layer for Vix.cpp, distributed through the registry. |
+| [Vix Pico](https://github.com/vixcpp/pico) | Production-style backend used to validate Vix modules, deployment, auth, PDF generation, SQLite, KV, jobs, and WebSocket routes. |
+| [Vix Game](https://github.com/vixcpp/vix-game) | Game-oriented project built on the Vix.cpp runtime foundation. |
+| [Softadastra Runner](https://github.com/softadastra/runner) | Small command runner built with Vix.cpp and `vix::process`. |
+| [Softadastra Kordex](https://github.com/softadastra/kordex) | JavaScript and TypeScript runtime layer built on Vix and Softadastra. |
+| [Softadastra Engine](https://github.com/softadastra/softadastra) | Local-first and offline-first runtime foundation for reliable applications. |
+| [Softadastra Cnerium](https://github.com/softadastra/cnerium) | Reliability-first application framework built on Vix and the Softadastra SDK. |
+| [Softadastra Cloud](https://github.com/softadastra/cloud) | Reliability testing control plane for reports, scores, and dashboard results. |
+| [Softadastra Converdict](https://github.com/softadastra/converdict) | Reliability verification platform for distributed systems. |
+| [Softadastra PulseGrid](https://github.com/softadastra/PulseGrid) | Real-time service monitoring built with Vix.cpp. |
+
+## Vix Pico
+
+Vix Pico is a production-style backend built with Vix.cpp.
+
+It validates Vix in real backend conditions:
+
+- HTTP routes
+- WebSocket runtime
+- SQLite persistence
+- KV storage
+- threadpool jobs
+- runtime events
+- production service deployment
+- Rix Auth diagnostics
+- Rix PDF generation
+
+Pico is used to prove that Vix can build and deploy real backend applications, not only small examples.
+
+## Softadastra Runner
+
+Softadastra Runner is a simple command runner built with Vix.cpp.
-### Vix Game
+It shows how to structure a small console application around:
-Game-oriented project built on the Vix.cpp runtime foundation.
+- application orchestration
+- CLI input and output
+- command parsing
+- service logic
+- process execution through `vix::process`
-https://github.com/vixcpp/vix-game
+Run it with:
+
+```bash
+vix build
+vix run
+```
+
+Runner is intentionally small, readable, and useful as a clean example for building console tools with Vix.cpp.
+
+## Project workflow
+
+Create a new project:
+
+```bash
+vix new hello --app
+cd hello
+```
+
+Build it:
+
+```bash
+vix build
+```
+
+Run it:
+
+```bash
+vix run
+```
+
+Run tests:
+
+```bash
+vix tests
+```
+
+Add a package:
+
+```bash
+vix add rix/csv
+vix install
+```
+
+## Production workflow
+
+Vix provides a production workflow for backend applications.
+
+A basic deployment can be handled with:
+
+```bash
+vix deploy
+```
+
+`vix deploy` can build the application, restart the service, check service status, run health checks, validate the proxy, and show logs when something fails.
+
+For production inspection and operations, Vix also provides:
+
+```bash
+vix doctor production
+vix service status
+vix logs
+vix health
+vix proxy nginx check
+```
+
+A typical production flow looks like this:
+
+```bash
+vix build
+vix service install
+vix proxy nginx init
+vix deploy
+vix doctor production
+```
+
+The idea is to avoid custom deployment scripts for normal Vix backend applications.
+
+Vix should make the production state visible: service, ports, proxy, TLS, health checks, logs, and runtime status.
## Links
+- Website: https://vixcpp.com
- Documentation: https://docs.vixcpp.com
+- Rix documentation: https://rix.vixcpp.com
- Registry: https://registry.vixcpp.com
- Engineering notes: https://blog.vixcpp.com
-- Website: https://vixcpp.com
+- X: https://x.com/vix_cpp
+- YouTube: https://www.youtube.com/@vixcpp
## Contributing
Contributions are welcome.
+
Read the contribution guide:
+```text
https://docs.vixcpp.com/contributing
+```
+
+You can contribute by improving the runtime, writing examples, testing Vix on real projects, improving documentation, or publishing packages for the Vix registry.
## License
diff --git a/examples/rate_limit/rate_limit_pipeline_demo.cpp b/examples/rate_limit/rate_limit_pipeline_demo.cpp
index aa8fa3e..67fc96c 100644
--- a/examples/rate_limit/rate_limit_pipeline_demo.cpp
+++ b/examples/rate_limit/rate_limit_pipeline_demo.cpp
@@ -26,10 +26,10 @@
using namespace vix::middleware;
-static vix::http::RawRequest make_req()
+static vix::http::Request make_req()
{
namespace http = boost::beast::http;
- vix::http::RawRequest req{http::verb::get, "/api/x", 11};
+ vix::http::Request req{http::verb::get, "/api/x", 11};
req.set(http::field::host, "localhost");
req.set("x-forwarded-for", "1.2.3.4");
req.prepare_payload();
diff --git a/modules/cli b/modules/cli
index c62291b..a180f65 160000
--- a/modules/cli
+++ b/modules/cli
@@ -1 +1 @@
-Subproject commit c62291bac48e9f2d163dfacccaab04c8d8091f8a
+Subproject commit a180f65e7a9c28a574549771a267f4d80e3c7bd3
diff --git a/modules/crypto b/modules/crypto
index 51017bd..9d3906e 160000
--- a/modules/crypto
+++ b/modules/crypto
@@ -1 +1 @@
-Subproject commit 51017bd53ca9b8ceb961fc982b262be035c71021
+Subproject commit 9d3906e2017d95d2491d8f2702f2031f48547173
diff --git a/modules/middleware b/modules/middleware
index 17b2c52..4a41d5d 160000
--- a/modules/middleware
+++ b/modules/middleware
@@ -1 +1 @@
-Subproject commit 17b2c527b974ddce93d813b30806804270d84509
+Subproject commit 4a41d5d908ecab9eff9abdc214eaf1451ec577b0