${ssrInterpolate(section.title)}
${ssrInterpolate(section.description)}
- `);
+ ssrRenderList(section.points, (point) => {
+ _push(`
- ${ssrInterpolate(point)} `); + }); + _push(`
diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/404.html b/vix-site/.vite-ssg-temp/1mc6wisw06/404.html new file mode 100644 index 000000000..6819fb324 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/404.html @@ -0,0 +1,11 @@ + + +
+ + + + + + diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/changelog-YD3fSK2P.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/changelog-YD3fSK2P.js new file mode 100644 index 000000000..5e909998a --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/changelog-YD3fSK2P.js @@ -0,0 +1,8 @@ +const html = 'This changelog documents the evolution of Vix.cpp across its public releases.
\nEach page explains the purpose of the release, the technical changes it introduced, the workflows affected, and the compatibility or validation work behind it. Releases are grouped by development period so related architectural changes remain easy to follow.
\nThe v2.8 line introduces vix::realtime, a transport-independent runtime for authoritative stateful applications, then strengthens the everyday C++ development loop, modular application architecture, dependency management, and project mutation safety.
Versions v2.8.0, v2.8.1, and v2.8.2 were published while release, packaging, and distribution issues were still being resolved. They remain part of the project history for traceability, but they should not be used as stable releases. Vix.cpp v2.8.3 is the first stable and supported release of the v2.8 line.
\nVix.cpp v2.8.5 stabilizes Vix Realtime and adds module-scoped Git dependencies, canonical module graph validation, dependency ownership and conflict detection, transactional project mutations, interrupted transaction recovery, and stricter Git installation contracts.
\nVix.cpp v2.8.4 adds lighter public headers, faster compilation and rebuilds, dependency-aware caching, safer build parallelism, clearer diagnostics, improved cross-compilation controls, and more consistent behavior across vix build, vix run, and vix dev.
Vix.cpp v2.8.3 introduces the stable v2.8 realtime runtime for authoritative stateful applications, with rooms, serialized commands, deterministic events, logical sessions, snapshots, replay, reconnection, presence, persistence stores, and optional WebSocket and PostgreSQL integration.
\nThe v2.7 line expands Vix beyond the core build and runtime workflow. It introduces specialized SDK profiles, Vix Note, Vix UI, Vix Requests, application modules, Softadastra Cloud integration, composable SDK installations, improved package management, package and namespace migrations, and the first package-based Note extension system.
\nVix.cpp v2.7.8 — adds first-class package moves and namespace migrations across the Vix Registry and CLI, automatic registry pull request creation, dependency-only workspace packages, semantic version ordering, and broader compatibility with managed, system, local, and legacy Vix SDK installations.
\nVix.cpp v2.7.7 — introduces package-based extensions for Vix Note, extension discovery and management, registry-aware extension commands, a modernized Vix Reply editor, and more reliable global installation of CLI packages.
\nVix.cpp v2.7.6 — adds secure browser-based authentication for Softadastra Cloud, preserves terminal login for scripts and fallback environments, and fixes Cloud API connectivity and HTTPS transport lifetime handling.
\nVix.cpp v2.7.5 — fixes composed SDK generation for multi-profile installations and adds safe automatic migration of obsolete lockfile integrity metadata during vix install.
Vix.cpp v2.7.4 — makes installed SDK profiles composable, allowing projects to combine modules from profiles such as web and data without installing the complete all SDK.
Vix.cpp v2.7.3 — adds generated WebSocket modules, API-only backend projects, the first Softadastra Cloud CLI workflow, Git dependencies, global package installation, faster single-file execution, and safer public registry publishing.
\nVix.cpp v2.7.2 — adds module-level registry dependencies, keeps dependency resolution in one root vix.lock, links packages to the modules that use them, and introduces timeout and output guards for C++ cells in Vix Note.
Vix.cpp v2.7.1 — introduces Vix App Modules for structuring C++ applications and backends, with manifest-driven activation, generated route registration, module tests, architecture checks, and manifest-aware vix dev rebuilds.
Vix.cpp v2.7.0 — introduces Vix Note, Vix UI, and Vix Requests, together with specialized SDK profiles, CLI-first SDK installation, and the first desktop and mobile application shell workflows.
\nThe v2.6 line develops the application workflow around vix.app, backend tooling, runtime reliability, diagnostics, tests, and release validation.
Vix.cpp v2.6.3 — strengthens Core lifecycle and shutdown behavior, adds official benchmark baselines, improves vix run and vix tests, expands sanitizer coverage, and tightens CI and module validation.
Vix.cpp v2.6.2 — improves dependency installation and updates, registry reliability, package listing commands, Windows SDK packaging, crypto helpers, and command diagnostics.
\nVix.cpp v2.6.1 — improves runtime and build diagnostics, test failure reporting, SDK release validation, and full-SDK consumer linking through vix::vix.
Vix.cpp v2.6.0 — introduces the AI agent module, the official vix.app workflow, Vue integration, target-aware builds, async-powered vix dev, production backend tooling, and the game runtime foundation.
The v2.5 line develops faster execution, generated projects, registry integration, build diagnostics, replay, and the early application manifest architecture.
\nVix.cpp v2.5.6 — fixes generated library workflows, improves header-only package guidance, strengthens Ninja target diagnostics, and simplifies CLI output.
\nVix.cpp v2.5.5 — improves registry dependency linking in vix run, installed module consistency, package exports, and the first experimental vix.app workflow.
Vix.cpp v2.5.3 — introduces execution replay, runtime diagnostics, incremental build graph foundations, improved test and check output, and a dedicated development session engine.
\nThese releases establish the broader module, package, manifest, and direct-execution workflows used by later Vix versions.
\nVix.cpp v2.4.0 — adds native static file serving, standalone modules, umbrella headers, vix::tests, broader environment support, and real-world examples.
Vix.cpp v2.3.1 — fixes OpenSSL package resolution for consumer projects, particularly on macOS and Homebrew-based environments.
\nVix.cpp v2.3.0 — adds fast direct C++ execution, intelligent CMake fallback, script caching, database flags, and a cleaner vix run pipeline.
Vix.cpp v2.2.0 — introduces manifests, dependency resolution, root lockfiles, Semantic Versioning constraints, transitive packages, and interactive configuration generation.
\nThe v2.1 series focuses on cross-platform SDK packaging, dependency exports, runtime output, CMake diagnostics, and release portability.
\nVix.cpp v2.1.19 — adds structured CMake diagnostics, dedicated build failure detection, reliable clean builds, and fixes for package publication edge cases.
\nVix.cpp v2.1.18 — improves SQLite target compatibility across CMake versions and fixes exported WebSocket dependencies.
\nVix.cpp v2.1.17 — fixes SQLite target resolution for exported WebSocket packages and improves dependency handling in VixConfig.cmake.
Vix.cpp v2.1.16 — improves Linux release portability, SDK runtime compatibility, header-only fmt and spdlog integration, and packaged artifact validation.
Vix.cpp v2.1.15 — improves SDK binary portability, relative runtime paths, installer behavior, and self-contained runtime execution.
\nVix.cpp v2.1.14 — cleans up cache module dependencies, unifies vix::json, and fixes exported VixTargets.
Vix.cpp v2.1.13 — makes nlohmann_json integration export-safe and improves cache module dependency and SDK packaging behavior.
Vix.cpp v2.1.12 — stabilizes JSON and SQLite exports, CMake package generation, and reusable SDK installation.
\nVix.cpp v2.1.11 — introduces full SDK packaging for Linux, macOS, and Windows with consistent bin, include, and lib layouts.
Vix.cpp v2.1.10 — improves Windows dependency resolution, cross-platform build reliability, and Boost dependency cleanup.
\nVix.cpp v2.1.9 — completes the fmt migration, fixes logging dependency propagation, and simplifies CMake configuration.
Vix.cpp v2.1.8 — fixes macOS spdlog compatibility and improves logging portability.
Vix.cpp v2.1.7 — fixes macOS builds and completes cross-platform dependency setup.
\nVix.cpp v2.1.6 — restores Linux dependencies and fixes aarch64 cross-compilation behavior.
\nVix.cpp v2.1.5 — fixes the Linux aarch64 release pipeline and cross-compilation dependency discovery.
\nVix.cpp v2.1.4 — removes build warnings, improves runtime safety, cleans up CMake configuration, and simplifies the CLI.
\nVix.cpp v2.1.3 — improves runtime output, task execution, vix fmt, vix info, global updates, and Vix Reply.
Vix.cpp v2.1.2 — adds shell completion, paginated package search, PTY runtime output, and improved command suggestions.
\nVix.cpp v2.1.1 — fixes registry dependency resolution, generated CMake safety, and package loading order.
\nVix.cpp v2.1.0 — improves runtime performance, documentation structure, project templates, examples, and ecosystem maturity.
\nvix build is becoming more target-aware.
The goal is simple:
\nbuild the target that was requested\nskip work that is already known to be clean\nfallback to CMake and Ninja when they are the safer pathVix still keeps CMake and Ninja compatibility.\nBut Vix now has a stronger build layer on top of them.\nThe graph target executor is now the default path for real build targets.
\nBefore this change, vix build mostly behaved like this:
vix build\n -> resolve project\n -> configure CMake if needed\n -> call CMake build\n -> let Ninja execute the targetThis path is reliable.\nIt works for existing CMake projects.\nIt works for complex targets.\nIt works for all.
But it also means that even when Vix knows more about the project, it still delegates almost everything to the CMake/Ninja path.\nThat is safe, but not always ideal.
\nFor real targets, Vix now uses the graph target executor by default.
\nExample:
\nvix build --build-target vixThe path becomes:
\nvix build\n -> resolve project\n -> configure CMake if needed\n -> import compile_commands.json\n -> import build.ninja\n -> build Vix BuildGraph\n -> resolve requested target\n -> collect target closure\n -> check dirty compile tasks\n -> execute only what is neededThis gives Vix a build view that is more precise than a plain command wrapper.\nVix can now reason about the requested target before deciding what to run.
\nThis change does not remove CMake.\nIt does not remove Ninja.\nThe current model is:
\nCMake -> configuration and compatibility\nNinja -> generated build graph and fallback execution\nVix -> target-aware graph analysis and fast pathsThat is important.\nCMake and Ninja are still excellent for compatibility.\nVix uses them as a stable foundation while adding its own build intelligence on top.
\nall stays on the CMake/Ninja pathThe all target is different.\nIt is not a single executable.\nIt is not a single library.\nIt is a global target that can include many things:
So this still uses the normal CMake/Ninja path:
\nvix build --build-target allThe rule is:
\nreal target -> graph target executor\nall target -> CMake/NinjaThis keeps the behavior safe.
\nFor a target like:
\nvix build --build-target vixVix resolves the graph target and collects its closure.
\nConceptually:
\ntarget: vix\n -> link task\n -> object files\n -> compile tasks\n -> source files\n -> dependency files\n -> headersThen it checks which compile tasks are dirty.\nIf no source, header, command, or output state requires recompilation, the target is clean.\nThe output can look like:
\n✔ Graph target: vix\n✔ Up to date\n✔ DoneOne important improvement is that Vix can now skip the final Ninja call when the graph already proves the target is up to date.\nBefore this improvement, even a clean graph could still end with:
\nninja -C build-ninja vixNinja would then answer:
\nninja: no work to do.That is correct, but still extra work.\nNow the graph executor can detect:
\ndirty compile tasks: 0\ntarget output existsThen it can skip Ninja entirely.\nThe internal logic is:
\nif no dirty compile tasks\nand target outputs exist\nthen return up to dateThis makes the no-op path cleaner.
\nA key fix was the dirty detection logic.\nFor compile tasks, the output object file should not make the task dirty just because the output node changed.
\nA compile task should be dirty when:
\nThe output object is the result of the task.\nIt should not be treated the same way as an input.\nThe corrected model is:
\ncompile task dirty =\n dirty input\n or missing outputThis matters because large projects can have hundreds of compile tasks.\nOn Vix.cpp itself, the vix target selected hundreds of compile tasks.\nAfter the dirty logic was corrected, a clean rebuild correctly reported:
dirty compile tasks: 0That is the behavior needed for reliable target-aware builds.
\nThe graph executor can handle target-aware builds.\nBut for very large dirty closures, Ninja is still a better execution engine today.\nSo Vix has a safety fallback.\nIf too many compile tasks are dirty, Vix falls back to Ninja.\nThe rule is not based on the number of selected tasks.\nA large target can select many tasks and still be clean.\nThe rule is based on dirty tasks:
\nmany selected tasks + zero dirty tasks -> fine\nmany selected tasks + many dirty tasks -> fallback to NinjaThis avoids a bad path where Vix tries to directly execute a very large dirty build closure before the graph executor is mature enough for that case.
\nDuring development, graph logs were useful.\nThey showed steps like:
\ngraph: resolving target task\ngraph: collecting task closure\ngraph: selected compile tasks\ngraph: checking dirty compile tasks\ngraph: target outputs exist, skipping ninjaThat helped debug the executor.\nBut this is too verbose for normal users.\nSo graph logs are hidden by default.\nThey should only appear with:
\nVIX_LOG_LEVEL=debug vix build --build-target vix -vor:
\nVIX_LOG_LEVEL=trace vix build --build-target vix -vThe normal output stays clean:
\n✔ Graph target: vix\n✔ Up to date\n✔ Done--fast build-state pathThe biggest no-op speedup came from the build-state fast path.\nThe graph executor avoids unnecessary Ninja work.\nBut before reaching the graph executor, Vix may still need to:
\ncompile_commands.jsonbuild.ninjaFor a large repository, that can still cost time.\nSo --fast adds a higher-level shortcut.\nIf the project state matches the last successful build, Vix can return early:
vix build --fast --build-target vixExpected output:
\nChecking vix (dev)\n ✔ Up to date in 0.30sThis happens before loading global packages, before rebuilding the graph, and before invoking Ninja.
\nThe fast path depends on build-state validation.\nIt compares the current state with the last successful build.\nThe state includes information like:
\nIf the state matches, Vix can safely say:
\nnothing changedThen it skips the full build pipeline.\nThis is the fastest no-op path.
\nOn the Vix.cpp repository, the no-op benchmark showed the difference clearly.
\nvix build --fast --build-target vix 303 ms\nvix build --build-target vix 6.10 s\nVIX_GRAPH_EXECUTOR=0 vix build --build-target vix 6.16 sThat means the fast path was about:
\n20x fasterfor this no-op target build.\nThe important detail is that this benchmark is for a clean no-op state.\nIt does not mean every build is 20x faster.\nIt means Vix can now skip the full pipeline when the project state proves that nothing changed.
\nA no-op build is common during development.\nDevelopers often run a build to check whether the project is still valid.\nIf nothing changed, the best build is the one that proves that quickly.\nThe old no-op path still needed to walk through the normal build system.\nThe fast path can now avoid that.\nThis improves the feedback loop.
\nThe current build model is now:
\nvix build --build-target all\n -> CMake/Ninja path\n\nvix build --build-target <real-target>\n -> graph target executor\n\nvix build --fast --build-target <real-target>\n -> build-state fast path when valid\n -> fallback to graph/CMake/Ninja when neededThis gives Vix three layers:
\nfast state check\ntarget-aware graph execution\nCMake/Ninja compatibility fallbackEach layer has a purpose.
\nA wrapper simply forwards commands.\nVix Build now does more than that.
\nIt can:
\nThis is build-system behavior.\nCMake and Ninja are still part of the pipeline, but Vix now owns more of the decision-making.
\nExisting CMake projects continue to work.\nThe CMake path remains the compatibility layer.\nThe graph executor can be disabled:
\nVIX_GRAPH_EXECUTOR=0 vix build --build-target vixAnd all still uses the CMake/Ninja path:
vix build --build-target allThis means the new executor improves the build path without removing the old one.
\nVix is not trying to replace the entire C++ ecosystem in one step.\nThe better path is gradual:
\nThis change follows that path.\nIt keeps the reliability of CMake/Ninja while allowing Vix to become more than a command wrapper.
\nOwning the graph opens the door to better build features.\nFuture improvements can include:
\nvix.app native builds fasterThe graph executor is a foundation.\nIt gives Vix a place to build these features.
\nvix.appThis also helps the long-term vix.app direction.\nToday, vix.app uses generated CMake for compatibility.\nBut the long-term path is:
vix.app\n -> native BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkThe graph target executor brings Vix closer to that model.\nIt proves that Vix can reason about build targets directly.\nThat is necessary before native vix.app builds can become the fast path.
The principle is:
\nuse Vix where Vix can be correct\nfallback to CMake/Ninja where they are saferThat is the right balance.\nIt gives users speed without losing compatibility.\nIt gives Vix room to grow without breaking existing C++ projects.
\nvix build now has a stronger execution model.\nFor real targets, Vix can use its graph executor by default.\nFor clean targets, it can skip unnecessary Ninja work.\nFor no-op builds with --fast, it can return through a build-state fast path.\nAnd for complex or global targets, it still falls back to CMake and Ninja.\nThe result is a build system that stays compatible, but becomes more intelligent:
CMake/Ninja for compatibility\nBuildGraph for target awareness\nBuild state for fast no-op buildsThis is an important step toward a faster and clearer C++ build workflow.
\n'; +const graphTargetExecutorDefault = { + html +}; +export { + graphTargetExecutorDefault as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/how-vix-build-works-DJr1dwsZ.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/how-vix-build-works-DJr1dwsZ.js new file mode 100644 index 000000000..fa183339f --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/how-vix-build-works-DJr1dwsZ.js @@ -0,0 +1,8 @@ +const html = 'vix build is the command that turns a Vix.cpp project into build outputs.
Those outputs can be:
\nexecutables\nstatic libraries\nshared libraries\ntest binaries\nexamplesAt a high level, the command does four things:
\nresolve the project\ncreate a build plan\nconfigure the build system\nbuild the selected targetFor normal CMake projects, Vix keeps the CMake compatibility path.
\nFor vix.app projects, Vix can generate an internal CMake project first, then build it through the same build pipeline.
The current model is:
\nCMakeLists.txt\n -> project resolution\n -> build planning\n -> CMake configure\n -> CMake build\n\nvix.app\n -> project resolution\n -> generated CMake\n -> build planning\n -> CMake configure\n -> CMake buildThe long-term model is:
\nvix.app\n -> native BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkBut the current implementation keeps compatibility first.
\nvix build should answer these questions:
What project am I building?\nWhich build preset is active?\nWhere is the build directory?\nWhat is the CMake source directory?\nWhat is the default target name?\nDo I need to configure?\nDo I need to build?\nCan I reuse previous artifacts?\nCan I skip work safely?A good build command should not blindly rebuild everything.
\nIt should avoid unnecessary work while staying correct.
\nThe first step is project resolution.\nVix needs to find the project root.\nA project root is usually a directory containing one of these files:
\nCMakeLists.txt\nvix.appThe resolution rule is:
\n1. If CMakeLists.txt exists, use CMakeLists.txt.\n2. Otherwise, if vix.app exists, use vix.app.This rule is important because CMake remains the full-control path.
\nIf a CMakeLists.txt exists, Vix does not ignore it.
For a CMake project:
\nmyapp/\n CMakeLists.txt\n src/\n main.cppthe resolved project model is:
\nuserProjectDir = myapp/\ncmakeSourceDir = myapp/\ndefaultTargetName = myapp\ngeneratedFromVixApp = falseThe configure step can use:
\ncmake -S myapp -B myapp/build-ninjaThe build step can use:
\ncmake --build myapp/build-ninja --target myappwhen no explicit target is provided.
\nFor a vix.app project:
myapp/\n vix.app\n src/\n main.cppVix first parses the manifest.
\nThen it generates an internal CMake project under:
\nmyapp/.vix/generated/app/The resolved model becomes:
\nuserProjectDir = myapp/\ncmakeSourceDir = myapp/.vix/generated/app/\ndefaultTargetName = manifest.name\ngeneratedFromVixApp = trueThis distinction is critical.
\nThe user project is still:
\nmyapp/But the CMake source directory is:
\nmyapp/.vix/generated/app/For normal CMake projects, the two paths are the same.\nFor vix.app, they are different.\nThat means the build plan must not treat one path as everything.
Use:
\nuserProjectDirfor real project operations:
\nbuild directory placement\n.env lookup\nwatch mode\nsnapshots\ncache state\nexports\nuser diagnosticsUse:
\ncmakeSourceDirfor CMake configure:
\ncmake -S\ngenerated CMake diagnostics\nCMakeLists.txt pathIf those two paths are confused, Vix can build the wrong target, export to the wrong directory, or snapshot generated files instead of user files.
\nAfter project resolution, Vix creates a build plan.\nThe build plan contains derived paths and decisions.\nA good plan contains values like:
\nuserProjectDir\ncmakeSourceDir\nprojectDir\ndefaultTargetName\ngeneratedFromVixApp\npreset\nbuildDir\nconfigureLog\nbuildLog\nsignature\ncmakeVars\nlauncher\nfastLinkerFlag\nprojectFingerprintThe plan is the central object used by the build pipeline.\nIt tells the rest of the command what to configure, where to build, and what target to build.
\nVix has embedded build presets.
\nCommon presets include:
\ndev\ndev-ninja\nreleaseThey map to common build configurations.
\nExample:
\ndev:\n generator: Ninja\n build type: Debug\n build dir: build-dev\n\ndev-ninja:\n generator: Ninja\n build type: Debug\n build dir: build-ninja\n\nrelease:\n generator: Ninja\n build type: Release\n build dir: build-releaseSo this:
\nvix buildusually builds with the default development preset.
\nAnd this:
\nvix build --preset releaseuses the release preset.
\nThe build directory is where CMake and Ninja write build files and outputs.
\nExamples:
\nbuild-dev/\nbuild-ninja/\nbuild-release/For vix.app, build directories must still be created under the user project directory.
Correct:
\nmyapp/build-ninja/Wrong:
\nmyapp/.vix/generated/app/build-ninja/The generated CMake directory is not the user project root.
\nThe configure step runs CMake.
\nConceptually:
\ncmake -S <cmakeSourceDir> -B <buildDir> -G NinjaFor a CMake project:
\ncmake -S myapp -B myapp/build-ninja -G NinjaFor a vix.app project:
cmake -S myapp/.vix/generated/app -B myapp/build-ninja -G NinjaThis is why cmakeSourceDir exists.
The configure step must use the directory containing the active CMakeLists.txt.
The build step runs:
\ncmake --build <buildDir>If a target is known, Vix can build that specific target:
\ncmake --build build-ninja --target myappFor vix.app, the default target comes from:
name = myappSo the build step should not guess the target from:
\n.vix/generated/appThe target name should come from the manifest.
\nTarget selection follows this rule:
\nif --build-target is provided:\n use it\nelse if defaultTargetName exists:\n use it\nelse:\n use project directory nameThis keeps old CMake behavior while supporting vix.app.
Example:
\nvix build --build-target serverforces the target:
\nserverWithout an explicit target, a vix.app project uses:
manifest.nameVix can avoid unnecessary configure work by computing a signature.\nA configure signature represents the inputs that affect CMake configuration.
\nExamples:
\npreset\nCMake variables\ntoolchain file\ncompiler launcher\nfast linker\ntarget triple\nproject fingerprint\nvix.app-generated CMake contentIf the signature is unchanged, Vix can skip reconfigure.\nIf it changes, Vix should run configure again.
\nThe project fingerprint helps detect meaningful build configuration changes.\nFor CMake projects, important files may include:
\nCMakeLists.txt\nCMakePresets.json\ncmake/For vix.app projects, important files include:
vix.app\n.vix/generated/app/CMakeLists.txtBut the build system must still remember that the user project directory is the real project root.\nThe generated CMake file is derived from vix.app.
Vix can pass CMake variables to the configure step.
\nExample:
\nvix build -- -DCMAKE_PREFIX_PATH=/path/to/prefixEverything after -- is forwarded to CMake configure.
This is useful for cases like:
\ncustom package prefixes\ntoolchain options\nfeature flags\nexternal dependency locationsVix can use a compiler launcher when available.
\nExamples:
\nccache\nsccacheA launcher helps speed up repeated compilation by caching compiler outputs.\nThe build plan can store the resolved launcher.\nThen CMake can receive something like:
\nCMAKE_CXX_COMPILER_LAUNCHER=ccacheThis is one layer of build acceleration.
\nVix can also prefer a fast linker when available.
\nExamples:
\nmold\nlldLinking can become a bottleneck in C++ builds.\nUsing a faster linker reduces the cost of incremental builds where only the final link step is needed.\nThis does not remove compilation cost, but it improves the hot path.
\nThe current build pipeline still uses CMake/Ninja as the execution layer.\nThis gives Vix compatibility with:
\nexisting CMake projects\ngenerated CMake from vix.app\nCMake packages\nNinja\ntoolchains\ncompiler launchers\nfast linkersThe compatibility path is important because C++ projects can be very different.\nVix should not break existing workflows.
\nBeyond running CMake, Vix can build a deeper model of the build.\nThe build graph layer can import:
\ncompile_commands.json\nbuild.ninja\ndependency filesFrom those files, Vix can understand:
\ncompile tasks\nlink tasks\narchive tasks\ncopy tasks\ninput files\noutput files\ndependenciesThis is the beginning of a more intelligent build engine.
\ncompile_commands.json contains the exact compiler commands used for translation units.
A typical entry includes:
\nworking directory\nsource file\ncompiler arguments\nobject outputThis is useful because Vix should not guess compile flags.\nIt can import the real command emitted by CMake/Ninja.\nThat makes cache decisions more accurate.
\nbuild.ninja contains the generated build rules.
Vix can parse it to understand build edges.\nEdges can be classified as:
\nCompile\nArchive\nLink\nCopy\nInstall\nUtility\nUnknownThis helps Vix understand the actual build tasks that Ninja will execute.
\nCompilers can emit dependency files such as:
\nmain.dThese files describe which headers a source file depends on.
\nExample:
\nmain.o: src/main.cpp include/app.hpp include/config.hppDependency files are essential for correct incremental builds.\nIf a header changes, the object files that depend on it must become dirty.
\nA build graph contains nodes.\nNodes can represent:
\nsource files\nheaders\nconfig files\npackages\nobject files\nlibraries\nexecutablesEach node can have a state:
\nclean\ndirty\nmissingThis allows Vix to reason about what changed.
\nA build graph also contains tasks.
\nTasks can represent:
\ncompile\nlink\narchive\ncopy\ngenerateA compile task turns a source file into an object file.\nA link task turns object files and libraries into an executable.\nAn archive task creates a static library.\nA copy task copies resources or outputs.
\nA build system should know whether a task needs to run.\nInputs to dirty checking can include:
\nsource file timestamp\nsource file hash\nheader dependency state\ncompiler command hash\noutput file existence\noutput file metadata\nbuild fingerprintIf nothing relevant changed, the task can be skipped.\nIf anything relevant changed, the task should run.
\nThe object cache stores reusable compiled object files.\nA cached object is valid only if the compile inputs match.\nImportant cache inputs include:
\nsource content\nheader dependencies\ncompiler identity\ncompiler arguments\ninclude directories\ndefines\nC++ standard\ntarget triple\nbuild typeIf those match, Vix can restore the object instead of recompiling.\nThis can make repeated builds much faster.
\nThe artifact cache works at a larger level.\nIt can cache build outputs such as:
\nlibraries\nexecutables\npackage artifacts\ncompiled dependenciesThe artifact cache is useful when a whole target or dependency was already built with the same relevant inputs.
\nObject cache helps with translation units.\nArtifact cache helps with larger build products.
\nA no-op build is when nothing changed.
\nThe ideal behavior is:
\ndetect unchanged state\nskip configure\nskip compile\nskip link\nfinish quicklyThis is where a build tool can feel extremely fast.\nThe goal is not to make the compiler magically faster.\nThe goal is to avoid invoking it when there is no work.
\nA target-aware build should only build what is needed for the requested target.\nIf the user runs:
\nvix build --build-target serverVix should not do unnecessary work for unrelated targets.\nThis is especially important for larger projects.\nFor vix.app, this is simpler because one manifest usually describes one target.\nFor CMake projects, Vix can rely on CMake/Ninja target information.
A scheduler executes build tasks in dependency order.\nIt can run independent tasks in parallel.
\nA simple model is:
\nfind ready tasks\nrun ready tasks up to job limit\nmark outputs complete\nunlock dependent tasks\nrepeatThis is the core of parallel builds.\nNinja already does this well.\nVix’s own scheduler becomes important for a future native build path.
\nThe -j or --jobs option controls parallelism.
Example:
\nvix build -j 8If no job count is provided, Vix can choose a default based on available CPU cores.\nParallelism speeds up compilation when multiple source files can be built independently.
\nvix build should not only run commands.\nIt should make failures readable.\nA good diagnostic includes:
error title\nsource location\nmessage\nhint\ncode frame when possible\nraw compiler output when neededC++ build errors are often noisy.\nVix can improve the developer experience by extracting the useful part.
\nConfigure errors usually come from:
\ninvalid CMake\nmissing packages\nbad toolchain\nbad CMake variables\ngenerated CMake problemsFor vix.app, configure errors may point to:
.vix/generated/app/CMakeLists.txtBut the root cause may still be in:
\nvix.appGood diagnostics should make that relationship clear.
\nCompile errors usually come from source code.
\nExamples:
\nmissing header\ntype error\ntemplate error\ninvalid syntax\nundefined macroVix can parse compiler output and show a cleaner message.\nThe build system should preserve the raw log when needed.
\nLink errors usually come from:
\nmissing library\nmissing symbol\nwrong link order\npackage found but target not linked\nduplicate main()\nundefined referenceFor vix.app, a common link mistake is:
packages = [\n fmt:REQUIRED,\n]without:
\nlinks = [\n fmt::fmt,\n]packages finds packages.
links links targets.
Vix can write configure and build logs.\nLogs are important because the terminal output may be filtered or styled.\nA full log helps debug hard build failures.\nCommon logs include:
\nconfigure log\nbuild log\nvix logThe UI can stay clean while logs preserve details.
\nvix build can present progress in a more readable way than raw build output.\nA build header may include:
target\npreset\nlauncher\nlinker\njobsExample:
\nCompiling all (dev)\n * launcher: ccache | linker: mold | jobs: 8The purpose is to show the important build context without flooding the terminal.
\nA clean build removes previous build outputs and starts again.
\nExample:
\nvix build --cleanThis is useful when cache or generated files are stale.\nFor vix.app, cleaning should affect build outputs under the user project directory.\nIt should not confuse the generated CMake directory with the project root.
For vix.app, the current build path is:
load vix.app\nvalidate manifest\ngenerate CMake\ncreate build plan\nconfigure CMake from cmakeSourceDir\nbuild defaultTargetNameExample manifest:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]Build:
\nvix buildConceptual build command:
\ncmake --build build-ninja --target helloThe future native path can avoid CMake for simple vix.app projects.\nThe architecture can become:
vix.app\n -> BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkThis means Vix would create compile and link tasks directly from the manifest.\nCMake would remain available as a fallback and compatibility path.
\nA native vix.app build can avoid some overhead:
CMake configure\nCMake generate\nNinja file parsing\nextra indirectionIt can also use Vix-specific caches more directly.\nBut this does not mean C++ compilation becomes free.\nIt means Vix can avoid work more aggressively when it understands the project directly.
\nThe realistic architecture is:
\nCMakeLists.txt -> compatibility path\nvix.app -> fast pathCMake projects continue to work.
\nvix.app projects become the place where Vix can innovate faster.\nThis is a better strategy than trying to replace CMake for every C++ project.
A typical vix build flow looks like this:
1. parse CLI options\n2. resolve project\n3. resolve preset\n4. create build plan\n5. compute configure signature\n6. generate vix.app CMake if needed\n7. configure if needed\n8. build selected target\n9. import build graph if needed\n10. update cache state\n11. print resultNot every step runs every time.\nA no-op build should skip as much as possible.
\nCommon failures include:
\nproject not found\ninvalid vix.app\nsource file not found\nCMake configure failed\npackage not found\ncompiler error\nlinker error\nexecutable not produced\nstale build directory\ninvalid build targetA good build command should make each failure point clear.
\nvix build should not be only a wrapper around CMake.\nIt should be a build orchestrator.\nToday, it can orchestrate:
CMake\nNinja\npresets\nlogs\ndiagnostics\ncache\ngenerated CMake\nbuild graphsTomorrow, it can orchestrate:
\nnative BuildGraph\nObjectCache\nArtifactCache\nScheduler\nLinkThe user command remains the same:
\nvix buildOnly the execution strategy changes.
\nvix build is the center of the Vix.cpp build experience.\nIt resolves the project, creates a build plan, configures the build system, builds the target, and prepares for caching and graph-aware execution.\nFor CMake projects, it keeps compatibility.\nFor vix.app projects, it starts with generated CMake and can later become a native fast path.\nThe important architectural lesson is:
project resolution and build planning must be preciseEspecially for vix.app, Vix must distinguish:
userProjectDir\ncmakeSourceDir\ndefaultTargetName\ngeneratedFromVixAppThat separation makes the current build correct.\nIt also prepares Vix for the next step:
\nvix.app -> BuildGraph -> ObjectCache -> Scheduler -> Link';
+const howVixBuildWorks = {
+ html
+};
+export {
+ howVixBuildWorks as default,
+ html
+};
diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/how-vix-run-resolves-targets-DYcl8hC6.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/how-vix-run-resolves-targets-DYcl8hC6.js
new file mode 100644
index 000000000..aec952f2e
--- /dev/null
+++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/how-vix-run-resolves-targets-DYcl8hC6.js
@@ -0,0 +1,8 @@
+const html = 'vix run is the command that turns a source file or project into something executable, then runs it.
It looks simple from the outside:
\nvix runor:
\nvix run main.cppBut internally, vix run has to answer several questions:
Is this a single C++ file?\nIs this a project?\nIs the project using CMakeLists.txt?\nIs the project using vix.app?\nWhat target should be built?\nWhere is the executable?\nWhich arguments belong to Vix?\nWhich arguments belong to the program?Target resolution is the part of vix run that answers these questions.
vix run has two major modes:
script mode\nproject modeScript mode runs a single C++ file.
\nProject mode runs a CMake or vix.app project.
Example script mode:
\nvix run main.cppExample project mode:
\nvix runfrom inside a project directory.
\nScript mode is used when the input is a C++ source file.
\nExample:
\nvix run main.cppIn this mode, Vix treats the file as the entry point.
\nThe target identity comes from the source file.
\nConceptually:
\ninput file: main.cpp\nscript target: mainVix can compile the file, link the required libraries, then execute the produced binary.
\nProject mode is used when Vix detects a project root.
\nA project root contains one of these files:
\nCMakeLists.txt\nvix.appResolution order:
\n1. CMakeLists.txt\n2. vix.appIf a CMakeLists.txt exists, Vix uses the CMake project.
If no CMakeLists.txt exists but vix.app exists, Vix uses the vix.app project.
Running a project is not only about building.
\nAfter building, Vix needs to find the executable.
\nThat requires a target name.
\nFor example:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]The executable target is:
\nhelloSo vix run should build and search for:
hellonot necessarily the folder name.
\nFor many CMake projects, Vix can guess the target from the project folder.
\nExample:
\nhello/\n CMakeLists.txt\n src/\n main.cppFolder name:
\nhelloTarget name:
\nhelloIn this case, guessing from the folder works.
\nBut this assumption breaks when the target name differs from the directory name.
\nWith vix.app, the manifest declares the target name directly:
name = serverThe folder could be named:
\nbackend-app/But the target is:
\nserverSo vix run must use the resolved target name from the manifest.
It should not guess from:
\nproject directory name\ngenerated CMake directory nameA good project resolver returns enough metadata for vix run.
For a CMake project:
\nkind = CMake\nuserProjectDir = project/\ncmakeSourceDir = project/\ncmakeListsPath = project/CMakeLists.txt\ntargetName = project folder name or resolved target\ngenerated = falseFor a vix.app project:
kind = vix.app\nuserProjectDir = project/\ncmakeSourceDir = project/.vix/generated/app/\ncmakeListsPath = project/.vix/generated/app/CMakeLists.txt\nappManifestPath = project/vix.app\ntargetName = manifest.name\ngenerated = truevix run should use this resolved result instead of duplicating project detection logic.
userProjectDir is the real project root.
It contains:
\nCMakeLists.txtor:
\nvix.app\nsrc/\ninclude/\nassets/For vix.app, this remains the user project root even though the generated CMake file lives elsewhere.
vix run should use userProjectDir for:
working directory decisions\nwatch mode\nproject-relative operations\ncalling vix build\nuser-facing diagnosticscmakeSourceDir is the directory passed to CMake configure.
For CMake projects:
\ncmakeSourceDir = project/For vix.app projects:
cmakeSourceDir = project/.vix/generated/app/vix run usually should not treat this as the user project root.
It is only the active CMake source directory.
\ntargetName is the target to build and run.
For vix.app, this comes from:
name = ...Example:
\nname = api_serverThen vix run should build:
api_serverand search for an executable named:
\napi_serveror platform equivalent:
\napi_server.exeon Windows.
\nThe generated flag tells Vix whether the active CMake project came from vix.app.
This helps diagnostics.
\nFor example, vix run can show different context:
Project directory:\n app/\n\nGenerated CMake source:\n app/.vix/generated/app/It also helps avoid using generated directories for user-facing operations.
\nFor a normal CMake project:
\nhello/\n CMakeLists.txt\n src/\n main.cppvix run can do:
resolve project\nbuild target\nfind executable\nrun executableConceptually:
\nvix build --dir hello\n./build-ninja/helloThe actual implementation may call internal build functions or invoke the build pipeline directly, but the logic is the same.
\nFor a vix.app project:
hello/\n vix.app\n src/\n main.cppwith:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]vix run should do:
resolve vix.app\ngenerate internal CMake if needed\nbuild target hello\nfind executable hello\nrun executableThe generated CMake directory should not become the user project root.
\nvix run should ensure the target is built before execution.
Conceptually:
\nvix run\n -> resolve project\n -> build selected target\n -> resolve executable path\n -> execute binaryThis is why vix run depends on correct vix build planning.
If vix build builds the wrong target, vix run will search for the wrong executable.
After building, vix run needs to find the executable.
Common locations include:
\nbuild-ninja/<target>\nbuild-ninja/bin/<target>\nbuild-ninja/src/<target>For Windows, the executable may include:
\n.exeSo for target:
\nhelloVix may search for:
\nhello\nhello.exedepending on platform.
\nvix.app supports:
output_dir = binThis means the executable may be under:
\nbuild-ninja/bin/Example:
\nname = server\ntype = executable\nstandard = c++20\noutput_dir = bin\n\nsources = [\n src/main.cpp,\n]After build, Vix should search:
\nbuild-ninja/bin/serveras well as other common locations.
\nSome build systems place outputs in less obvious directories.
\nA fallback recursive search can help when the executable is not in the expected locations.
\nHowever, recursive search should still be guided by:
\ntargetNameIt should not run a random executable just because it exists.
\nTarget name keeps the search safe and predictable.
\nvix run is mainly for executable targets.
If a project is:
\nname = mathlib\ntype = staticthere may be no executable to run.
\nThe correct command is:
\nvix buildTo run something for a library, use a test or example executable:
\ntests/vix.app\nexamples/basic/vix.appThen run:
\ncd tests\nvix runor:
\ncd examples/basic\nvix runvix run must separate Vix arguments from program arguments.
For example:
\nvix run main.cpp --run --name Gaspardor for project mode:
\nvix run -- --name GaspardThe exact boundary depends on the command design, but the principle is important:
\narguments before the boundary configure Vix\narguments after the boundary go to the programWithout a clear boundary, Vix may consume arguments intended for the user program.
\nIn script mode:
\nvix run main.cppVix can derive the target name from the file:
\nmainThe compiled output can be stored in a Vix build/cache directory.
\nThe exact path is an implementation detail.
\nWhat matters is:
\nthe source file is the entry point\nthe output is executable\nthe program receives runtime argumentsIn project mode:
\nvix runVix must resolve a project first.
\nThen it uses the project target.
\nFor CMake:
\ntargetName = project default targetFor vix.app:
targetName = manifest.nameThis is the main difference.
\nA user may provide an explicit build target.
\nExample:
\nvix run --build-target serverIn that case, the explicit target should take priority over the default target.
\nResolution rule:
\nif --build-target is provided:\n use --build-target\nelse:\n use resolved targetNameThis is useful for CMake projects with multiple targets.
\nFor vix.app, there is normally one target, so the manifest name is usually enough.
Watch mode should watch the real project directory.
\nFor CMake projects:
\nwatch project/For vix.app projects:
watch project/It should not watch only:
\nproject/.vix/generated/app/because that directory contains generated files, not the user’s real source code.
\nFor vix.app, watch mode should observe:
vix.app\nsrc/\ninclude/\nassets/For a vix.app project, generated CMake is part of the build process.
But vix run should still think in terms of the user project.
The important values are:
\nuserProjectDir -> where the project lives\ncmakeSourceDir -> where generated CMake lives\ntargetName -> what to build and runThis keeps vix run aligned with vix build.
For normal CMake projects, vix run may use CMake presets when available.
For vix.app, presets are less relevant because the CMake project is generated internally.
The important rule is:
\nnormal CMake project -> can use project CMake presets\nvix.app project -> use generated CMake and Vix build planningIf Vix cannot find:
\nCMakeLists.txtor:
\nvix.appproject mode cannot run.
\nExample error:
\nUnable to determine the project directory.\nMissing CMakeLists.txt or vix.app.Fix:
\nrun vix from a project directory\nor create vix.app\nor create CMakeLists.txtThis can happen when:
\nthe target is a library\nthe build failed\nthe target name is wrong\noutput_dir is unexpected\nthe executable was not producedFor vix.app, check:
name = ...\ntype = executable\noutput_dir = ...If the type is:
\ntype = staticthen vix run has no executable to run.
This can happen if the build system guesses from the folder name instead of using the manifest name.
\nExample:
\nfolder: hello-project\nmanifest name: helloCorrect target:
\nhelloWrong target:
\nhello-projectThe fix is to use the resolved target name from project resolution.
\nFor vix.app, this is wrong:
project root = .vix/generated/appThat can break:
\nwatch mode\nruntime working directory\ntarget guessing\nexports\ndiagnosticsThe project root should be:
\nuserProjectDirThe generated directory should be:
\ncmakeSourceDirThe runtime working directory affects relative file access.
\nIf the program opens:
\nstd::ifstream file("config/app.json");then it depends on where the process starts.
\nFor apps with resources, this matters.
\nA vix.app project may copy resources next to the executable:
build-ninja/bin/config/app.jsonbut the program may run from the project root unless Vix changes the working directory.
\nThis is a design choice vix run should make deliberately.
If the manifest says:
\noutput_dir = bin\n\nresources = [\n "data/config.json=config/config.json",\n]then the resource may be copied to:
\nbuild-ninja/bin/config/config.jsonvix run should either:
run from the executable directoryor document the runtime working directory clearly.
\nThe important point is predictability.
\nvix run should not reinvent vix build.
It should reuse the same project resolution and build planning rules.
\nThe flow should be:
\nresolve project\ncall build pipeline with target\nresolve executable\nrun executableIf vix run and vix build resolve projects differently, bugs appear.
Especially with vix.app.
A shared resolver should answer:
\nkind\nuserProjectDir\ncmakeSourceDir\ntargetName\ngenerated\ncmakeListsPath\nappManifestPathBoth vix build and vix run should use this same model.
That keeps behavior consistent.
\nWhen verbose mode is enabled, vix run can show:
Project:\n kind: vix.app\n root: /path/to/project\n generated CMake: /path/to/project/.vix/generated/app\n target: hello\n\nBuild:\n preset: dev-ninja\n directory: build-ninja\n\nRun:\n executable: build-ninja/bin/helloThis makes target resolution visible.
\nMost command-line tools feel simple because the hard decisions are hidden.
\nBut hidden decisions still need to be correct.
\nvix run should feel like:
vix runBut internally it must correctly handle:
\nsingle-file scripts\nCMake projects\nvix.app projects\ngenerated CMake\noutput directories\nruntime arguments\nwatch modeThat is why target resolution matters.
\nIn the future, vix.app may build natively:
vix.app\n -> BuildGraph\n -> ObjectCache\n -> Scheduler\n -> Linkvix run should not need a major redesign for that.
If the resolver still provides:
\ntargetName\nbuildDir\noutput path\nproject rootthen the execution step stays similar.
\nOnly the build engine changes underneath.
\nvix run resolves targets by first deciding whether it is running a single file or a project.
For projects, it resolves either:
\nCMakeLists.txtor:
\nvix.appFor vix.app, the manifest name is the target name.
That target name must drive both the build step and the executable lookup.
\nThe key rule is:
\ndo not guess from the generated directory\ndo not guess from the folder when the manifest gives a nameA clean vix run model uses shared project resolution, builds the correct target, finds the executable, and runs it with a clear argument boundary.
vix build keeps getting faster, but the most important part is not just speed.\nThe important part is correctness.\nA build tool should never say that a target is up to date unless it can prove it.\nThe latest work on vix build focused on that balance:
fast when safe\ncorrect by default\nfallback when neededThis article explains the latest improvement: normal no-op target builds are now fast too.
\nIn the previous benchmark, the --fast path was clearly the fastest path.\nThe result looked like this:
vix build --fast --build-target vix 303 ms\nvix build --build-target vix 6.10 s\nVIX_GRAPH_EXECUTOR=0 vix build --build-target vix 6.16 sThat was a strong result.
\nIt showed that --fast could skip the heavy build pipeline when the project state proved that nothing had changed.
But it also meant that the user needed to know about --fast.\nThe normal target build was still much slower.
After the latest build-state and cache routing improvements, the benchmark changed.\nOn the same Vix.cpp repository, the new result is:
\nvix build --fast --build-target vix 313 ms\nvix build --build-target vix 315 ms\nVIX_GRAPH_EXECUTOR=0 vix build --build-target vix 309 msThis is the important change:
\nthe normal target build is now fast too
\nvix build --build-target vix no longer needs to walk through the full pipeline when Vix can already prove that the target is clean.
Before, --fast had the highest-level shortcut.\nThe normal build path could still pay for work such as:
That is safe, but it is not always necessary.\nNow the build-state validation can help the normal target build too.\nThe normal path can return early when the state proves:
\nSo the normal command can be fast:
\nvix build --build-target vixExpected output:
\nChecking vix (dev)\n ✔ Up to date in 0.3sThis is better than making only --fast fast.
A special flag is useful for power users.\nBut the best developer experience is when the default command is already smart.\nThe user should not need to think:
\n\n\nShould I use
\n--fasthere?
For a clean target, Vix can now make the normal command fast when it can prove correctness.\nThat makes the common workflow simpler:
\nvix build --build-target vixThe speedup is only valid because Vix does not trust one signal blindly.\nFor example, a build state hit is not enough.\nThe final binary must still exist.\nThe target must match.\nThe project inputs must match.\nThe build signature must match.
\nIf the binary is missing, Vix must not say Up to date. It must rebuild or restore from the artifact cache.
That was tested with:
\nvix build --build-target vix\nrm -f build-ninja/vix\nvix build --fast --build-target vixThe rule is:
\nstate hit is not enough\nthe target output must still be validThe latest work also improved target artifact restoration.\nIf the final binary exists in the artifact cache, Vix can restore it directly.
\nExample:
\nvix build --build-target vix\nrm -rf build-ninja\nvix build --build-target vixThe result can be:
\nRestoring vix (dev)\n ✔ Artifact cache hit\n ✔ DoneThat means even after deleting the build directory, Vix can restore the final target without recompiling.\nThis is a different layer from the object cache.
\nObjectCache -> restores .o and .d files\nArtifactCache -> restores the final binary or libraryThe build model becomes layered:
\nBuildState -> fastest no-op validation\nArtifactCache -> restore complete target\nBuildGraph -> target-aware analysis\nObjectCache -> restore compile outputs\nCMake/Ninja -> compatibility fallbackThis work is now protected by a build safety test script.\nThe script checks the fragile paths:
\n--fast state hit--fast fallbackThe current result is:
\nPassed: 12\nFailed: 0This matters because build optimizations can be dangerous.\nA build system is not allowed to be fast by being wrong.\nEvery shortcut must prove that it is safe.
\n--explain also improvedThe latest work also improved --explain.\nFor source changes, Vix can now explain the rebuild:
vix build --explain --build-target vixExample output:
\nRebuilding BuildCommand.cpp\n reason: source file changed\n\nRelinking vix\n reason: object file changedFor some header changes, when Vix cannot yet map the header precisely to selected compile tasks, it now avoids lying.
\nInstead of saying:
\nNo rebuild requiredit says:
\nProject input changed\n reason: dependency changed, delegating target to Ninja\n\nRelinking vix\n reason: target may depend on changed inputThen Ninja decides the exact files to rebuild.\nThat is the right behavior.\nIf Vix cannot prove the target is clean, it must not claim that it is clean.
\nThe benchmark now shows similar times for:
\n--fastThat does not mean the Graph Executor is useless.\nIt means the no-op path is now being solved earlier.\nFor clean builds, the fastest layer wins before the graph executor needs to do much work.\nBut when the project changes, the graph executor still matters because it gives Vix target awareness.
\nIt can:
\nThe long-term direction is still:
\nCMake/Ninja -> for compatibility\nBuildGraph -> for target intelligence\nObjectCache -> for compile reuse\nArtifactCache -> for target reuse\nBuildState -> for fast no-op validationThe current benchmark was run on:
\nCPU Intel Core i7-8650U\nRAM 15Gi\nOS Ubuntu 24.04.4 LTS\nCompiler GCC 13.3.0\nLinker mold\nLauncher ccache\nTarget vix\nRuns 20\nWarmup 5Result:
\nvix build --fast --build-target vix 313 ms\nvix build --build-target vix 315 ms\nVIX_GRAPH_EXECUTOR=0 vix build --build-target vix 309 msThe conclusion is not:
\n--fast is 20x fasterThat was the previous result.\nThe new conclusion is:
\nnormal no-op target builds are now fast by default
\nThat is a better developer experience.
\nThe principle remains the same:
\nfast when safe\ncorrect by default\nfallback when neededVix should be fast when it can prove correctness.
\nThis is how vix build can become faster without becoming fragile.
The latest vix build work changes the default experience.
Before:
\n--fast was the fast no-op pathNow:
\nvix build --build-target vixThis checklist comes from analyzing PulseGrid running in production. +PulseGrid showed an important reality:
+++Vix can build and run a real C++ backend, but production still requires too much manual work. +The goal of this checklist is to make Vix extremely simple for real production apps. +A developer should be able to build, run, deploy, inspect, debug, and operate a Vix app without manually wiring systemd, Nginx, logs, health checks, ports, services, and production diagnostics.
+
Vix should understand the production state of an app. +A command like this should exist:
+vix doctor productionIt should inspect the current project and report:
+App: PulseGrid
+Status: running
+Binary: build-ninja/PulseGrid
+Service: pulsegrid.service
+HTTP port: 8080
+WebSocket port: 9090
+Public URL: https://pulsegrid.softadastra.com
+Proxy: nginx
+TLS: enabled
+Healthcheck: ok
+Logs: availablevix.json, vix.app, PulseGrid.vix, or CMake target.Vix should manage production services directly. +Current PulseGrid production setup uses a manual systemd service. +Vix should provide:
+vix service install
+vix service start
+vix service stop
+vix service restart
+vix service status
+vix service logsjournalctl.Example generated service:
+[Unit]
+Description=PulseGrid
+After=network.target
+
+[Service]
+User=gaspard
+WorkingDirectory=/home/gaspard/PulseGrid
+Environment=Vix_DIR=/home/gaspard/vix-clean/build-ninja
+Environment=CMAKE_PREFIX_PATH=/home/gaspard/vix-clean/build-ninja
+ExecStart=/home/gaspard/PulseGrid/build-ninja/PulseGrid
+Restart=always
+RestartSec=3
+LimitNOFILE=65535
+
+[Install]
+WantedBy=multi-user.targetVix should make Nginx setup simple. +PulseGrid manually uses:
+HTTP app port: 8080
+WebSocket port: 9090
+Domain: pulsegrid.softadastra.com
+TLS: Let's EncryptVix should provide:
+vix proxy nginx init
+vix proxy nginx check
+vix proxy nginx reload/ws.X-Forwarded-* headers.Example production config Vix should generate:
+server {
+ listen 80;
+ listen [::]:80;
+ server_name pulsegrid.softadastra.com;
+
+ return 301 https://$host$request_uri;
+}
+
+server {
+ listen 443 ssl http2;
+ listen [::]:443 ssl http2;
+ server_name pulsegrid.softadastra.com;
+
+ ssl_certificate /etc/letsencrypt/live/pulsegrid.softadastra.com/fullchain.pem;
+ ssl_certificate_key /etc/letsencrypt/live/pulsegrid.softadastra.com/privkey.pem;
+
+ location / {
+ proxy_pass http://127.0.0.1:8080;
+ proxy_http_version 1.1;
+
+ proxy_set_header Connection "";
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+
+ proxy_connect_timeout 10s;
+ proxy_send_timeout 60s;
+ proxy_read_timeout 60s;
+ }
+
+ location = /ws {
+ proxy_pass http://127.0.0.1:9090/;
+ proxy_http_version 1.1;
+
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+
+ proxy_read_timeout 3600s;
+ proxy_send_timeout 3600s;
+ proxy_buffering off;
+ }
+}Vix should not only build the app. It should verify that the app is alive. +PulseGrid currently uses a manual deploy script with:
+curl -I http://127.0.0.1That checks Nginx, not necessarily the internal app.
+Vix should provide:
+vix health
+vix health local
+vix health publicvix.json.Example:
+{
+ "production": {
+ "health": {
+ "local": "http://127.0.0.1:8080/",
+ "public": "https://pulsegrid.softadastra.com/",
+ "websocket": "wss://pulsegrid.softadastra.com/ws"
+ }
+ }
+}A Vix production app should not need a custom deploy.sh for basic deployment.
+PulseGrid currently does:
git pull origin main
+vix build --with-sqlite
+sudo systemctl restart pulsegrid
+sudo systemctl is-active pulsegrid
+curl -I http://127.0.0.1Vix should provide:
+vix deployvix.json.Example production deployment config:
+{
+ "production": {
+ "deploy": {
+ "pull": true,
+ "branch": "main",
+ "build": "vix build --with-sqlite",
+ "service": "pulsegrid",
+ "health": "http://127.0.0.1:8080/"
+ }
+ }
+}Vix should centralize app logs, systemd logs, and proxy logs. +PulseGrid logs are currently split between:
+journalctl -u pulsegrid
+/var/log/nginx/pulsegrid.access.log
+/var/log/nginx/pulsegrid.error.logVix should provide:
+vix logs
+vix logs app
+vix logs proxy
+vix logs errorsExample:
+vix logs --since "1 hour ago"
+vix logs --follow
+vix logs --errorsVix should not treat normal client disconnects as production errors. +PulseGrid revealed repeated logs like:
+[session] write error: Broken pipeThis usually means the client closed the connection before the server finished writing. +Vix already handles normal disconnects while reading. The same logic must be applied during response writing.
+Expected behavior:
+[session] client disconnected during response write: Broken pipeinstead of:
+[session] write error: Broken pipeVix should provide stronger production support for WebSocket apps. +PulseGrid uses a live WebSocket endpoint for realtime status updates. +Vix should make this easier to operate and debug.
+vix proxy nginx checkvix ws check.Example:
+vix ws check wss://pulsegrid.softadastra.com/wsVix should make backend apps with static files easy.
+PulseGrid has:
+public/index.html
+public/app.css
+public/app.js
+public/status.html
+public/status.css
+public/status.jsVix should support this as a first-class backend app pattern.
+public/.Vix should simplify apps that use SQLite in production.
+PulseGrid uses:
+storage/pulsegrid.db
+storage/pulsegrid.db-shm
+storage/pulsegrid.db-wal
+migrations/Vix should understand this pattern.
+vix db status.vix db migrate later.Example:
+vix db statusExpected output:
+Database: storage/pulsegrid.db
+WAL: enabled
+Migrations: migrations/
+Status: okVix should make .env usage simple and visible.
PulseGrid has:
+.env
+.env.exampleVix should help verify production environment variables.
+.env..env.example.vix env check.Example:
+vix env check --productionvix.jsonVix needs one clear place to describe production.
+A future vix.json should support:
{
+ "name": "PulseGrid",
+ "production": {
+ "service": {
+ "name": "pulsegrid",
+ "user": "gaspard",
+ "working_dir": "/home/gaspard/PulseGrid",
+ "exec": "build-ninja/PulseGrid",
+ "restart": "always",
+ "restart_sec": 3,
+ "limit_nofile": 65535
+ },
+ "ports": {
+ "http": 8080,
+ "websocket": 9090
+ },
+ "proxy": {
+ "type": "nginx",
+ "domain": "pulsegrid.softadastra.com",
+ "tls": true,
+ "websocket_path": "/ws"
+ },
+ "health": {
+ "local": "http://127.0.0.1:8080/",
+ "public": "https://pulsegrid.softadastra.com/",
+ "websocket": "wss://pulsegrid.softadastra.com/ws"
+ },
+ "logs": {
+ "app": "journalctl -u pulsegrid",
+ "proxy_access": "/var/log/nginx/pulsegrid.access.log",
+ "proxy_error": "/var/log/nginx/pulsegrid.error.log"
+ }
+ }
+}PulseGrid shows the architecture Vix should encourage for serious backend apps.
+Current structure:
+src/pulsegrid/
+ app/
+ application/
+ domain/
+ infrastructure/
+ presentation/
+ support/
+public/
+storage/
+migrations/
+tests/Vix should provide:
+vix new myapp --template backendmain.cpp.AppBootstrap.vix.json.vix.app.main() minimal.Example main.cpp:
#include <myapp/app/AppBootstrap.hpp>
+
+int main()
+{
+ myapp::app::AppBootstrap bootstrap;
+ return bootstrap.run();
+}Vix should detect when the CLI and libraries come from different directories. +PulseGrid revealed this situation:
+CLI:
+ /home/gaspard/vix/build/vix
+
+App build libraries:
+ /home/gaspard/vix-clean/build-ninjaThis can be confusing.
+Vix should warn when:
+vix command != Vix_DIR used by project/servicevix binary path.Vix_DIR.CMAKE_PREFIX_PATH.vix doctor toolchain.Example warning:
+warning: Vix CLI and Vix libraries come from different installations
+
+CLI:
+ /home/gaspard/vix/build/vix
+
+CMake package:
+ /home/gaspard/vix-clean/build-ninja
+
+This can cause confusing builds.Replaced by vix deploy.
The original goal was to generate a safe deployment script while the deployment workflow was incomplete. Since vix deploy now supports pull, build, tests, service restart, service status, health checks, proxy checks, logs on failure, dry-run, verbose mode, and production config from vix.json, a generated deploy script is no longer required for the v2.6 production workflow.
vix deploy.vix.json.vix service.vix health.vix proxy nginx check.Vix should provide a simple production readiness score.
+vix doctor productionShould produce:
+Production readiness: 82/100
+
+OK service installed
+OK service running
+OK nginx proxy configured
+OK TLS enabled
+OK local health check
+OK public health check
+WARN websocket health not configured
+WARN deploy rollback not configuredThese are the first concrete improvements to implement in Vix.
+Broken pipe during response write.vix doctor production.vix logs.vix service.vix proxy nginx.vix deploy.PulseGrid proves that Vix should become:
+++A C++ runtime that makes production backend apps simple to build, run, deploy, inspect, and operate.
+
The developer experience should feel like:
+vix new pulsegrid --template backend
+vix dev
+vix test
+vix build
+vix service install
+vix proxy nginx init
+vix deploy
+vix doctor production
+vix logsThe long-term goal:
+No manual systemd.
+No manual Nginx guessing.
+No unclear ports.
+No noisy logs.
+No hidden build mismatch.
+No weak health checks.
+No confusing production state.Vix should make a production C++ backend feel simple, visible, and reliable.
+`; +const productionSimplicityChecklist = { + html +}; +export { + productionSimplicityChecklist as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/apple-touch-icon.png b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/apple-touch-icon.png new file mode 100644 index 000000000..ff8129fc0 Binary files /dev/null and b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/apple-touch-icon.png differ diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/favicon-16x16.png b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/favicon-16x16.png new file mode 100644 index 000000000..91ce8f2c8 Binary files /dev/null and b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/favicon-16x16.png differ diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/favicon-32x32.png b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/favicon-32x32.png new file mode 100644 index 000000000..5a237f32f Binary files /dev/null and b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/favicon-32x32.png differ diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/favicon.ico b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/favicon.ico new file mode 100644 index 000000000..d84e1a2ab Binary files /dev/null and b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/favicon.ico differ diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/icon-192.png b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/icon-192.png new file mode 100644 index 000000000..3e9fb8be1 Binary files /dev/null and b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/icon-192.png differ diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/icon-512-maskable.png b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/icon-512-maskable.png new file mode 100644 index 000000000..0f1f8f6af Binary files /dev/null and b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/icon-512-maskable.png differ diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/icon-512.png b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/icon-512.png new file mode 100644 index 000000000..0f1f8f6af Binary files /dev/null and b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/pwa/icon-512.png differ diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/roadmap-BeH2oDRh.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/roadmap-BeH2oDRh.js new file mode 100644 index 000000000..1d49b370f --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/roadmap-BeH2oDRh.js @@ -0,0 +1,8 @@ +const html = 'Technical roadmap for the evolution of Vix.cpp.
\nThese notes document where Vix is going next: production backend tooling, deployment workflows, service management, reverse proxy support, health checks, logs, diagnostics, and operational reliability.
\nThe goal is simple: make serious C++ backend applications easier to build, run, deploy, inspect, and operate.
\nvix.app starts with generated CMake.\nThat is the safe compatibility path.\nBut the long-term direction is more important:
vix.app\n -> native BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkThis is where vix.app becomes more than a simpler configuration file.\nIt becomes structured build input that Vix can understand directly.
Today, a vix.app project follows this model:
vix.app\n -> parse manifest\n -> validate manifest\n -> generate .vix/generated/app/CMakeLists.txt\n -> CMake configure\n -> CMake buildThis is practical.\nIt gives users a simple manifest while keeping compatibility with the C++ build ecosystem.\nThe generated CMake path means Vix can support vix.app without rewriting the entire build engine first.
Generated CMake gives Vix three things immediately:
\ncompatibility\nstability\nincremental adoptionCMake already knows how to handle:
\ncompilers\ntoolchains\ngenerators\npackages\nlinking\nNinja\nplatform differencesSo Vix can focus on the user-facing experience first.\nA user writes:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]Then runs:
\nvix build\nvix runInternally, Vix can still use CMake.\nThat is the bridge.
\nGenerated CMake still has overhead.\nEven for a simple project, the pipeline can include:
\nmanifest parsing\nCMake generation\nCMake configure\nCMake generate\nNinja build files\nCMake build invocation\nNinja executionFor complex projects, this overhead is acceptable.\nFor simple projects, Vix can eventually do better.\nA vix.app manifest already gives Vix the important build information directly:
target name\ntarget type\nC++ standard\nsources\ninclude directories\ndefines\ncompile options\nlink options\npackages\nlinks\nresources\noutput directoryThat is enough to create a build graph for many projects.
\nThe future native path is:
\nvix.app\n -> BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkIn this model, Vix does not generate CMake as the primary execution path.\nInstead, it creates the build graph directly from the manifest.
\nFor a simple app:
\nname = myapp\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n src/app.cpp,\n]\n\ninclude_dirs = [\n include,\n]Vix can create:
\ncompile src/main.cpp -> main.o\ncompile src/app.cpp -> app.o\nlink main.o app.o -> myappNo CMake configure step is needed for that simple case.
\nArbitrary CMake is hard to interpret because CMake is a full language.
\nIt has:
\nfunctions\nmacros\nconditions\ngenerator expressions\ncustom commands\nplatform branches\ndynamic targets\nFetchContent\ntoolchain logicVix should not try to understand all arbitrary CMake logic.\nCMake should remain the compatibility path for that.\nBut vix.app is different.\nIt is narrow and declarative.\nIt has no arbitrary control flow.\nIt describes one target.\nThat makes it possible for Vix to translate it directly into native build tasks.
The clean architecture is:
\nCMakeLists.txt -> compatibility path\nvix.app -> native fast pathThis does not mean removing CMake.\nIt means Vix should use the best path for each project type.\nFor complex projects:
\nuse CMakeFor simple vix.app projects:
use native BuildGraphThis gives Vix a realistic path to faster builds without breaking existing C++ workflows.
\nThe first native vix.app build should support a small, clear subset.\nMinimum useful support:
executable\nstatic library\nshared library\nsources\ninclude_dirs\ndefines\ncompile_options\nlink_options\nlinks\nresources\noutput_dirThat is enough to build many simple projects.\nThe native path does not need to support every CMake feature on day one.
\nSome features should stay in the CMake compatibility path.
\nExamples:
\ncustom commands\ngenerated sources\ninstall rules\nCTest\nFetchContent\nCPM.cmake\ncomplex package discovery\ncustom toolchains\nplatform-specific build branches\nmany targets in one project\npackage export generationTrying to support all of these immediately would turn the native builder into a second CMake.\nThat would be the wrong direction.
\nThe native path should not rely on hidden magic.\nIf the manifest says:
\nsources = [\n src/main.cpp,\n src/app.cpp,\n]then Vix creates compile tasks for those files.\nIf the manifest says:
\ninclude_dirs = [\n include,\n]then those include directories are part of the compile command.\nIf the manifest says:
\nlinks = [\n m,\n]then those link inputs are part of the link task.\nThe manifest should map clearly to build tasks.
\nThe first step is to convert vix.app into a BuildGraph.
For this manifest:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]Vix can create:
\nNode: src/main.cpp\nNode: build/native/objects/src/main.o\nNode: build/native/bin/hello\n\nTask: compile src/main.cpp -> main.o\nTask: link main.o -> helloThe graph becomes the source of execution.
\nFor each source file, Vix creates a compile task.\nA compile task needs:
\ncompiler\nsource path\nobject output path\ninclude directories\ndefines\nC++ standard\ncompile options\ntarget triple\nbuild type\ndependency file pathExample conceptual command:
\nc++ -std=c++20 -Iinclude -MMD -MP -MF main.d -c src/main.cpp -o main.oThe exact command depends on compiler and platform.
\nThe native build path should use deterministic object paths.
\nExample:
\nbuild-ninja/.vix/native/objects/src/main.cpp.o\nbuild-ninja/.vix/native/objects/src/app.cpp.oor:
\nbuild-ninja/objects/src/main.o\nbuild-ninja/objects/src/app.oThe important properties are:
\nstable\nunique\nsafe for nested paths\nsafe for files with same basenameFor example:
\nsrc/main.cpp\ntools/main.cppmust not collide.
\nThe native compile command should emit dependency files.
\nExample:
\nmain.o: src/main.cpp include/app.hpp include/config.hppThese dependency files are required for correct incremental builds.\nWithout them, Vix cannot know which headers affect which object files.\nThe native path should treat dependency files as first-class build metadata.
\nBefore running a compile task, Vix should decide whether it is dirty.\nInputs include:
\nsource file content\ndependency headers\ncompiler identity\ncompile command hash\nobject output existence\ndependency file existence\nbuild configurationIf the task is clean, skip it.\nIf the object cache has a valid entry, restore it.\nOtherwise, run the compiler.
\nNative vix.app builds should use ObjectCache directly.\nFor each compile task:
compute compile identity\ncheck object cache\nrestore object on hit\ncompile on miss\nstore object after successful compileThis is one of the main reasons native builds can be faster.\nThe object cache becomes part of the build execution path, not an external accident.
\nAfter Vix creates compile tasks and link tasks, it can schedule them.
\nExample:
\ncompile main.cpp\ncompile app.cpp\ncompile server.cpp\nlink myappThe compile tasks can run in parallel.\nThe link task waits for object files.\nThis is the same basic model as Ninja, but controlled by Vix for the manifest subset it understands.
\nFor an executable target, Vix creates a link task.
\nInputs:
\nobject files\nlibraries\nlink options\npackage link targets or library namesOutput:
\nexecutableFor a static library target, Vix creates an archive task.\nFor a shared library target, Vix creates a shared link task.
\nFor:
\nname = mathlib\ntype = static\nstandard = c++20\n\nsources = [\n src/add.cpp,\n src/mul.cpp,\n]Vix can create:
\ncompile src/add.cpp -> add.o\ncompile src/mul.cpp -> mul.o\narchive add.o mul.o -> libmathlib.aThis is a clean native build case.
\nFor:
\nname = plugin\ntype = shared\nstandard = c++20\n\nsources = [\n src/plugin.cpp,\n]Vix can create:
\ncompile src/plugin.cpp -> plugin.o\nlink shared plugin.o -> libplugin.soPlatform differences matter here.
\nOn Linux, the output may be:
\nlibplugin.soOn macOS:
\nlibplugin.dylibOn Windows:
\nplugin.dllThe native path needs a platform layer.
\nResources should become copy tasks.
\nFor:
\nresources = [\n assets,\n "data/config.json=config/config.json",\n]Vix can create:
\ncopy assets -> target_dir/assets\ncopy data/config.json -> target_dir/config/config.jsonResource changes should not trigger C++ recompilation.\nThey should only trigger resource copy tasks.\nThat separation is important.
\nThe output_dir field should work the same in native mode as in generated CMake mode.
Example:
\noutput_dir = binmeans the target output goes under:
\nbuild-ninja/bin/For an executable:
\nbuild-ninja/bin/myappResources are copied next to that target.
\nPackages are the hardest part of native vix.app builds.
In generated CMake mode:
\npackages = [\n fmt:REQUIRED,\n]maps to:
\nfind_package(fmt REQUIRED)In native mode, Vix needs a package resolution layer.\nThat layer may initially be limited.
\nPossible first approach:
\nnative mode supports simple system links\nCMake fallback handles find_package packagesThis is acceptable for an experimental native builder.
\nA practical first native mode can support:
\nsources\ninclude_dirs\ndefines\ncompile_options\nlink_options\nsimple links\nresources\noutput_dir\nexecutable/static/sharedAnd fallback to CMake when it sees:
\npackages\ncomplex links\nunsupported platform\nunsupported compilerThis keeps the native path safe.
\nThe native builder should have a clear fallback rule:
\nIf the manifest uses unsupported features, use generated CMake.Example:
\npackages = [\n "Boost:COMPONENTS=system,filesystem:REQUIRED",\n]If native package resolution is not ready, Vix should not fail unnecessarily.\nIt can fall back to generated CMake.\nThis preserves compatibility.
\nThe native path should probably start behind a flag.
\nExamples:
\nvix build --nativeor:
\nVIX_APP_NATIVE_BUILD=1 vix buildThis allows testing without breaking the stable build path.\nThe default path can remain generated CMake until native builds are reliable.
\nNative mode should become default only when it is reliable for common projects.\nA safe progression:
\n1. generated CMake default\n2. native mode experimental\n3. native mode for minimal projects\n4. native mode for common projects\n5. generated CMake becomes fallbackThis avoids destabilizing vix build.
Native builds must be correct before they are fast.\nImportant correctness requirements:
\nsource changes rebuild the right object\nheader changes rebuild dependent objects\nflag changes invalidate objects\ndefine changes invalidate objects\ncompiler changes invalidate objects\nlink input changes relink target\nresource changes copy resourcesIf any of these are wrong, the build system cannot be trusted.
\nThe native builder needs to know which compiler to use.\nPossible sources:
\nenvironment variables\nVix defaults\nCMake-style settings\ntoolchain config\ntarget triple\nplatform defaultsExamples:
\nCXX\nc++\ng++\nclang++\nclThe compiler identity must become part of cache keys.
\nNative builds need a platform layer for:
\nexecutable suffix\nobject file suffix\nstatic library prefix and suffix\nshared library prefix and suffix\ncompiler flags\nlinker flags\narchive tool\nruntime library pathsThis cannot be hardcoded only for Linux if Vix wants to be portable.\nA first version can target Linux and expand later.
\nFor static libraries, native mode needs an archiver.\nCommon tool:
\narConceptual command:
\nar rcs libmathlib.a add.o mul.oOn Windows, this may be different.\nSo archive tasks should go through a toolchain abstraction.
\nVix can prefer fast linkers when available.\nExamples:
\nmold\nlldIn native mode, linker selection can be more direct.\nThe build plan can decide:
\ncompiler driver\nlinker flag\nlink options\noutput pathBut it still must respect platform and compiler differences.
\nNative mode should not remove the CMake path.\nThe relationship should be:
\nnative path:\n faster for supported vix.app projects\n\ngenerated CMake path:\n fallback for unsupported vix.app features\n\nCMakeLists.txt path:\n full compatibility for advanced projectsThis gives users both speed and safety.
\nvix run should not care whether the project was built through CMake or native mode.
It should ask:
\nwhat is the target name?\nwhere is the build output?\nwhere is the executable?If native mode preserves the same output layout, vix run can work unchanged or with minimal changes.
Native mode gives Vix more control over diagnostics.\nInstead of receiving errors only through CMake/Ninja output, Vix can know:
\nwhich task failed\nwhich source file was compiling\nwhich command was run\nwhich dependency triggered the task\nwhich cache key missedThis can make errors easier to explain.
\nA native build engine can eventually answer:
\nwhy did this rebuild?Examples:
\nsrc/app.cpp rebuilt because source changed\nsrc/main.cpp rebuilt because include/config.hpp changed\nmyapp relinked because app.o changed\nassets copied because assets/logo.png changedThis is a major advantage of owning the graph.
\nA native no-op build can be extremely fast.\nIf Vix knows:
\nmanifest unchanged\ngraph unchanged\nsources unchanged\nheaders unchanged\nobjects valid\ntarget valid\nresources copiedthen it can skip everything.\nThe best output is:
\nnothing to buildor a very fast success message.
\nNative mode plus cache can make clean builds much faster.\nIf the build directory is removed:
\nrm -rf build-ninjabut the object cache is warm, Vix can restore objects.\nFlow:
\nrestore main.o\nrestore app.o\nlink myapp\ncopy resourcesIf artifact cache also has the final target, Vix may restore the final binary too.
\nBefore executing the graph, Vix can check artifact cache.\nIf the final target artifact is valid:
\nrestore target\nrestore resources if needed\nskip compile\nskip linkIf not, continue to object cache and task execution.\nThis creates a layered cache model:
\nartifact cache\nobject cache\ncompiler\nlinkerThe native BuildGraph can be saved between builds.\nStored state can include:
\nnodes\ntasks\ncommand hashes\ndependency files\nsource metadata\noutput metadata\ncache keys\nlast successful targetOn the next build, Vix can reload this state and update only what changed.\nThis makes repeated builds faster.
\nDuring the transition, Vix can keep both systems.
\nFor example:
\n.vix/generated/app/CMakeLists.txt\n.vix/native/graph.jsonGenerated CMake remains useful for:
\ndebugging\nfallback\ncomparison\ncompatibilityNative graph becomes useful for:
\nspeed\ncaching\ndiagnostics\ndirect executionNative builds need strong tests.
\nTest cases should include:
\nminimal executable\nmultiple source files\nstatic library\nshared library\ninclude directories\ndefines\ncompile options\nlink options\nresources\noutput_dir\nsource change\nheader change\nresource change\nclean build\ncache hit\ncache miss\nfallback to CMakeA build system needs test coverage because small mistakes can produce incorrect binaries.
\nA good first milestone:
\nvix build --nativefor a minimal executable:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]Expected behavior:
\ncreate compile task\ncompile main.cpp\nlink hello\nrun with vix run\nskip on no-op rebuildThis proves the core pipeline.
\nSupport multiple source files and includes:
\nsources = [\n src/main.cpp,\n src/app.cpp,\n]\n\ninclude_dirs = [\n include,\n]Expected behavior:
\ncompile each source\ntrack headers\nrecompile only dirty source\nlink when neededThis proves incremental behavior.
\nSupport resources and output directory:
\noutput_dir = bin\n\nresources = [\n assets,\n]Expected behavior:
\nbuild-ninja/bin/myapp\nbuild-ninja/bin/assets/This proves runtime app support.
\nSupport static libraries:
\nname = mathlib\ntype = staticExpected behavior:
\ncompile sources\narchive libmathlib.a\nskip archive when unchangedThis proves non-executable target support.
\nSupport object cache:
\ncompile once\nclean build directory\nrestore objects from cache\nlink targetThis proves the build can become faster than normal clean rebuilds.
\nA native build system touches many areas:
\ncompiler abstraction\ndependency tracking\nobject paths\nlinking\narchiving\nplatforms\ncache\nscheduler\ndiagnostics\nresources\nfallbackTrying to do everything at once is risky.\nThe correct approach is layered.\nEach milestone should produce a working build.
\nThe principle should be:
\nnative where Vix can be correct\nfallback where CMake is saferThis keeps the user experience stable.\nIt also allows Vix to grow without breaking existing workflows.
\nFor a supported vix.app project, success looks like this:
first build:\n compile sources\n link target\n store cache\n\nsecond build:\n no work\n\none source changed:\n compile one file\n relink\n\nheader changed:\n compile affected files\n relink\n\nclean build with warm cache:\n restore objects\n relink or restore artifactThat is the build experience Vix should aim for.
\nThe long-term architecture can be:
\nProjectResolver\n -> AppManifest\n -> BuildPlan\n -> NativeBuildGraph\n -> ObjectCache\n -> ArtifactCache\n -> Scheduler\n -> LinkerWith fallback:
\nif unsupported:\n generate CMake\n use CMake compatibility pathFor CMake projects:
\nCMakeLists.txt\n -> CMake compatibility path\n -> graph import\n -> cache analysisFor vix.app projects:
vix.app\n -> native path\n -> CMake fallback when neededNative vix.app builds are the natural next step for Vix.\nGenerated CMake makes vix.app usable today.\nNative BuildGraph execution can make it faster tomorrow.\nThe key is not to remove CMake.\nThe key is to use CMake where it is strongest and use Vix’s own graph where the project is simple enough to understand directly.\nThat gives Vix a realistic and powerful direction:
CMakeLists.txt -> compatibility\nvix.app -> native fast pathThe user keeps one command:
\nvix buildBut Vix gains the freedom to choose the best execution engine underneath.
\n'; +const towardNativeVixAppBuilds = { + html +}; +export { + towardNativeVixAppBuilds as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.0.0-jikc9_3s.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.0.0-jikc9_3s.js new file mode 100644 index 000000000..9d7379fa9 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.0.0-jikc9_3s.js @@ -0,0 +1,8 @@ +const html = "Vix.cpp v2.0.0 marks the beginning of the V2 series.\nThis release is not a cosmetic version bump. It is the architectural reset that moves Vix away from the limitations of the V1 runtime and establishes a cleaner foundation for the future of the project.\nThe most important change is the removal of the old Boost.Beast-based HTTP layer and the introduction of a native vix::http stack built around the Vix async execution model.
Vix.cpp V1 was originally built around Boost.Beast.\nAt the beginning, that was useful because Beast provided a mature HTTP foundation. It made it possible to move fast and build the first version of the runtime. But as Vix grew, the architecture started to expose a serious problem: the runtime was becoming too dependent on Beast’s internal model.\nHTTP headers, sessions, request handling, middleware, WebSocket integration, and even parts of the application lifecycle started to feel like they were shaped by Beast instead of by Vix.\nThat made the project harder to control.\nVix was supposed to become a native C++ runtime with its own execution model, its own developer experience, and its own module boundaries. But with Beast deeply present across the codebase, Vix was slowly becoming a Beast-based application instead of an independent runtime.\nThis created several issues:
\nVix.cpp v2.0.0 exists because those problems could not be solved cleanly with small patches.\nThe runtime needed a new foundation.
\nThe main focus of Vix.cpp v2.0.0 is architectural independence.\nThe old Boost.Beast-based HTTP layer has been removed and replaced with a native vix::http stack. This gives Vix direct ownership over request parsing, response handling, listener behavior, routing integration, middleware flow, shutdown logic, and runtime execution.\nThis change matters because Vix can now evolve around its own architecture instead of adapting every internal decision to Beast.\nThe goal is not only to remove Boost.Beast as a dependency. The goal is to make HTTP, WebSocket, middleware, and application runtime behavior share one coherent foundation.
In V1, too many parts of the runtime were coupled to the Beast model.\nThat made the code harder to extend because changes in the HTTP layer could affect unrelated systems. Middleware, WebSocket, and server lifecycle behavior had to follow the old transport assumptions. This reduced flexibility and made it harder to design Vix as a general runtime.\nVix.cpp v2.0.0 changes that direction.\nThe runtime is now Vix-driven. The HTTP stack is native. The async model is central. The runtime executor owns the execution flow. Modules can integrate through Vix abstractions instead of depending on Beast-specific details.\nThis is the real reason V2 matters.\nIt gives Vix control over its own future.
\nVix.cpp v2.0.0 introduces the native vix::http stack.\nThis new stack replaces the old Boost.Beast-based implementation and becomes the foundation for HTTP server behavior in Vix.\nThe native stack makes the runtime easier to reason about because the core HTTP flow is now designed for Vix directly. Listener startup, accept loop behavior, request handling, response generation, and shutdown can now follow the same internal model as the rest of the runtime.\nThis is especially important for future work around performance, diagnostics, middleware, WebSocket behavior, documentation generation, and runtime tooling.\nA runtime cannot stay clean if its most central layer is controlled by an external abstraction that leaks everywhere.
Vix.cpp v2.0.0 moves the runtime toward an async-first model.\nThe listener lifecycle is more deterministic, the accept loop shutdown is cleaner, and runtime execution is safer during application shutdown.\nThis release also improves shutdown behavior around App::close, worker cleanup, normal EOF handling, and unsafe runtime termination paths.\nThese details matter because server shutdown is one of the hardest parts of runtime design. A backend runtime must handle active connections, stopped listeners, pending tasks, worker threads, and cleanup order without leaving the system in an unsafe state.\nThe V2 architecture gives Vix a better foundation for that.
Vix.cpp v2.0.0 replaces legacy executor behavior with RuntimeExecutor.\nThis is part of the broader move toward a clearer runtime execution model.\nInstead of letting execution behavior remain scattered across older internal patterns, Vix now starts consolidating runtime lifecycle and execution responsibilities into a more explicit foundation.\nThis makes the runtime easier to extend and easier to debug.
The WebSocket and middleware layers were migrated to the new native HTTP stack.\nThis is a major internal change because WebSocket and middleware should not behave like separate systems with separate lifecycle rules. They need to share the same server foundation, the same runtime execution model, and the same shutdown behavior.\nIn V1, the old Boost.Beast-based layer made that harder. Vix had to adapt WebSocket and middleware behavior around Beast-driven internals.\nIn V2, these modules are aligned with the native Vix HTTP stack.\nThat creates a cleaner path for future improvements in real-time applications, middleware pipelines, routing, API documentation, and runtime diagnostics.
\nOne of the biggest motivations behind Vix.cpp v2.0.0 is installation simplicity.\nThe V1 architecture made packaging harder because Boost.Beast and related Boost dependencies were deeply connected to the runtime. This created friction for users who wanted to install Vix, build examples, or consume it as a reusable C++ toolchain.\nVix.cpp v2.0.0 removes that pressure by moving toward a Boost-free runtime foundation.\nThis does not only make the dependency graph cleaner. It also makes the project easier to distribute, easier to build, easier to debug, and easier to evolve.\nFor a C++ runtime, installation is part of the product. If the dependency model is too heavy or too fragile, adoption becomes harder.\nV2 fixes the foundation.
\nVix.cpp v2.0.0 also reorganizes examples across HTTP, cache, P2P, sync, templates, database, ORM, and middleware.\nOlder CRUD-style examples and deprecated demo layouts were removed or replaced with cleaner, more progressive examples.\nThis cleanup matters because examples should teach the current architecture, not preserve old design assumptions.\nThe objective is to make the ecosystem easier to learn while keeping examples close to real usage patterns.
\nThis release improves Windows and MSVC compatibility across CLI, core, and middleware.\nIt also reduces MSVC-specific portability issues, improves environment variable handling, adds fallback behavior for Unicode rendering in terminal output on Windows, and improves formatting stability in the format module.\nThese changes are part of making Vix more serious as a cross-platform runtime.\nA runtime architecture is not complete if it only works well on one platform.
\nvix::http stack.RuntimeExecutor.App::close shutdown behavior.Vix.cpp v2.0.0 introduces breaking architectural changes.\nThe old Boost.Beast-based HTTP stack has been removed.\nRelated Boost compatibility paths have also been removed.\nLegacy executor behavior has been replaced with RuntimeExecutor.\nListener startup behavior now follows the new async-first runtime model.\nProjects depending directly on old Beast-based internals must migrate to the new Vix-native HTTP and runtime APIs.
Vix.cpp v2.0.0 is the first official V2 baseline.\nIt is designed as a clean foundation for future V2 releases, not as a small compatibility patch for V1 internals.\nExisting projects using high-level Vix APIs should migrate toward the new native runtime model.\nProjects that depended on Boost.Beast-specific behavior or headers should update their integration to use Vix-owned abstractions instead.
\nThis release fixes Windows build blockers across CLI, core, and middleware.\nIt reduces MSVC-specific portability issues.\nIt fixes ambiguous std::to_string usage in the template module.\nIt improves environment variable handling for cross-platform support.\nIt adds fallback behavior for Unicode rendering in terminal output on Windows.\nIt improves formatting stability and safety in the format module.
Vix.cpp v2.0.0 is the real foundation of the V2 series.\nThis release exists because V1 reached the architectural limit of the Boost.Beast-based design. Beast helped Vix start, but it also made the runtime harder to control, harder to package, and harder to evolve as an independent system.\nV2 resets that foundation.\nVix now has a native HTTP stack, a cleaner async-first architecture, better runtime ownership, cleaner module boundaries, and a stronger path toward becoming a complete C++ application runtime.\nThis was not a change for the sake of changing.\nIt was the necessary step to make Vix independent, installable, maintainable, and ready for the next stage of the ecosystem.
\n"; +const v2_0_0 = { + html +}; +export { + v2_0_0 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.0-CpcIKkYM.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.0-CpcIKkYM.js new file mode 100644 index 000000000..afd3aaee0 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.0-CpcIKkYM.js @@ -0,0 +1,8 @@ +const html = "Vix.cpp v2.1.0 is a major performance, documentation, and ecosystem maturity release.\nThis release improves the HTTP hot path, scheduler behavior, async coroutine execution, template examples, documentation structure, and real-world examples across the Vix ecosystem.\nThe focus of this release is maturity. Vix is no longer only fast. It is becoming structured, documented, and ready to be used in real projects.
\nVix.cpp v2.1.0 improves performance in the core runtime.\nThe HTTP hot path was optimized, scheduler behavior was improved, run queue processing overhead was reduced, and the async coroutine fast path was cleaned up.\nThe async layer also removes redundant error handling where it was adding unnecessary overhead.\nThe result is lower latency, better throughput, and more predictable execution under load.\nFor a C++ runtime, performance is not only about raw speed. It is also about reducing unnecessary work in the most frequently executed paths.
\nThis release improves the scheduler and task execution model.\nThe goal is to make async execution more efficient and more predictable, especially when the runtime is under load.\nReducing overhead in queue processing and coroutine dispatch helps Vix behave more consistently in HTTP and backend workloads.\nThis is important because the scheduler is part of the runtime foundation. Every higher-level module depends on the cost and reliability of task execution.
\nVix.cpp v2.1.0 includes a complete refactor of template examples.\nThe template module now focuses more on real-world use cases instead of isolated demonstrations.\nNew examples include:
\nThe layout system is also improved with support for patterns such as extends, includes, and filters.\nThis makes the template module easier to understand through practical examples that look closer to real application pages.
\nThis release adds structured template examples with a progressive learning path.\nThe examples are organized to move from simple usage toward more complete scenarios.\nOlder and unstructured template demos were removed to keep the examples cleaner and easier to follow.\nThis matters because examples are not secondary content. They teach the architecture, the API style, and the intended usage patterns of the framework.
\nVix.cpp v2.1.0 adds a large amount of documentation across the ecosystem.\nThe new documentation covers:
\nThe documentation also includes more real-world scenarios such as authentication, JWT, caching, and rate limiting.\nThe goal is to give developers a clearer mental model of Vix architecture and make onboarding easier.
\nThis release improves the developer experience by aligning documentation, examples, and runtime behavior.\nExamples now follow a more progressive learning path.\nDocumentation is closer to real usage patterns.\nBasic and advanced concepts are separated more clearly.\nThis helps developers learn Vix without being forced to jump immediately into complex internals.
\nVix.cpp v2.1.0 improves internal consistency across the core, async, and template modules.\nThe structure is cleaner and easier to maintain.\nThis prepares the codebase for future features by reducing inconsistency in areas that are used by many parts of the ecosystem.
\nVix.cpp v2.1.0 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is improved runtime performance, better documentation, cleaner examples, and stronger ecosystem structure.\nProjects using the runtime should benefit from lower overhead and more predictable behavior under load.
\nVix.cpp v2.1.0 marks a major step toward making Vix a complete developer platform.\nFrom performance to documentation to real-world examples, Vix is now designed to be learned, used, and extended.\nThis release strengthens the foundation for future work across runtime performance, backend development, templates, documentation, and developer tooling.
\n"; +const v2_1_0 = { + html +}; +export { + v2_1_0 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.1-C84FUUEK.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.1-C84FUUEK.js new file mode 100644 index 000000000..875bb06a7 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.1-C84FUUEK.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.1 is a small but important registry and CMake stability release.\nThis release improves dependency resolution in vix install, stabilizes generated dependency loading order in .vix/vix_deps.cmake, and makes generated application CMake files safer when registry packages are added.\nThe focus of this release is package reliability. Vix projects should be able to install registry dependencies, generate CMake integration files, and build consistently even when packages use slightly different manifest formats.
The main fix in Vix.cpp v2.1.1 is support for the deps fallback when loading package manifests.\nvix install now correctly resolves dependencies declared using both:
"dependencies"and:
\n"deps"This improves compatibility with mixed package formats and ensures dependencies are resolved in the correct topological order.\nThe recommended field remains dependencies, but deps continues to be supported for compatibility.
This release fixes dependency loading order in:
\n.vix/vix_deps.cmakeThe generated CMake dependency file now loads packages in a safer order, preventing missing target errors when one package depends on another.\nFor example, if router depends on http, the generated CMake integration must ensure the lower-level dependency is available before the dependent package tries to link against it.\nThis is important because CMake target availability depends on load order. A correct dependency graph is not enough if the generated CMake file loads targets in the wrong sequence.
Vix.cpp v2.1.1 improves generated CMakeLists.txt files for application projects.\nGenerated CMake now safely includes:
.vix/vix_deps.cmakeonly when the file exists.\nThis allows developers to create a project, build it without registry packages, then add registry packages later without breaking the CMake configuration.\nThe generated CMake also introduces:
\nvix_link_optional_targets(...)This helper makes it easier to link optional registry libraries only when their targets are available.
\nGenerated application CMake files now include clearer inline guidance for linking registry libraries.\nThis helps users understand where registry dependencies should be linked and how optional package targets should be handled.\nThat is useful because dependency installation and CMake linking are separate concepts. Installing a package does not automatically mean every application target should link against every installed library.\nVix.cpp v2.1.1 makes that boundary easier to understand.
\nThis release improves consistency between:
\nvix install\nvix build\nvix runThe dependency resolver, generated CMake files, and runtime build behavior now handle mixed package formats more reliably.\nThat matters because a package workflow should not behave differently depending on whether the user installs dependencies, builds the project, or runs the application.
\ndeps fallback support when loading package manifests.dependencies field.vix install..vix/vix_deps.cmake.CMakeLists.txt safety for registry packages..vix/vix_deps.cmake only when present.vix_link_optional_targets(...).vix install, vix build, and vix run.Vix.cpp v2.1.1 introduces no breaking changes.\nExisting projects remain compatible.\nPackage manifests should standardize on:
\n"dependencies"but the older deps field remains supported.\nProjects using the Vix registry with CMake should now behave more reliably, especially when dependencies depend on each other.
Vix.cpp v2.1.1 is a small release, but it fixes an important class of stability problems.\nRegistry packages must resolve in the correct order, generated CMake must load dependency targets safely, and application projects must remain buildable before and after packages are added.\nSmall release. Big stability upgrade.
\n'; +const v2_1_1 = { + html +}; +export { + v2_1_1 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.10-DpANfYUq.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.10-DpANfYUq.js new file mode 100644 index 000000000..055e85d0b --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.10-DpANfYUq.js @@ -0,0 +1,8 @@ +const html = "Vix.cpp v2.1.10 is a cross-platform build stability release.\nThis release fixes Windows build failures caused by missing spdlog and fmt, improves dependency consistency across Linux, macOS, and Windows, ensures fmt is linked correctly for logging utilities, and removes unnecessary Boost dependencies.\nThe focus of this release is build reliability. A runtime ecosystem must build consistently across supported platforms before higher-level tooling can be trusted.
The main fix in Vix.cpp v2.1.10 is resolving Windows build failures caused by missing spdlog and fmt.\nThese dependencies are now included in the vcpkg manifest so Windows builds can resolve them correctly through the standard dependency path.\nThis matters because Windows builds often fail when dependencies are assumed to exist globally or are handled differently from Unix-based systems. Vix.cpp v2.1.10 makes the Windows dependency path explicit.
This release also ensures that fmt is correctly available as a direct dependency for logging utilities.\nThat is important because logging is used across many runtime and CLI components. If fmt is only available indirectly, builds can become fragile depending on module order, platform behavior, or package manager configuration.\nVix.cpp v2.1.10 makes the dependency relationship clearer.
Dependency setup is now more consistent across the main supported platforms.\nLinux uses apt.\nmacOS uses brew.\nWindows uses vcpkg.\nThe goal is not to make every platform identical internally. The goal is to ensure each platform has a clear and reliable dependency installation path.\nThis release reduces platform-specific failures caused by missing or inconsistent dependency setup.
Vix.cpp v2.1.10 eliminates several build issues caused by dependency mismatch between platforms.\nThis improves confidence in release builds, CI builds, and local developer builds.\nFor a C++ project, cross-platform stability depends on more than source code portability. It also depends on reliable dependency declaration, package discovery, linking behavior, and CI environment setup.
\nThis release removes unnecessary Boost dependencies, including boost-system and boost-beast.\nThat simplification keeps the project dependency graph smaller and better aligned with the V2 direction of Vix.cpp.\nRemoving unnecessary dependencies also reduces packaging complexity and lowers the risk of platform-specific build failures.
spdlog and fmt.spdlog and fmt to the vcpkg manifest.fmt is available as a direct dependency for logging utilities.apt, brew, and vcpkg.boost-system dependency.boost-beast dependency.Vix.cpp v2.1.10 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is that Windows builds should now resolve required logging and formatting dependencies correctly through vcpkg.\nLinux, macOS, and Windows builds should now behave more consistently.
\nVix.cpp v2.1.9 stabilized CMake and fmt integration, but Windows builds were still missing required dependencies.\nVix.cpp v2.1.10 completes that work by fixing the Windows dependency path and aligning dependency setup across Linux, macOS, and Windows.\nThis release is an important step toward stable cross-platform releases for the Vix ecosystem.
Vix.cpp v2.1.11 is a major SDK packaging release.\nThis release introduces full SDK distribution across Linux, macOS, and Windows. Instead of shipping only CLI binaries, Vix now produces complete installable SDK artifacts with a standard layout containing bin, include, and lib.\nThe focus of this release is integration. Vix should not only be executable as a command-line tool. It should also be installable as a C++ SDK that other projects can consume.
Vix.cpp v2.1.11 introduces a dedicated SDK release workflow.\nThe new SDK packaging system produces complete installable artifacts for the major supported platforms:
\nvix-sdk-linux-x86_64.tar.gz\nvix-sdk-macos-aarch64.tar.gz\nvix-sdk-windows-x86_64.zipThese artifacts are designed for real C++ integration workflows, not only CLI usage.\nA proper SDK needs headers, libraries, and binaries in a predictable layout. This release establishes that distribution model.
\nSDK artifacts now contain the full installation layout:
\nbin/\ninclude/\nlib/This is an important shift from CLI-only releases.\nThe bin directory provides executable tools such as the vix CLI.\nThe include directory provides public headers for C++ consumers.\nThe lib directory provides compiled libraries and package metadata needed for linking.\nThis layout makes Vix more usable as a native C++ dependency in external projects.
This release fixes Windows SDK packaging.\nThe Windows workflow now performs a proper build, install, and zip packaging process using vcpkg and the CMake toolchain.\nThat matters because Windows packaging often has different dependency and toolchain behavior from Linux and macOS.\nVix.cpp v2.1.11 brings Windows closer to the same SDK distribution model used on the other platforms.
\nThe SDK build environments for Linux, macOS, and Windows were aligned to produce consistent SDK layouts.\nThis improves predictability for users and maintainers.\nA developer should not need to learn a different package structure for each operating system. The platform-specific archive format may differ, but the internal SDK layout should remain consistent.
\nVix.cpp v2.1.11 separates CLI releases from SDK releases.\nThe release architecture now distinguishes between:
\nrelease.yml\nsdk-release.ymlrelease.yml remains focused on CLI release artifacts.\nsdk-release.yml is dedicated to SDK packaging.\nThis separation makes the release process clearer and easier to maintain. CLI distribution and SDK distribution have different goals, so they should not be forced into the same workflow.
This release prepares Vix for real-world integration workflows.\nA C++ runtime ecosystem needs an SDK distribution model so external projects can install Vix, include its headers, link its libraries, and use its tooling without depending on the source repository layout.\nVix.cpp v2.1.11 establishes that foundation.
\nvix-sdk-linux-x86_64.tar.gz, vix-sdk-macos-aarch64.tar.gz, and vix-sdk-windows-x86_64.zip.bin, include, and lib.Vix.cpp v2.1.11 introduces no breaking changes.\nExisting CLI releases remain supported.\nThe main difference is that Vix now has a separate SDK distribution path in addition to CLI releases.\nDevelopers who only need the vix command can continue using CLI artifacts. Developers who want to integrate Vix into C++ projects can use the SDK artifacts.
Vix.cpp v2.1.10 stabilized builds across platforms.\nVix.cpp v2.1.11 introduces the complete SDK distribution model.\nThis release is important because it moves Vix beyond a CLI-centered release process and prepares it for real C++ adoption as an installable runtime SDK.
\n'; +const v2_1_11 = { + html +}; +export { + v2_1_11 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.12-BCQMx7cH.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.12-BCQMx7cH.js new file mode 100644 index 000000000..14ae44adf --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.12-BCQMx7cH.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.12 is an SDK stabilization and CMake export reliability release.\nThis release makes nlohmann_json integration export-safe, normalizes SQLite target usage in the WebSocket module, fixes install(EXPORT VixTargets) issues, and improves the reliability of installed Vix SDK artifacts across Linux, macOS, and Windows.
The focus of this release is installability. Vix should not only build correctly from source. It should also install as a reusable SDK and work reliably through find_package(Vix) in consumer projects.
The main fix in Vix.cpp v2.1.12 is making nlohmann_json integration export-safe.\nPrevious JSON integration could expose non-exported targets through the installed package graph. That could cause CMake export failures or break consumer projects after installation.\nVix.cpp v2.1.12 removes direct linkage to non-exported JSON targets and ensures the header-only fallback works correctly with install and export flows.\nThis makes the JSON module safer to consume through installed SDK packages.
The WebSocket module now uses normalized SQLite target handling.\nThis release replaces deprecated usage of:
\nSQLite::SQLite3with the canonical target:
\nSQLite3::SQLite3Compatibility aliases are also added for cross-platform builds.\nThis matters because SQLite target names can vary depending on the platform, package manager, and CMake version. A reliable SDK must normalize those differences internally instead of pushing them onto users.
\nVix.cpp v2.1.12 fixes install(EXPORT VixTargets) issues caused by non-exported dependencies.\nThis is a critical part of SDK packaging. A project may compile correctly in the source tree but fail when installed if exported targets reference dependencies that were never exported or cannot be resolved by the consumer.\nThis release strengthens the export graph so installed Vix packages are usable through:
find_package(Vix)This release improves SDK installability.\nGenerated SDK artifacts are now fully usable after installation without missing dependencies from JSON or SQLite backends.\nThis is important for developers who want to install Vix once and consume it from separate projects instead of always working inside the Vix source tree.\nVix.cpp v2.1.12 makes that workflow more reliable.
\nDependency handling is now more consistent across Linux, macOS, and Windows.\nThis applies especially to SQLite and JSON backends, where package discovery and target naming can differ between environments.\nVix.cpp v2.1.12 improves those paths so the same installed SDK behaves more predictably across platforms.
\nnlohmann_json integration export-safe.SQLite::SQLite3 usage with SQLite3::SQLite3.install(EXPORT VixTargets) errors.find_package(Vix) usage for consumer projects.Vix.cpp v2.1.12 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is that installed SDK artifacts should now work more reliably through find_package(Vix) without missing JSON or SQLite dependency targets.\nProjects using WebSocket, JSON, or installed Vix SDK packages should benefit from more stable CMake configuration behavior.
Vix.cpp v2.1.11 introduced SDK packaging.\nVix.cpp v2.1.12 stabilizes the CMake export layer and makes Vix more reliable as a reusable installed SDK.\nThis release is important because a C++ runtime ecosystem must be installable, export-safe, and consumable outside its own source tree. The SDK should work as a real package, not only as a local build.
\n'; +const v2_1_12 = { + html +}; +export { + v2_1_12 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.13-DGbDu20Y.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.13-DGbDu20Y.js new file mode 100644 index 000000000..5639b3e77 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.13-DGbDu20Y.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.13 is an SDK packaging and CMake export reliability release.\nThis release fixes the cache module’s nlohmann_json integration, corrects FetchContent usage order, improves header-only fallback handling, and completes the export-safe packaging work needed for reliable SDK installation across modules.\nThe focus of this release is export correctness. A module can build correctly inside the source tree and still fail when installed if its dependency model leaks non-exported targets or build-only paths.
The main fix in Vix.cpp v2.1.13 is making the cache module’s nlohmann_json integration export-safe.\nThe previous integration could link against FetchContent-created targets in a way that was valid during the build but invalid during installation and package export.\nThat could break:
install(EXPORT VixTargets ...)Vix.cpp v2.1.13 removes invalid linkage to FetchContent targets and ensures the header-only fallback does not leak into exported package metadata incorrectly.
\nThis release also fixes the FetchContent call sequence used for nlohmann_json.\nThe previous order could cause configuration errors such as:
No content details recorded for nlohmann_jsonThat kind of failure is easy to miss during local development but can break clean CI builds, SDK packaging, and fresh consumer environments.\nVix.cpp v2.1.13 corrects the sequence so fallback dependency handling behaves consistently.
\nThe cache module now handles header-only fallback includes more carefully.\nFallback JSON headers are exposed only at build time and are not exported as external targets.\nThis distinction is important in CMake packaging. Build-tree usage and install-tree usage are not the same thing.\nA dependency path that is valid while compiling Vix may not be valid after the SDK is installed elsewhere.
\nThis release improves SDK installation reliability for the cache module in both static and header-only modes.\nThe module can now install correctly without missing dependencies or leaking invalid external targets.\nThis is an important step for users who consume Vix as an installed SDK instead of building everything from the source tree.
\nVix.cpp v2.1.13 improves CMake export consistency across modules.\nAll modules now follow a more consistent pattern for handling external dependencies in export sets.\nThis reduces the risk that one module solves dependency handling differently from another module and accidentally breaks installed package usage.\nFor a modular C++ ecosystem, consistency in export behavior is not optional. It is required for downstream reliability.
\nJSON fallback handling is also improved.\nWhen a system package is not available, the fallback dependency is handled correctly and installed with the SDK when needed.\nThis makes the SDK more portable in environments where users do not have every dependency installed globally.
\nnlohmann_json integration export-safe in the cache module.install(EXPORT VixTargets ...) failures caused by cache dependency handling.No content details recorded for nlohmann_json configure errors.Vix.cpp v2.1.13 introduces no breaking changes.\nExisting users of the cache module remain compatible.\nThe main difference is that SDK installation and exported package usage should now be more reliable, especially when nlohmann_json is provided through fallback handling instead of a system package.
Vix.cpp v2.1.12 stabilized JSON and SQLite integration.\nVix.cpp v2.1.13 completes the follow-up work for the cache module and finalizes export-safe SDK packaging across the affected modules.\nThis release is important because C++ package exports must work outside the original build tree. Vix modules should be usable after installation without leaking internal FetchContent targets, temporary include paths, or incomplete dependency metadata.
\n'; +const v2_1_13 = { + html +}; +export { + v2_1_13 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.14-BbTcR3sE.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.14-BbTcR3sE.js new file mode 100644 index 000000000..bc16c61c9 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.14-BbTcR3sE.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.14 is a module dependency cleanup release.\nThis release removes direct nlohmann_json linkage from the cache module, fixes VixTargets export errors caused by leaked third-party dependencies, and reinforces vix::json as the unified JSON abstraction across the ecosystem.\nThe focus of this release is clean module boundaries. A Vix module should depend on Vix-owned public abstractions, not expose third-party implementation details through installed package exports.
The main change in Vix.cpp v2.1.14 is that the cache module now relies on vix::json instead of linking directly to:
nlohmann_json::nlohmann_jsonThis keeps JSON usage consistent across modules.\nvix::json becomes the single JSON entry point, which improves portability and gives Vix better control over the public dependency model.\nFor a modular C++ runtime, this matters because third-party dependencies should not leak accidentally from internal modules into downstream consumer projects.
This release fixes an install(EXPORT VixTargets ...) failure caused by non-exported external dependencies leaking from the cache module.\nThat kind of failure is especially important because it affects installed SDK usage. A project may build correctly inside the source tree but fail once exported and consumed through find_package(Vix).\nVix.cpp v2.1.14 fixes that by ensuring the cache module no longer exposes local third-party JSON targets through the exported package graph.
The cache module no longer performs local JSON resolution or FetchContent logic.\nDependency responsibility is delegated to the json module.\nThis aligns the module with umbrella build principles: each module should own its own dependency responsibilities, and other modules should consume the Vix-facing abstraction.\nThat prevents duplicated dependency management and makes the package export graph easier to reason about.
Internally, the cache module removes local nlohmann_json detection and fallback logic.\nThis simplifies the module and reduces the risk of conflicting dependency resolution paths.\nThe result is a cleaner cache module that depends on the Vix JSON layer instead of managing JSON independently.
nlohmann_json dependency from the cache module.vix::json.VixTargets export errors caused by leaked external dependencies.vix::json as the unified JSON abstraction.FetchContent JSON fallback logic.json module.Vix.cpp v2.1.14 introduces no breaking changes.\nExisting cache users remain compatible.\nThe main difference is internal dependency cleanup: cache now uses vix::json as the JSON abstraction instead of exposing direct nlohmann_json linkage.\nInstalled package exports should now behave more reliably when consumed through find_package(Vix).
Vix.cpp v2.1.14 is a small but important architecture release.\nIt does not add user-facing runtime features. It fixes the dependency model behind the cache module and ensures JSON usage flows through the Vix abstraction layer.\nThis kind of cleanup is essential for a modular C++ ecosystem because package exports must remain clean, stable, and free from accidental third-party target leakage.
\n'; +const v2_1_14 = { + html +}; +export { + v2_1_14 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.15-DvHfhAD8.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.15-DvHfhAD8.js new file mode 100644 index 000000000..9a95c7cf9 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.15-DvHfhAD8.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.15 is an SDK installation and runtime portability release.\nThis release fixes relative runtime library resolution for the SDK binary, improves installer behavior when the CLI is already installed at the target location, enhances installer output across Linux, macOS, and Windows, and makes the SDK runtime more self-contained.\nThe focus of this release is installation reliability. A C++ SDK should not only build correctly. It should also install cleanly, locate its runtime libraries, and give users clear feedback during setup.
\nThe main fix in Vix.cpp v2.1.15 is relative RPATH support for the SDK binary.\nThe vix executable can now locate its shared libraries relative to its install prefix.\nOn Unix systems, the runtime path uses:
$ORIGIN/../libOn macOS, it uses:
\n@loader_path/../libThis improves SDK portability because the executable no longer depends on users manually configuring library paths after installation.
\nThis release refactors the CLI so it resolves dependencies relative to its installation prefix.\nThat makes the SDK runtime more self-contained and reduces the need for manual environment configuration.\nFor developers, this is important because an installed CLI should behave predictably after installation. If the binary exists but cannot locate its shared libraries, the installation is effectively broken.\nVix.cpp v2.1.15 strengthens that path.
\nThe installer now handles same-file symlink cases in SDK mode.\nThis prevents the installer from attempting to create a symbolic link when the CLI is already installed at the target location.\nThat small edge case matters because repeated installations should be safe. A user should be able to rerun the installer without hitting avoidable file or symlink errors.
\nVix.cpp v2.1.15 improves the installer experience on Linux and macOS.\nThe installer now uses clearer step-based output with styled messages for steps, success states, and warnings.\nThis makes installation feel more professional and easier to follow.\nInstead of a raw script-like output, users now get a clearer progression of what is happening and whether the installation completed successfully.
\nThe Windows installer output was also improved.\nThis release adds structured logs and better feedback during installation, including clearer success and warning messages.\nThe goal is to make installation feedback consistent across platforms, while still respecting platform-specific behavior.
\nThe installer now displays a better final summary after completion.
\nThe summary includes:
\nThis gives users immediate confirmation of what was installed and where it was placed.
\nInternally, the installer logic was simplified and logging was unified across platforms.\nThis reduces duplicated behavior and makes future installer improvements easier to maintain.\nInstallation is part of the product experience. A clean installer flow helps Vix feel more reliable before the user even runs their first project.
\n$ORIGIN/../lib runtime path support on Unix.@loader_path/../lib runtime path support on macOS.Vix.cpp v2.1.15 introduces no breaking changes.\nExisting SDK installations remain compatible.\nThe main difference is that new SDK installations should locate their runtime libraries more reliably after installation.\nRepeated installation in SDK mode should also behave more safely when the CLI already exists at the target location.
\nVix.cpp v2.1.15 is a release engineering and installer quality update.\nIt does not introduce new runtime APIs. It focuses on making the installed SDK easier to use, easier to relocate, and easier to trust across Linux, macOS, and Windows.\nThis is an important step for Vix.cpp because the developer experience starts at installation, not at the first command.
\n'; +const v2_1_15 = { + html +}; +export { + v2_1_15 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.16-Dfg4IRBW.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.16-Dfg4IRBW.js new file mode 100644 index 000000000..29877222a --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.16-Dfg4IRBW.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.16 is a Linux release portability and SDK compatibility release.\nThis release fixes runtime failures caused by shared library ABI mismatches in Linux artifacts, updates release and SDK workflows to build on Ubuntu 24.04, improves fmt and spdlog linkage behavior, and adds runtime validation for packaged Linux artifacts.\nThe focus of this release is making released Vix binaries more reliable on modern Linux systems.
The main fix in Vix.cpp v2.1.16 is resolving Linux runtime failures caused by shared library ABI mismatch.\nPrevious Linux artifacts were built on Ubuntu 22.04 and could be linked against older shared libraries such as:
\nlibfmt.so.8On newer distributions such as Ubuntu 24.04, this could cause runtime failures after installation if the expected shared library ABI was not available.\nVix.cpp v2.1.16 updates release workflows to build on Ubuntu 24.04, aligning packaged artifacts with modern Linux environments.
\nThis release also updates SDK artifact generation to use the same Linux build environment.\nThat matters because the SDK should not have different runtime assumptions from the CLI or release artifacts.\nBy unifying the Linux build environment, Vix reduces the chance that users install an SDK package that builds successfully but fails at runtime because of mismatched system library dependencies.
\nVix.cpp v2.1.16 improves vix_utils by preferring header-only targets for fmt and spdlog.
The preferred targets are now:
\nfmt::fmt-header-onlyand:
\nspdlog::spdlog_header_onlyThis reduces reliance on system shared libraries and improves portability for packaged releases.\nFor a distributed C++ CLI and SDK, depending accidentally on system-specific shared library versions can make binaries fragile. Header-only integration helps reduce that risk.
\nThis release also improves fmt and spdlog integration by adding:
SPDLOG_FMT_EXTERNAL=1This ensures more consistent integration with fmt and prevents unexpected linkage behavior.\nThe goal is to avoid implicit shared library dependencies in Linux release artifacts whenever possible.
Vix.cpp v2.1.16 adds a runtime validation step for packaged Linux artifacts.\nAfter packaging, the release workflow now validates the artifact by executing:
\nvix --versionand inspecting dependencies through:
\nlddThis helps detect broken binaries before they are published.\nThis is important because a package can compile successfully and still fail on the target system due to missing or incompatible runtime dependencies.
\nThe Linux release and SDK workflows are now standardized on Ubuntu 24.04.\nThis gives the release process a more consistent baseline and improves compatibility with modern Linux distributions.\nIt also reduces differences between release artifacts and SDK artifacts, which makes future debugging easier.
\nvix_utils to prefer fmt::fmt-header-only.vix_utils to prefer spdlog::spdlog_header_only.SPDLOG_FMT_EXTERNAL=1.vix --version validation after packaging.ldd dependency inspection before publishing artifacts.Vix.cpp v2.1.16 introduces no breaking changes.\nExisting source builds remain compatible.\nExisting installations on older Linux systems may still require compatible runtime libraries.\nThis release improves compatibility for modern Linux systems, especially environments closer to Ubuntu 24.04.
\nVix.cpp v2.1.16 is a release engineering stability update.\nIt does not introduce new runtime APIs. It focuses on making Linux artifacts and SDK packages safer to install and execute.\nFuture releases should continue moving toward fully self-contained Linux binaries, but this release already reduces avoidable runtime failures caused by shared library ABI mismatches.
\n'; +const v2_1_16 = { + html +}; +export { + v2_1_16 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.17-2qTef-h4.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.17-2qTef-h4.js new file mode 100644 index 000000000..54d013a55 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.17-2qTef-h4.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.17 is a CMake package compatibility release focused on SQLite dependency resolution in exported WebSocket builds.\nThis release fixes a critical developer experience issue where vix::websocket could expose SQLite3::SQLite3 in exported package targets, while that target was not guaranteed to exist in the consumer project. The result could be a CMake configuration failure during find_package(Vix) or when running simple programs through vix run.
The main fix in Vix.cpp v2.1.17 is resolving the SQLite target mismatch in the exported WebSocket module.\nPreviously, vix::websocket could expose SQLite3::SQLite3 as a dependency, but consumer projects were not always guaranteed to have that imported target available. This caused package configuration failures even when SQLite itself was installed on the system.\nVix.cpp v2.1.17 improves this by ensuring the SQLite dependency is resolved before Vix targets are loaded.
This release adds proper SQLite dependency handling in VixConfig.cmake.
The package configuration now calls the required dependency discovery path before loading exported Vix targets. This prevents missing target errors during:
\nfind_package(Vix)That matters because installed package usage must be reliable. A consumer project should not need to manually know the internal dependency order of Vix modules just to import the SDK.
\nVix.cpp v2.1.17 improves SQLite target naming across modules and package configuration.
\nThe release standardizes on:
\nSQLite3::SQLite3as the canonical SQLite target, while also adding compatibility aliases for common alternatives such as:
\nSQLite::SQLite3and:
\nsqlite3This makes the package more tolerant of different environments, package managers, and CMake discovery behavior.
\nThe WebSocket module now has stronger SQLite target resolution logic.\nThis improves compatibility across environments such as vcpkg, system package installs, and manual SQLite installations. The goal is to make vix::websocket usable from installed Vix packages without requiring consumers to patch or normalize SQLite target names themselves.\nFor developers, the practical result is simpler: running programs that depend on WebSocket should no longer fail because of missing transitive SQLite targets.
This release eliminates a common vix run configuration failure.\nSimple programs should not fail because a transitive dependency from an exported module was not correctly resolved. Vix.cpp v2.1.17 strengthens that path so dependency discovery is handled by the package configuration instead of being pushed onto the user.\nThis is especially important for a runtime-focused CLI, where users expect vix run to handle the project environment consistently.
vix::websocket exposed SQLite3::SQLite3 without guaranteeing the target existed.VixConfig.cmake dependency handling.SQLite3::SQLite3.SQLite::SQLite3 and sqlite3.vix run failures caused by missing transitive SQLite dependencies.Vix.cpp v2.1.17 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is that projects using modules with SQLite-backed dependencies, especially vix::websocket, should now configure more reliably through find_package(Vix) and vix run.
Vix.cpp v2.1.17 is a focused package reliability release.\nIt does not introduce new runtime features. It fixes an important dependency-resolution problem in exported WebSocket packages and makes SQLite target handling more robust across consumer environments.\nFor a C++ runtime ecosystem, this kind of fix is essential because package configuration must be predictable before higher-level workflows can feel reliable.
\n'; +const v2_1_17 = { + html +}; +export { + v2_1_17 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.18-CBM0T0is.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.18-CBM0T0is.js new file mode 100644 index 000000000..2c8a56f88 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.18-CBM0T0is.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.18 is a package compatibility and dependency resolution patch release.\nThis release fixes SQLite target normalization across different CMake versions and resolves remaining vix run failures caused by exported WebSocket SQLite dependency handling.
The main fix in Vix.cpp v2.1.18 is more robust SQLite target handling in exported Vix packages.\nPrevious package configuration relied on fragile SQLite alias normalization. That could break depending on how CMake discovered SQLite and which imported target name was available in the consumer environment.\nVix.cpp v2.1.18 replaces that fragile behavior with imported compatibility targets.\nThis allows exported Vix packages to work reliably with both:
\nSQLite::SQLite3and:
\nSQLite3::SQLite3This release also fixes remaining vix run failures caused by exported WebSocket SQLite dependency handling.\nThe WebSocket module can depend on SQLite in package contexts. If the exported dependency graph does not normalize SQLite targets correctly, consumers may fail even when SQLite is installed and usable.
Vix.cpp v2.1.18 strengthens this path so vix run can work more reliably when WebSocket and SQLite are involved through installed package exports.
This patch improves compatibility for projects using both older and newer CMake versions.\nThat matters because C++ package consumers do not always use the same CMake version, the same platform, or the same package discovery behavior.\nA Vix package export should be resilient enough to support those differences without forcing users to manually patch target names.
\nSQLite::SQLite3.SQLite3::SQLite3.vix run failures caused by exported WebSocket SQLite dependency handling.Vix.cpp v2.1.18 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is that exported Vix packages should now resolve SQLite dependencies more reliably across different CMake versions and consumer environments.\nProjects using WebSocket features with SQLite-backed package exports should benefit from more stable vix run behavior.
Vix.cpp v2.1.18 is intentionally focused.\nIt does not add new runtime features. It strengthens package export reliability around SQLite target naming, WebSocket dependency handling, and consumer compatibility.\nThis kind of release is important for a C++ ecosystem because installed package behavior must remain reliable across platforms, package managers, and CMake versions.
\n'; +const v2_1_18 = { + html +}; +export { + v2_1_18 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.19-D0LSLzui.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.19-D0LSLzui.js new file mode 100644 index 000000000..4af625ab4 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.19-D0LSLzui.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.19 is a build diagnostics and reliability release.\nThis release introduces structured CMake build error diagnostics, dedicated detectors for common build failures, cleaner CLI error output, more reliable --clean behavior, and safer publish handling in edge cases involving missing working directories or git context.\nThe focus of this release is making build failures easier to understand.\nC++ build systems can fail for many reasons: missing link targets, invalid CMake configuration, compilation errors, linker errors, stale build artifacts, or incorrect project roots. Vix.cpp v2.1.19 improves how these failures are detected and presented.
Vix.cpp v2.1.19 introduces a structured error detection system for CMake builds.\nInstead of passing through noisy raw build output as the main user experience, Vix now detects common failure patterns and turns them into clearer diagnostics.\nThis is important because raw CMake and Ninja output is often technically accurate but difficult to read quickly.\nA runtime-oriented CLI should help the developer understand what failed, where it failed, and what action is likely useful next.
\nThis release adds dedicated detectors for common build issues.\nThe diagnostics now handle cases such as linking failures, missing targets, and compilation failures more explicitly.\nThis makes the build pipeline easier to debug because different error families can receive different messages and hints.\nA missing target should not be explained like a compiler syntax error.\nA linker failure should not be treated like a missing CMake project.\nVix.cpp v2.1.19 moves the error system toward that separation.
\nError output is now cleaner and easier to understand.\nNoisy lines such as:
\nninja: build stoppedare no longer treated as useful primary diagnostics.\nThose lines describe the consequence of a failure, not the cause.\nVix now focuses on the relevant part of the error first, reducing the amount of terminal noise developers must scan during debugging.
\nThe hint system was improved so follow-up suggestions are only displayed when relevant.\nThis matters because an irrelevant hint can be worse than no hint. It can send the developer toward the wrong fix.\nVix.cpp v2.1.19 gates hints on handled errors, which prevents misleading suggestions from appearing when the error has already been correctly identified.\nThe result is a more disciplined diagnostic flow: detect the failure, classify it, show the focused message, and only add a hint when it helps.
\nThis release improves --clean behavior.\nThe command now correctly removes local build directories and build artifacts, ensuring a fresh build environment when requested.\nThis is important because stale CMake or Ninja artifacts can create confusing behavior.\nWhen a developer asks for a clean build, the CLI should remove the local build state reliably instead of leaving partial artifacts behind.
Vix.cpp v2.1.19 also improves publish behavior.\nPublishing now handles null current working directory cases more safely and improves git detection.\nThese are edge cases, but they matter for reliability. CLI tools should behave predictably even when invoked from unusual environments, scripts, automation, or partially initialized project contexts.
\n--clean behavior.--clean.Vix.cpp v2.1.19 introduces no breaking changes.\nExisting build, run, and publish workflows remain compatible.\nThe main difference is that build failures should now be reported with cleaner diagnostics and more focused hints.\nProjects using --clean should now get a more reliable fresh build environment.
Vix.cpp v2.1.19 is a focused diagnostic release.\nIt improves the developer experience around one of the most painful parts of C++ development: understanding why a build failed.\nThe long-term direction is clear. Vix should not only run C++ projects. It should also explain failures in a way that is precise, readable, and useful for real debugging.
\n'; +const v2_1_19 = { + html +}; +export { + v2_1_19 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.2-BYpp0vxi.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.2-BYpp0vxi.js new file mode 100644 index 000000000..f4abe6ca4 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.2-BYpp0vxi.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.2 is a CLI usability and runtime output release.\nThis release adds bash shell completion, pagination support for search results, improved command suggestions, and better live runtime stdout behavior through PTY support in vix run.\nThe focus of this release is interaction quality. A developer tool should not only execute commands correctly. It should also make discovery, navigation, output, and command usage smoother.
Vix.cpp v2.1.2 adds a shell completion command for bash.\nThis allows users to generate auto-completion scripts for the Vix CLI, making command discovery and daily usage faster.\nShell completion is important because as the CLI grows, users should not need to memorize every command, flag, or subcommand. Completion turns the CLI itself into a more discoverable interface.
\nThis release adds pagination support to search results.\nSearch commands now support:
\n--page\n--limitThis improves usability when the result set is large.\nInstead of dumping too much output at once, Vix can now present search results in a more controlled way. This makes registry or package search workflows easier to read and easier to navigate.
\nVix.cpp v2.1.2 improves live runtime stdout behavior in vix run.\nThe command now uses PTY support for runtime output, which improves real-time display when running applications.\nThis matters for applications that print logs, prompts, status messages, or long-running output. The CLI should show output as the program produces it, not delay or buffer it in a way that makes runtime behavior harder to understand.
Command suggestions were improved.\nSuggestions now rely on dispatcher entries, which makes them more accurate and better aligned with the actual registered command set.\nThis is important because suggestions should reflect what the CLI really supports. If suggestions are generated from a separate or outdated source, they can become misleading.
\nThis release adds a shell completion guide.\nThe new documentation explains how to enable and use CLI auto-completion.\nThat matters because shell completion is only useful if users can install and activate it easily in their environment.
\nVix.cpp v2.1.2 improves the daily CLI experience by making commands easier to discover, search results easier to navigate, and runtime output easier to follow.\nThese changes are small individually, but together they make Vix feel more polished as a developer-facing tool.
\n--page support for search results.--limit support for search results.vix run.Vix.cpp v2.1.2 introduces no breaking changes.\nExisting CLI workflows remain compatible.\nThe main difference is improved usability: shell completion can now be generated, search results can be paginated, command suggestions are more accurate, and runtime output behaves more reliably during vix run.
Vix.cpp v2.1.2 is a developer experience release.\nIt improves how users interact with the CLI, how they navigate search results, how they discover commands, and how they observe running applications.\nThis release continues the work of making Vix feel like a complete C++ development tool, not only a build command.
\n'; +const v2_1_2 = { + html +}; +export { + v2_1_2 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.3-8rUhMahW.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.3-8rUhMahW.js new file mode 100644 index 000000000..80b278d33 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.3-8rUhMahW.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.3 is a developer experience and CLI workflow release.\nThis release improves runtime output, introduces task execution through vix.json, adds project utilities, introduces formatting support, adds environment inspection through vix info, supports global updates, improves REPL capabilities, and strengthens generated project workflows.\nThe focus of this release is predictability. Vix output should be clean, runtime logs should be stable, generated projects should align with the build workflow, and developers should have better tools to inspect and manage their environment.
The main improvement in Vix.cpp v2.1.3 is cleaner runtime output.\nTerminal clearing and spinner behavior were removed from application execution. This makes vix run output more stable, minimal, and production-friendly.\nRuntime output should not hide what the application prints. It should not rewrite the terminal in ways that make logs harder to copy, inspect, or compare.\nVix.cpp v2.1.3 moves the runtime toward predictable output that works better in terminals, CI logs, demos, and production-like workflows.
This release introduces task execution through vix.json.\nThe new task system gives projects a structured way to define reusable commands and workflows inside the project configuration.\nThis is an important CLI foundation because real projects usually need more than build and run. They need repeatable tasks for formatting, checks, scripts, setup, local workflows, and project-specific commands.\nVix.cpp v2.1.3 also adds new project utilities to make project management smoother from the CLI.
Vix.cpp v2.1.3 adds a new formatting command.\nThe vix fmt command gives projects a direct workflow for improving code consistency.\nThis is part of the broader Vix direction: common development tasks should be available from the same CLI that already handles project creation, build, run, checks, and environment inspection.
This release adds the vix info command.\nThe command displays environment details, cache statistics, and disk usage.\nThis gives developers better visibility into the local Vix environment. That matters because runtime tools often depend on caches, build directories, installed binaries, environment variables, and platform-specific paths.\nA good CLI should make that state inspectable.
Vix.cpp v2.1.3 adds global update support through the -g flag.\nThis allows users to update Vix globally when needed.\nFor a developer tool, update behavior must be explicit and understandable. Adding a global update mode creates a clearer path for managing the installed CLI outside a single project.
The REPL receives improved support for JSON access, array indexing, and typed literals.\nThis makes runtime interaction more useful and expressive.\nThe release also adds REPL documentation through:
\ndocs/vix_repl.mdThis gives users a better reference for understanding REPL behavior and runtime interactions.
\nGenerated projects now better align with the Vix build workflow.\nThis is important because scaffolding is often the first experience a developer has with a tool. A generated project should teach the correct workflow by default.\nVix.cpp v2.1.3 improves project generation so the created structure feels closer to how Vix expects projects to build, run, and evolve.
\nThis release guards template examples, tests, and benchmarks subdirectories more carefully.\nThe time module also excludes benchmarks from library sources, preventing duplicate main symbols during compilation.\nThese fixes improve build correctness and prevent example or benchmark code from accidentally leaking into library builds.
Vix.cpp v2.1.3 improves runtime log formatting by adding proper spacing between labels and values.\nThis is a small change, but it improves readability. CLI output should be clear and consistent, especially when developers use it repeatedly during debugging.
\nvix.json.vix fmt command.vix info command.-g.docs/vix_repl.md.Vix.cpp v2.1.3 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is developer experience: runtime output is cleaner, CLI workflows are broader, and generated projects better match the Vix build model.\nApplications should continue to run normally while producing more predictable terminal output.
\nVix.cpp v2.1.3 improves the daily workflow around Vix.\nIt makes runtime output cleaner, adds task execution, introduces formatting and environment inspection commands, improves global update behavior, strengthens the REPL, and makes scaffolding more consistent.\nThis release continues the direction of turning Vix into a complete C++ development workflow, not only a build and run command.
\n'; +const v2_1_3 = { + html +}; +export { + v2_1_3 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.4-DQJS7GWq.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.4-DQJS7GWq.js new file mode 100644 index 000000000..390cef399 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.4-DQJS7GWq.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.4 is a code quality and build consistency release.\nThis release focuses on making the codebase warning-free under strict compiler flags, improving runtime safety, cleaning CLI internals, standardizing CMake usage across modules, and isolating third-party warnings more effectively.\nThe focus of this release is maintainability. A runtime ecosystem cannot stay reliable if warnings, unsafe patterns, inconsistent CMake usage, and platform-specific code paths accumulate over time.
\nThe main improvement in Vix.cpp v2.1.4 is the cleanup required to reach a warning-free build across CLI, core, and modules.\nThe codebase was cleaned under strict compiler flags such as:
\n-Wall -Wextra -WconversionThis matters because warnings in a C++ runtime are not just cosmetic. They can hide real bugs, unsafe conversions, unused execution paths, platform assumptions, and future portability issues.\nVix.cpp v2.1.4 reduces that risk by treating warning cleanup as part of runtime quality.
\nThis release replaces several unsafe or noisy implementation patterns with cleaner modern C++ constructs.\nThat includes reducing unsafe snprintf usage, removing redundant moves, cleaning implicit conversions, and improving request/session construction paths.\nThe goal is not only to silence warnings. The goal is to make the runtime code easier to reason about and safer under stricter compiler analysis.
The core module receives fixes around const char[] versus char* handling.\nThis prevents template issues and removes warning noise in console-related code.\nThe session layer also removes redundant std::move usage during request construction. This makes the code cleaner and avoids misleading ownership signals.\nSmall fixes like these matter in a runtime because they improve correctness and readability at the same time.
Vix.cpp v2.1.4 cleans several CLI internals.\nUnused variables, functions, and parameters were removed across commands and the REPL. Platform-specific helpers are now better guarded so Windows-only utilities do not affect other targets.\nThe run command also removes unused runtime variables, and the REPL receives improved argument parsing and validation.\nThis makes the CLI easier to maintain and reduces the chance that unused or platform-specific code creates warnings in unrelated builds.
\nThis release improves build system consistency across modules.\nCMake configuration now uses more consistent target_link_libraries patterns, avoiding mixed signature usage and reducing linking inconsistencies.\nFor a modular C++ project, CMake consistency is part of the architecture. If each module expresses dependencies differently, package exports, standalone builds, and umbrella builds become harder to maintain.\nVix.cpp v2.1.4 cleans that foundation.
External warnings from dependencies such as Asio, spdlog, and fmt are now better isolated using SYSTEM includes.\nThis keeps strict warning builds focused on Vix code instead of surfacing warning noise from third-party headers.\nThat distinction is important. Vix should remain strict about its own code, while not letting external dependency warnings break the developer experience.
The CLI command reference was updated.\nThe README now reflects the complete vix -h command list, giving users a more accurate view of available commands.\nDocumentation consistency matters because CLI behavior and documentation should evolve together.
Vix.cpp v2.1.4 improves the development environment by making builds cleaner, warnings more meaningful, and module behavior more consistent.\nA warning-free codebase gives contributors a stronger baseline. New warnings become easier to notice because they are not hidden inside existing noise.\nThis directly improves long-term maintainability.
\n-Wall, -Wextra, and -Wconversion.target_link_libraries consistency.SYSTEM includes.const char[] versus char* handling in core console code.std::move usage in session request construction.vix run.Vix.cpp v2.1.4 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is internal quality: builds should be cleaner, warnings should be reduced, and CMake configuration should be more consistent across modules.
\nVix.cpp v2.1.4 is a maintenance release, but it is strategically important.\nWarning-free builds, strict compiler hygiene, safer runtime patterns, clean CMake boundaries, and accurate CLI documentation all make the project easier to evolve.\nThis release improves the foundation that later runtime, SDK, and packaging work depends on.
\n'; +const v2_1_4 = { + html +}; +export { + v2_1_4 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.5-Do3ix5RR.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.5-Do3ix5RR.js new file mode 100644 index 000000000..4699d264d --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.5-Do3ix5RR.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.5 is a release pipeline and cross-compilation stability release.\nThis release fixes the Linux aarch64 build pipeline, improves dependency discovery during cross builds, adds missing dependencies for the utils module, and stabilizes the CI pipeline across Linux, macOS, and Windows.\nThe focus of this release is release reliability. Vix should produce valid artifacts across supported platforms, including native and cross-compiled targets.
\nThe main fix in Vix.cpp v2.1.5 is the Linux aarch64 release pipeline.\nThe previous cross-compilation setup did not correctly resolve required system packages such as spdlog and fmt. This could cause configuration failures during release builds and prevent valid Linux aarch64 artifacts from being produced.\nVix.cpp v2.1.5 updates the CMake toolchain configuration so cross builds can resolve the required dependencies more reliably.
This release improves dependency discovery during cross-compilation.\nThe CMake setting:
\nCMAKE_FIND_ROOT_PATH_MODE_PACKAGEwas updated to allow both target and host package resolution where needed.\nThis matters because cross builds often need to distinguish between packages required for the target environment and tools or metadata required from the host environment. If CMake is too restrictive, dependencies that exist in the build environment may still fail to resolve.\nVix.cpp v2.1.5 makes this path more robust.
\nThe aarch64 build environment now installs the missing spdlog and fmt dependencies required by the utils module.\nThis prevents configuration failures caused by missing logging and formatting dependencies.\nThe fix also aligns the aarch64 environment more closely with native builds, reducing differences between platform targets.
Vix.cpp v2.1.5 improves release reliability by stabilizing the CI pipeline across supported targets.\nThe affected targets include Linux, macOS, and Windows.\nThis release specifically supersedes v2.1.4, which was affected by a Linux aarch64 CI issue and may not produce valid release artifacts.
\nThis release improves consistency between native builds and cross builds.\nThe dependency setup is now better aligned so the aarch64 release path behaves more like the standard platform builds.\nFor a C++ runtime project, this is important because release artifacts must be reproducible and trustworthy across every supported architecture.
\nspdlog and fmt during cross builds.CMAKE_FIND_ROOT_PATH_MODE_PACKAGE.spdlog dependency to the aarch64 build environment.fmt dependency to the aarch64 build environment.Vix.cpp v2.1.5 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is release stability: Linux aarch64 artifacts should now be produced through a working pipeline with the required dependencies available during configuration.
\nVix.cpp v2.1.4 was affected by a Linux aarch64 CI issue and may not produce valid release artifacts.\nVix.cpp v2.1.5 supersedes v2.1.4 with a working release pipeline.\nThis release is important because architecture support is only meaningful when release artifacts are built, validated, and distributed reliably.
\n'; +const v2_1_5 = { + html +}; +export { + v2_1_5 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.6-CMR-9ige.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.6-CMR-9ige.js new file mode 100644 index 000000000..062e469c2 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.6-CMR-9ige.js @@ -0,0 +1,8 @@ +const html = "Vix.cpp v2.1.6 focuses on release stability across Linux targets.
\nThe previous releases exposed an important infrastructure problem: the native Linux x86_64 build and the aarch64 cross-compilation build were not using a fully aligned dependency environment. For a C++ runtime, this kind of issue is critical because release artifacts must be reproducible, portable, and predictable before users can trust the SDK in real projects.
\nThis version restores the missing system packages required by the Linux x86_64 release pipeline and fixes the aarch64 cross-compilation environment. The work mainly affects dependency resolution, CMake package discovery, and CI consistency.
\nThe affected dependency set includes spdlog, fmt, OpenSSL, zlib, SQLite, and Brotli on native Linux builds, plus missing spdlog and fmt setup for the aarch64 build environment.
spdlog and fmt dependencies in the aarch64 cross-compilation job.Vix.cpp v2.1.4 and v2.1.5 exposed release pipeline issues around Linux builds. Vix.cpp v2.1.6 closes that gap and establishes a more stable baseline for Linux, macOS, and Windows release targets.
\n"; +const v2_1_6 = { + html +}; +export { + v2_1_6 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.7-DMvjQfJo.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.7-DMvjQfJo.js new file mode 100644 index 000000000..d9cbb8262 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.7-DMvjQfJo.js @@ -0,0 +1,8 @@ +const html = "Vix.cpp v2.1.7 is a cross-platform CI stability release.\nThis release fixes the remaining macOS build failures, completes dependency setup across Linux and macOS targets, and improves release reliability across all supported platforms.\nThe focus of this release is build consistency. Vix should compile reliably across Linux, macOS, and Windows without missing system packages or platform-specific dependency gaps.
\nThe main fix in Vix.cpp v2.1.7 is resolving macOS build failures caused by missing dependencies.\nThe macOS build environment now installs the required spdlog and fmt packages before CMake configuration.\nThis prevents configuration failures caused by missing logging and formatting dependencies.
This release completes the system dependency setup across supported CI targets.\nRequired packages are now installed consistently for:
\nThis improves reliability for release builds and reduces the risk that a platform fails only because its CI environment was missing a dependency already available elsewhere.
\nVix.cpp v2.1.7 improves CI stability across Linux, macOS, and Windows.\nThe dependency installation strategy is now more unified, which makes the build matrix easier to maintain and less fragile.\nFor a C++ runtime project, CI stability is critical. If the build matrix is unreliable, it becomes harder to trust releases, test platform support, or validate changes confidently.
\nThis release eliminates remaining platform-specific issues that affected previous releases.\nVix.cpp v2.1.6 fixed Linux builds, but macOS builds were still incomplete. Vix.cpp v2.1.7 completes that work and makes the release process more dependable across supported platforms.
\nspdlog dependency to the macOS build environment.fmt dependency to the macOS build environment.Vix.cpp v2.1.7 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is release and CI stability: supported platforms should now have the required dependencies installed before configuration and build steps.
\nVix.cpp v2.1.6 fixed Linux builds, but macOS dependency setup was still incomplete.\nVix.cpp v2.1.7 completes the missing platform work and establishes the first fully stable release path across all supported targets.\nThis release is important because reliable cross-platform CI is the foundation for every later runtime, SDK, and packaging improvement.
\n"; +const v2_1_7 = { + html +}; +export { + v2_1_7 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.8-BqcCKMyP.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.8-BqcCKMyP.js new file mode 100644 index 000000000..1b2c360b9 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.1.8-BqcCKMyP.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.1.8 is a cross-platform build stability release.\nThis release fixes a macOS build failure caused by usage of an internal spdlog header, improves logging module portability, and finalizes build consistency across Linux, macOS, and Windows.\nThe focus of this release is portability. Vix should rely on stable public APIs from dependencies, not internal headers whose availability may change between versions or package environments.
The main fix in Vix.cpp v2.1.8 is replacing usage of:
\n#include <spdlog/fmt/ostr.h>with:
\n#include <fmt/ostream.h>The previous include relied on an internal spdlog header path. That worked in some environments but failed on macOS with newer spdlog and fmt versions.\nVix.cpp v2.1.8 moves the logging code to the official fmt API, which is a cleaner and more portable integration path.
This release improves the portability of the logging module by removing reliance on spdlog internal headers.\nThat matters because internal dependency headers are not stable API contracts. They can change depending on package version, platform, package manager, or build configuration.\nBy using the official fmt header instead, Vix makes the logging module easier to build and maintain across environments.
Vix.cpp v2.1.8 addresses the remaining macOS build issues exposed after the previous CI dependency fixes.\nThe result is a more stable build path for macOS developers and CI environments.\nThis is especially important because macOS package managers and dependency layouts can differ significantly from Linux and Windows setups.
\nThis release improves overall build consistency across all supported platforms.\nLinux, macOS, and Windows builds now share a more reliable logging dependency path.\nThe goal is simple: the same Vix source tree should build successfully across supported targets without platform-specific surprises caused by dependency internals.
\nspdlog internal header usage.spdlog/fmt/ostr.h with fmt/ostream.h.fmt API.spdlog internal headers.Vix.cpp v2.1.8 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is internal dependency portability: the logging module now uses the official fmt API instead of relying on an internal spdlog header.\nProjects should benefit from more stable builds, especially on macOS environments with newer spdlog and fmt packages.
Vix.cpp v2.1.7 fixed CI dependency issues but exposed a compatibility issue with spdlog on macOS.\nVix.cpp v2.1.8 resolves that issue and stabilizes the logging dependency path across supported platforms.\nThis release is small, but it is important because dependency portability is part of runtime reliability. A C++ ecosystem must build cleanly across environments before higher-level developer workflows can be trusted.
Vix.cpp v2.1.9 is a cross-platform build reliability release.\nThis release completes the transition to explicit fmt integration, fixes macOS header resolution issues, improves dependency propagation for logging utilities, removes fragile spdlog detection logic, and simplifies CMake dependency handling across platforms.\nThe focus of this release is predictable dependency configuration. Vix modules should expose the headers and libraries they require without depending on fragile implicit behavior.
The main fix in Vix.cpp v2.1.9 is resolving a fmt header include failure on macOS.\nSome builds could fail when headers such as:
#include <fmt/ostream.h>were not resolved correctly.\nVix.cpp v2.1.9 fixes this by linking fmt as a direct dependency where it is required.\nThis matters because header availability should not depend on accidental transitive includes or platform-specific package layout.
This release also corrects dependency propagation for the logging module.\nfmt is now exposed as a PUBLIC dependency where needed, ensuring headers are available to all consumers that include Vix logging-related headers.\nThat is important for installed packages and downstream CMake projects. If a public header requires a dependency, that dependency must be visible to consumers.\nOtherwise, the module may build internally but fail when used from another project.
Vix.cpp v2.1.9 removes fragile spdlog and fmt detection logic.\nPrevious build configuration included conditional handling around SPDLOG_FMT_EXTERNAL. That made the build harder to reason about and created platform-specific fragility.\nThis release simplifies the model with explicit and predictable linking.\nThe goal is clearer CMake behavior: dependencies should be declared directly instead of inferred through conditional paths.
Dependency handling for spdlog and fmt is now more consistent across Linux, macOS, and Windows.\nThis improves CI stability and makes local builds easier to reproduce.\nFor a C++ runtime ecosystem, cross-platform reliability depends heavily on correct dependency propagation. The same code should not require different hidden assumptions on each platform.
This release improves CMake maintainability by simplifying dependency configuration.\nExplicit dependency links are easier to debug, easier to export, and easier for downstream projects to consume.\nVix.cpp v2.1.9 continues the cleanup started in v2.1.8 by completing the fmt migration at the CMake level.
fmt header include failure on macOS.<fmt/ostream.h> resolves correctly.fmt as a direct dependency where required.fmt as a PUBLIC dependency for consumers.spdlog fmt detection logic.SPDLOG_FMT_EXTERNAL.spdlog and fmt dependency handling across Linux, macOS, and Windows.Vix.cpp v2.1.9 introduces no breaking changes.\nExisting projects remain compatible.\nThe main difference is that projects consuming logging-related headers should now receive the required fmt dependency more reliably.\nmacOS builds should no longer fail because of missing fmt headers such as <fmt/ostream.h>.
Vix.cpp v2.1.8 introduced the fmt migration but missed proper linkage in CMake.\nVix.cpp v2.1.9 completes that transition and stabilizes dependency handling across supported platforms.\nThis release is important because clean dependency propagation is part of the public API contract of a C++ SDK. If a module exposes headers that require a dependency, the build system must expose that dependency correctly too.
Vix.cpp v2.2.0 is a dependency management and package resolution release.\nThis release introduces a new manifest, resolver, and lockfile architecture for the Vix CLI. It also adds full semver resolution, transitive dependency installation, backward compatibility for legacy vix.json dependencies, and a new interactive configuration generator through vix make:config.\nThe focus of this release is deterministic dependency management.\nA C++ runtime ecosystem needs more than a build command. It also needs a reliable way to describe dependencies, resolve versions, install packages, and preserve reproducible project state.
Vix.cpp v2.2.0 introduces a new dependency architecture built around three core pieces:
\nThe manifest describes what the project depends on.\nThe resolver determines the correct dependency graph.\nThe lockfile preserves the resolved state so installations remain deterministic across machines and future runs.\nThis is an important foundation for the Vix package ecosystem because dependency installation should not depend on accidental command order or changing registry state.
\nThis release adds full semver support across dependency-related commands.\nThe resolver can now select package versions correctly for commands such as:
\nvix add\nvix install\nvix outdatedSemver support is required for a real package manager because projects need to express compatibility ranges while still getting predictable version selection.\nThe goal is to let developers depend on packages safely without manually pinning every version unless they need exact reproducibility.
\nVix.cpp v2.2.0 enables transitive dependency resolution.\nDependencies are now resolved recursively and installed correctly.\nThis is a major step for package management because real packages often depend on other packages. A resolver that only installs direct dependencies is not enough for a modular ecosystem.\nWith transitive resolution, Vix can build a more complete dependency graph and prepare projects for larger package structures.
\nThe resolver also supports legacy vix.json dependencies.\nThis preserves backward compatibility with existing packages while enabling the new resolution model.\nThat balance is important. Vix can improve its dependency system without forcing every existing package to migrate immediately.\nThe new resolver can understand older dependency declarations while still moving the ecosystem toward manifest, lockfile, and semver-based workflows.
Vix.cpp v2.2.0 adds:
\nvix make:configThis command generates structured configuration files through interactive prompts.\nThe goal is to make configuration setup easier and less error-prone, especially for developers who are starting a new project or want to generate a clean baseline configuration.\nInstead of manually writing configuration from memory, users can generate it through a guided workflow.
\nThis release improves package publishing safety.\nVix now rejects duplicate versions, validates vix.json before publishing, infers versions from git tags, and restores correct build order during publish workflows.\nThese changes protect the registry from invalid or inconsistent releases.\nThey also help package authors avoid mistakes such as publishing the same version twice, releasing invalid manifests, or building packages in the wrong dependency order.
Vix.cpp v2.2.0 fixes edge cases in dependency version resolution.\nThese fixes improve consistency across dependency commands and make the resolver more trustworthy.\nFor a package ecosystem, small resolver inconsistencies can create large downstream problems. This release strengthens the resolver behavior before the ecosystem grows larger.
\nadd, install, and outdated.vix make:config.vix.json dependencies.vix.json validation before publish.Vix.cpp v2.2.0 preserves backward compatibility with legacy vix.json dependency declarations.\nExisting packages can continue using their current dependency metadata while the resolver supports the newer dependency architecture.\nThe new dependency system is additive and prepares the ecosystem for more deterministic package workflows.
Vix.cpp v2.2.0 is a foundational package management release.\nIt gives the Vix ecosystem the pieces required for serious dependency management: manifests, deterministic resolution, semver, lockfiles, transitive dependencies, publish validation, and interactive configuration generation.\nThis release moves Vix closer to a complete C++ application runtime with package management that is predictable enough for real projects.
\n'; +const v2_2_0 = { + html +}; +export { + v2_2_0 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.3.0-Bucpbk1f.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.3.0-Bucpbk1f.js new file mode 100644 index 000000000..af2d5ee8c --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.3.0-Bucpbk1f.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.3.0 is a major vix run workflow release.
This release introduces ultra-fast direct C++ execution for single-file programs, smart CMake fallback for scripts that require more complex build support, local script cache support, SQLite and MySQL flags in run/build workflows, better executable detection, and a cleaner execution pipeline.
\nThe focus of this release is speed without losing correctness.\nSimple C++ files should run quickly. More complex files should still fall back to the full CMake path when needed.
\nVix.cpp v2.3.0 introduces a new direct execution mode for single C++ files.\nThis mode compiles and runs simple C++ files without going through a full CMake configuration step.\nThat matters because single-file C++ development should feel lightweight. When a developer wants to test a small program, example, algorithm, experiment, or utility, the runtime should not force the full project build path unless it is actually needed.\nThe goal is not to replace CMake.\nThe goal is to avoid using CMake when the input is simple enough to compile directly.
\nDirect execution is useful only if it remains safe.\nVix.cpp v2.3.0 adds smart CMake fallback so vix run can automatically switch back to the CMake path when the script requires complex dependencies, project structure, or runtime support that direct compilation cannot safely handle.\nThis gives Vix two execution paths:
This design keeps the fast path fast while preserving the correctness of the native C++ build system.
\nThis release improves caching for script builds.\nScript builds are now cached globally and keyed by absolute file path for better reuse across repeated executions.\nVix.cpp v2.3.0 also adds:
\n--local-cachefor script mode in vix run and vix check.
Local cache support gives developers more control over where script build artifacts are stored and helps align repeated script execution with the broader Vix cache behavior.\nThe result is faster repeated runs with fewer unnecessary rebuilds.
\nVix.cpp v2.3.0 adds SQLite and MySQL flags directly to vix run and vix build.\nThis improves the developer experience for small database-backed programs and examples.\nInstead of manually wiring database dependencies for quick experiments, developers can use Vix flags to express that the program needs SQLite or MySQL support.\nThis is especially useful for examples, prototypes, and single-file programs that need to quickly test database logic.
This release improves executable detection in vix run.\nInstead of assuming the executable name from the project directory, Vix now resolves executables from actual build directories such as bin/ and scanned targets.\nThis makes project execution more reliable.\nA C++ project does not always produce a binary with the same name as the folder. The runtime should inspect the build output instead of guessing.
Vix.cpp v2.3.0 reorganizes the internal execution pipeline.\nThe run flow is now cleaner and more robust, with improved process handling and better separation between script execution, project execution, and fallback behavior.\nThis is an important foundation for future runtime work.\nOnce vix run supports direct scripts, CMake fallback, built project binaries, runtime flags, database options, and process handling, the pipeline must be structured clearly. Otherwise every new execution mode becomes harder to maintain.
This release also improves the configuration system inside the core module.\nConfiguration structure and handling were cleaned up so runtime and example usage can become more predictable.\nThis supports the broader Vix direction: configuration should be explicit, easy to reason about, and usable from real applications.
\nVix.cpp v2.3.0 fixes several issues around script detection and build diagnostics.\nVix runtime scripts are now detected correctly in fallback mode, preventing incorrect fallback behavior when running Vix-based scripts.\nCMake error detection was improved to avoid misleading build errors and improve project root handling.\nThe vix_utilsConfig.cmake template was also cleaned up to remove redundant content.
The examples were updated to better demonstrate the improved run workflow.\nThis includes examples for blocking execution, background execution, and dynamic port usage.\nThese examples help show how the new execution pipeline behaves in practical scenarios.
\n--local-cache support for script mode in vix run and vix check.vix run and vix build.vix run execution pipeline.vix_utilsConfig.cmake.Vix.cpp v2.3.0 introduces no breaking changes.\nCMake remains the correct path for complex projects.\nDirect execution is used for simple single-file programs, while smart fallback keeps project-aware and dependency-heavy cases on the CMake path.\nExisting project workflows should continue to work normally.
\nVix.cpp v2.3.0 is an important step for the vix run experience.\nIt makes simple C++ execution faster, while still respecting the complexity of real C++ projects.\nThe direction is clear: Vix should make the common path fast, but keep the full native build system available whenever correctness requires it.
Vix.cpp v2.3.1 is a patch release focused on packaging and cross-platform stability.\nThis release improves how VixConfig.cmake resolves OpenSSL for consumer projects, especially on macOS environments where OpenSSL is installed through Homebrew and may not be available on the default CMake search paths.
The main fix in this release is better OpenSSL resolution in VixConfig.cmake.\nConsumer projects should be able to import and use Vix without manually fighting CMake package discovery when OpenSSL is installed in a non-default location.\nThis is especially common on macOS, where Homebrew installs OpenSSL outside the default system paths.\nVix.cpp v2.3.1 improves that behavior so downstream projects can configure more reliably.
This release avoids build failures caused by OpenSSL being installed but not discoverable through the default CMake search paths.\nThat matters because package configuration should be reliable for users consuming Vix as an installed SDK.\nA runtime library is not only judged by its internal code. It must also be easy to import, configure, and link correctly from external projects.
\nVixConfig.cmake.Vix.cpp v2.3.1 introduces no breaking changes.
\nThere are no changes to vix run behavior.\nThere are no runtime feature changes in this release.\nExisting projects should continue to work normally, with improved package configuration behavior when OpenSSL is required.
Vix.cpp v2.3.1 is intentionally small.\nIt focuses on one important packaging problem: making installed Vix projects more reliable for consumers, especially on systems where OpenSSL is not located in a standard CMake search path.\nThis kind of patch release is important for a C++ runtime ecosystem because reliable package discovery is part of the developer experience.
\n"; +const v2_3_1 = { + html +}; +export { + v2_3_1 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.4.0-TOAufyhj.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.4.0-TOAufyhj.js new file mode 100644 index 000000000..d60114873 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.4.0-TOAufyhj.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.4.0 is a major ecosystem release.\nThis release expands the modular architecture of Vix.cpp, introduces native static file serving in the core runtime, adds the new vix::tests module, improves environment handling, standardizes umbrella headers, and adds a large set of real-world examples across the ecosystem.\nThe focus of this release is structure. Vix.cpp is becoming more consistent as a modular C++ runtime where core runtime behavior, configuration, testing, filesystem utilities, process tools, logging, and examples follow the same design philosophy.
Vix.cpp v2.4.0 introduces native static file serving through:
\napp.static_dir(...);Static file serving is now part of the core runtime.\nThis means static files no longer require middleware or a separate bootstrap layer. The router can now serve static files through its fallback path before returning a 404 response.\nThe root mount / was also fixed so nested paths such as /index.html, /style.css, and other frontend assets resolve correctly.\nThis change removes the old static handler bridge and the previous middleware dependency for static serving.\nFor real applications, this matters because serving a frontend, documentation UI, dashboard, or static assets should be a core runtime capability, not an external workaround.
This release removes the deprecated vix/core.h header.\nThe Vix public API continues moving toward consistent modern C++ include paths, especially through umbrella headers such as:
#include <vix/core.hpp>and the top-level SDK include:
\n#include <vix.hpp>Removing legacy headers keeps the public API cleaner and reduces confusion between old and current runtime entry points.
\nVix.cpp v2.4.0 integrates several new modules into the ecosystem:
\nenverrorfsiologospathprocesstestsThese modules follow the same Vix design direction: minimal dependencies, predictable behavior, production-oriented APIs, and compatibility with both standalone and umbrella builds.\nThis is important for the long-term architecture because Vix should not be a monolithic runtime where every utility lives inside core.\nInstead, each capability should have a clear module boundary.
All major modules now expose a single public entry point.\nExamples include:
\n#include <vix/async.hpp>\n#include <vix/cache.hpp>\n#include <vix/env.hpp>\n#include <vix/error.hpp>\n#include <vix/fs.hpp>\n#include <vix/io.hpp>\n#include <vix/json.hpp>\n#include <vix/log.hpp>\n#include <vix/middleware.hpp>\n#include <vix/net.hpp>\n#include <vix/orm.hpp>\n#include <vix/os.hpp>\n#include <vix/path.hpp>\n#include <vix/process.hpp>\n#include <vix/sync.hpp>\n#include <vix/tests.hpp>\n#include <vix/websocket.hpp>This gives Vix a cleaner and more predictable public include model.\nDevelopers no longer need to understand deep internal header paths for common usage. Each module has one obvious public entry point.\nThat improves developer experience while keeping internal organization free to evolve.
\nVix.cpp v2.4.0 introduces the new vix::tests module.\nThe testing module follows a simple design:
A minimal test looks like this:
\nauto ®istry = TestRegistry::instance();\n\nregistry.add(TestCase("basic test", [] {\n Assert::equal(2 + 2, 4);\n}));\n\nreturn TestRunner::run_all_and_exit();The goal is not to replace every advanced C++ testing framework.\nThe goal is to provide a small native testing layer that fits the Vix ecosystem, works cleanly with examples and modules, and can integrate with CTest when needed.
\nThe environment system is significantly expanded in this release.\nVix.cpp v2.4.0 adds .env file support, layered configuration, typed access, and production-oriented configuration patterns.\nThe examples now cover configuration for:
This gives Vix projects a clearer configuration story.\nInstead of hardcoding runtime values or relying on outdated JSON configuration files, applications can now use environment-driven configuration patterns closer to production practice.
\nThis release improves database integration examples with environment-driven configuration.\nNew examples cover:
\nA full HTTP + database environment showcase is also included.\nThis matters because database configuration is one of the first places where real applications need clean separation between code, local settings, and deployment settings.
\nVix.cpp v2.4.0 makes that workflow more visible and easier to copy into real projects.
\nStatic file serving now has dedicated examples.\nThe new examples include:
\n01_basic_static.cpp\n02_static_directory.cpp\n03_static_with_cache.cppThese examples demonstrate directory mounting with app.static_dir, automatic index.html resolution, cache control support, and safe path handling.\nThis gives developers a direct path for serving static assets from the Vix core runtime.
Vix.cpp v2.4.0 adds and updates a large set of examples across modules.\nThe examples now cover configuration, environment loading, error handling, filesystem operations, IO utilities, logging, OS helpers, ORM usage, and HTTP + database integration.\nThis is important because examples are part of the public developer experience.\nA module is easier to trust when it has examples that show real usage patterns rather than isolated toy calls.
\nThis release improves the modular structure of the Vix ecosystem.\nThe architecture is now cleaner in several areas:
\nThis makes the codebase easier to scale.\nVix can continue adding capabilities without forcing everything into core or exposing unstable internal paths to users.
App::static_dir./ for nested static paths.vix/core.h.env module.error module.fs module.io module.log module.os module.path module.process module.tests module.vix::tests module..env file support..env.example usage.core and db.Vix.cpp v2.4.0 continues the V2 modularization effort.\nStatic files no longer require middleware or bootstrap code.\nProjects using legacy static middleware patterns should migrate to:
\napp.static_dir(...);Projects should also review .env usage and update configuration patterns to the expanded environment system where appropriate.\nThe deprecated vix/core.h header has been removed. Projects should use the modern .hpp headers instead.\nFor testing, projects can adopt vix::tests when they want a small native testing layer aligned with the Vix ecosystem.
Vix.cpp v2.4.0 is a structural release.\nStatic serving is now native to the runtime. Configuration is centered around .env. Modules expose consistent umbrella headers. Testing has a native module. Examples are broader and closer to real application usage.\nThis release moves Vix.cpp further away from being only a runtime library and closer to being a complete modular C++ application ecosystem.
Vix.cpp v2.5.0 is a runtime stability release.
\nThis release focuses on cleaner shutdown behavior, stronger async cleanup, safer HTTP server lifecycle handling, and more reliable WebSocket session writes.
\nA major part of this work came from debugging real issues inside a large production-style C++ application. The result is a stronger Vix runtime, especially for mixed HTTP + WebSocket applications where shutdown order, active connections, async cancellation, and detached write operations must be handled correctly.
\nThe main focus of Vix.cpp v2.5.0 is runtime stability.\nThe core runtime now handles App::close() more safely, improves HTTP server stop and join behavior, fixes thread shutdown ordering, and removes temporary debug traces from shutdown paths.\nThis matters because shutdown is one of the hardest parts of a C++ runtime. A server may still have active sessions, pending async operations, worker threads, write queues, browser connections, and internal services running when shutdown begins.\nThe runtime must stop in the right order.\nVix.cpp v2.5.0 strengthens that flow.
The HTTP server receives important lifecycle improvements.\nThis release improves server stop and join behavior, fixes thread shutdown ordering inside HTTPServer, and restores multi-threaded HTTP I/O workers after temporary debugging constraints.\nMulti-threaded HTTP I/O performance is restored while keeping the safer shutdown behavior introduced during bug isolation.\nThe goal is to keep the runtime fast without keeping temporary debugging bottlenecks in the normal execution path.
The async runtime receives safer shutdown behavior.\nVix.cpp v2.5.0 improves scheduler shutdown, stabilizes the async runtime stop flow, improves asio_net_service lifecycle management, and adds safer stop/join handling for the async network service.\nThis is important because async cleanup must be deterministic. If the scheduler, network service, and worker threads stop in the wrong order, the runtime can expose deadlocks, dangling operations, invalid callbacks, or stuck joins.\nThis release makes the async shutdown path more predictable.
The WebSocket runtime receives several important fixes in this release.\nVix.cpp v2.5.0 improves shutdown coordination in mixed HTTP + WebSocket runtimes, stabilizes low-level WebSocket server stop and join behavior, fixes session write flush lifecycle issues, and corrects session lifetime handling during detached async write operations.\nThe write queue handling was also cleaned up, and missing write path pieces were restored.\nThese changes are especially important for applications with repeated browser refreshes, multiple WebSocket clients, active connections during shutdown, and concurrent async writes.
\nThis release significantly improves behavior in real scenarios involving:
\nVix.cpp v2.5.0 adds a dedicated /bench fast path for benchmark builds.\nThe HTTP benchmark path was improved under VIX_BENCH_MODE, with benchmark-specific optimizations isolated from the standard HTTP runtime path.\nThis keeps benchmark measurements useful without polluting normal server behavior.\nThe release was benchmarked at approximately 98k requests per second on the /bench route in release benchmark mode.\nThe important part is separation: benchmark-specific paths remain isolated, while the normal runtime keeps its production behavior.
This release improves build consistency for modules that depend on async networking headers.\nPublic Asio propagation from vix::async to dependent modules was fixed, and umbrella build consistency was improved for modules using async networking.\nConditional compilation paths for benchmark-only helpers were also cleaned up, and warning noise was reduced in core and platform-specific sources.\nThese changes strengthen the modular build system and reduce accidental breakage across dependent modules.
The process module receives platform-specific cleanup.\nVix.cpp v2.5.0 fixes POSIX platform warnings, improves non-Linux helper isolation in process spawning internals, and cleans up noreturn, unused parameter, and unused helper issues.\nThis keeps stricter builds cleaner and makes platform-specific process code easier to maintain.
App::close() shutdown flow.HTTPServer.asio_net_service lifecycle management.AttachedRuntime shutdown coordination./bench fast path for benchmark builds.VIX_BENCH_MODE.vix::async to dependent modules.Vix.cpp v2.5.0 introduces no breaking changes.\nIf you use Vix for HTTP + WebSocket applications, this release is recommended.\nIt contains important fixes for shutdown stability, session write handling, async runtime cleanup, and mixed HTTP + WebSocket lifecycle behavior.\nExisting applications should continue to work normally while benefiting from safer runtime cleanup and more predictable shutdown behavior.
\nVix.cpp v2.5.0 is a reliability-focused release.\nIt was heavily validated through real debugging sessions on a large C++ codebase with complex concurrency behavior.\nSeveral difficult bugs were tracked down, including shutdown ordering problems, deadlocks, invalid session lifetime handling, async cleanup issues, and WebSocket write lifecycle problems.\nThis release strengthens the Vix runtime where it matters most: under real server pressure, active connections, repeated reloads, concurrent sessions, and shutdown conditions.
\n"; +const v2_5_0 = { + html +}; +export { + v2_5_0 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.5.1-DNxxjnfV.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.5.1-DNxxjnfV.js new file mode 100644 index 000000000..6558320c0 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.5.1-DNxxjnfV.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.5.1 is a stability and ecosystem cleanup release.
\nThis release fixes an important HTTP session lifecycle issue, improves stricter compiler builds, removes legacy example configuration, standardizes examples around .env, updates runtime examples to the current Vix architecture, and adds a complete set of production-oriented WebSocket examples.
The focus of this release is consistency. HTTP, WebSocket, configuration, documentation, and examples are now better aligned with the current Vix runtime model.
\nThe most important fix in Vix.cpp v2.5.1 is in the core HTTP session lifecycle.\nHTTP sessions now close correctly on EOF instead of continuing to loop.\nThis prevents infinite loops when clients close connections and improves the correctness of connection handling inside the core HTTP runtime.\nFor a backend runtime, EOF handling is not a small detail. A server must treat connection shutdown as a normal lifecycle event, not as a condition that keeps the session alive indefinitely.
\nVix.cpp v2.5.1 also improves strict compiler behavior around Asio headers.\nThe async module now suppresses a false-positive -Wnull-dereference warning around Asio includes using diagnostic push/pop boundaries.\nThis keeps strict warning builds cleaner without weakening warning behavior across the rest of the codebase.\nThe goal is precise warning control: suppress known external false positives locally, but keep Vix code strict.
This release updates existing examples to use RuntimeExecutor instead of the legacy threadpool API.\nThat change matters because examples should represent the current architecture, not old internal patterns.\nVix examples now better reflect the runtime direction established in the V2 series: a clearer execution model, cleaner lifecycle management, and less reliance on outdated APIs.
Vix.cpp v2.5.1 standardizes example configuration around .env.
Legacy config/config.json files were removed across HTTP and WebSocket examples. Examples now use .env.example files instead.\nThis makes configuration simpler, more familiar, and easier to adapt for real backend projects.\nThe release also removes old references to config/config.json, which helps avoid confusion when users copy examples into real applications.
Vix.cpp v2.5.1 adds a complete set of real-world WebSocket examples.\nThe new examples include:
\n01_minimal_ws\n02_http_ws_basic\n03_chat_rooms\n04_chat_persistent\n05_chat_long_polling\n06_metrics_runtime\n07_client_runtime\n08_realtime_dashboardThese examples are not simple demos.
\nThey cover minimal WebSocket setup, HTTP and WebSocket integration, room-based messaging, persistent chat with SQLite, long-polling fallback, runtime metrics, native WebSocket clients, and a full realtime dashboard with HTTP, WebSocket, and UI integration.\nThis gives developers a stronger starting point for real applications.
\nVix.cpp v2.5.1 improves API discoverability in the core and WebSocket documentation.\nThe core README now includes an OpenAPI and /docs section.\nThe WebSocket README was also improved with clearer runtime usage and examples.\nThis release highlights built-in API documentation endpoints:
/docs\n/openapi.json/docs provides interactive Swagger UI.\n/openapi.json provides the generated OpenAPI specification.\nThe documentation remains offline-first, with no external CDN requirement.
The WebSocket module receives a small cleanup by removing the unused set_affinity placeholder function.\nThis is a minor internal improvement, but it keeps the codebase cleaner and avoids exposing unused implementation ideas that are not part of the active runtime design.
-Wnull-dereference warning around Asio headers.set_affinity placeholder.config/config.json to .env.RuntimeExecutor./docs documentation sections..env.example files across examples.Vix.cpp v2.5.1 introduces no breaking changes.\nExisting HTTP and WebSocket runtime behavior remains compatible.\nExample configuration moved from legacy config/config.json files to .env, but this affects examples and documentation rather than existing user applications.
Projects using the current runtime architecture should continue to work normally.
\nVix.cpp v2.5.1 is not a feature-heavy release, but it is an important cleanup release.\nIt fixes a critical HTTP lifecycle issue, improves strict compiler behavior, removes outdated example configuration, aligns examples with RuntimeExecutor, and introduces a stronger WebSocket example suite.
This release continues the V2 direction: Vix is evolving from a runtime into a complete backend system where HTTP, WebSocket, API documentation, configuration, examples, and developer tooling are designed to work together.
\n'; +const v2_5_1 = { + html +}; +export { + v2_5_1 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.5.2-dwlpnqkL.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.5.2-dwlpnqkL.js new file mode 100644 index 000000000..338ef3299 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.5.2-dwlpnqkL.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.5.2 is a developer experience and runtime execution release.\nThis release introduces a stable options-based vix::print(...) API, a simple vix::input(...) API, modular runtime and template diagnostics, single-file binary export, runtime target execution, direct binary execution, smarter vix run target resolution, and optional HTTPS support in vix::core.\nThe focus of this release is clarity. Vix.cpp improves how developers write small programs, run different target types, diagnose advanced C++ errors, and configure HTTP or HTTPS server execution.
Vix.cpp v2.5.2 adds a stable options-based print API.\nThe new API supports Python-like print customization through:
\nvix::print(vix::options{...}, ...);The existing print API remains compatible.\nThis release also adds a simple interactive input API for console applications:
\nvix::input(...);Dedicated examples were added for both print_v2 and input.\nThese APIs matter because Vix is not only a backend runtime. It also aims to make native C++ application development more ergonomic for small programs, scripts, examples, and teaching workflows.
Vix.cpp v2.5.2 adds modular runtime error rules in the CLI.\nThe new runtime diagnostics cover common C++ execution failures such as joinable thread destruction, data races, deadlocks, mutex misuse, condition variable misuse, future and promise misuse, thread creation failures, detached thread lifetime issues, invalid container access, iterator misuse, dangling std::string_view, and dangling std::span.\nRuntime error prioritization was also improved so specialized concurrency diagnostics are shown before generic uncaught exception messages.\nThis gives Vix a clearer diagnostic pipeline for real C++ runtime failures, especially the kinds of errors that are common in concurrent and systems-level code.
Vix.cpp v2.5.2 adds modular template error rules for clearer compile-time diagnostics.\nThe release includes dedicated handling for missing typename before dependent types, missing nested types or type aliases, template argument mismatches, substitution failures, requires-expression failures, concept constraint failures, constrained overload failures, lambda capture lifetime issues, coroutine return type errors, missing co_return, invalid awaitable usage, invalid coroutine promise_type, and missing await_ready, await_suspend, or await_resume.\nIt also improves diagnostics for deleting through a base class with a non-virtual destructor, object slicing, invalid override, and invalid downcasts.\nThis is especially important for advanced C++ users because template, concepts, coroutine, and inheritance errors often produce long compiler traces. Vix does not hide the compiler. It adds a focused diagnostic layer that helps developers reach the actual cause faster.
Vix.cpp v2.5.2 adds single-file binary export in vix build.\nDevelopers can now produce executables directly from single-file programs using:
vix build main.cpp --bin --out appCross-compilation support for single-file builds was also added through:
\nvix build main.cpp --target <target>This makes vix build more useful for small utilities, examples, experiments, and distributable single-file C++ programs.\nThe command reuses the script execution engine from vix run, which keeps build and run behavior consistent.
Vix.cpp v2.5.2 expands vix run beyond local scripts and projects.\nThe command now supports runtime targets such as:
vix run docker://nginx -p 8080:80vix run container://nginx -p 8080:80vix run ssh://user@hostvix run https://example.comdocker://image and container://image execute containers through Docker.\nssh://user@host executes remote commands through SSH.\nhttp:// and https:// targets fetch URLs through curl.\nRuntime arguments after the target are now forwarded directly to the runtime. This removes the need for --run when using runtime targets.\nVix also adds direct binary execution:
vix run ./appThis release introduces smart target resolution so vix run can automatically resolve between scripts, binaries, projects, and runtime targets.
Vix.cpp v2.5.2 improves interactive passthrough in vix run.\nConsole applications now forward stdin correctly and display runtime prompts immediately without delayed buffering.\nPTY behavior was also improved by disabling local echo for forwarded runtime input.\nThis fixes issues where interactive C++ programs could behave differently under Vix compared to direct terminal execution.\nFor a runtime-focused CLI, stdin, prompts, and interactive applications must behave predictably. This release makes that path much more reliable.
Vix.cpp v2.5.2 adds optional HTTPS support in vix::core.\nTLS can be enabled from configuration using:
SERVER_TLS_ENABLED\nSERVER_TLS_CERT_FILE\nSERVER_TLS_KEY_FILEThe HTTP session layer now runs over a generic transport abstraction.\nPlain HTTP sessions use PlainTransport.\nHTTPS sessions use TlsTransport.\nThe release adds TlsConfig, TlsSession, and TlsTransport, and updates HTTPServer to start plain HTTP or HTTPS sessions depending on TLS configuration.\nThe server ready banner now displays HTTPS: when TLS is enabled.\nThe recommended production model remains clear: run the Vix HTTP core behind a TLS-terminating reverse proxy such as Nginx, Caddy, or Traefik. Built-in HTTPS is intended for local development, internal tools, and simple self-hosted deployments.
The new transport boundary separates the HTTP parser and session layer from the underlying connection type.\nThis is important because a server session should not be permanently tied to a plain TCP stream.\nBy introducing PlainTransport and TlsTransport, Vix creates a cleaner foundation for connection handling while preserving the existing plain HTTP path.\nThe release also adds native TCP socket handle access in vix::async::net::tcp_stream, which helps transport adapters integrate with lower-level socket behavior.
Vix.cpp v2.5.2 generalizes Vix include detection in the script pipeline.\nAny include matching:
\n#include <vix/...>or:
\n#include "vix/..."is now recognized automatically.\nAny usage of the vix:: namespace is also detected as Vix runtime usage.\nThis removes the need to maintain a hardcoded list of Vix modules in the script probe. New modules can now be detected without updating the probe manually.\nThe script execution pipeline was also improved so lightweight headers such as vix::print and vix::input no longer force unnecessary CMake fallback.
vix::print(...) API.vix::print(vix::options{...}, ...) for Python-like print customization.vix::input(...) API.std::string_view, and dangling std::span.vix build.--bin and --out for direct executable output.--target.vix run.vix run ./app.vix run.vix::core.TlsConfig, TlsSession, and TlsTransport.App::run(const vix::config::Config&) and App::listen(const vix::config::Config&, ...).vix::async::net::tcp_stream.Vix.cpp v2.5.2 introduces no breaking changes.\nThe existing print API remains compatible.\nExisting nlohmann::json and Simple.hpp response helpers remain supported while core JSON handling continues to move through vix::json::Json.\nBuilt-in HTTPS support is optional.\nWhen vix::core is built without OpenSSL support, Vix keeps graceful fallback behavior.\nThe recommended production deployment model remains a TLS-terminating reverse proxy in front of the Vix HTTP core.
Vix.cpp v2.5.2 strengthens both ends of the developer workflow.\nAt the small-program level, it improves print, input, single-file builds, binary export, direct execution, runtime target resolution, and interactive terminal behavior.\nAt the systems level, it improves concurrency diagnostics, template diagnostics, coroutine diagnostics, transport abstraction, and optional HTTPS support.\nThis release makes Vix.cpp more practical as a daily C++ runtime tool while continuing to reinforce its native systems foundation.
Vix.cpp v2.5.3 is a major workflow and diagnostics release.\nThis release introduces vix replay, opt-in execution recording, stronger runtime diagnostics, a new incremental build graph foundation, cleaner test and check output, and a dedicated development session engine for vix dev.\nThe focus of this release is observability. Vix.cpp is not only improving how projects build and run. It is also improving how failures are captured, explained, replayed, and debugged.
Vix.cpp v2.5.3 introduces the new vix replay command group.
The goal of replay is to make previous Vix executions inspectable and reproducible. A recorded run stores execution metadata and logs locally under .vix/runs/.
A recorded execution can include:
\nrun.json\nstdout.log\nstderr.log\ncombined.logThe first replay workflow includes:
\nvix replay last\nvix replay failed\nvix replay show\nvix replay list\nvix replay cleanReplay support works for both project runs and single-file script runs.\nRecording is now explicit. Normal vix run executions no longer create replay data automatically. Users must opt in with:
vix run main.cpp --replayor:
\nvix run --replayThis keeps normal runs clean while still giving developers a precise tool when they need to inspect or reproduce an execution.
\nVix.cpp v2.5.3 significantly improves runtime error diagnostics.\nThe release adds shared runtime location helpers for extracting file:line:column locations and printing runtime code frames. It also adds source-based fallback hints when logs do not provide an exact user frame.\nThis improves diagnostics for sanitizer and non-sanitizer crashes, including double free, iterator invalidation, segmentation faults, aborts, out-of-range errors, mutex errors, condition variable failures, thread errors, span issues, and std::string_view misuse.\nThe runtime error pipeline now avoids printing raw crash logs before friendly Vix diagnostics.\nThat matters because raw allocator or sanitizer output is useful, but it should not be the first thing most developers see. Vix now tries to present a focused diagnostic first, with a location, a code frame, and one useful hint.
This release improves sanitizer-driven script execution.\nThreadSanitizer support is now available through:
\nvix run main.cpp --tsanRuntime diagnostics for script sanitizer runs are also more precise. For example, vix run file.cpp --san and CMake fallback script runs can now show code frames for crashes such as double free.\nWhen sanitizer logs do not provide a clean user location, Vix attempts to point to suspicious source lines such as delete, delete[], or free().\nThis makes sanitizer output more useful without forcing users to manually scan long raw logs.
Vix.cpp v2.5.3 adds a new incremental build graph foundation for vix build.\nThis foundation includes build nodes, build tasks, dependency file parsing, object cache metadata, build graph persistence, and a parallel build scheduler.\nThe build graph can import real build information from:
compile_commands.json\nbuild.ninjacompile_commands.json gives Vix access to real compile commands generated by CMake/Ninja.\nbuild.ninja gives Vix visibility into archive, link, copy, install, and utility edges.\nThis is an important architectural step because Vix build intelligence should be based on the real native build graph, not guessed project structure.\nThe target-aware graph executor is still guarded and experimental. CMake/Ninja remains the stable execution path, and graph execution is protected behind:
VIX_GRAPH_EXECUTORThis keeps the release safe while preparing Vix for deeper no-op, incremental, and target-aware build decisions.
\nVix.cpp v2.5.3 improves the default vix build experience.\nBuild output is now cleaner, and detailed internal information such as graph state, artifact cache metadata, project paths, and CMake variables is hidden unless debug logging is enabled.\nThe build command also receives a unified diagnostic style for CMake, compiler, linker, sanitizer, runtime, and template-related errors.\nThe default build path was also improved to focus on the main project target instead of always rebuilding the full all target. When developers need the full CMake behavior, they can still request it explicitly:
vix build --build-target allThis improves no-op and focused rebuild performance while keeping the full build available.
\nVix.cpp v2.5.3 improves compile-time error rules with shorter messages, focused hints, code frames, and consistent at: output.\nTemplate diagnostics also receive important improvements.\nThe release adds cleaner diagnostics for concepts, coroutine awaiters, invalid overrides, object slicing, downcasts, and template substitution failures.\nThis matters because advanced C++ errors are often technically correct but difficult to read. Vix does not replace the compiler. It adds a higher-level diagnostic layer that helps users find the relevant part of the error faster.
Vix.cpp v2.5.3 improves vix tests with Vix-native output styling.\nThe test command now has a cleaner header, progress line, success summary, and failure diagnostics. It also extracts failed test names and useful error messages instead of dumping raw runner output by default.
The release adds:
\nvix tests --raw\nvix tests --test <name|pattern>\nvix tests -R <name|pattern>vix tests --raw keeps raw internal test runner output available when needed.\nFiltered test execution makes it easier to run one test or a subset of tests while keeping the command aligned with familiar CTest-style workflows.
Vix.cpp v2.5.3 improves vix check.\nThe command now uses cleaner Vix-native output with progress lines, timing summaries, and reduced default noise.\nFor project mode, sanitizer checks now validate the sanitizer build by default without forcing runtime execution. Runtime validation remains explicit through:
vix check --san --runScript mode also receives cleaner output for:
\nvix check file.cppand:
\nvix check file.cpp --sanSuccessful CMake and Ninja logs no longer leak into normal output during checks.
\nVix.cpp v2.5.3 adds a dedicated vix dev session engine.\nThe new development flow includes target-aware rebuild orchestration and a DevFileIndex for faster file watching using filtered file indexing, modification time, and file size comparisons.\nThe dev watcher now ignores build folders, .git, .vix, docs, generated output, and unrelated files.\nDev rebuild output now uses real Ninja progress instead of a fake spinner animation. Terminal output is cleared before application restarts, which prevents stale application output from mixing with rebuild output.\nThe result is a cleaner and more reliable development loop.
Vix.cpp v2.5.3 moves the thread pool implementation out of core and into the dedicated threadpool module.\nIt also adds kv as a dedicated Vix module for durable local-first key-value storage.\nThis improves module boundaries and prepares the runtime for cleaner dependency ownership. Core should not own every runtime facility directly. Moving threadpool and kv into standalone modules makes the architecture easier to maintain and package.
vix replay for recording, inspecting, listing, cleaning, and replaying previous executions..vix/runs/.vix replay last, vix replay failed, vix replay show, vix replay list, and vix replay clean.vix run --replay.vix run --docs.--tsan support for ThreadSanitizer script runs.vix build.compile_commands.json.build.ninja.BuildStyle for consistent build output and diagnostics.vix tests.vix tests --raw.vix tests --test and vix tests -R.vix check.vix dev session engine.DevFileIndex for faster dev-mode file watching.threadpool as a dedicated Vix module.kv as a dedicated Vix module for durable local-first key-value storage.Vix.cpp v2.5.3 introduces no breaking changes.\nReplay recording is now opt-in. Normal vix run executions no longer create .vix/runs/ unless --replay is passed.\nOpenAPI/docs mode is now opt-in. Documentation generation for vix run is disabled by default unless --docs is passed.\nCMake/Ninja remains the stable default build execution path.\nThe experimental graph executor is guarded behind:
VIX_GRAPH_EXECUTORThe full CMake all build remains available through:
vix build --build-target allVix.cpp v2.5.3 is an important step toward a more observable C++ runtime workflow.\nThe release improves how Vix records executions, explains runtime crashes, formats compiler and template errors, manages test output, checks projects, watches files, and prepares future incremental builds.\nThe deeper direction is clear: Vix is becoming a C++ development environment where build, run, test, check, dev, diagnostics, and replay are part of one coherent workflow.
\n'; +const v2_5_3 = { + html +}; +export { + v2_5_3 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.5.5-5LAIuhxk.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.5.5-5LAIuhxk.js new file mode 100644 index 000000000..b279d4d15 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.5.5-5LAIuhxk.js @@ -0,0 +1,8 @@ +const html = "Vix.cpp v2.5.5 is a reliability release for vix run, installed registry dependencies, package exports, and the first experimental vix.app workflow.\nThe most important fix is that vix run now links installed registry dependencies correctly, including compiled modules such as kv. This makes script and application execution more reliable when projects depend on modules installed through the Vix registry.
Before this release, some scripts using installed compiled modules could fail because the runtime build path did not link registry dependencies consistently.\nVix.cpp v2.5.5 fixes this behavior for vix run.
This is especially important for modules that are not header-only. A C++ runtime workflow cannot only resolve include paths; it must also correctly link compiled libraries.
\nThis release also fixes package export cleanup to avoid duplicate CMake targets in VixTargets.\nThat matters for installed SDK usage because duplicate exported targets can break downstream CMake consumers or make package configuration harder to reason about.\nThe release also improves installed module consistency for threadpool and kv.
Vix.cpp v2.5.5 introduces the first experimental version of vix.app.\nThe goal of vix.app is to let simple C++ applications build and run without requiring users to write a visible CMakeLists.txt.\nInternally, Vix generates the required CMake project and continues to use the native CMake/Ninja toolchain. This keeps the workflow compatible with real C++ build systems while reducing the amount of visible configuration needed for small applications.\nIn this release, vix.app is still experimental and only used when no CMakeLists.txt is present.
vix run auto-linking for installed registry dependencies.kv.VixTargets.threadpool and kv.vix.app support.vix.app based builds and runs.vix.app design.vix.app projects.Vix.cpp v2.5.5 introduces no breaking changes.\nExisting CMake projects keep the current build and run behavior.\nvix.app is experimental in this release and is only used when no CMakeLists.txt exists.
Vix.cpp v2.5.6 is a maintenance release focused on improving generated library workflows, CLI diagnostics, and terminal output consistency.\nThis release fixes the next-step guidance generated by vix new --lib, especially for header-only libraries. The generated instructions now better reflect the current build behavior and recommend vix build --build-target all when building generated library scaffolds.\nIt also improves diagnostics when a requested Ninja target does not exist. Instead of exposing raw Ninja output such as ninja: error: unknown target, Vix now reports a clearer and more focused message.
The main correction in this release is around generated library projects.\nHeader-only library scaffolds do not always produce a named executable target, so asking users to build a guessed target can lead to confusing errors. Vix.cpp v2.5.6 aligns the generated instructions with the safer CMake target behavior by recommending the generic all target.
This makes the generated project workflow more reliable for both application projects and library projects.
\nVix.cpp v2.5.6 also improves the formatting of vix new, vix modules init, and vix modules add.\nThe command output now uses cleaner sections for files, targets, and next steps. Extra spacing was removed so the output feels closer to the rest of the Vix CLI style.\nThis is a small release, but it improves an important part of the developer experience: what users see immediately after creating or modifying a project.
vix new --lib next steps for header-only libraries.vix build --build-target all.vix new and vix modules command output.vix new help output for application and header-only library workflows.vix modules init and vix modules add output formatting.vix build target behavior.Vix.cpp v2.5.6 introduces no breaking changes.\nExisting application projects keep the same vix build, vix run, and vix dev behavior.\nHeader-only library projects should use:
vix build --build-target allwhen building generated library scaffolds.
\n'; +const v2_5_6 = { + html +}; +export { + v2_5_6 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.6.0-C4YAKsO2.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.6.0-C4YAKsO2.js new file mode 100644 index 000000000..940602b61 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.6.0-C4YAKsO2.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.6.0 is one of the largest releases in the V2 series.\nThis release expands Vix.cpp beyond a C++ runtime and CLI workflow into a broader native application platform. It introduces local-first AI workflows, official vix.app support, Vue + Vix full-stack scaffolding, target-aware build execution, improved test automation, an async-powered development session, and the first serious foundation for game development with vix::game.\nThe focus of this release is not only feature growth. It is about making Vix.cpp more coherent as a runtime-oriented C++ development environment.
The main focus of Vix.cpp v2.6.0 is developer workflow integration.
\nPrevious releases established the native runtime, HTTP stack, async execution model, CLI commands, module packaging, and build system foundations. Vix.cpp v2.6.0 builds on that foundation by connecting more parts of the developer experience together:
\nvix::ai::Agentvix.appThis release makes Vix.cpp feel less like a collection of modules and more like a unified C++ application runtime.
\nVix.cpp v2.6.0 introduces the new vix::ai_agent module for local-first AI workflows.\nThe public API is exposed through:
#include <vix/ai.hpp>The main user-facing entry point is vix::ai::Agent.
The first supported provider path is Ollama, which allows local models to be executed from native C++ applications without treating AI as an external-only service.
\nThis is an important direction for Vix.cpp because AI support is added as a native runtime capability, not as a detached scripting layer or cloud-only integration.\nThe CLI also gains the new vix agent command group:
vix agent ask\nvix agent analyze\nvix agent scanThese commands establish the first user-facing workflow for AI-assisted project interaction inside the Vix ecosystem.
\nVix.cpp v2.6.0 makes vix.app an official application manifest path for simple C++ applications.\nThe goal of vix.app is to let developers build and run C++ applications without writing a visible CMakeLists.txt for simple executable projects.\nA generated application can now use:
vix new my_app --app\nvix build\nvix run\nvix dev\nvix testsInternally, Vix still relies on a real CMake/Ninja workflow. The difference is that simple application projects can now be described through a smaller application manifest, while Vix generates the internal CMake project under .vix/generated/app/.\nThis keeps the build system explicit and compatible with native C++ tooling, while reducing the amount of build-system ceremony required for small projects.
Vix.cpp v2.6.0 adds Vue application scaffolding through:
\nvix new my_app --template vueGenerated Vue + Vix projects include a Vue frontend and a Vix C++ backend. The frontend template includes the standard Vite structure with files such as package.json, index.html, vite.config.js, src/main.js, and src/App.vue.
The development workflow is integrated into vix dev.\nThis means Vix can start the Vue/Vite frontend alongside the C++ backend during development. Vue projects proxy /api requests to the Vix backend, which gives developers a clean full-stack development loop without manually wiring every process.\nThis is not a replacement for frontend tooling. Instead, Vix coordinates the native backend and the frontend dev server as one development workflow.
Vix.cpp v2.6.0 significantly improves the build workflow.\nThe default build target is now the generic CMake all target instead of guessing a target from the current folder name. This makes default builds safer and closer to standard CMake behavior.\nThe release also adds target-aware vix build execution with safe fallback to CMake/Ninja. When Vix can safely execute a target through its build graph, it can do so. When a target is unsupported, ambiguous, or unsafe, it delegates back to Ninja.\nThis is the right tradeoff for a C++ runtime tool: optimize when the model is safe, but never pretend to understand more than it does.\nVix.cpp v2.6.0 also adds:
vix build --warnings\nvix build --warning-check\nvix build --explainvix build --warnings provides paginated compiler warning exploration.\nvix build --warning-check builds with stronger compiler warning flags automatically.\nvix build --explain explains why files or targets rebuild.\nTogether, these features move vix build closer to a diagnostic tool, not only a build launcher.
vix run now uses the same project execution path as vix build.\nThis matters because build and run behavior should not diverge. A project should not build one way and run through a separate execution path with different assumptions.\nVix.cpp v2.6.0 also improves how vix run handles process exits. Normal non-zero exits are no longer treated as runtime crashes.\nvix dev receives deeper changes.
The dev session now runs on the Vix async runtime. Rebuilds, polling, debounce timers, child-process monitoring, and Ctrl+C shutdown are coordinated through the async execution model.\nThis makes the development loop more aligned with the rest of the Vix runtime architecture.\nApplications that exit cleanly now stop the dev session instead of being restarted in a loop. Library projects stay in watch/build-only mode, while runnable application projects execute normally.\nThe result is a quieter and more predictable development workflow.
\nVix.cpp v2.6.0 improves vix tests.\nProjects with a tests/ directory can now prepare and run tests automatically when possible, even if the test configuration has not been explicitly completed yet.\nThe command also gains cleaner CTest-based listing and per-test status display.\nThis reduces friction for projects that are still evolving, while keeping compatibility with standard CMake/CTest workflows.
The REPL engine has been moved out of the CLI module into the new standalone vix::reply module.\nThis is an internal architectural improvement, but it matters because the REPL engine is now separated from CLI command implementation details.\nvix repl now uses this standalone module.\nThis makes the REPL foundation easier to evolve and reuse without coupling it too tightly to the CLI layer.
Vix.cpp v2.6.0 moves lightweight developer helper APIs into the new vix::io ownership model.\nThis includes headers and APIs such as:
#include <vix/print.hpp>\n#include <vix/format.hpp>\n#include <vix/inspect.hpp>\n#include <vix/input.hpp>\n#include <vix/console.hpp>This change clarifies module boundaries.\nThe core module should not own every developer-facing helper. By moving these APIs into vix::io, Vix keeps vix::core focused while still preserving a simple developer experience through the installed SDK and umbrella headers.
Vix.cpp v2.6.0 introduces the new vix::game module.\nThis is the first major foundation for game development inside Vix.cpp. The module includes support for game loops, scenes, events, entities, assets, background jobs, runtime contexts, editor contexts, and package metadata.\nThe release adds game-aware project generation:
vix new my_game --game\nvix new my_game --template gameGenerated game projects include:
\nassets/\ngame.package.json\nsrc/main.cpp\nvix.app\nvix.jsonGame projects generated by Vix can now use:
\nvix build\nvix run\nvix dev\nvix game exportThis is a significant step because Vix.cpp is no longer limited to backend, CLI, networking, and runtime use cases. It now has the beginning of a native game application workflow.
\nThe vix::game module now includes a backend foundation with:
GameRuntimeGameContextNullWindowNullRendererVix.cpp v2.6.0 also adds an SDL OpenGL renderer backend.\nThis includes OpenGL context creation through SDL, shader compilation, VAO/VBO/EBO setup, texture upload, sprite rendering, and glDrawElements rendering.\nThe release includes tiny_adventure, a complete game example using SDL windowing, SDL OpenGL rendering, input, asset loading, texture upload, sprite drawing, movement, and simple collision logic.\nThis gives the game module a real executable direction instead of only abstract runtime types.
Vix.cpp v2.6.0 adds the first vix::game export workflow.
The new export system includes:
\nGameExportConfigGameExporterGameExportManifestGameExportAssetGameAssetPipelineThe CLI now supports:
\nvix game exportThis command exports Vix game projects from game.package.json, generates export.json manifests, scans assets, detects asset types, and records exported asset metadata such as path, type, and size.\nThe export workflow is additive. It does not change existing vix build, vix run, vix dev, or vix new --game behavior.
Vix.cpp v2.6.0 improves umbrella CMake integration and package export behavior.\nThe umbrella CMake module order has been improved so dependencies are configured before the modules that consume them.\nVixConfig.cmake has also been improved so umbrella consumers can load exported Vix targets without requiring internal modules such as vix_io as separate packages.\nThe release adds package configuration support for optional game backends:
-DVIX_WITH_GAME_SDL=ON\n-DVIX_WITH_GAME_SDL_OPENGL=ONStandalone and umbrella vix::game builds also receive dedicated support for:
-DVIX_GAME_ENABLE_SDL=ON\n-DVIX_GAME_ENABLE_SDL_OPENGL=ONThis makes game backend availability explicit and keeps optional dependencies under control.
\nVix.cpp v2.6.0 improves standalone CI workflows across several modules, including:
\nThe release also fixes isolated module dependency layouts so each standalone module receives the sibling modules it needs during CI builds.\nModules that depend on core now preload required dependencies such as json, template, and env before configuring core.\nThese changes are important for a modular C++ codebase because umbrella builds can hide dependency mistakes. Standalone CI forces each module boundary to be explicit.
Added the new vix::ai_agent module.
Added public AI support through <vix/ai.hpp> and vix::ai::Agent.
Added Ollama support for local model execution.
\nAdded vix agent ask, vix agent analyze, and vix agent scan.
Added the standalone vix::reply module for the REPL engine.
Added official vix.app support for simple C++ application projects.
Added vix.app support in vix build, vix run, vix check, and vix tests.
Added Vue + Vix full-stack project scaffolding.
\nAdded Vue-aware vix dev support.
Added target-aware vix build execution with safe CMake/Ninja fallback.
Added fast no-op build detection and ArtifactCache restore support.
\nAdded compiler warning summaries and warning exploration commands.
\nAdded vix build --warnings, vix build --warning-check, and vix build --explain.
Added automatic test preparation in vix tests.
Added the new vix::game module.
Added game project scaffolding through vix new --game.
Added SDL and SDL OpenGL backend foundations for vix::game.
Added sprite rendering, texture upload, SDL input mapping, and runtime diagnostics.
\nAdded tiny_adventure, a complete Vix game example.
Added vix game export.
Added exported game manifests and asset metadata.
\nImproved vix dev by moving session orchestration to the Vix async runtime.
Improved CMake package export for umbrella consumers and optional game backends.
\nVix.cpp v2.6.0 does not introduce breaking changes.\nExisting CMake projects continue to use CMakeLists.txt directly.\nvix.app is used only when no CMakeLists.txt exists, and it is currently focused on simple application and executable projects. Library projects continue to use CMakeLists.txt for now.\nThe AI agent module is optional and can be disabled with:
-DVIX_ENABLE_AGENT=OFFThe game module is also optional and can be disabled with:
\n-DVIX_ENABLE_GAME=OFFSDL game backend support can be enabled with:
\n-DVIX_GAME_ENABLE_SDL=ONSDL OpenGL renderer backend support can be enabled with:
\n-DVIX_GAME_ENABLE_SDL_OPENGL=ONThe graph executor can be disabled with:
\nVIX_GRAPH_EXECUTOR=0Vue support is currently focused on development workflows through vix dev. vix run continues to run the Vix application or backend.
Vix.cpp v2.6.0 is a major workflow release.\nIt introduces AI, application manifests, Vue development workflows, stronger build diagnostics, async-powered development sessions, and the first serious game runtime foundation.\nThe most important architectural direction is consistency.\nvix build, vix run, vix dev, vix tests, vix.app, Vue projects, AI commands, and game projects are becoming part of one coherent runtime workflow.\nThat is the long-term direction of Vix.cpp: native C++ development with modern application-level tooling, without hiding the underlying C++ build system when the project needs full control.
Vix.cpp v2.6.1 is a patch release focused on diagnostics, SDK release validation, and post-v2.6.0 stabilization.
\nVix.cpp v2.6.0 was a large release. It introduced major workflow and runtime foundations such as AI agent support, official vix.app support, Vue + Vix workflows, target-aware builds, async-powered development sessions, and the first serious game runtime foundation.
v2.6.1 is the follow-up release that hardens that foundation.
\nThe focus is not new surface area.
\nThe focus is making failures clearer, release packages safer, and SDK consumption more trustworthy.
\nThe main focus of Vix.cpp v2.6.1 is reliability after a large release.
\nLarge releases often expose problems that only appear when the full SDK is packaged, installed, linked, and used as a consumer would use it.
\nv2.6.1 improves that part of the release process.
\nIt strengthens:
\nvix dev failure reportingvix::vixThe release makes Vix.cpp better at answering one important question:
\nIf something fails, can the developer quickly understand what failed and why?Vix.cpp v2.6.1 improves runtime diagnostic formatting for clearer CLI output.
\nRuntime failures should not feel like raw noise. They should point the developer toward the useful part of the failure.
\nThis release improves diagnostics for bad variant access errors and generic runtime failures.
\nWhen runtime logs contain useful information, Vix now extracts that information and presents it more clearly.
\nThe goal is to reduce the distance between the failure and the fix.
\nInstead of forcing developers to scan long logs manually, Vix tries to show:
\nwhat failed\nwhere it failed\nwhy it likely failed\nwhat context mattersvix dev runtime failures now route through the same diagnostic pipeline used by vix run.
This matters because development mode should not have weaker error reporting than manual run mode.
\nBefore this change, the same runtime problem could be easier to understand through vix run than through vix dev.
v2.6.1 makes the behavior more consistent.
\nIf an application fails while running inside the development session, Vix can now present the failure through the same diagnostic model used elsewhere in the CLI.
\nThis is part of the larger direction of Vix.cpp:
\nsame project\nsame runtime\nsame diagnostics\nsame developer workflowv2.6.1 reduces duplicated runtime log output when a clear diagnostic is already available.
\nThis is important because a diagnostic tool should not make failures harder to read by printing the same information several times.
\nWhen Vix can produce a focused diagnostic, the surrounding logs should support that diagnostic, not bury it.
\nThis makes runtime failure output more compact and easier to scan.
\nVix.cpp v2.6.1 improves build diagnostic location selection.
\nWhen possible, Vix now prefers user code over system headers.
\nThis fixes misleading build diagnostics that pointed to standard library headers instead of the project files that caused the error.
\nThis is especially important in C++.
\nA mistake in user code can often appear deep inside:
\nstandard library headers\ntemplate internals\nsystem headers\nthird-party headersBut the useful location is usually the project file where the template, type, or API was instantiated incorrectly.
\nv2.6.1 improves that selection so diagnostics are more helpful.
\nThe goal is not to hide compiler output.
\nThe goal is to anchor the diagnostic closer to the code the developer can actually change.
\nvix tests receives better output for failed C and C++ assertions.
CTest assertion failures are now rendered as clean Vix diagnostics.
\nWhen an assertion fails, Vix can show:
\nThis improves the test debugging loop.
\nInstead of reading a raw test runner block and manually searching for the relevant source line, the developer gets a focused diagnostic.
\nThis is important because Vix.cpp is adding more tests across modules, runtime behavior, CLI workflows, and SDK validation.
\nAs test coverage grows, test failure output must stay readable.
\nv2.6.1 adds clearer diagnostics for missing runtime resources.
\nMissing resources can happen when:
\nThe improved diagnostics help distinguish a missing runtime resource from a generic runtime failure.
\nThis makes configuration and packaging problems easier to understand.
\nOne of the most important areas in v2.6.1 is SDK release validation.
\nThe release workflow was strengthened to validate a complete and faithful Vix SDK package.
\nThis matters because Vix is not only built from source.
\nUsers also need to install and consume packaged SDK releases.
\nA release package must contain the pieces a real C++ application needs:
\nv2.6.1 adds stricter SDK release checks for all of these areas.
\nThe release process now does more than produce an archive.
\nIt validates that the archive is actually usable.
\nv2.6.1 improves SDK release validation to ensure that:
\nvix::vixcan be used as the single consumer target for full SDK projects.
\nThat is important for user experience.
\nA consumer should be able to write:
\nfind_package(Vix CONFIG REQUIRED)\n\ntarget_link_libraries(app PRIVATE vix::vix)and get a working full SDK integration.
\nThis release improves validation so packaged releases test real linking through that path.
\nThat means SDK validation is closer to how real users consume Vix.
\nv2.6.1 fixes incomplete SDK release validation that allowed missing module libraries to pass CI.
\nThis is a critical release-quality improvement.
\nA package can appear valid if the build succeeds, but still be incomplete if some module libraries are missing from the installed SDK.
\nThe release validation now checks more faithfully that the SDK package includes the expected libraries and exported targets.
\nThis helps prevent broken packages from being published as valid releases.
\nv2.6.1 fixes SDK packaging checks so missing WebSocket symbols are caught.
\nThe release specifically improves validation around symbols such as:
\nLowLevelServer::run\nSession::shutdown_now\nLongPollingManager::push_toThese symbols matter because missing exported symbols can break real consumers even when the source repository builds correctly.
\nThe packaged SDK must not only compile internally.
\nIt must link externally.
\nv2.6.1 improves that external-consumer confidence.
\nThis release also updates internal module references for the v2.6.1 patch release.
\nThis keeps module versioning and internal references aligned after the v2.6.0 release.
\nPatch releases often include this kind of maintenance work to ensure the repository, modules, and SDK package all agree on the current release state.
\nv2.6.1 fixes issues discovered after the v2.6.0 release.
\nThis is normal after a large release.
\nv2.6.0 introduced significant new workflows and infrastructure. v2.6.1 follows by tightening the parts where packaging, diagnostics, and real consumer usage needed stronger validation.
\nThe result is a more trustworthy v2.6 line.
\nUpdated internal module references for the v2.6.1 patch release.
\nImproved runtime diagnostic formatting for clearer CLI output.
\nImproved CLI runtime diagnostics for bad variant access errors.
\nAdded clearer diagnostics for missing runtime resources.
\nImproved generic runtime failure handling by extracting useful error information from runtime logs.
\nRouted vix dev runtime failures through the same diagnostic pipeline used by vix run.
Reduced duplicated runtime log output when a clear diagnostic is already available.
\nImproved build diagnostic location selection to prefer user code over system headers.
\nFixed misleading build diagnostics that pointed to standard library headers instead of project files.
\nImproved test failure output to render CTest assertion failures as clean Vix diagnostics.
\nFixed vix tests output for failed C/C++ assertions by showing the failing source location, assertion message, and code frame.
Strengthened the SDK release workflow to validate a complete and faithful Vix SDK package.
\nAdded stricter SDK release checks for installed headers, static libraries, CMake package files, and exported Vix targets.
\nImproved SDK release validation to ensure vix::vix can be used as the single consumer target for full SDK projects.
Fixed incomplete SDK release validation that allowed missing module libraries to pass CI.
\nFixed SDK packaging checks to catch missing WebSocket symbols such as LowLevelServer::run, Session::shutdown_now, and LongPollingManager::push_to.
Fixed SDK consumer validation so packaged releases test real linking through find_package(Vix CONFIG REQUIRED) and target_link_libraries(app PRIVATE vix::vix).
Fixed issues discovered after the v2.6.0 release.
\nVix.cpp v2.6.1 does not introduce intentional breaking changes.
\nExisting v2.6.0 workflows continue to work:
\nvix build\nvix run\nvix dev\nvix testsThe main changes are improvements to diagnostics and release validation.
\nFor SDK consumers, the important path is:
\nfind_package(Vix CONFIG REQUIRED)\n\ntarget_link_libraries(app PRIVATE vix::vix)v2.6.1 improves release validation so this consumer path is tested more faithfully before an SDK package is accepted.
\nFor CLI users, runtime and test failures should now be easier to understand.
\nVix.cpp v2.6.1 is a small but important patch release.
\nIt improves the experience around failures.
\nIt also makes the SDK release workflow more serious.
\nThat matters because a native C++ application platform cannot only work inside its own repository. It must also work when packaged, installed, found through CMake, linked into a consumer application, and executed through the CLI.
\nv2.6.1 strengthens that path.
\nThe direction is clear:
\nbetter diagnostics\nstronger SDK validation\ncleaner test output\nmore reliable release packagesThis release makes the v2.6 series safer after the major v2.6.0 expansion.
\n'; +const v2_6_1 = { + html +}; +export { + v2_6_1 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.6.2-DoUiBLNA.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.6.2-DoUiBLNA.js new file mode 100644 index 000000000..81ef91779 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.6.2-DoUiBLNA.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.6.2 is a workflow reliability release.
\nThis release focuses on the parts of Vix.cpp that developers touch every day:
\nvix.appThe goal of v2.6.2 is not to add a large new runtime surface.
\nThe goal is to make the existing Vix.cpp workflow more correct, more predictable, and easier to trust.
\nThe main focus of Vix.cpp v2.6.2 is dependency and registry workflow correctness.
\nPrevious releases expanded the Vix platform with vix.app, AI workflows, game tooling, Vue integration, and stronger build and development commands. v2.6.2 focuses on the dependency layer that makes package-based C++ projects practical.
This release improves:
\nvix installvix updatevix outdatedvix listvix publishIt also improves vix run for generic CMake projects and strengthens diagnostics across build, test, and vix.app workflows.
Vix.cpp v2.6.2 adds two important helpers to the crypto module.
\nThe first addition is constant-time byte comparison helpers.
\nThese are useful for security-sensitive comparisons where normal byte comparison may leak timing information.
\nThe second addition is PBKDF2-HMAC-SHA256 password hashing and verification helpers.
\nThis gives the crypto module a stronger foundation for password-related workflows.
\nThe added capabilities are:
\nThis is a small API addition, but it matters because security-sensitive helpers should be easy to use correctly.
\nvix run receives an important fix for generic CMake projects.
Before this release, vix run could assume that the executable target name matched the folder name. That assumption does not hold for many real CMake projects.
v2.6.2 fixes this by detecting and running the executable produced by the build instead of assuming that the folder name is the target name.
\nThis makes vix run more useful for existing CMake projects that were not created by Vix.
The default vix run output is also kept cleaner during normal execution.
This matters because vix run should be readable during daily development, not noisy by default.
vix update receives several important dependency workflow fixes.
The command now updates only dependencies with newer resolved versions instead of reprocessing every dependency in the project.
\nIt also respects the version constraints declared in vix.json instead of always resolving direct dependencies to the latest registry version.
That distinction is important.
\nA dependency update command should not ignore the project’s declared version policy.
\nFor example, if a project declares a constrained dependency range, vix update should work inside that policy instead of jumping to the latest version unconditionally.
v2.6.2 also improves vix update so it can refresh lockfile metadata and package hashes even when dependency versions do not change.
This allows the lockfile to stay accurate without pretending that a version update happened.
\nUpdate summaries are now clearer because they separate:
\nversion changes\nlockfile metadata updatesAlready-current dependencies are no longer repeated in the main update summary.
\nThe result is a cleaner and more accurate dependency update experience.
\nvix outdated now shows only direct project dependencies from vix.json by default.
The full locked dependency graph is still available with:
\nvix outdated --allThis improves the default view because most developers first want to know whether the dependencies they directly declared are outdated.
\nThe same model was applied to vix list.
By default, vix list now shows only direct project dependencies from vix.json.
To show transitive locked dependencies, use:
\nvix list --allv2.6.2 also adds pagination and JSON output support to vix list.
This makes dependency inspection more useful for both humans and tools.
\nvix install output is now more accurate.
It reports only dependencies that were actually installed or relinked instead of counting every dependency from vix.lock as newly installed.
This makes the install summary more honest.
\nIf nothing meaningful changed, the command should not make it look like every dependency was installed again.
\nDependency installation messages are also shorter and cleaner.
\nThis improves the developer experience, especially in projects with several dependencies or transitive packages.
\nv2.6.2 improves project dependency installation by handling stale or broken .vix/deps links more reliably.
This matters because project-local dependency links can become stale after:
\nThe install workflow now handles these cases more defensively.
\nThe goal is simple:
\nif dependency links are stale,\nVix should repair them instead of leaving the project broken.This release fixes transitive registry dependency propagation.
\nPackages such as rix/rix can now expose dependencies such as:
rix/csv\nrix/debug\nrix/authwithout requiring every application to list those dependencies manually.
\nThis is important for the Vix registry model.
\nA facade package should be able to expose the packages it needs, and applications should not be forced to repeat internal dependency declarations by hand.
\nThis improves the userland package workflow and makes packages such as Rix easier to consume.
\nv2.6.2 includes improvements made after testing the registry install, update, and generated CMake integration flow in production with:
\npico.vixcpp.comThis matters because registry workflow issues are easiest to find in real package usage.
\nThe release improves the registry dependency workflow based on that production-style validation.
\nThe direction is clear:
\nregistry metadata\n -> resolved dependencies\n -> lockfile\n -> generated CMake integration\n -> working C++ projectThe registry workflow must be reliable across all of those steps.
\nvix publish receives several fixes and diagnostic improvements.
The command now gives better diagnostics when a tag exists locally but has not been pushed to origin.
This is important because publishing a package usually depends on Git tags being visible remotely.
\nv2.6.2 also fixes registry preparation so stale local publish branches and untracked registry entry files are cleaned before checking whether a version already exists.
\nThis reduces false publish failures caused by old local state.
\nPublishing should fail because of a real package problem, not because the local registry checkout is stale or dirty.
\nv2.6.2 fixes the Windows SDK release pipeline.
\nThe release now ensures that:
\nvix-sdk-windows-x86_64.zipis built, packaged, checksummed, signed, and uploaded to GitHub Releases.
\nThis also fixes the Windows installer failure where install.ps1 attempted to download:
vix-sdk-windows-x86_64.zipbut the asset was missing from the release.
\nThis is an important packaging fix.
\nA working installer depends on a complete release artifact pipeline.
\nIf the installer expects an asset, the release process must always publish that asset.
\nv2.6.2 improves CMake error parsing.
\nMulti-line:
\nmessage(FATAL_ERROR ...)diagnostics are now displayed clearly instead of being collapsed into unreadable one-line reasons.
\nThis matters because CMake errors often contain important context across multiple lines.
\nA build tool should preserve that structure when reporting the failure.
\nThe goal is not to hide CMake.
\nThe goal is to make CMake failures easier to understand.
\nvix build -v is now kept readable.
Raw CMake/Ninja output is reserved for:
\nvix build --cmake-verboseThis gives developers two useful levels of output:
\n-v\n readable Vix-level verbose output\n\n--cmake-verbose\n raw CMake/Ninja outputThat separation matters because normal verbose mode should help developers understand what Vix is doing without flooding the terminal.
\nWhen raw build-system logs are needed, they are still available explicitly.
\nvix tests receives improved failure diagnostics.
Test runner output is now summarized with:
\nThis improves the debugging loop.
\nWhen tests fail, the developer should quickly see:
\nwhich test failed\nwhere it failed\nwhat the focused error was\nwhich code frame mattersThis is especially important as Vix.cpp continues to expand module-level tests and CI coverage.
\nv2.6.2 improves diagnostics for vix.app projects.
If .vix/vix_deps.cmake is missing, Vix now reports a clearer error.
Resource validation also improves.
\nMissing resources now fail early with a clear error instead of failing later through a long post-build CMake command.
\nThis is important because vix.app exists to make simple application projects easier.
When something is wrong, the error should point directly to the missing resource or missing generated dependency file.
\nThis release fixes build toolchain behavior by using absolute system archiver paths.
\nThis improves reliability in environments where tool lookup, PATH configuration, or build generator behavior can otherwise produce inconsistent results.
\nSmall toolchain fixes like this help make builds more reproducible.
\nv2.6.2 exposes middleware app integration helpers through the public aggregate header.
\nIt also keeps the middleware aggregate header cache independent.
\nThis improves the public middleware integration surface and keeps include behavior cleaner.
\nAdded constant-time byte comparison helpers to the crypto module.
\nAdded PBKDF2-HMAC-SHA256 password hashing helpers.
\nAdded PBKDF2-HMAC-SHA256 password verification helpers.
\nFixed vix run for generic CMake projects by detecting the executable produced by the build.
Kept default vix run output cleaner during normal execution.
Fixed vix update so it updates only dependencies with newer resolved versions.
Fixed vix update so it respects version constraints declared in vix.json.
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 outdated default output to show only direct project dependencies.
Added vix outdated --all support for the full locked dependency graph.
Improved vix list default output to show only direct project dependencies.
Added vix list --all support 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.
Shortened and cleaned dependency installation messages.
\nFixed stale and broken .vix/deps link handling.
Fixed transitive registry dependency propagation for packages such as rix/rix.
Improved vix publish diagnostics when a tag exists locally but has not been pushed to origin.
Fixed vix publish registry preparation for stale publish branches and untracked registry entries.
Improved registry install, update, and generated CMake integration after production testing with pico.vixcpp.com.
Fixed the Windows SDK release pipeline.
\nFixed the Windows installer failure caused by a missing vix-sdk-windows-x86_64.zip release asset.
Improved CMake error parsing for multi-line message(FATAL_ERROR ...) diagnostics.
Improved vix build -v readability.
Reserved --cmake-verbose for raw CMake/Ninja output.
Improved vix tests failure diagnostics with clearer names, locations, messages, and code frames.
Improved vix.app diagnostics when .vix/vix_deps.cmake is missing.
Improved vix.app resource validation so missing resources fail early.
Fixed build toolchain behavior by using absolute system archiver paths.
\nExposed middleware app integration helpers through the public aggregate header.
\nKept middleware aggregate header cache independent.
\nVix.cpp v2.6.2 does not introduce intentional breaking changes.
\nExisting project workflows continue to work:
\nvix build\nvix run\nvix dev\nvix tests\nvix install\nvix updateThe main behavior changes are correctness and output improvements.
\nFor dependency workflows, default views are now more focused:
\nvix list\nvix outdatedshow direct dependencies by default.
\nUse:
\nvix list --all\nvix outdated --allwhen you need the full locked dependency graph.
\nFor build output, use:
\nvix build -vfor readable Vix verbose output.
\nUse:
\nvix build --cmake-verbosewhen raw CMake/Ninja output is needed.
\nFor generic CMake projects, vix run should now behave better because it detects the built executable instead of assuming the folder name is the executable name.
Vix.cpp v2.6.2 is a practical release.
\nIt improves the workflows that make Vix usable every day:
\ninstall\nupdate\nlist\noutdated\npublish\nrun\nbuild\ntest\npackage\ndiagnoseIt also strengthens the registry model, improves Windows release packaging, adds useful crypto helpers, and makes diagnostics easier to read.
\nThis release is another step toward a more dependable C++ application platform.
\nThe direction remains the same:
\nnative C++\nmodern workflow\nreliable dependency management\nclear diagnostics\nproduction-oriented toolingVix.cpp v2.6.2 makes that foundation cleaner and more predictable.
\n'; +const v2_6_2 = { + html +}; +export { + v2_6_2 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.6.3-CsmlOt-t.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.6.3-CsmlOt-t.js new file mode 100644 index 000000000..d3e3f345a --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.6.3-CsmlOt-t.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.6.3 is a stability and engineering-discipline release.
\nIt does not try to introduce a large new product surface like v2.6.0. Instead, it focuses on making the existing Vix.cpp runtime, CLI, Core module, tests, benchmarks, and CI workflows more reliable.
\nThis release strengthens several areas that matter for a serious C++ application platform:
\nvix runvix testsThe focus of v2.6.3 is simple:
\nstabilize the runtime\nmeasure performance\nstrengthen CI\nmake failures easier to trustVix.cpp v2.6.3 focuses on reliability.
\nPrevious v2.6 releases expanded the platform with AI workflows, vix.app, game tooling, Vue integration, and stronger developer workflows. v2.6.3 takes that foundation and hardens it.
The release improves how Vix behaves when projects are larger, tests are slower, shutdown paths are concurrent, benchmarks are enabled, sanitizer builds are active, and CI needs to distinguish real project problems from false positives.
\nThis is important because Vix.cpp is not only a library. It is becoming a full native application workflow for C++.
\nThat means the project must care about more than APIs.
\nIt must care about:
\nVix.cpp v2.6.3 is about that confidence.
\nThis release fixes several issues around vix publish and registry state handling.
Publishing now prepares and normalizes the local registry index internally before publishing. That means the publish workflow is less dependent on stale local state.
\nThe local registry state is refreshed more defensively by fetching origin, resetting to origin/main, and cleaning untracked registry entry files before checking existing package versions.
This matters because package publishing should not fail because of an old or dirty local registry checkout.
\nv2.6.3 also improves diagnostics when a package version already exists in the registry.
\nThe goal is to make registry failures clearer and less surprising.
\nThe JSON module receives an important JPath parsing fix.
\nPaths after bracket segments now parse correctly, including shapes such as:
\nusers[0].email\n["complex.key"].valueThis is a small-looking fix, but it matters because JPath is often used in real data access paths where arrays, object keys, and nested properties are mixed.
\nThe JSON module also receives stronger dedicated CMake targets for examples, tests, and benchmarks.
\nDocumentation was expanded for:
\nThe release also adds benchmark result snapshots for JSON construction, conversion, dumping, parsing, JPath, and Simple payloads.
\nThis improves the JSON module as both a user-facing API and a measurable runtime component.
\nvix run receives several important fixes around executable resolution.
CMake projects do not always produce binaries with the same name as the project directory. v2.6.3 fixes executable resolution for those projects.
\nIt also improves diagnostics when a build produces multiple runnable executables.
\nThis makes vix run more reliable in real projects where the build output is not trivial.
The project watch mode also now resolves runnable executables generically instead of assuming the binary name matches the project folder.
\nThat is an important workflow improvement because development sessions should follow the actual build output, not naming assumptions.
\nThis release also fixes a CLI run preset selection false positive by ensuring empty preset lists are handled before accessing the first preset.
\nv2.6.3 improves compiler diagnostics for template errors originating in system headers.
\nWhen possible, Vix can re-anchor those errors to the relevant project instantiation location.
\nThis matters because C++ template failures often appear deep inside standard library or third-party headers. The real mistake is usually in user code, but the compiler output may not make that obvious at first glance.
\nVix does not hide the compiler.
\nIt tries to make the useful part of the compiler output easier to reach.
\nvix tests receives improvements for long CTest runs.
The live progress output now shows:
\ncompleted\ntotal\nrunning\nelapsed timeThis makes long test sessions easier to follow.
\nThe release also fixes interruption handling so Ctrl+C is reported as a user interruption instead of being treated as a test failure.
That distinction matters.
\nA user interruption is not the same thing as a broken test suite.
\nVix Core receives several HTTP session fixes for edge cases.
\nThe release improves parsing and error-response behavior for:
\nIt also fixes HTTP keep-alive shutdown behavior for case-insensitive Connection: close handling.
This kind of work is not always visible in simple examples, but it is critical for real servers.
\nHTTP servers must behave correctly when clients send bad input, partial input, or protocol edge cases.
\nv2.6.3 makes that layer more robust.
\nOne of the most important parts of v2.6.3 is the work on Core lifecycle behavior.
\nThis release strengthens shutdown semantics across:
\nAppHTTPServerRuntimeExecutorApp::close() is now terminal, idempotent, and safe before or after listen().
App::wait() now ensures signal-stop paths close the running server instead of only exiting the wait loop.
App::listen() prevents closed app instances from being restarted accidentally.
The HTTP server shutdown ordering was improved so the accept loop can drain before the async I/O context is stopped.
\nThe TCP listener is destroyed before shutting down the async context.
\nReadiness signaling now marks the server as ready only after the accept loop has started.
\nMetrics-thread shutdown races were also fixed by serializing metrics-thread creation with shutdown joining.
\nThis is deep infrastructure work.
\nThe result is a Core module that behaves more predictably under fast lifecycle tests, shutdown races, signal stops, and sanitizer instrumentation.
\nThe async TCP layer also receives important shutdown fixes.
\nAsync TCP stream close behavior now cancels pending operations, shuts down the socket, and closes it safely.
\nAsync TCP listener close behavior now cancels and closes the acceptor on the Asio executor.
\nPending accepts keep the acceptor alive until completion handlers finish.
\nAsync shutdown behavior was improved so pending Asio operations can complete and resume awaiting coroutines cleanly.
\nThe async scheduler shutdown path was also fixed so pending coroutine handles are not silently destroyed before completion paths can run.
\nThis work matters because async shutdown bugs can be intermittent and difficult to reproduce.
\nThey may pass in normal runs and fail only under sanitizer builds, Valgrind, slow machines, or CI timing conditions.
\nv2.6.3 reduces those races.
\nThe runtime executor receives shutdown and idle-detection fixes.
\nPending posted tasks are now drained before workers are stopped.
\nIdle detection now tracks accepted in-flight tasks before they begin execution.
\nThis avoids cases where the runtime could appear idle while accepted work had not started yet.
\nThe runtime worker shutdown behavior was also fixed when yielding tasks are still being rescheduled.
\nTogether, these changes make the runtime executor more reliable under concurrent workloads, shutdown paths, and tests that depend on deterministic completion.
\nv2.6.3 adds the official Vix Core benchmark suite.
\nThe suite covers both low-level runtime paths and higher-level application behavior:
\nruntime.task\nruntime.queue\nruntime.scheduler\nruntime.worker\n\nexecutor.submit\nexecutor.post\nexecutor.metrics\n\nrouter.match\nrouter.registration\n\nhttp.request\nhttp.response\n\nsession.fake_transport\n\napp.route_registration\napp.group_registrationThe release also adds shared benchmark utilities for:
\nThis gives Vix Core a repeatable benchmark workflow instead of relying on manual impressions.
\nVix.cpp v2.6.3 adds the official Core v2.6.3 Release benchmark baseline.
\nThe baseline was generated on:
\nOS: Linux\nArch: x86_64\nCompiler: GCC 13.3.0\nBuild type: ReleaseThe baseline is stored under:
\nmodules/core/benchmarks/baselines/v2.6.3/The release also adds:
\nscripts/run_core_benchmarks.sh\nscripts/compare_core_benchmarks.pyThe run script generates versioned benchmark JSON reports.
\nThe comparison script compares current benchmark results against a baseline using configurable warning and failure thresholds.
\nBy default, benchmark comparison uses:
\nmedian_ops_per_secHigher is better.
\nThe default thresholds are:
\nWARN = -5%\nFAIL = -10%This turns performance into a tracked engineering signal.
\nPerformance should not be based on feelings.
\nIt should be measured, stored, compared, and protected.
\nv2.6.3 documents an important benchmark rule.
\nOfficial performance numbers must be generated from Release builds, not dev or debug builds.
\ndev/debug = compile, test, debug\nrelease = measure performanceThis rule is important because debug builds are useful for development but not for official performance measurement.
\nThe Core module README was updated with benchmark workflow documentation and a link to the official v2.6.3 benchmark baseline article.
\nBenchmark binaries are now grouped under:
\nbuild-release/benchmarks/corewhen Core benchmarks are enabled with:
\n-DVIX_CORE_BUILD_BENCHMARKS=ONv2.6.3 also fixes and stabilizes Core benchmark workloads so long-running benchmark targets do not block full benchmark runs.
\nValgrind CI was updated to avoid running benchmark binaries as normal memory-test executables.
\nThis distinction is important.
\nBenchmarks and memory tests serve different purposes.
\nBenchmark binaries are performance tools. They should not accidentally become blocking memory-test targets in strict CI.
\nThe Core test layout was strengthened with dedicated test groups for:
\nNetwork-based tests now use isolated ports, timeouts, and serial execution where required.
\nThis makes the Core test suite more explicit and less fragile.
\nv2.6.3 also adds broad HTTP session test coverage for:
\nHTTP server tests were expanded for:
\nRuntime tests were expanded for:
\nExecutor tests were expanded for:
\nConfig tests were expanded for:
\nApp tests were expanded for:
\nThis is one of the most important signs that v2.6.3 is a hardening release.
\nv2.6.3 adds strict Core CI coverage for:
\nCore sanitizer coverage was improved for:
\nValgrind timeouts were increased for slower runtime and lifecycle tests under instrumentation.
\nStrict CI is not only about running more tools.
\nIt is about running the right tools on the right targets.
\nThe release makes several important changes to SECURITY_CI.
The CI now builds and runs module-level tests instead of relying only on root-level test discovery.
\nIt enables tests for modules that keep their tests inside each module directory.
\nIt also runs broad module tests with ASan/UBSan enabled.
\nThis expands sanitizer-ready module test coverage across many modules, including:
\nasync\ncache\nconversion\ncrypto\nenv\nerror\nfs\ngame\nio\njson\nkv\nlog\nmiddleware\nos\npath\np2p\nprocess\nsync\ntemplate\ntests\nthreadpool\ntime\nvalidation\nwebrpc\nwebsocket\nagentThis is a major improvement for umbrella-level confidence.
\nIt means more modules are tested in the way they are actually organized.
\nv2.6.3 fixes static-analysis scope so CI focuses on project source files instead of unrelated files.
\nThird-party code, generated files, examples, benchmarks, and tests are no longer treated as blocking project source analysis.
\nThis matters because strict static analysis is only useful when it is correctly scoped.
\nThe release fixes cppcheck CI failures caused by analyzing vendored Asio tests and optional backend files outside the configured build profile.
\nBlocking cppcheck analysis now runs on module implementation sources only.
\nStyle-only cppcheck findings are still reported, but separately from blocking warnings, performance, and portability checks.
\nClang-tidy analysis now uses configured source files from the CMake compilation database.
\nOptional SDL backend files are not analyzed when SDL support is disabled.
\nThis keeps CI strict without turning irrelevant files into release blockers.
\nv2.6.3 fixes sanitizer linking for module tests across a broad set of modules.
\nThis includes modules such as:
\nasync\ncache\ncrypto\ngame\njson\nkv\nmiddleware\np2p\nsync\ntemplate\ntests\ntime\nwebrpc\nwebsocket\nagent\nthreadpool\npath\nfs\nio\nlog\nos\nprocess\nerror\nenvThe release also updates module test CMake files to consistently attach sanitizer compile and link options to test executables.
\nThis is important because sanitizer-enabled static libraries often require the final test executables to link with the required ASan/UBSan runtime flags.
\nWithout that, tests can fail at link time instead of testing the real code.
\nThe threadpool module receives several deterministic behavior fixes.
\nFuture handling for pre-cancelled and queued-cancelled tasks now resolves deterministically instead of hanging.
\nTask handle cancellation paths now report cancellation through the associated future.
\nThreadpool tests that assumed asynchronous work completed immediately after posting were fixed.
\nExecutorTest now waits for posted threadpool work to complete before checking shared state.
ShutdownTest behavior expectations were fixed for the allow_after_stop submission policy.
These changes matter because threadpool tests must not depend on timing luck.
\nConcurrency tests should prove behavior, not race the scheduler.
\nv2.6.3 also includes several focused module fixes.
\nThe game registry clear test was fixed to avoid reading a system object after Registry::clear() destroys owned systems.
The time module smoke test was fixed to avoid signed integer overflow detected by UBSan.
\nThe validation module test linking was fixed by avoiding a single GoogleTest binary for plain test files that each define their own main.
These fixes are small individually, but together they improve the reliability of broad module testing.
\nFixed vix publish registry preparation and stale registry state handling.
Improved diagnostics when a package version already exists.
\nFixed JSON JPath parsing after bracket segments.
\nAdded dedicated JSON module CMake targets for examples, tests, and benchmarks.
\nAdded JSON module benchmark snapshots.
\nFixed vix run executable resolution for CMake projects with non-folder-name binaries.
Improved vix run diagnostics when multiple runnable executables are produced.
Updated watch mode to use shared runnable executable discovery.
\nImproved compiler diagnostics for template errors rooted in system headers.
\nImproved vix tests live progress output.
Fixed vix tests interruption handling for Ctrl+C.
Fixed HTTP session handling for malformed requests, invalid content lengths, oversized payloads, and unexpected EOF bodies.
\nFixed case-insensitive Connection: close keep-alive shutdown behavior.
Strengthened Core lifecycle semantics across App, HTTPServer, RuntimeExecutor, and async TCP services.
Fixed App::close() so shutdown is terminal, idempotent, and safe before or after listen().
Fixed App::wait() signal-stop behavior.
Fixed App::listen() so closed app instances cannot be restarted accidentally.
Improved HTTP server shutdown ordering.
\nFixed async TCP stream and listener close behavior.
\nFixed async shutdown behavior for pending Asio operations and awaiting coroutines.
\nFixed runtime executor shutdown so pending posted tasks drain before worker shutdown.
\nFixed runtime executor idle detection.
\nAdded the official Vix Core benchmark suite.
\nAdded shared benchmark utilities and JSON report generation.
\nAdded scripts/run_core_benchmarks.sh.
Added scripts/compare_core_benchmarks.py.
Added the official Core v2.6.3 Release benchmark baseline.
\nUpdated Core README with benchmark workflow documentation.
\nAdded strict Core CI coverage for debug builds, sanitizer builds, Valgrind, static analysis, benchmark builds, and package export validation.
\nUpdated SECURITY_CI to build and run module-level tests.
\nAdded broad sanitizer-ready module test coverage.
\nFixed static-analysis scope so third-party, generated, example, benchmark, and test files are not blocking source analysis.
\nUpdated cppcheck and clang-tidy scope handling.
\nFixed sanitizer linking for many module test targets.
\nMade threadpool cancellation and shutdown tests deterministic.
\nVix.cpp v2.6.3 is a compatibility-focused release.
\nIt does not introduce intentional breaking changes.
\nExisting CMake projects continue to use their CMakeLists.txt.
Existing Vix workflows such as:
\nvix build\nvix run\nvix dev\nvix tests\nvix checkcontinue to work.
\nThe main behavior changes are improvements in correctness, diagnostics, test handling, shutdown behavior, benchmark organization, and CI scope.
\nFor projects with unusual executable output names, vix run should now behave better because runnable executable discovery no longer depends on the project folder name.
For projects using long-running CTest suites, vix tests should now provide better progress visibility and cleaner interruption handling.
For projects running strict CI with sanitizers or static analysis, v2.6.3 should reduce false positives and linking failures while increasing real module coverage.
\nVix.cpp v2.6.3 is not a flashy release.
\nIt is an engineering release.
\nIt makes the runtime safer, the tests more reliable, the benchmark workflow official, the CI stricter and better scoped, and the module test story stronger.
\nThis kind of release matters because a C++ application platform cannot rely only on new features.
\nIt must also prove that the foundation is stable.
\nVix.cpp v2.6.3 is a step in that direction.
\nIt improves confidence in the Core runtime, the CLI workflow, the module ecosystem, and the release process itself.
\nThe direction is clear:
\nnative C++\nmodern workflow\nmeasured performance\nstrict CI\nproduction-oriented reliabilityThat is the long-term path for Vix.cpp.
\n'; +const v2_6_3 = { + html +}; +export { + v2_6_3 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.0-C4VDlEl1.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.0-C4VDlEl1.js new file mode 100644 index 000000000..a36b37299 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.0-C4VDlEl1.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.7.0 introduces three new foundations for building and learning with Vix: Vix Note, Vix UI, and Vix Requests.
\nVix Note provides a visual workspace where C++ and Reply cells can be written, executed, saved, and exported. Vix UI introduces a server-rendered interface layer for applications that need views, forms, assets, live fragments, or WebView delivery. Vix Requests adds a built-in HTTP and HTTPS client for communicating with external APIs without introducing a separate networking library into each project.
\nThe release also changes how the Vix SDK is installed. The bootstrap installers now install the CLI only, while developers select the SDK profile that matches their project through vix upgrade --sdk.
These changes give the v2.7 release line a broader application workflow without making every Vix installation carry the complete SDK by default.
\nVix began as a native runtime and command-line workflow for building C++ applications. As the project grew, several related needs became more visible.
\nLearning and experimentation required a workspace more approachable than a complete application project. Web and desktop applications needed a clear interface layer rather than ad hoc HTML generation. Applications consuming external services needed a simple client API with proper HTTP, HTTPS, timeout, session, and TLS behavior.
\nThe SDK also needed a more deliberate installation model. A developer building a database application does not necessarily need game, peer-to-peer, desktop, and agent modules. Installing the complete SDK for every project made setup heavier and hid which system dependencies belonged to which domain.
\nVix.cpp v2.7.0 addresses these problems together.
\nThe release introduces the modules needed for visual learning, interfaces, and outbound requests, while SDK profiles make it possible to install only the relevant parts of the platform.
\nVix now distributes specialized SDK profiles through:
\nvix upgrade --sdkThe supported profiles are:
\ndefault\nweb\ndata\ndesktop\np2p\ngame\nagent\nallEach profile groups the modules and system dependencies required for a particular kind of project.
\nThe web profile is intended for HTTP services, WebSocket applications, requests, middleware, templates, and related web functionality.
The data profile covers database, ORM, cache, key-value, and data-oriented modules.
The desktop, p2p, game, and agent profiles provide the modules associated with those application domains.
The default profile provides the general SDK foundation, while all installs the complete SDK for development, validation, or projects that intentionally use modules from several areas.
Available release profiles can be listed with:
\nvix upgrade --sdk listA profile can be inspected before installation:
\nvix upgrade --sdk info webThe shorter information form is also supported:
\nvix upgrade --sdk-info webProfile information includes:
\nThis allows developers to understand what an SDK profile contains before downloading it or installing additional system packages.
\nA profile can be installed with:
\nvix upgrade --sdk webRunning vix upgrade --sdk without a profile selects default.
Several profiles can also be installed in one command:
\nvix upgrade --sdk web data desktopEach profile reports its status independently. A missing release asset for one profile is shown directly rather than causing the command to finish without useful output.
\nProfile names are validated before asset resolution, so an unknown profile produces a focused CLI error instead of a failed download request.
\nSDK profiles are installed under:
\n~/.vix/sdk/<profile>/<version>/Current-profile metadata is stored in:
\n~/.vix/sdk/<profile>/current.jsonA current pointer is also maintained under:
\n~/.vix/sdk/<profile>/currentThe installation metadata records the profile, Vix version, platform, installation directory, source asset, installation time, and downloaded size.
\nKeeping versions in separate directories makes the installation state easier to inspect and prepares the SDK workflow for safer upgrades and profile lifecycle management.
\nThe Unix and Windows bootstrap installers now install the Vix CLI only.
\nAfter installation, the developer selects an SDK from the CLI:
\nvix upgrade --sdk list\nvix upgrade --sdk info web\nvix upgrade --sdk webThis separates two responsibilities.
\nThe bootstrap installer is responsible for making the vix command available.
The CLI is responsible for understanding Vix release assets, SDK profiles, operating systems, architectures, system dependencies, and profile metadata.
\nThis avoids duplicating SDK selection logic across shell and PowerShell installation scripts.
\nThe older --cli-only installer option remains accepted for compatibility, although CLI-only installation is now the normal behavior.
vix upgrade now uses a quieter default output focused on the information required by the developer.
Internal commands, temporary paths, clone operations, raw download details, and low-level diagnostics are hidden during a normal successful upgrade.
\nDetailed output remains available with:
\nvix upgrade --verboseCheck and dry-run modes use concise summaries:
\nvix upgrade --check\nvix upgrade --dry-runWhen checking an SDK profile, Vix verifies that the expected release asset exists instead of reporting that a profile can be installed before confirming its availability.
\nMachine-readable output is kept separate:
\nvix upgrade --jsonIn JSON mode, human progress lines are not mixed into the structured result.
\nVix Note is a visual notebook for learning, demonstrating, and experimenting with C++ and Vix.cpp.
\nIt is available as the first-class SDK target:
\nvix::noteand through the CLI:
\nvix noteRunning the command without a document starts a workspace in the current directory.
\nAn existing notebook can be opened with:
\nvix note lesson.vixnoteThe browser interface provides editable cells, execution controls, outputs, compiler errors, cell ordering, document saving, and run-all behavior.
\n.vixnote formatVix Note documents use the .vixnote extension and remain compatible with Markdown-oriented content.
Cell boundaries and metadata are stored through comments such as:
\n<!-- vixnote:cell ... -->This keeps the document readable as text while preserving information required by the notebook, including stable cell identifiers, titles, types, and execution state.
\nThe document model includes:
\nvix::note::NoteDocument\nvix::note::NoteCell\nvix::note::NoteResult\nvix::note::NoteOutput\nvix::note::NoteErrorSerialization now preserves stable cell identifiers and titles through load, edit, save, and reload cycles.
\nThe first Vix Note release supports C++ and Reply execution.
\nC++ cells run through the existing Vix execution workflow rather than through an unrelated embedded compiler. This allows a note to use the same compiler and project context as ordinary Vix commands.
\nReply cells use the embedded Vix Reply runtime.
\nThe runtime session stores cell outputs and execution records so the UI can display the result associated with each cell.
\nNote execution can also understand the surrounding Vix project. It can use the project root, vix.app, legacy manifests, dependency directories, include paths, and the correct project working directory.
This makes it possible to write notebook examples that use the project’s real headers and dependencies rather than limiting Note to standalone standard-library snippets.
\nA pre-existing .vixnote file is no longer required.
Running:
\nvix notestarts a Note workspace rooted in the current directory.
\nThis is useful when beginning a lesson, exploring an existing project, or testing small pieces of code without first creating a document manually.
\nA document can then be created and saved from the browser interface.
\nThe workflow is similar to other notebook environments while remaining connected to the native Vix project and compiler.
\nVix Note starts a local server that hosts the interface and exposes the notebook operations required by the frontend.
\nThe initial API supports:
\nThe frontend uses these routes rather than maintaining an unrelated in-browser document model.
\nThe server also handles static assets for the Note interface.
\nVix Note can load its frontend assets from several sources.
\nIt supports project-local assets, installed assets, a custom asset directory, and an embedded fallback.
\nA custom directory can be supplied through:
\nVIX_NOTE_ASSET_DIR=/path/to/assets vix noteThe embedded fallback ensures that Note can still start when an external asset directory is unavailable.
\nAsset resolution covers both / and /index.html, and the server tests validate normal, installed, custom, and fallback asset behavior.
Vix Note can run inside a desktop WebView shell:
\nvix note --desktopAn existing notebook can be opened similarly:
\nvix note lesson.vixnote --desktopThe Note server runs locally in the process, while the desktop shell opens the interface after the readiness endpoint becomes available.
\nThe shell waits for the configured server URL instead of opening immediately and displaying an unavailable page.
\nThe browser workflow remains the default. Desktop mode provides another delivery path for environments where the notebook should feel like a standalone local application.
\nA .vixnote lesson can be exported as static HTML:
vix note export lesson.vixnote --out lesson.htmlThe export produces a document that can be opened without starting the Note server.
\nThis is useful for sharing lessons, publishing examples, archiving completed notebooks, or distributing educational content where interactive execution is not required.
\nVix UI introduces a server-rendered interface layer for Vix applications.
\nIt is available through:
\n#include <vix/ui.hpp>and through the CMake target:
\nvix::uiThe module builds on the existing Vix template engine and HTTP response layer rather than introducing a separate client-side application framework.
\nIts purpose is to provide the common primitives needed to generate application interfaces from C++ in a structured way.
\nThe core UI types include:
\nvix::ui::View\nvix::ui::ViewContext\nvix::ui::ViewResult\nvix::ui::HtmlResponseA view describes server-rendered content and receives the context required to produce its result.
\nHtmlResponse allows the HTTP layer to return UI output directly without requiring every route to construct low-level response bodies and headers manually.
Core now supports optional UI response integration, so applications can return Vix UI views through the normal routing workflow when the UI module is enabled.
\nVix UI includes helpers for common HTML generation tasks.
\nThese cover escaping text, creating attributes, and producing small fragments without repeatedly rebuilding the same safety logic inside each application.
\nThe helpers are intended for focused rendering tasks. Larger page structures can continue to use the template system and view abstractions.
\nEscaping remains explicit because server-rendered output must distinguish trusted markup from user-provided text.
\nThe UI asset layer includes:
\nAsset\nAssetManifest\nAssetManager\nAssetMap\nAssetModeIt supports development and production asset behavior, including:
\nThis allows a server-rendered application to use assets produced by a frontend build tool without hardcoding generated filenames into C++ source.
\nIn development, readable or direct paths can be used. In production, the asset manager can resolve the fingerprinted paths recorded by the build manifest.
\nVix UI provides server-rendered form helpers for:
\nThe goal is to keep ordinary server-rendered forms practical without creating a large form framework.
\nA validation failure can return the same view with the user’s earlier input and associated errors, instead of requiring each project to rebuild that behavior from scratch.
\nThe module includes helpers for interfaces that update part of a page rather than rendering the complete document again.
\nThis includes support for:
\nThese primitives are designed to work with the existing Vix HTTP and WebSocket stack.
\nThey do not require that the entire application become a client-side single-page application. A project can remain server-rendered while adding live behavior only where it is useful.
\nVix UI includes helpers for Progressive Web App metadata and mobile-oriented browser behavior.
\nThese cover:
\nThe initial mobile direction is based on web interfaces and WebView delivery rather than a separate native widget system.
\nThis keeps one interface model usable in browsers, desktop shells, and mobile shells while leaving space for native UI work where it is genuinely required.
\nThe UI module includes the lower-level components used by desktop shell workflows:
\nAppShell\nShellConfig\nServerProcess\nServerReadinessIt also includes a descriptor backend for non-visual validation and a Linux WebView backend for actual desktop windows.
\nThe descriptor backend allows shell behavior to be tested in CI without opening a graphical window.
\nPlatform descriptors describe web, desktop, and mobile targets so higher-level commands can prepare the correct delivery path from one application interface.
\nThe CLI now provides:
\nvix desktopDevelopment mode can be started with:
\nvix desktop runA desktop build can be prepared with:
\nvix desktop buildA distributable directory can be created with:
\nvix desktop package --target dirThe shell manages the relationship between the local server process and the WebView.
\nIt waits for server readiness before opening the application and cleans up server processes started by vix desktop run when the desktop shell closes.
Vix also introduces:
\nvix mobileThe first mobile implementation generates Android WebView projects.
\nThe workflow includes project generation, wrapper handling, build, run, and device-listing commands.
\nGenerated Android projects include the launcher resources required for a valid build, and commands can be run from inside the generated Android project directory.
\nWhen a Gradle wrapper is present, Vix prefers:
\n./gradlewover relying on a system Gradle installation.
\nLaunch behavior uses the generated application package and MainActivity.
Vix Requests provides a built-in HTTP and HTTPS client API.
\nIt is available through:
\n#include <vix/requests.hpp>or:
\n#include <vix/requests/requests.hpp>The public target is:
\nvix::requestsThe API is designed for direct request workflows while still providing reusable clients and sessions for applications that need persistent configuration.
\nThe module provides helpers for common HTTP methods:
\nvix::requests::get\nvix::requests::post\nvix::requests::put\nvix::requests::patch\nvix::requests::del\nvix::requests::head\nvix::requests::requestA simple request can use the direct helper API:
\n#include <vix/requests.hpp>\n\nint main()\n{\n auto response = vix::requests::get("https://example.com/api/status");\n\n if (!response)\n {\n return 1;\n }\n\n return response->ok() ? 0 : 1;\n}The direct functions are intended for small requests and focused scripts.
\nApplications that share configuration across several calls can use Client or Session.
Client provides a reusable request interface for applications that communicate with one or more services.
Session can preserve shared configuration such as default headers, cookies, authentication, and request behavior across calls.
This avoids repeating the same options for every endpoint while keeping request state explicit.
\nThe module also includes examples for API client wrappers, where application-specific methods are built on top of a configured Vix Requests client.
\nRequests can include:
\nResponse helpers provide access to status, headers, and parsed body data.
\nThe API is intended to keep ordinary service calls readable while retaining access to lower-level request options when needed.
\nAsynchronous variants are available for the supported methods:
\nasync_get\nasync_post\nasync_put\nasync_patch\nasync_del\nasync_head\nasync_requestThe transport uses vix::async, allowing requests to participate in the existing Vix asynchronous runtime instead of introducing another scheduler or event loop.
This is useful for servers and applications that need to make outbound calls without blocking the active worker.
\nVix Requests supports HTTP and HTTPS transports.
\nHTTPS uses OpenSSL with Asio-based transport execution.
\nThe implementation includes:
\nTLS verification is controlled through:
\nRequestOptions::verify_tlsVerification can be disabled for controlled local testing, but secure verification remains the default for normal requests.
\nThe module includes HTTPS smoke validation through a local OpenSSL test server so TLS behavior can be tested without depending entirely on an external public service.
\nThe new modules are integrated into the Vix umbrella build.
\nWhen enabled, the following targets are built, installed, and exported:
\nvix::note\nvix::ui\nvix::requestsThey can also participate in:
\nvix::vixthrough their corresponding feature options.
\nRequests adds the umbrella configuration options:
\nVIX_ENABLE_REQUESTS\nVIX_REQUESTS_BUILD_TESTS\nVIX_REQUESTS_BUILD_EXAMPLESRelease validation checks that the new public headers and static libraries are present after installation.
\nThis prevents a module from building successfully inside the repository while being absent or incomplete in the distributed SDK.
\nThe release expands CI coverage for Note, UI, and Requests across umbrella builds, module tests, package export, SDK validation, release checks, and security-oriented configurations.
\nCore is tested with UI support both enabled and disabled so the optional response integration does not become an unconditional dependency.
\nVix Requests is built, tested, installed, and consumed through its exported package configuration.
\nHTTP integration tests run against local test services, while HTTPS behavior is validated through a local OpenSSL server.
\nVix Note tests cover document parsing, stable metadata, local routes, cell execution, run-all behavior, asset loading, custom asset directories, save and reload behavior, and workspace startup.
\nDesktop shell tests use the descriptor backend in automated environments instead of opening a real Linux WebView window.
\nMobile validation covers generated Android resources, Gradle wrapper selection, project detection, building, and application launch metadata.
\nAs part of the v2.7.0 validation work, the Vix HTTP runtime was measured with a local benchmark on an HP EliteBook running Linux on x86_64 with eight CPU threads.
\nThe benchmark used wrk against a small local /bench route:
wrk -t8 -c800 -d30s --latency http://127.0.0.1:8080/benchThe server completed:
\n3,386,276 requests in 30.09s\n112,539.11 requests/secRecorded latency was:
\nAverage: 7.31ms\np50: 6.51ms\np75: 7.59ms\np90: 8.73ms\np99: 12.19msThis result is included as a local performance signal for the v2.7 runtime rather than as a universal throughput claim. HTTP performance depends on the application route, compiler, build configuration, operating system, hardware, connection settings, and benchmark methodology.
\nThe benchmark nevertheless confirms that the new Note, UI, Requests, SDK, desktop, and mobile work did not require turning the underlying HTTP runtime into a heavier execution path.
\nSeveral issues found during the Vix Note integration were corrected before the release.
\nCell identifiers are preserved after editing and saving a notebook.
\nThe command can start from the current directory without an existing note file.
\nAsset resolution now works across custom directories, environment overrides, installed files, and embedded fallback assets.
\nDesktop Note mode starts the server in process and waits until it is ready before opening the WebView.
\nC++ cell execution avoids unnecessary clean rebuilds during ordinary runs, keeping notebook iteration practical.
\nDesktop shell startup now waits for the configured readiness URL before opening.
\nThe shell handles the case where the readiness endpoint is already used by another process rather than blindly starting a duplicate service.
\nProcesses launched by vix desktop run are cleaned up when the shell closes.
Android generation now includes the launcher icon resources needed by the generated application.
\nMobile build, run, and wrapper commands recognize the generated project even when invoked from inside its Android directory.
\nThe new SDK workflow also corrects several command-line presentation and validation problems.
\nUnavailable profile assets are reported directly during dry runs and checks.
\nUnknown profile names fail before asset lookup.
\nMulti-profile commands produce visible status for each profile.
\nImportant labels and commands use readable terminal contrast.
\nModule lists and system dependency commands are formatted as normal readable terminal content rather than low-contrast decorative text.
\nExtra blank lines before the shell prompt have been removed.
\nThe early Vix Note prototype files were removed:
\nexamples/hello.vixnote\nexamples/learning_cpp.vixnote\nexamples/vix_ui_note.vixnoteThey were replaced by the more complete C++, Reply, and HTML learning examples introduced with the stable Note foundation.
\nRemoving the prototypes avoids keeping examples that describe an earlier document structure or execution model.
\nExisting Vix projects remain compatible with the release.
\nThe new modules are optional and are included only when enabled by the selected SDK and build configuration.
\nProjects that do not use UI retain the existing Core HTTP response behavior.
\nThe install scripts continue to make the CLI available, but developers must now select an SDK profile through vix upgrade --sdk when SDK headers and libraries are required.
The --cli-only installer option remains recognized for older automation.
Projects that need the complete SDK can continue to use:
\nvix upgrade --sdk allProjects with focused requirements can install a smaller profile instead.
\nVix Note v1.0.0 provides the notebook foundation but does not yet include the later package-based extension system. The first release supports the built-in cell and runtime model.
\nC++ cells execute native code and should be treated with the same care as running a local executable. Stronger timeout and output guards are introduced in v2.7.2.
\nVix UI is primarily a server-rendered interface system. It does not attempt to replace full client-side frameworks when an application genuinely requires a large browser runtime.
\nThe Linux WebView backend is the first native desktop shell implementation. Platform support depends on the available shell backend and system libraries.
\nThe initial mobile workflow targets Android WebView projects. It is not a complete cross-platform native mobile toolkit.
\nVix Requests provides the common HTTP and HTTPS client workflow, but specialized protocol clients may still require application-specific wrappers.
\nSDK profiles in this release can be installed side by side, but full automatic composition of modules from several profiles is completed in v2.7.4.
\nVix.cpp v2.7.0 expands the platform in three clear directions.
\nVix Note creates a visual environment for learning, documenting, and running C++ code while remaining connected to real Vix projects.
\nVix UI provides the server-rendered primitives needed to build interfaces, forms, asset pipelines, live fragments, PWAs, and WebView-delivered applications.
\nVix Requests gives applications a standard way to communicate with HTTP and HTTPS services using direct calls, reusable sessions, asynchronous APIs, and secure TLS defaults.
\nThe new SDK profile workflow makes these capabilities available without requiring every installation to carry the complete platform.
\nDevelopers install the CLI first, inspect the available profiles, and then install the SDK that matches the project they are building.
\nThis release establishes the main foundations extended throughout the rest of the v2.7 line: App Modules, module dependencies, Cloud integration, SDK composition, safer package workflows, and package-based Vix Note extensions.
\n'; +const v2_7_0 = { + html +}; +export { + v2_7_0 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.1-DxRDQGw1.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.1-DxRDQGw1.js new file mode 100644 index 000000000..8eec1683f --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.1-DxRDQGw1.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.7.1 introduces the first complete foundation for Vix App Modules.
\nApplications and backend projects can now declare internal modules in vix.app, enable or disable them from one place, generate module-specific source structures, wire enabled modules into the executable automatically, and validate architectural problems before they become build failures.
The release also updates vix dev so changes to vix.app trigger the configuration work required to regenerate module wiring. SDK lifecycle handling and vix uninstall receive a broader command workflow for inspecting and removing CLI installations, SDK profiles, and globally installed packages.
A small C++ application can remain understandable with one executable target and a compact src/ directory. As the project grows, that structure often becomes less clear.
Authentication, projects, package management, storage, billing, build history, administration, and other areas begin to share the same source tree. Routes are registered from several places, tests lose their connection to the feature they cover, and disabling one part of the application may require manual edits across CMake, startup code, and source files.
\nVix App Modules provide an internal organization layer for this kind of project.
\nA module belongs to one application. It can contain its own source files, routes, controller, tests, migrations, and metadata, while the application keeps one executable, one dependency graph, and one main runtime.
\nThis is different from creating an independent library for every feature. Internal modules are intended to organize one application without forcing each feature to become a separately versioned or installed package.
\nvix.appApplication modules are declared through [module.<name>] sections in vix.app.
A basic declaration looks like this:
\n[module.auth]\nenabled = true\npath = "modules/auth"\nkind = "backend"\ndepends = []The module name comes from the section name. The remaining fields describe how the application should load it.
\nenabled determines whether the module participates in the active build.
path points to the module directory relative to the project root.
kind describes the role of the module in the application workflow.
depends records dependencies between internal application modules.
For example:
\n[module.projects]\nenabled = true\npath = "modules/projects"\nkind = "backend"\ndepends = ["auth"]This states that projects is active and requires the auth module.
The declaration is part of the application manifest because module activation is an application-level decision. A module directory may exist on disk without participating in every build.
\nThe vix.app loader now parses module declarations into structured application metadata.
Each module is represented with its:
\nname\nenabled state\npath\nkind\ninternal dependenciesThis metadata is used consistently by module listing, validation, generated CMake, runtime wiring, dev-mode rebuild decisions, and CLI module commands.
\nThe application manifest also supports:
\ntype = "backend"A backend application is mapped internally to an executable target. This gives backend projects the same module-aware generated build path as other executable vix.app applications.
A module can be created with:
\nvix modules add authInside a vix.app project, the command now performs more than creating a folder.
It generates the module structure, writes a vix.module manifest, creates a test file, and registers the new module in the root vix.app.
The developer does not need to add the [module.auth] section manually after generation.
The exact generated structure depends on the application type. Backend projects receive a backend-oriented module, while general application projects receive a routed service module.
\nInside a backend project, vix modules add generates a module prepared for routes, controllers, migrations, tests, and future data or service layers.
A generated module contains files such as:
\nmodules/auth/\n├── CMakeLists.txt\n├── vix.module\n├── include/\n│ ├── AuthModule.hpp\n│ └── AuthController.hpp\n├── src/\n│ ├── AuthModule.cpp\n│ └── AuthController.cpp\n├── migrations/\n└── tests/\n └── test_auth.cppThe generated controller and module provide a small working route rather than an empty placeholder.
\nThis allows the module to compile, register itself, and demonstrate the expected application integration immediately after creation.
\nThe initial skeleton remains deliberately small. It creates the boundaries required by the workflow without deciding that every backend module must use a particular repository, service, model, or persistence architecture.
\nThose layers can be added when the module actually needs them.
\nGeneral executable app projects receive routed service modules.
\nA generated service module contains:
\n<Module>Module.hpp\n<Module>Module.cpp\n<Module>Controller.hpp\n<Module>Controller.cpp\nvix.module\ntests/test_<module>.cppThe generated example includes route registration and a minimal HTTP response so the developer can verify that the module is active.
\nService modules are recorded with:
\nkind = "service"This allows generated application wiring to distinguish them from unrelated source folders and include them in route registration.
\nThe module remains part of the main application runtime. It does not create a separate server process or executable.
\nEvery generated module receives a vix.module file.
The manifest describes the module itself rather than its application-level activation state.
\nA basic generated manifest can contain:
\nname = "auth"\nkind = "backend"\n\n[routes]\nprefix = "/api/auth"\n\n[tests]\nenabled = trueThe root vix.app decides whether the module is enabled and where it lives. The module manifest describes details that belong to the module, such as its kind, route prefix, and test configuration.
This separation allows module metadata to stay close to the module source while keeping the active application composition visible from one root file.
\nDeclared modules can be activated through the CLI:
\nvix modules enable authThey can be disabled with:
\nvix modules disable authThese commands update the corresponding enabled value in vix.app.
A disabled module can remain in the repository without being compiled or linked. Its files, tests, and manifest stay available for later use, but it does not participate in the current application.
\nThis is useful for optional features, experimental work, deployment variants, and modules that are temporarily unavailable while another part of the project is being changed.
\nDisabling a module is not implemented by deleting its CMake files or commenting out startup code. The application manifest remains the source of truth.
\nThe active module state can be inspected with:
\nvix modules listThe output includes the declared module name, enabled state, kind, configured path, filesystem status, and internal dependencies.
\nThis helps distinguish several conditions that would otherwise look similar during a build:
\nThe command reflects vix.app, not every arbitrary folder found under modules/.
Generated vix.app CMake projects now load only the modules enabled in the application manifest.
Vix emits the active set through:
\nVIX_ENABLED_MODULESThis list controls which module directories are added to the generated build.
\nAn empty list is emitted explicitly when no modules are enabled. This is important because the absence of the variable could otherwise cause the older CMake fallback to load every directory under modules/.
The behavior now differs intentionally between project types:
\nvix.app project:\n load only VIX_ENABLED_MODULES\n\nclassic CMake project:\n preserve legacy modules/* discoveryClassic projects continue to use the previous convention unless they adopt the vix.app module workflow.
Enabled modules are connected to executable applications through generated source files:
\n.vix/generated/app/include/vix_app_modules.hpp\n.vix/generated/app/vix_app_modules.cppThe generated implementation includes the enabled routed modules and provides the registration code used by the application startup path.
\nFor executable vix.app targets, vix_app_modules.cpp is added automatically to the generated CMake target.
The application template keeps a small integration point rather than requiring developers to modify src/main.cpp whenever a module is added or disabled.
This allows the root application bootstrap to remain stable while module registration follows the manifest.
\nGenerated app projects now include a small module registry layer:
\ninclude/app/ModuleRegistry.hpp\nsrc/app/ModuleRegistry.cppThe registry provides a clear point where generated module registration and application startup meet.
\nThe goal is not to hide module construction behind a large runtime framework. It is to prevent the main source file from becoming a manually maintained list of every route and feature in the application.
\nA typical application entry point can initialize its core runtime and delegate module registration to the registry.
\nWhen the module set changes, Vix regenerates the application module wiring without requiring the developer to rewrite the main bootstrap.
\nEnabled routed modules register their routes automatically.
\nFor a module with:
\n[routes]\nprefix = "/api/auth"the generated application wiring includes the module registration hook associated with that route group.
\nWhen the module is disabled, its generated registration disappears from the active build. The route is no longer available because the module itself is not compiled or wired into the executable.
\nThis behavior was validated for both service modules in app projects and backend modules in backend projects.
\nRoute availability therefore follows the same activation state as compilation and linking.
\nModules can declare dependencies on other modules:
\n[module.projects]\nenabled = true\npath = "modules/projects"\nkind = "backend"\ndepends = ["auth"]Internal dependencies describe application structure rather than registry packages.
\nThe declaration says that the projects module expects the auth module to participate in the same application.
Vix validates these relationships before the generated build is configured.
\nAn enabled module cannot depend on an undeclared module, and it cannot depend on a module that is currently disabled.
\nThis prevents application configurations where compilation succeeds partially but required runtime behavior is absent.
\nvix modules check now detects circular internal dependencies.
For example:
\nauth depends on projects\nprojects depends on authThis structure is rejected before CMake generation.
\nCircular module relationships usually indicate that the boundary between two features is unclear or that shared behavior should move into a lower-level module.
\nDetecting the cycle at the manifest level gives the developer a direct architectural error rather than allowing the relationship to emerge later through include paths, link order, or runtime initialization.
\nThe module checker now validates the complete relationship between vix.app, the filesystem, module manifests, and internal dependencies.
Run:
\nvix modules checkThe command reports conditions such as:
\ndeclared module missing on disk\nenabled module missing CMakeLists.txt\nenabled module missing vix.module\nmodule directory not declared in vix.app\ndependency on an undeclared module\ndependency on a disabled module\ncircular module dependency\nduplicate route prefixThese checks are intended to catch architectural drift early.
\nWithout them, a module may appear in the source tree but never compile, two modules may register the same route prefix, or a disabled dependency may leave another feature in an invalid state.
\nVix now checks route prefixes declared in enabled module manifests.
\nTwo modules declaring the same prefix can create ambiguous or order-dependent route behavior.
\nFor example:
\n# modules/auth/vix.module\n[routes]\nprefix = "/api/users"and:
\n# modules/accounts/vix.module\n[routes]\nprefix = "/api/users"will produce a module validation error.
\nThe check happens before runtime registration, where the resulting behavior would be harder to understand.
\nNew modules include a test file by default.
\nGenerated CMake creates module test targets when the application test option is enabled:
\n<app>_BUILD_TESTSThe generated application CMake now declares its test options before module directories are loaded.
\nThis ordering is important because modules decide whether to create their test targets while their CMake files are being evaluated.
\nPreviously, the application test option could be introduced after the modules had already been processed, causing valid module tests to be skipped.
\nModule tests can now be discovered and run through:
\nvix testsThe generated test provides a starting point and confirms that the module target participates correctly in the application build.
\nvix dev now treats vix.app as an active project configuration file.
A source or header change can continue through the fast rebuild path. The existing generated CMake structure remains valid, so Vix rebuilds and restarts the application without repeating unnecessary project generation.
\nA change to vix.app is different.
Enabling a module, disabling a module, changing a module path, or editing the application target can alter generated CMake and module wiring.
\nVix now recognizes this distinction:
\nsource or header change:\n fast rebuild\n\nvix.app change:\n regenerate, reconfigure, rebuild, restartThis makes dev mode follow the real project state rather than continuing to run an executable generated from an older manifest.
\nWhen vix.app changes, vix dev can regenerate:
generated application CMake\nVIX_ENABLED_MODULES\nvix_app_modules.hpp\nvix_app_modules.cpp\nmodule registration\ntarget source listsThe project is then reconfigured before rebuilding.
\nThis fixes cases where editing the module list appeared to have no effect during watch mode because the previous fast rebuild path did not revisit application generation.
\nThe developer can now enable or disable a module while vix dev is active and receive an application built from the updated manifest.
This release also improves how installed SDK profiles are registered and removed.
\nSDK upgrades now register installed profiles with the CMake user package registry.
\nThis helps CMake-based consumer projects locate the installed SDK through the expected package discovery mechanisms.
\nThe uninstall workflow removes the related SDK state rather than deleting only the main installation directory.
\nCleanup can include:
\ninstalled SDK directory\ncurrent profile metadata\ncurrent profile pointer\nCMake user package registry entryThis prevents a removed SDK from continuing to appear active through stale metadata or CMake registration.
\nvix uninstall now provides a command experience aligned with the newer vix upgrade workflow.
Normal output uses clearer sections, status lines, hints, and completion messages.
\nA removal can be inspected before files are deleted with:
\nvix uninstall --dry-runMachine-readable output is available through:
\nvix uninstall --jsonDetailed diagnostic output can be requested with:
\nvix uninstall --verboseThe command now covers CLI removal, SDK profiles, and globally installed packages through one consistent interface.
\nInstalled SDK profiles can be managed with:
\nvix uninstall --sdk <profile>\nvix uninstall --sdk-all\nvix uninstall --sdk-list--sdk-list shows the installed profiles available for removal.
--sdk <profile> removes one selected profile and its associated metadata.
--sdk-all removes all installed SDK profiles.
These commands do not uninstall the Vix CLI unless the user explicitly selects the broader CLI removal workflow.
\nThis separation is useful when changing SDK profiles while keeping the command-line tool itself installed.
\nGlobally installed packages can be removed with:
\nvix uninstall -g <package>or:
\nvix uninstall --global <package>The package entry is removed from the global installation manifest together with the files owned by that package.
\nThis fixes cases where the files were removed but the global package registry continued to report the package as installed.
\nThe command also uses the newer uninstall output rather than a separate older presentation path.
\nRemoving the Vix CLI safely requires identifying the actual binary being used.
\nThe command can now resolve the installation path from several sources:
\ninstallation metadata\nVIX_CLI_PATH\nshell command lookup\nexplicit installation prefix\nexplicit binary pathExplicit options include:
\n--prefix <dir>\n--path <file>\n--systemThis avoids assuming that every installation lives under one fixed system directory.
\nA user-built CLI, a system installation, and a custom-prefix installation may all resolve differently.
\nThe uninstall command provides options for broader cleanup:
\n--purge\n--all\n--systemPotentially destructive operations are made explicit and can be reviewed with --dry-run.
The command reports when another vix binary remains available through the shell path after removal.
This can happen when several installations exist, such as one under /usr/local/bin and another in a user directory.
Instead of reporting a misleading success and leaving the user confused when vix still runs, the CLI explains that another binary is being resolved.
This release fixes a conflict between the new manifest-driven module system and the older modules/* CMake fallback.
In early implementations, disabling a module in vix.app did not always prevent the legacy loader from discovering its folder and compiling it anyway.
Vix now emits the enabled module list for every vix.app project, including when that list is empty.
The legacy folder scan remains available only for classic CMake projects that do not use the application manifest module model.
\nAs a result:
\n[module.auth]\nenabled = falsenow reliably prevents auth from being added to the generated application target.
vix modules add now registers new modules in vix.app automatically.
Generated service modules use the correct:
\nkind = "service"metadata and participate in the generated app wiring.
\nBackend modules compile with their generated route registration and become available through the normal application startup path.
\nDisabling either kind removes its route because the module no longer enters the generated build or registration code.
\nGenerated module tests are now created once and included in the correct build phase.
\nThe release removes duplicate file output previously produced during some module generation paths.
\nApplication test options are declared before module loading so each enabled module can create its test target when requested.
\nThis makes the workflow consistent:
\nvix modules add auth\nvix build\nvix testsNo manual CMake edits are required to make the generated test visible.
\nA backend can now grow around feature-oriented directories:
\nmodules/\n├── auth/\n├── projects/\n├── builds/\n└── packages/Each module can keep its own manifest, routes, controller, implementation, migrations, and tests.
\nThe application bootstrap remains responsible for shared runtime configuration, server startup, global middleware, and infrastructure used across modules.
\nFeature-specific behavior remains inside the module that owns it.
\nThe model is intentionally internal to the application. It provides structure without requiring a distributed system, plugin runtime, or separate package for every feature.
\nCreate a backend project:
\nvix new cloud --template backend\ncd cloudAdd two modules:
\nvix modules add auth\nvix modules add projectsDeclare the dependency of projects on auth:
[module.auth]\nenabled = true\npath = "modules/auth"\nkind = "backend"\ndepends = []\n\n[module.projects]\nenabled = true\npath = "modules/projects"\nkind = "backend"\ndepends = ["auth"]Check the structure:
\nvix modules checkBuild and run:
\nvix build\nvix runDisable one module:
\nvix modules disable projectsDuring vix dev, the manifest change triggers application regeneration and removes the disabled module from the active executable.
The App Modules workflow was validated across manifest parsing, generation, CMake integration, runtime registration, module state changes, tests, and development mode.
\nCoverage includes:
\n[module.<name>] sections;vix.app;vix.module generation;ModuleRegistry generation;vix_app_modules.hpp and vix_app_modules.cpp;CMakeLists.txt;vix.module;vix tests;vix dev.The uninstall workflow was validated for SDK profile listing, single-profile removal, complete SDK cleanup, global package removal, dry-run behavior, JSON output, explicit installation paths, and stale shell-path detection.
\nClassic CMake projects can continue to load modules through the existing modules/* convention.
The stricter enabled-module behavior applies to projects using vix.app, where the manifest is now the authoritative source of application composition.
Existing vix.app projects without module declarations remain valid. Their generated executable workflow continues without requiring a modules/ directory.
Generated modules remain ordinary C++ and CMake source directories. Developers can inspect and modify their files without relying on a hidden binary format or runtime service.
\nSDK uninstall commands do not remove the Vix CLI unless the broader CLI uninstall option is selected.
\nExisting global package installations remain compatible with the improved uninstall manifest cleanup.
\nVix App Modules in this release are internal application modules. They are not independently published registry packages.
\nThe first generated structures focus on routed service and backend modules. More specialized module workflows can be added later without changing the manifest foundation.
\nInternal dependencies are validated for declaration, activation state, and cycles, but this release does not yet provide module-level registry package declarations. External package ownership inside modules is introduced in v2.7.2.
\nGenerated route registration assumes the standard Vix application and backend startup model. Projects with heavily customized bootstraps may need to connect the generated module registry at their own integration point.
\nDisabling a module removes it from compilation and generated registration, but it does not delete its source files or migration history.
\nVix.cpp v2.7.1 gives C++ applications a manifest-driven internal module structure.
\nModules can be declared, generated, enabled, disabled, listed, validated, tested, and wired into the application without maintaining separate registration code in main.cpp.
Backend projects receive feature-oriented module skeletons with controllers, routes, migrations, and tests. General applications receive routed service modules connected through a small generated module registry.
\nvix dev now understands that application manifest changes can alter the generated build and performs the required regeneration instead of treating them like ordinary source edits.
The release also improves SDK registration and expands vix uninstall into a clearer workflow for CLI installations, SDK profiles, and global packages.
This establishes the application module foundation extended by later v2.7 releases with module-level package dependencies and generated WebSocket workflows.
\n'; +const v2_7_1 = { + html +}; +export { + v2_7_1 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.2-D2bAsvFv.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.2-D2bAsvFv.js new file mode 100644 index 000000000..6cb1aa027 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.2-D2bAsvFv.js @@ -0,0 +1,258 @@ +const html = `Vix.cpp v2.7.2 completes the dependency workflow introduced with Vix App Modules.
+A module can now declare the registry packages it needs in its own vix.module file, while the application continues to resolve one effective dependency graph and maintain one root vix.lock.
The release also makes C++ cell execution in Vix Note safer. Programs that do not terminate or produce excessive output are now stopped before they can block the notebook interface.
+Together, these changes strengthen two parts of Vix that execute user-defined work: application modules can depend on external packages without becoming separate projects, and Note cells can fail without taking the surrounding development environment with them.
+Vix App Modules were introduced in v2.7.1 to give larger applications a clearer internal structure.
+A project can divide routes, services, controllers, storage code, and runtime behavior into modules while keeping one application entry point and one build. Each module has its own vix.module file, and vix.app decides which modules participate in the current application.
The first module release covered module discovery, enablement, build generation, and runtime participation. It did not yet provide a complete answer for packages used by only one module.
+A package could be added to the root application, but that lost useful ownership information. An authentication module might be the only part of the project using rix/rix, yet the dependency appeared to belong to the entire application and was linked at the application level.
Vix.cpp v2.7.2 allows the module to declare that dependency directly.
+The application still owns package resolution. Modules do not create independent lockfiles, dependency directories, or package environments. Instead, dependencies from enabled modules are merged into the application’s effective dependency set and resolved through the root project.
+A module can now declare registry packages in its vix.module manifest:
[deps]
+registry = [
+ "rix/rix@^0.9.1",
+]
+
+links = [
+ "rix::rix",
+]The registry list describes the packages required by the module.
The links list describes the CMake targets from those packages that must be linked to the generated module target.
Keeping these two pieces of information in the module manifest makes the dependency relationship explicit. A developer reading modules/auth/vix.module can see both the external package required by the module and the target used by its C++ implementation.
The module does not receive its own vix.lock. Its package requirement is resolved as part of the root application dependency graph.
The vix add command now accepts a module target:
vix add rix/rix --module authThe short form is also supported:
+vix add rix/rix -m authAssignment-style syntax can be used in scripts:
+vix add rix/rix --module=authThe command updates:
+modules/auth/vix.modulerather than adding the package to the root application manifest.
+After updating the module, Vix refreshes the root lockfile so the new dependency is immediately part of the reproducible project state.
+The complete workflow is:
+vix modules add auth
+vix add rix/rix --module auth
+vix install
+vix buildThere is no separate module installation command and no second dependency resolver inside the module.
+A package can expose one or more CMake targets. When Vix cannot determine the intended target from the package name alone, it can be supplied explicitly:
+vix add rix/rix \\
+ --module auth \\
+ --link rix::rixFor common package names, Vix can infer a default target:
+rix/rix -> rix::rixThe inferred or explicit target is written to the module’s links list.
This separation matters because a registry package name and a CMake target are related but not identical concepts. The package identifies what Vix resolves and installs. The target identifies what CMake links into the module.
+Dependencies declared by enabled modules are merged with the root project dependencies before resolution.
+Suppose an application has:
+root dependency:
+ fmtlib/fmt
+
+auth module:
+ rix/rix
+
+storage module:
+ another/database-packageVix builds one effective dependency set from the application and its enabled modules. That set is resolved together and written to the root:
+vix.lockThis preserves a single version decision for each package across the project.
+Two modules cannot silently resolve incompatible copies of the same registry dependency in isolated lockfiles. Version conflicts are handled at the application boundary, where the complete dependency graph is visible.
+This also keeps source control straightforward. The repository contains one lockfile representing the exact package state required by the active application configuration.
+Only dependencies from enabled modules participate in the active dependency graph.
+If a module exists in the project but is disabled in vix.app, its registry requirements do not force packages into the current installation or build.
This follows the same rule used for module compilation and runtime generation. A disabled module remains part of the source tree, but it is not part of the active application.
+The behavior is useful for optional features and project variants. A project can keep an integration module in the repository without requiring every developer or deployment profile to install its external dependencies.
+When the module is enabled again, its requirements return to the effective dependency set and are resolved through the root lockfile.
+vix add --module now refreshes the root vix.lock after modifying the module manifest.
Earlier implementations could write the package into vix.module without creating or updating the root lockfile. The module declaration was therefore valid, but the project had no resolved package state for vix install to consume.
Vix.cpp v2.7.2 closes that gap.
+The command sequence now has a consistent meaning:
+vix add --module declares the dependency and refreshes resolution
+vix install materializes the resolved dependency graph
+vix build loads package targets and compiles the modulesThe root lockfile remains the authoritative record of selected versions, commits, integrity information, and transitive dependencies.
+The generated application CMake now records link targets for each module.
+For an auth module using rix::rix, Vix can generate:
set(VIX_MODULE_auth_LINKS
+ rix::rix
+)The package target is linked to the generated target for auth, not automatically to the main application executable.
This preserves dependency ownership in the build graph.
+A package used only by one module does not become a direct link dependency of every other module or of unrelated application code. Its include directories, compile definitions, and transitive link interface flow through the module that actually consumes it.
+This is especially useful as applications grow. Module boundaries are more meaningful when dependencies follow those boundaries instead of accumulating on one global target.
+Registry package targets must exist before module targets attempt to link them.
+Vix now includes:
+.vix/vix_deps.cmakebefore enabled modules are added to the generated application build.
+The order is therefore:
+1. load resolved registry package targets
+2. generate enabled module targets
+3. link package targets to their modules
+4. generate the application runtime and executablePreviously, packages could be installed correctly but still fail during vix build because the module’s target_link_libraries() call was evaluated before targets such as rix::rix had been defined.
The resulting CMake error often appeared as:
+missing: rix::rixThe package itself was present. The problem was that it entered the generated build too late.
+The updated generation order makes module dependency declarations usable through the normal build flow.
+The generated application CMake includes .vix/vix_deps.cmake when at least one active dependency requires it.
This condition now considers dependencies declared by enabled modules as well as dependencies declared at the root application level.
+A project containing only module-level registry packages therefore receives the same dependency initialization as a project with root dependencies.
+This removes the previous assumption that the root manifest had to contain a package before generated dependency CMake would be loaded.
+Vix now validates the relationship between registry packages and module link targets.
+A module that declares a registry package but provides no corresponding link information may be incomplete. The package would be installed, but the module might never consume its exported target.
+The opposite case is also checked. A module should not declare an external link target without a package requirement capable of providing it.
+These checks do not assume that package names and target names must have identical spelling. They verify that the manifest contains a coherent dependency description and report incomplete metadata before CMake produces a less useful unresolved-target error.
+Validation also covers malformed dependency entries and unsafe combinations inside the [deps] section.
The existing root dependency workflow remains unchanged:
+vix add rix/rixWithout --module, the dependency is added to the root project as before.
The two forms now express different ownership:
+vix add rix/rixmeans that the package belongs to the application dependency set directly.
+vix add rix/rix --module authmeans that the auth module owns the declaration and link relationship.
Both dependency sources are resolved into the same root lockfile.
+The module dependency design keeps each project file responsible for one part of the workflow.
+vix.app determines which modules belong to the active application:
[module.auth]
+enabled = true
+path = "modules/auth"
+kind = "service"vix.module describes the module itself and what it needs:
name = "auth"
+kind = "service"
+
+[routes]
+prefix = "/api/auth"
+
+[deps]
+registry = [
+ "rix/rix@^0.9.1",
+]
+
+links = [
+ "rix::rix",
+]
+
+[tests]
+enabled = trueThe root vix.lock records the exact package resolution for the application and all enabled modules.
vix install materializes that locked graph.
vix build loads the resulting package targets before generating and compiling the active modules.
This model gives modules local ownership without turning them into independent package-management islands.
+Vix Note executes C++ cells as native programs.
+That is useful because a notebook can compile and run real C++ rather than evaluating a restricted approximation of the language. It also means the code can behave like any native program, including entering an infinite loop or writing output without stopping.
+Before this release, a cell containing non-terminating code could leave the execution request waiting indefinitely. A program producing a very large stream of output could also consume memory and make the browser interface unresponsive.
+Vix.cpp v2.7.2 adds timeout and output-size guards around C++ cell execution.
+These safeguards do not attempt to prove whether a program is correct. They put practical limits around one notebook execution so a bad cell does not prevent the user from continuing to work.
+C++ cell execution now has a time limit.
+When a program does not terminate before the configured deadline, Vix Note stops the child process and returns a controlled execution result.
+This covers accidental infinite loops, blocked programs, and code waiting indefinitely for input or another condition that the notebook environment cannot satisfy.
+The timeout applies to the execution process rather than compilation. Compiler diagnostics still return normally when the source does not build.
+A timed-out program is reported as an execution failure, allowing the notebook to recover and accept another cell run.
+Vix Note now limits how much output can be captured from a C++ cell.
+Consider this program:
+#include <iostream>
+#include <vector>
+
+int main()
+{
+ std::vector<int> v;
+
+ for (int i = 0; i < v.size() - 1; i++)
+ {
+ std::cout << i << '\\n';
+ }
+
+ return 0;
+}v.size() returns an unsigned value. When the vector is empty, subtracting one underflows and produces a very large value.
The loop can therefore print far more output than the author expected.
+Vix Note now stops the execution when captured output reaches the allowed limit. The oversized result is not sent in full to the browser.
+This protects the server process, the HTTP response, and the notebook frontend from one unexpectedly noisy cell.
+Timeout and output-limit failures are treated as failures of the current cell execution, not failures of the complete Note session.
+The user can inspect the result, correct the source, and run the cell again.
+This distinction is important in an interactive notebook. User code is expected to be incomplete or incorrect during development. The surrounding tool should contain those failures and remain usable.
+The guards do not make arbitrary native code completely isolated. They address the two immediate cases that previously caused visible blocking: non-terminating execution and unbounded captured output.
+Vix.cpp v2.7.2 also removes remaining compiler warnings from the affected code paths.
+Vix Note runtime and web route code had sign-conversion warnings where signed and unsigned values crossed API boundaries.
+The Note web server also contained socket-length conversions that could produce warnings on supported compilers and platforms.
+These conversions are now handled explicitly.
+Additional warnings across the Vix build were corrected so normal project compilation and CI logs remain focused on actionable problems.
+A warning-free build is not only cosmetic. It makes new warnings visible when they are introduced and reduces the chance that unsafe conversions become accepted as ordinary build noise.
+This release fixes several failures that came from the incomplete connection between module manifests and the root dependency system.
+vix add --module now updates the root lockfile instead of leaving the project without a resolved dependency state.
vix install now works when every registry dependency originates from modules and the root application contains no direct package declaration.
Generated builds load installed package targets before module CMake is evaluated.
+Module link targets from vix.module are applied to the generated module that owns them.
Disabled modules no longer introduce inactive package requirements.
+Together, these changes complete the path from declaration to compilation:
+vix.module
+ ↓
+root dependency resolution
+ ↓
+vix.lock
+ ↓
+vix install
+ ↓
+.vix/vix_deps.cmake
+ ↓
+module target links
+ ↓
+vix buildRegression coverage was added for module dependency declaration, root lockfile generation, installation, CMake generation, and target linking.
+The tests cover:
+--module;-m syntax;--module=<name>;--link;vix.module;.vix/vix_deps.cmake before module targets;rix::rix;vix add compatibility.Vix Note validation covers:
+The full project was also rebuilt after warning cleanup to verify that the updated code paths compile without the previous conversion warnings.
+Existing projects with root registry dependencies continue to use the same vix add, vix install, and vix build workflow.
Existing modules without a [deps] section remain valid.
Module dependencies are additive. A project can keep shared dependencies at the root while moving feature-specific packages into the modules that use them.
+The application continues to maintain one root vix.lock. This release does not introduce nested module lockfiles or separate dependency installations under each module directory.
Projects that disable a module may see its exclusive packages removed from the effective dependency graph the next time the root lockfile is refreshed. Re-enabling the module restores those requirements.
+Vix Note continues to compile and run ordinary C++ cells normally. Timeout and output limits affect only executions that exceed the configured safety boundaries.
+Module-level dependencies currently use the application’s registry dependency system. They do not make a module independently publishable or installable as a separate package.
+The links list remains explicit metadata. Vix can infer common target names, but packages exposing several possible public targets may still require --link.
Dependencies are resolved globally, so incompatible version requirements from two enabled modules must be reconciled at the application level. Modules do not receive isolated package versions.
+Vix Note execution guards limit runtime duration and captured output, but they are not a complete operating-system sandbox. Native code can still access resources permitted to the Vix Note process.
+More advanced isolation, resource accounting, and interactive process control require additional runtime work beyond this release.
+Vix.cpp v2.7.2 gives App Modules ownership of their external package requirements without fragmenting the project dependency model.
+A module can declare registry packages and CMake links in vix.module. Enabled module requirements are merged into the application graph, resolved through one root vix.lock, installed once, and linked only to the module that needs them.
The release also makes Vix Note more resilient when native C++ cells do not behave as expected. Execution timeouts and output limits keep an infinite loop or excessive output from blocking the notebook.
+With the remaining compiler warnings removed, v2.7.2 provides a cleaner and more reliable foundation for the module and notebook workflows introduced in the v2.7 release line.
+`; +const v2_7_2 = { + html +}; +export { + v2_7_2 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.3-DG_QSQnn.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.3-DG_QSQnn.js new file mode 100644 index 000000000..9b8a3ca4f --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.3-DG_QSQnn.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.7.3 expands the CLI workflow around application modules, backend projects, package management, and Softadastra Cloud.
\nThe release adds generated WebSocket modules that integrate with vix.app, introduces an API-only backend template for projects with separately hosted frontends, and provides the first complete CLI path for connecting a local Vix project to Softadastra Cloud.
It also improves the package workflow beyond the registry. Git repositories can now be installed directly as project dependencies, command-line packages can be installed globally into a user-managed Vix prefix, and single C++ files can use temporary dependencies without turning the current directory into a permanent project.
\nPublic registry publishing receives stricter source and identity validation so published metadata is derived from the exact tagged revision rather than the developer’s current working tree.
\nThe main direction of v2.7.3 is to make Vix workflows connect more naturally.
\nApplication modules should not only generate files; they should participate correctly in project startup and builds. Packages should not only resolve from the public registry; developers should also be able to experiment with Git repositories and install useful command-line tools globally. Cloud integration should provide shared project state without moving compilation away from the developer’s machine.
\nThese areas meet in the CLI.
\nVix already knew how to create projects, resolve packages, build applications, run tests, and generate application modules. This release extends that model so the same commands can also prepare WebSocket runtimes, initialize existing directories, publish private packages, upload lockfiles, report local builds, and inspect tagged source before a public release.
\nThe result is not one isolated feature. It is a broader project workflow in which local development, reusable packages, generated modules, and optional cloud coordination follow the same project metadata.
\nVix.cpp v2.7.3 introduces the first Softadastra Cloud commands in the Vix CLI.
\nThe initial command set is:
\nvix login\nvix cloud status\nvix cloud init\nvix cloud sync\nvix logoutvix login authenticates the developer with Softadastra Cloud and stores the resulting session in the global Vix configuration.
vix cloud init links the current local project to a Cloud workspace and project record. The link is stored under:
.vix/cloud.jsonThis project-local file identifies the Cloud workspace and project associated with the current source tree.
\nAuthentication and project identity are intentionally stored in different places. The user session belongs to the developer’s Vix environment and can be reused across projects, while the Cloud link belongs to one repository.
\nThis allows a developer to work with several Cloud-linked projects without repeating login for each one and without embedding account credentials in project files.
\nSoftadastra Cloud does not replace the local Vix build system.
\nSource files, compiler execution, generated objects, build directories, package checkouts, and native binaries remain on the developer’s machine or in the project’s own CI environment.
\nThe Cloud integration records the parts of project state that are useful to share:
\nThis distinction is visible in the CLI. vix build still performs a normal local build. Adding --report submits information after that build; it does not upload the source code for remote compilation.
Similarly, vix cloud lockfile upload records the dependency state selected by the local project without changing how those dependencies are resolved or installed.
After authentication, the current environment can be inspected with:
\nvix cloud statusThe command reports whether the user is authenticated, whether the current directory is linked to a Cloud project, and which workspace and project are active.
\nA local project can be connected with:
\nvix cloud initThe CLI uses the authenticated account to retrieve available workspaces and creates or selects the Cloud project associated with the current source tree.
\nProject metadata remains explicit. Vix does not assume that every local directory should be uploaded or linked merely because the user is authenticated.
\nvix cloud sync refreshes the Cloud-side project metadata associated with the local link while preserving the local project as the source of the build workflow.
Cloud-linked projects can upload their dependency lockfile with:
\nvix cloud lockfile uploadThe shorter alias is also available:
\nvix cloud lock uploadBy default, the command uses the project’s normal lockfile. A different file can be selected explicitly:
\nvix cloud lockfile upload --file vix.lockMachine-readable output is available with:
\nvix cloud lockfile upload --jsonThe uploaded record includes checksum information, allowing the Cloud project to distinguish lockfile revisions and keep a history of dependency states.
\nThis is useful when several developers or environments build the same project. The lockfile remains in source control as before, while the Cloud record provides another view of which dependency state was associated with project activity.
\nThe command reports direct errors when the project has not been linked or when the requested lockfile does not exist.
\nA local build can submit a report to Softadastra Cloud with:
\nvix build --reportThe build itself follows the normal Vix process. The CLI configures the project, invokes the selected build backend, and determines whether the requested targets succeeded.
\nWhen the project is linked to Softadastra Cloud, Vix can then submit information such as:
\nThe report is intended to describe the local build, not replace it.
\nA report submission failure does not turn a successful native build into a failed build command. The CLI reports the Cloud error separately while preserving the successful build exit status.
\nThis is important for local work and CI. Cloud reporting is useful project metadata, but a temporary network or API failure should not make a valid compiled binary appear broken.
\nPrivate package versions can be published to Softadastra Cloud through the existing publish command:
\nvix publish --cloudThe equivalent Cloud command is:
\nvix cloud publishCloud publication is explicit. Running vix publish without --cloud continues to use the public Vix Registry workflow.
A private package publication can specify its identity and visibility:
\nvix publish --cloud \\\n --package softadastra/example \\\n --version 0.1.0 \\\n --visibility privateAdditional options include:
\n--description\n--repository-url\n--archive\n--manifest\n--dry-run\n--jsonThe command can prepare the package archive, calculate its checksum, read metadata from vix.json or vix.app, create the Cloud package record, and upload the version archive.
Duplicate package versions produce a clear conflict message instead of a generic API failure.
\nThe public and private package workflows therefore share the same high-level command while remaining separate destinations with different access models.
\nvix doctor --cloud now inspects the Cloud side of the development environment.
The diagnostic includes:
\nCloud command failures also use more specific API errors for common cases such as missing authentication, missing project links, permission failures, missing files, and duplicate package versions.
\nThe Cloud HTTP client uses the existing vix::requests module instead of introducing a separate networking implementation inside the CLI.
This keeps TLS, request handling, error conversion, and response parsing aligned with the networking code already maintained by Vix.
\nThe application module generator now supports WebSocket workflows.
\nA named module can be created with:
\nvix modules add live_chat --websocket --workflow attachedOption-based generation is also supported:
\nvix modules add \\\n --websocket \\\n --name live_chat \\\n --workflow attachedThe explicit --name option is useful in scripts and project generators where the module name is passed as a command option rather than a positional argument.
Generated metadata records the selected workflow in the module’s vix.module file.
The initial WebSocket generator provides four workflows:
\nattached\nstandalone\nbridge\nclientEach workflow represents a different relationship between the generated module and the application runtime.
\nAn attached module participates in the application’s existing runtime.
\nIt is appropriate when the project already has a primary HTTP or backend application and the WebSocket feature should run as part of that process.
\nThe generated module contributes its WebSocket behavior without defining an unrelated second application entry point.
\nA standalone module provides its own runtime-capable WebSocket application.
\nThis is useful for a service whose primary responsibility is WebSocket communication and which does not need to attach to another generated backend runtime.
\nA bridge module is runtime-capable and is intended for workflows where WebSocket communication connects two parts of an application or forwards events between boundaries.
\nThe generated structure provides a dedicated place for that bridge logic while still participating in the Vix module and runtime system.
\nA client module generates WebSocket client support code.
\nUnlike the other workflows, it does not take ownership of application startup and must not be selected as the project runtime module.
\nVix now excludes these non-runtime client modules when deciding which generated module should participate in runtime generation.
\nEarlier generated modules still referenced runtime symbols that no longer matched the current WebSocket API, including older forms such as:
\nvix::websocket::Server\nvix::run_http_and_wsThis could produce a module that looked structurally correct but failed during the normal application build.
\nThe generator now uses the current WebSocket headers, runtime types, and startup model. Attached, standalone, and bridge modules can compile through the standard:
\nvix buildworkflow.
\nModule registration and generated vix.app metadata were also updated so WebSocket contributions work in both application and backend projects.
Generated backend assets now include a small WebSocket connection status panel.
\nAfter starting a generated backend:
\nvix build\nvix runthe browser page attempts to connect to the configured local WebSocket endpoint and reports whether the connection is open, closed, or unavailable.
\nThe panel is not intended to replace application-specific WebSocket tooling. It provides immediate confirmation that the generated server, route, frontend asset, and browser connection agree on the basic runtime configuration.
\nThis is particularly useful after creating a backend project and adding an attached WebSocket module because the developer can verify the generated integration before writing application-specific events.
\nBackend project generation now supports an API-only mode:
\nvix new api --template backend --api-onlyThe generated project keeps the production-oriented backend structure, including:
\nsrc/main.cpp\nAppBootstrap\nmiddleware registry\nroute registry\ncontrollers\nsupport helpers\nstorage\nmigrations\ntests\n.env\n.env.example\nvix.app\nvix.json\nREADMEIt omits the parts intended for a backend that also serves its own browser frontend:
\npublic/\nviews/\ngenerated static frontend assets\ntemplate setup\nstatic directory setup\nstatic compression middleware\npublic and views resource entriesThis mode is intended for applications where the C++ backend and frontend are deployed separately.
\nThe frontend may be built with Vue, React, Next.js, SvelteKit, another web framework, or a static hosting system. The Vix project remains responsible for API routes, application services, middleware, storage, and native runtime behavior.
\nStatic files, views, and related bootstrap code are now conditional parts of the standard backend template rather than assumptions shared by every backend project.
\nVix now provides a user-space global installation workflow for C++ packages that expose libraries or command-line executables.
\nFor example:
\nvix install -g vixcpp/ovi\novi --version\nvix uninstall -g vixcpp/oviGlobal packages are installed into a Vix-managed prefix rather than /usr/local by default.
This avoids requiring root access and gives Vix enough ownership information to update and remove package files safely.
\nWhen the package provides standard CMake installation rules, Vix builds the package and uses those rules. Installed files are recorded in the package’s global installation metadata.
\nExecutables are exposed through the Vix global bin directory, making commands such as ovi available when that directory is present on PATH.
Global installation is more than copying a compiled binary.
\nVix records which package owns each installed file and checks for executable name conflicts before replacing an existing command.
\nUninstallation removes only files registered to the selected package.
\nThis prevents a package uninstall from deleting unrelated headers, libraries, or commands that happen to share the same installation prefix.
\nScoped forms are accepted consistently by install and uninstall commands, including package names such as:
\n@rix/rixNormal uninstall output is kept short and reports the result with elapsed time rather than printing every removed path. More detailed output can still be requested when needed.
\nSome packages are designed to build inside the Vix package environment and reference internal targets prepared by the normal Vix dependency pipeline.
\nTreating those packages as unrelated standalone CMake projects can fail because their expected targets have not been created.
\nGlobal installation now passes packages such as rix/rix through the Vix build and installation workflow instead of configuring their source directories in isolation.
This preserves the same dependency preparation and target environment used when the package is consumed by a regular project.
\nVix projects can now install dependencies directly from Git repositories:
\nvix install https://github.com/fmtlib/fmt\nvix install https://github.com/nlohmann/json.gitThe CLI normalizes common Git URL forms and inspects the repository to determine how it can be consumed.
\nWhen no revision is specified, Vix selects the latest stable Semantic Versioning tag when one can be determined. It then resolves the selected revision to an exact commit and records that commit in vix.lock.
The source is materialized under:
\n.vix/depsand Vix generates:
\n.vix/vix_deps.cmakefor normal build and run workflows.
\nThe first implementation supports CMake repositories and header-only repositories.
\nA Git dependency recorded in vix.app can describe:
This allows the lockfile to preserve the exact resolved source while the application manifest describes how the project consumes it.
\nThe repository URL alone is often sufficient for common packages. Vix inspects the CMake project, searches for likely public targets, and prefers stable namespaced targets when the choice is unambiguous.
\nFor example, a repository may expose several internal targets but have one clear consumer target such as:
\nfmt::fmtWhen several plausible public targets remain and Vix cannot choose safely, installation stops with a direct ambiguity error instead of linking an arbitrary target.
\nDependencies declared in vix.app are prepared automatically by normal project commands.
A single-file execution inside a project no longer requires a separate deprecated dependency preparation step before running:
\nvix run main.cppWhen the file includes a project dependency, Vix resolves the dependency state, prepares the checkout, and selects the required compile path.
\nThe same generated dependency information is available to regular project builds.
\nThis brings dependency preparation into the commands that actually need the dependencies instead of requiring the developer to remember an independent synchronization command.
\nVix.cpp v2.7.3 adds:
\nvix initThe command turns the current directory into a minimal Vix project without generating a complete application template.
\nA basic workflow is:
\nmkdir fmt-test\ncd fmt-test\ntouch main.cpp\nvix initVix derives a safe project name from the directory, detects existing C++ source files, and creates a minimal vix.app.
Supported options include:
\n--name\n--lib\n--standard\n--forcevix init is intended for existing source trees or small folders that already contain code.
vix new remains the appropriate command when the developer wants a complete scaffold with a selected template, directory structure, examples, tests, and project documentation.
A single C++ file can now use a Git dependency without permanently modifying the current directory:
\nvix run main.cpp \\\n --dep https://github.com/fmtlib/fmtVix creates a temporary dependency environment, resolves the repository, prepares the required include or link information, compiles the file, and reuses the dependency cache where possible.
\nThis mode does not create:
\nvix.app\nvix.lock\n.vix/in the current directory unless the developer explicitly saves the dependency into a project.
\nIt is useful for evaluating a library, reproducing a small example, or testing an API before deciding whether the code belongs in a permanent Vix project.
\nvix run <file.cpp> now selects its execution path from the file’s actual dependency requirements.
A source file that uses only the C++ standard library can use the direct compiler path even when its parent project contains Git dependencies.
\nPreviously, the presence of:
\n.vix/vix_deps.cmakecould force every single-file run through CMake, including files that did not use any dependency from that file.
\nVix now examines the source includes and the dependency metadata before deciding whether CMake is necessary.
\nThe general behavior is:
\nstandard library only direct compiler\nheader-only dependency direct compiler with include paths\ncompiled dependency CMake with vix::depsThis preserves the fast script-like workflow for simple programs while still supporting correct linking when a compiled package is required.
\nRepeated direct runs can reuse the compiled binary when the relevant inputs have not changed.
\nThe cache key considers:
\nA change to any of these inputs invalidates the cached executable.
\nThis is especially useful for small examples and temporary dependency experiments, where repeatedly invoking a full project configuration would add unnecessary delay.
\nThe public vix publish workflow now validates the exact tagged source.
Publishing a version should describe the immutable revision associated with that version, not whichever files happen to exist in the current working directory.
\nVix now creates a detached temporary checkout at the selected tag commit. It reads vix.json, scans public headers, and prepares registry metadata from that checkout.
Local uncommitted changes, files added after the tag, or a branch that has moved beyond the release therefore cannot silently influence the published package description.
\nThe working tree remains untouched because inspection happens in the temporary checkout.
\nA package’s registry identity is now tied to its normalized repository URL.
\nWhen a repository already exists in the registry under a particular:
\nnamespace/namefuture publications from the same repository must preserve that identity.
\nChanging the package name in vix.json does not silently create a second registry package for the same repository.
This prevents accidental renames from splitting versions, download history, search results, and ownership information across duplicate package entries.
\nRepository identity mismatches are checked before remote tag validation so the developer receives the most relevant error first.
\nPublic publishing verifies that the requested version tag exists at the expected repository revision.
\nGit network, authentication, and repository errors are now distinguished from a genuinely missing remote tag.
\nEarlier behavior could report some remote access failures as though the tag had simply not been pushed. The updated validation preserves the underlying reason when the repository cannot be reached or accessed.
\nThis makes publication failures easier to diagnose, particularly for private remotes, incorrect repository URLs, or temporary network problems.
\nThe detached tagged checkout is also used to scan the package’s declared public include roots.
\nVix derives API metadata from the source that users will actually receive for that version.
\nThe generated metadata is deterministic: publishing the same immutable tag with the same manifest produces the same package API description.
\nThis creates a stable basis for registry browsing, documentation links, package analysis, and future compatibility tooling.
\nThe registry package type now comes from the real package manifest.
\nVix no longer forces published packages to appear as header-only when that does not match their actual build model.
Missing license information is also left missing rather than silently replaced with MIT.
Publication should preserve what the package declares and report invalid or incomplete metadata directly. It should not invent legal or technical properties on behalf of the author.
\nNormal publishing output remains focused on the result.
\nA dry run no longer prints the complete registry JSON automatically:
\nvix publish --dry-runStructured output remains available with:
\nvix publish --dry-run --jsonDetailed human-readable diagnostics can be requested with:
\nvix publish --dry-run --verboseThis keeps routine publication readable while preserving the information needed for automation and investigation.
\nThe release validates the new workflows across application generation, dependency management, Cloud commands, global installation, script execution, and public publishing.
\nWebSocket coverage includes:
\n--name;vix.module metadata;Backend template validation covers both the standard scaffold and API-only generation, including the absence of static frontend resources in API-only projects.
\nCloud validation covers authentication, project linking, status reporting, lockfile upload, build report submission, explicit Cloud publication, duplicate versions, missing links, missing files, and API errors.
\nPackage tests cover user-space global prefixes, executable exposure, package ownership, conflict detection, scoped uninstall names, and packages requiring the Vix build environment.
\nGit dependency tests cover URL normalization, stable tag selection, exact commit locking, CMake projects, header-only projects, target detection, ambiguous targets, generated dependency CMake, and normal run preparation.
\nSingle-file run tests cover direct compilation, header-only include paths, compiled dependency fallback, temporary dependencies, and cache invalidation.
\nPublic publishing tests cover tagged source inspection, repository identity, remote tag validation, header scanning, deterministic API metadata, manifest package types, missing licenses, and output modes.
\nThe documentation was updated to cover the workflows introduced or corrected by this release.
\nThe application module documentation now explains WebSocket generation, workflow selection, custom names, module registration, and runtime participation.
\nBackend template documentation covers the generated WebSocket status panel and the difference between the standard frontend-serving backend and --api-only.
Cloud documentation covers login, project linking, status, lockfile upload, build reports, private package publication, and vix doctor --cloud.
Package documentation covers global installations, executable commands, ownership-aware uninstallation, Git dependencies, target detection, lockfile behavior, and dependency caching.
\nThe CLI guides also document vix init, temporary vix run --dep experiments, and the stricter public publication requirements.
Existing public registry publication remains the default behavior of:
\nvix publishPrivate Cloud publication requires the explicit --cloud option.
Existing backend templates continue to include frontend assets unless --api-only is selected.
Projects without Git dependencies continue to build and run through their existing workflow. Git support adds another dependency source without replacing registry packages.
\nSimple vix run scripts continue to use direct compilation where possible. Projects requiring compiled dependencies fall back to the generated CMake dependency environment automatically.
Global installations use a Vix-managed user prefix by default, avoiding changes to system directories. Packages that provide correct CMake installation rules continue to use those rules.
\nCloud reporting remains optional. A project that is not authenticated or linked continues to build locally without requiring Softadastra Cloud.
\nThe first Git dependency implementation supports CMake-based and header-only repositories. Projects that require another build system need explicit support in a later release or must provide a compatible CMake integration.
\nAutomatic target detection is used only when Vix can identify a clear public consumer target. Repositories exposing several equally plausible targets require the developer to specify the intended target.
\nTemporary vix run --dep environments are intended for focused experiments. A dependency that becomes part of the application should be saved into vix.app so its exact resolution is recorded in the project lockfile.
Softadastra Cloud in this release coordinates project metadata, private packages, lockfiles, and build reports. It does not perform remote C++ compilation.
\nThe generated WebSocket status panel checks connection availability only. Application authentication, reconnection policy, message protocols, and production frontend behavior remain the responsibility of the project.
\nVix.cpp v2.7.3 connects several workflows that previously required separate manual steps.
\nWebSocket modules can be generated with an explicit runtime model and built through normal application and backend projects. Backend services can be created without bundled frontend assets when the interface is hosted separately.
\nThe CLI can authenticate with Softadastra Cloud, link local projects, upload dependency state, submit local build reports, and publish private package versions while keeping compilation on the developer’s machine.
\nGit repositories can participate in project dependencies, temporary single-file experiments, and reproducible lockfiles. Command-line packages can be installed globally into a user-controlled Vix prefix with tracked ownership and clean uninstallation.
\nPublic registry publication now derives its metadata from the exact release tag and protects package identity across versions.
\nTogether, these changes make Vix more useful across the full path from a small C++ file to a modular backend project with shared package and project state.
\n'; +const v2_7_3 = { + html +}; +export { + v2_7_3 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.4-C0ziq3Yh.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.4-C0ziq3Yh.js new file mode 100644 index 000000000..eec1e2265 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.4-C0ziq3Yh.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.7.4 makes specialized SDK profiles composable.
\nA project can now use modules from several installed profiles, such as web and data, without installing the complete all SDK. Before configuring CMake, Vix examines the project’s vix::* dependencies, determines which installed profiles provide them, and prepares one coherent SDK package for the build.
The release also improves the failure path when a project requests a known Vix module whose provider profile is not installed. Instead of allowing CMake to fail later with an unresolved target, the CLI identifies the missing module, reports its provider profile, and gives the exact installation command.
\nSDK profiles were introduced to avoid requiring every developer to install the full Vix SDK.
\nA backend application may need the web profile, a database-oriented tool may need data, and a desktop or game project may use another specialized profile. This keeps installations smaller and gives each project a more focused development environment.
The original profile model worked well when a project remained inside one profile. The problem appeared when an application crossed that boundary.
\nA Cloud service, for example, may use WebSocket support from web together with database functionality from data:
target_link_libraries(\n cloud\n PRIVATE\n vix::db\n vix::websocket\n)Installing both profiles did not solve the problem by itself. Each profile provided an independent CMake package named Vix, and CMake does not merge several packages returned by separate find_package(Vix) calls.
Vix.cpp v2.7.4 addresses this at the CLI level. It treats installed profiles as components of one SDK environment and creates a local composed package when the project needs more than one of them.
\nThe following workflow now supports a project that uses both web and data modules:
\nvix upgrade --sdk web data\nvix install\nvix build --preset releaseThe project does not need the heavier all profile merely because it links modules from two specialized profiles.
Before CMake configuration begins, vix build scans the project for known Vix targets. It resolves each requested module to the profile that provides it and verifies that the required profile is installed.
For this project:
\ntarget_link_libraries(\n app\n PRIVATE\n vix::db\n vix::websocket\n)Vix resolves:
\nvix::db data\nvix::websocket webBecause more than one provider is required, the CLI generates a composed SDK package inside the build directory and passes it to CMake through Vix_DIR.
The project continues to use the normal public target names. SDK composition is an implementation detail handled by vix build.
CMAKE_PREFIX_PATH was not enoughEach installed SDK profile contains its own package configuration:
\nVixConfig.cmake\nVixTargets.cmakeAll profiles use the same CMake package name because they represent different installations of Vix rather than unrelated libraries.
\nAdding the web and data installation roots to CMAKE_PREFIX_PATH does not cause CMake to combine their targets. find_package(Vix) selects one package location and loads the configuration found there.
As a result, the first selected profile could expose vix::websocket while leaving vix::db unresolved, or expose vix::db while omitting vix::websocket.
Vix now resolves the profiles before invoking CMake and presents them through one generated package. The composed configuration contains the targets required by the project while preserving the installation paths and exported properties of their original profiles.
\nDevelopers do not need to declare the required SDK profile separately in the build command.
\nvix build scans the project’s CMake files and Vix manifests for known vix::* targets before configuration. It then maps those targets to the profiles that officially provide them.
The supported profile set is:
\ndefault\nweb\ndata\ndesktop\np2p\ngame\nagent\nallWhen every requested module belongs to one profile, Vix uses that installed SDK directly.
\nWhen the project requires modules from several profiles, Vix creates a composed package for that build.
\nThis keeps the SDK decision connected to the actual project dependencies. A project that starts with web and later adds vix::db can be built after installing data, without manually changing a separate SDK configuration file.
The CLI now uses one shared source of truth for SDK profile information.
\nPreviously, the metadata displayed by:
\nvix upgrade --sdk infoand the metadata used internally by vix build could evolve through separate code paths. That created a risk that one command would describe a profile differently from the way another command resolved it.
Profile names, provided modules, descriptions, and provider relationships now come from a shared CLI helper.
\nThis means the information shown to the developer and the information used during build resolution follow the same model.
\nIt also makes later profile changes easier to maintain because a module should not need to be registered independently in several commands.
\nSome public Vix targets are aliases in the source tree.
\nDuring CMake export, aliases are not installed as ordinary targets. The underlying implementation target is exported, but the public alias used by consumer projects may need to be recreated in VixConfig.cmake.
Vix.cpp v2.7.4 restores the missing public aliases for:
\nvix::time\nvix::conversion\nvix::validation\nvix::webrpcThis ensures that installed SDK consumers can use the same public target names that are available inside the Vix source tree.
\nThe composed SDK generator preserves these aliases as well, so projects behave consistently whether they use one profile directly or several profiles through a generated composition.
\nCMake export files commonly describe installed paths relative to an internal variable named _IMPORT_PREFIX.
A target may reference locations such as:
\n${_IMPORT_PREFIX}/include\n${_IMPORT_PREFIX}/lib/libvix_websocket.aThat variable normally points to the root of the SDK installation that owns the target.
\nWhen a target from a secondary profile is copied into a composed configuration, leaving _IMPORT_PREFIX unresolved or binding it to the composed package directory can produce invalid paths such as:
/include\n/lib/libvix_websocket.aVix now rewrites every _IMPORT_PREFIX occurrence to the installation root of the source profile before adding the target to the composed package.
A target imported from web therefore continues to resolve its headers and libraries from the installed web SDK, while a target imported from data resolves against the data installation.
This applies to all occurrences in the exported target definition, not only the first path encountered.
\nNot every target using the vix:: namespace represents an installed SDK module.
Vix can generate project-specific helper targets such as:
\nvix::depsThese targets describe the current project’s resolved dependencies and are created during project generation. They are not modules provided by an installed SDK profile.
\nThe SDK resolver now excludes these generated targets when scanning project files.
\nWithout this distinction, vix build could report that a profile was missing for a target that no profile was ever supposed to provide.
The resolver therefore considers only known public SDK modules when deciding which profiles are required.
\nWhen a project requests a known Vix module whose provider profile is not installed, the CLI now reports the problem before CMake configuration.
\nFor example, a project may link:
\ntarget_link_libraries(app PRIVATE vix::websocket)while only the data SDK is installed.
Vix now reports:
\nMissing SDK modules:\n vix::websocket provider profile: web\n\ninstall command:\n vix upgrade --sdk webThis is more useful than the generic CMake error:
\nTarget "app" links to:\n vix::websocket\nbut the target was not found.The CMake message identifies the unresolved target but does not know which Vix SDK profile provides it or how the developer should install that profile.
\nThe new diagnostic keeps the failure at the level where it can be explained accurately.
\nInstalled profiles used in the same composed SDK must come from the same Vix version.
\nFor example, Vix will not compose a web profile from one release with a data profile from another release merely because both contain valid CMake packages.
Targets from different releases may have incompatible dependencies, export layouts, compile definitions, or module interfaces. Combining them could create a package that configures successfully but fails later in less predictable ways.
\nVix checks the installed profile versions before generating the composed SDK. When the versions differ, the build stops and reports the incompatibility.
\nThe developer can then upgrade the required profiles to the same Vix release before rebuilding.
\nVix does not generate a partial package or silently choose one version over another.
\nSDK composition does not depend on the order in which profiles were installed.
\nThese installation sequences must describe the same environment:
\nvix upgrade --sdk web\nvix upgrade --sdk dataand:
\nvix upgrade --sdk data\nvix upgrade --sdk webProvider selection is based on shared profile metadata and project requirements rather than directory discovery order.
\nThis matters because SDK installations may be accumulated over time. A developer should not need to remember which profile was installed first or reinstall profiles in a particular sequence to obtain a valid composed package.
\nallThe all profile remains useful when a developer intentionally wants the complete Vix SDK available in one installation.
It can be appropriate for SDK development, broad experimentation, release validation, examples that cover many unrelated modules, or environments where installation size is not a concern.
\nProjects with focused requirements no longer need all merely to cross one profile boundary.
A service using vix::websocket and vix::db can install web and data. A project using only web modules can continue to install web alone.
The choice is therefore based on the project’s real module requirements rather than a limitation of the package configuration system.
\nVix.cpp v2.7.4 adds tests for direct and composed SDK usage.
\nWeb profile coverage includes projects using:
\nvix::websocket\nvix::requests\nvix::middlewareData profile coverage includes:
\nvix::db\nvix::orm\nvix::cache\nvix::kvCombined profile coverage includes a project linking both:
\nvix::db\nvix::websocketThe test suite also covers:
\nVixConfig.cmake;_IMPORT_PREFIX rewriting;These tests verify both successful composition and the cases where Vix must stop before invoking CMake.
\nThe CLI documentation now explains how installed SDK profiles participate in builds.
\nIt covers:
\nvix::* targets;all profile.The documentation also clarifies that installing several SDK roots is not enough for CMake to merge them automatically. Composition is performed by vix build because the CLI has the project context and profile metadata required to build one valid package configuration.
Projects using one SDK profile continue to use that profile directly.
\nExisting project CMake files do not need to declare profile names. They continue to link public targets such as:
\ntarget_link_libraries(\n app\n PRIVATE\n vix::requests\n vix::websocket\n)Projects that already use the all SDK remain compatible.
Projects using modules from several specialized profiles can now install only the profiles they need. Their installed profiles must come from the same Vix version.
\nThe generated composed SDK is local to the build directory. It does not modify the installed profile packages or merge their files permanently on disk.
\nVix.cpp v2.7.4 turns specialized SDK profiles into a composable installation model.
\nProjects can combine web, data, and other supported profile modules while keeping their SDK installation focused. vix build discovers the required modules from the project, resolves their provider profiles, verifies version compatibility, and generates one CMake package when composition is needed.
The release also restores missing public aliases, preserves imported target paths across profile boundaries, ignores project-generated helper targets, and replaces generic CMake failures with diagnostics that identify the missing module and its provider.
\nThis makes SDK profiles practical for projects that do not fit entirely inside one category without forcing every developer to install the full Vix SDK.
\n'; +const v2_7_4 = { + html +}; +export { + v2_7_4 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.5-Cz6YsC1I.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.5-Cz6YsC1I.js new file mode 100644 index 000000000..6e3caccf8 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.5-Cz6YsC1I.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.7.5 fixes two problems that affected existing projects rather than introducing a new developer-facing feature.
\nThe first concerns composed SDK installations. When several SDK profiles such as web and data were installed together, generated CMake targets could select the wrong provider or inherit properties from an unrelated module.
The second concerns projects with lockfiles created before the current package integrity format. vix install can now migrate those old entries to the canonical vix-package-sha256 v2 format when the package identity, registry state, and local checkout prove that the migration is safe.
These fixes are especially important for long-lived projects. A toolchain upgrade should not require developers to rebuild their dependency state manually when Vix already has enough information to verify and repair it.
\nVix SDK profiles allow developers to install only the parts of the platform required by a project.
\nA web application may use the web profile, while a project that also needs database support may compose web and data. The generated SDK must then expose one coherent set of CMake targets, even when several profiles contain related modules or depend on overlapping parts of Vix.
Before v2.7.5, some composed installations could generate aliases from the wrong profile or copy target properties from a target that was not the actual provider. These mistakes were difficult to notice during installation because the generated SDK remained structurally valid. They appeared later as incorrect includes, link libraries, compile definitions, or consumer build failures.
\nOld lockfiles presented a different compatibility problem. Earlier versions of Vix stored package integrity information in formats that are no longer used. A project could have the correct package version and checkout but still fail installation because the stored hash metadata did not match the current canonical representation.
\nVix.cpp v2.7.5 addresses both cases by making SDK composition provider-aware and making integrity migration evidence-based.
\nSDK profiles are generated independently and can then be combined into a single installation.
\nFor example:
\nvix upgrade --sdk web,dataA composed SDK must determine which profile officially provides each exported module. It cannot assume that every profile mentioning a dependency owns the corresponding target.
\nVix now creates aliases only for modules actually exported by the profile being processed. A profile no longer creates placeholder or duplicate aliases for modules that belong to another provider.
\nThis keeps the generated CMake namespace aligned with the real SDK exports and avoids ambiguous ownership when profiles overlap.
\nThe validation module exposed one of the composition errors fixed in this release.
Both web-oriented and data-oriented parts of the SDK can depend on validation behavior, but that does not mean both profiles should provide the public vix::validation target.
In a composed web + data installation, vix::validation is now resolved from its official web provider. The data profile no longer shadows that target merely because one of its modules depends on validation.
This distinction between using a module and providing its exported target is important. Dependencies describe what a profile needs internally, while exports define what the profile owns and presents to consumer projects.
\nBy preserving that boundary, composed SDKs behave like the individual profiles from which they were built.
\nComposed targets now preserve the exact exported properties of their provider SDK target.
\nThese properties can include:
\nINTERFACE_INCLUDE_DIRECTORIES\nINTERFACE_LINK_LIBRARIES\nINTERFACE_COMPILE_DEFINITIONS\nINTERFACE_COMPILE_OPTIONS\nINTERFACE_LINK_OPTIONSThe composition step reads them from the selected provider and applies them to the corresponding composed target without reconstructing the dependency graph from unrelated profile data.
\nThis matters because exported CMake targets are more than names. Their interface properties describe how consumer projects compile and link against the SDK.
\nA composed target that points to the right module but carries the wrong interface properties is still incorrect.
\nThis release also fixes how target properties are extracted during SDK generation.
\nThe previous extraction logic could continue reading beyond the intended target boundary. In that situation, properties belonging to a later target could be associated with the target currently being generated.
\nFor example, properties from:
\nvix::dbcould leak into:
\nvix::websocketThe generated file could therefore look valid while giving vix::websocket database-related libraries, include directories, or compile definitions that were never part of its official export.
Property extraction is now isolated to the exact target being processed. Reading stops at the target boundary, and unrelated definitions cannot be carried into another composed target.
\nThis makes composed SDK output deterministic and equivalent to the provider SDK exports.
\nVix lockfiles record the exact package version and source state selected for a project.
\nModern lockfiles use canonical package integrity metadata based on:
\nvix-package-sha256\nhash version 2Projects created with older Vix releases may contain hashes calculated or represented using obsolete metadata. Even when the registry package and local checkout are correct, the old hash cannot be compared directly with the current canonical format.
\nPreviously, resolving this situation could require a manual sequence such as:
\nvix registry sync\nvix update\nvix installThat workflow was inconvenient and could change more project state than necessary. The real requirement was not to resolve new versions, but to verify the already locked package and rewrite only its integrity metadata.
\nVix.cpp v2.7.5 performs that migration during vix install when all required safety conditions are satisfied.
When vix install encounters obsolete package integrity metadata, it verifies the complete identity of the locked dependency before modifying the lockfile.
A successful migration updates only:
\nhash\nhash_algorithm\nhash_versionThe locked package id, selected version, tag, commit, source, and dependency resolution remain unchanged.
\nThis is intentionally narrower than vix update. The command does not search for a newer package or recompute the dependency graph. It confirms the package already selected by the lockfile and replaces only integrity fields that belong to the old format.
After migration, subsequent vix install runs use the canonical v2 metadata normally.
Integrity migration may require registry metadata that is not available in the local registry checkout.
\nWhen that happens, vix install now synchronizes the registry internally and retries the verification. The user does not need to stop the installation and run a separate vix registry sync command.
This synchronization is performed only when it is required to validate the locked package. It does not turn installation into a general package update.
\nThe workflow becomes:
\nvix installVix determines whether the existing lockfile is current, whether registry information is needed, and whether the old integrity metadata can be migrated safely.
\nThis keeps installation responsible for making the locked project installable without silently changing the versions selected by that lockfile.
\nAutomatic migration is allowed only when every available source of package identity agrees.
\nVix verifies that:
\nOnly after these checks succeed does Vix calculate the canonical v2 package hash and update the integrity fields.
\nThis approach treats the old hash as obsolete metadata, not as permission to trust arbitrary local content. The migration is based on package identity, repository state, and registry evidence.
\nvix install continues to fail without rewriting the lockfile when the dependency state cannot be proven safe.
A dirty checkout is rejected because local modifications mean the package content no longer corresponds exactly to the locked source.
\nA registry commit mismatch is also rejected. Even when the package id and version appear correct, a different commit represents different source content and cannot be repaired through a hash metadata migration.
\nIncomplete checkouts are rejected because Vix cannot calculate a trustworthy canonical package hash when expected files are missing.
\nModern v2 hashes are never treated as migration candidates. When a lockfile already declares vix-package-sha256 v2 and its hash is incorrect, installation fails normally. Vix does not replace a current-format hash merely because the local checkout produces a different result.
This distinction is central to the safety model:
\nobsolete format + verified identity = migrate\nmodern format + incorrect hash = failAutomatic migration repairs compatibility metadata. It does not weaken integrity validation.
\nAfter a successful migration, running vix install again does not modify the lockfile.
The package now contains canonical integrity fields, so the normal verification path can compare the stored v2 hash directly with the installed content.
\nThis idempotence matters for source control and automated builds. A project should not produce repeated lockfile changes every time dependencies are installed.
\nIt also makes the migration easy to review. The first compatible installation produces a small, focused change to the integrity fields, and later installations leave the file untouched.
\nThe migration was validated against Softadastra Cloud as a real consumer project.
\nThe project dependencies were installed with:
\nvix installNo manual registry synchronization or dependency update was required.
\nThe project was then built with:
\nvix build --preset releaseThe release build completed successfully and produced:
\nbin/cloudThis validation covered a project using multiple Vix modules and a composed SDK rather than an isolated package fixture.
\nIt confirmed that an existing lockfile could be migrated during normal installation and then used to build the application without changing its selected dependency versions.
\nVix.cpp v2.7.5 adds regression tests for the SDK composition and lockfile migration paths.
\nThe SDK tests cover:
\nvix::validation resolution in a web + data installation;vix::db properties leaking into vix::websocket.The package integrity tests cover:
\nThese tests focus on the boundaries where an automatic repair must stop and return an error.
\nProjects using a single SDK profile continue to use the same public CMake targets.
\nProjects combining profiles such as web and data should receive more accurate target aliases and interface properties without changing their CMakeLists.txt.
Existing lockfiles using current vix-package-sha256 v2 metadata are not migrated. They continue through the normal integrity verification path.
Old lockfiles are updated only when Vix can prove that the package identity and local checkout match the locked dependency. The selected versions, tags, commits, and package ids remain unchanged.
\nProjects with intentionally modified dependency checkouts must clean, restore, or explicitly update those dependencies before installation can continue.
\nVix.cpp v2.7.5 improves the reliability of existing Vix projects in two areas where generated metadata must be exact.
\nComposed SDKs now preserve module ownership and target properties across multiple profiles. Public aliases come from the correct provider, and one target can no longer inherit CMake properties from another.
\nOld package integrity metadata can now be migrated during vix install without requiring a manual registry sync or a full dependency update. The migration changes only obsolete hash fields and proceeds only when the registry, lockfile, and local checkout all describe the same package state.
The result is a more predictable SDK for multi-profile projects and a safer upgrade path for projects created with earlier Vix lockfile formats.
\n'; +const v2_7_5 = { + html +}; +export { + v2_7_5 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.6-BpNHKudG.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.6-BpNHKudG.js new file mode 100644 index 000000000..029c311c5 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.6-BpNHKudG.js @@ -0,0 +1,132 @@ +const html = `Vix.cpp v2.7.6 introduces a browser-based authentication flow for Softadastra Cloud.
+Developers can now sign in through the Cloud website when running vix login, while the CLI receives the resulting session securely through a temporary local callback. The existing email and password flow remains available for scripts, remote environments, and cases where opening a browser is not practical.
This release also fixes the Cloud API endpoint used by the CLI and resolves an HTTPS transport lifetime problem that could cause valid Cloud requests to fail with misleading memory-allocation errors.
+The first Softadastra Cloud integration allowed the Vix CLI to authenticate using an email address and password entered directly in the terminal. That workflow was useful as an initial implementation, but it was not the right default for an interactive developer tool.
+Terminal authentication requires the CLI to collect account credentials directly, offers limited room for future authentication methods, and separates the login experience from the Cloud website where account and workspace activity already takes place.
+Vix.cpp v2.7.6 adds a browser flow designed around a short-lived authorization code. The user authenticates on cloud.softadastra.com, while the CLI waits on a temporary local callback server and exchanges the returned code with the Cloud API.
The final session continues to use the same local configuration format as the previous login implementation. The change is therefore focused on how a session is obtained rather than how authenticated commands store or consume it.
+Running:
+vix loginnow presents two authentication methods:
+1. Open browser
+2. Enter email and passwordThe browser option is intended for normal interactive use. The manual option preserves the existing terminal workflow and remains useful on headless machines, through SSH sessions, and in environments where opening a local browser is unavailable.
+Explicit credentials can still be supplied with:
+vix login --email user@example.com --password '...'This keeps existing scripts and automation compatible while allowing the interactive command to use the safer browser experience by default.
+When browser login is selected, the CLI starts a temporary HTTP server on an available 127.0.0.1 port.
It then generates a cryptographically secure state value and opens the Softadastra Cloud login page with the callback address and state attached to the authorization request.
+The browser handles the account authentication on the Cloud domain. After the user signs in, the Cloud backend creates a short-lived authorization code and sends it to the local callback address together with the original state value.
+The CLI verifies that the returned state matches the value generated at the beginning of the flow. It then sends the authorization code to the Cloud API, which exchanges it for the final authenticated session.
+The resulting session is stored in:
+~/.vix/cloud/config.jsonThis is the same configuration location and session format used by manual login, so commands such as vix cloud status, package publication, lockfile upload, and build reporting do not need a separate authentication path.
The browser never receives the final CLI session token in a redirect URL.
+Instead, Softadastra Cloud creates a temporary authorization code that is bound to the current authentication flow. The code is associated with:
+Authorization codes are stored in hashed form, expire quickly, and can be exchanged only once.
+This prevents a code copied from browser history or intercepted after a successful exchange from being reused to create another CLI session. Binding the code to the redirect URI and state also prevents it from being moved into an unrelated authentication attempt.
+The final session token is returned directly to the CLI during the code exchange. It is not exposed in the browser address bar or passed through the local callback URL.
+Softadastra Cloud now provides a dedicated frontend route for CLI authentication:
+/cli/loginThe page receives the callback information generated by vix login, authenticates the user through the normal Cloud session, and requests a temporary CLI authorization code from the backend.
The callback is sent to the local CLI server in the background. The main browser tab remains on cloud.softadastra.com and transitions to a success state instead of navigating visibly to a temporary 127.0.0.1 page.
This avoids leaving the user on a local address that becomes unavailable as soon as the CLI closes its callback server.
+The local callback response also uses a Softadastra Cloud confirmation page with animated status feedback. It clearly reports whether the callback was received, rejected, or could not be completed, while the primary browser tab remains on the Cloud site.
+The state value connects the browser response to the CLI process that initiated the login.
+A newly generated state is included when the CLI opens the Cloud login page. The same value must return through the local callback and must also match the authorization code record stored by the backend.
+The CLI rejects the callback when the state is missing or does not match.
+This validation protects the local callback server from accepting an unrelated browser request and prevents one login attempt from completing another process's authentication flow.
+The callback server listens only on 127.0.0.1, so it is not exposed as a network service to other machines.
Browser authentication does not remove terminal login.
+The existing email and password request remains available through the interactive menu and through explicit command-line options. This provides a fallback when browser opening fails or when the developer is using an environment without a graphical session.
+Manual login continues to return the same Cloud session structure and writes it to the same configuration file as browser login.
+Machine-readable behavior is also preserved. When --json is used with the manual or scripted flow, the CLI does not mix interactive prompts, browser status messages, or decorative output into the JSON response.
This is important for tools that parse authentication failures or call vix login as part of a controlled setup process.
The Vix CLI now sends Cloud API requests to:
+https://api.softadastra.comEarlier builds could target the public frontend domain rather than the backend API domain. That made authentication and Cloud commands dependent on frontend routing behavior and could cause requests to reach the wrong service.
+The frontend and API now have clear roles:
+cloud.softadastra.com browser interface
+api.softadastra.com CLI and backend APIThe browser login page remains on the frontend domain, while authorization code creation, exchange, session validation, workspace queries, and other Cloud operations use the API domain.
+This release fixes an HTTPS transport lifetime problem that could appear during Cloud requests as:
+network_error: std::bad_allocThe error suggested that the application had exhausted memory, but the underlying problem was related to the lifetime of state used by the asynchronous HTTPS operation.
+Transport objects and response buffers now remain valid until their associated callbacks and request operations have completed. Cloud requests therefore no longer access state that has already been destroyed or moved out of scope.
+This correction applies to the shared HTTPS transport used by the CLI, not only to the browser login exchange.
+HTTPS transport now enforces a response-size guard.
+Without an explicit limit, a malformed server, unexpected endpoint, or unbounded response could cause the client to continue growing its response buffer. The new guard stops buffering when the configured maximum is exceeded and returns a controlled transport error.
+Cloud API responses are expected to remain small and structured, so an unusually large response is more likely to indicate an incorrect endpoint or server-side problem than a valid CLI result.
+The guard makes this failure mode explicit rather than allowing response memory usage to grow without a boundary.
+After a successful browser or manual login, the CLI reports the authenticated account and Cloud API address:
+✓ Login successful.
+Account user@example.com
+Cloud URL https://api.softadastra.comThe stored session can be verified with:
+vix cloud statusCloud commands use the saved session automatically until it expires, becomes invalid, or is replaced by another login.
+The authentication flow distinguishes between browser, local callback, API, and session failures.
+A rejected or expired authorization code produces an authentication error rather than a generic network failure. A state mismatch is rejected before the code exchange is attempted. When the backend is unavailable, the CLI reports that the Cloud service could not be reached instead of treating the request as invalid credentials.
+Manual login errors remain compatible with JSON output:
+vix login \\
+ --email user@example.com \\
+ --password incorrect \\
+ --jsonThis allows scripts to inspect the structured error without removing the browser-oriented experience from normal interactive use.
+Softadastra Cloud now includes the backend endpoints and persistence needed for CLI authorization codes.
+The backend creates a temporary code only after confirming that the browser has an authenticated Cloud session. It records the code hash, user identity, state, redirect URI, and expiration time.
+During exchange, the backend verifies each of those properties before creating the final CLI session. A successful exchange consumes the code immediately.
+The authorization code is not a second long-lived session. It exists only to transfer authenticated browser intent back to the CLI without exposing the final token through browser navigation.
+The Vix umbrella project was built with the database configurations used by the Cloud integration:
+vix build --build-target all -v -- \\
+ -DVIX_ENABLE_DB=ON \\
+ -DVIX_DB_USE_MYSQL=ON \\
+ -DVIX_DB_USE_SQLITE=ONThe Softadastra Cloud backend and frontend were built with the new authorization code support and /cli/login route.
The final CLI was installed with:
+sudo cmake --install build-ninja --prefix /usr/localBrowser login was verified through the complete flow: local callback startup, browser authentication, state validation, authorization code creation, one-time exchange, session storage, and authenticated Cloud status.
+The manual email and password fallback was also tested to confirm that the previous terminal workflow remains functional.
+Validation additionally covered:
+vix cloud status after browser authentication;api.softadastra.com;~/.vix/cloud/config.json.Existing authenticated Cloud sessions remain compatible because v2.7.6 does not change the local session configuration format.
+Scripts using vix login --email and --password can continue to use the terminal flow. Commands using --json retain machine-readable output without browser-oriented formatting.
The main behavior change affects interactive vix login, which now offers browser authentication before manual credential entry.
Cloud commands now use the API domain rather than the public frontend domain. Custom development environments that override the Cloud address should ensure that their configured URL points to an API-compatible backend.
+Browser authentication requires the CLI to open or provide a URL that can be accessed in a browser on the same machine.
+The callback uses a temporary 127.0.0.1 HTTP server rather than a registered operating-system URL scheme. This keeps the first implementation portable and independent of desktop registration, but it requires the browser to be able to reach the local machine where vix login is running.
Remote SSH environments may not be able to use the callback directly when the browser runs on another computer. Manual email and password login remains available for those cases.
+The authentication system currently supports the existing Softadastra Cloud account session. Additional identity providers, device authorization, organization-enforced authentication policies, and passkey-specific CLI flows are not part of this release.
+Vix.cpp v2.7.6 makes Cloud authentication fit more naturally into the developer workflow.
+Interactive users can authenticate through the Softadastra Cloud website without placing their password directly into a CLI prompt. The browser receives only a temporary authorization code, the CLI validates the login state, and the final session is exchanged directly with the API.
+Manual authentication remains available where it is needed, and both methods produce the same local session used by existing Cloud commands.
+The release also corrects the API endpoint used by the CLI and strengthens the shared HTTPS transport so Cloud requests have predictable object lifetimes and bounded response buffering.
+`; +const v2_7_6 = { + html +}; +export { + v2_7_6 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.7-DoWGBtPN.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.7-DoWGBtPN.js new file mode 100644 index 000000000..82ceeeeaf --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.7-DoWGBtPN.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.7.7 introduces the first package-based extension architecture for Vix Note.
\nThe release allows Note to discover new cell types and runtimes from ordinary Vix packages rather than requiring every integration to be implemented directly inside the Note module. It also adds the registry, command-line, and interface workflows needed to install and manage those extensions.
\nAlongside the Note work, this release modernizes the Vix Reply interactive terminal. Native C++ snippet mode now behaves more like a real code editor, with syntax highlighting, automatic indentation, cursor-aware editing, additional keyboard shortcuts, and an initial optional Vi keymap.
\nThe release also fixes global installation for header-only packages that build command-line executables without declaring CMake runtime installation rules.
\nVix Note already supported Markdown, HTML, C++, and Reply cells, but those cell types were part of the application itself. Adding another language or specialized runtime required modifying the Note codebase, rebuilding the application, and maintaining the integration as part of the main project.
\nVix.cpp v2.7.7 changes that boundary.
\nA Note extension can now be published as a standard package through the Vix Registry. The package declares its Note contribution in its manifest, provides the required runtime when execution is needed, and becomes discoverable after installation. This gives extension authors a path to add languages, visualization tools, development utilities, and domain-specific cells without placing every integration inside Vix Note.
\nThe goal of the initial system is not to define every possible extension mechanism at once. It establishes the package format, discovery rules, execution protocol, management workflow, and compatibility model that later releases can extend.
\nVix packages can now declare a Note extension through the extensions.note manifest section.
The extension metadata describes how the package participates in Vix Note. It can declare an extension API version, capabilities, contributed cell types, runtime configuration, aliases, and required permissions. This information remains part of the package when it is published, installed, and recorded in the global package registry.
\nUsing the existing package system is an important part of the design. Extension authors do not need a separate distribution service or an unrelated installation format. A Note extension follows the same namespace, versioning, registry, publication, and installation model as other Vix packages.
\nThis also means the extension lifecycle fits into an existing Vix workflow: developers can search for packages, inspect their metadata, install them globally, and remove them using familiar commands.
\nVix Note now discovers extensions from three sources:
\nProject-local extensions take precedence over global extensions with the same contribution. This makes it possible for a project to select or develop a specific integration without changing the global environment used by other projects.
\nBuilt-in cell types remain protected. An installed package cannot silently replace the standard Markdown, HTML, C++, or Reply behavior by declaring the same type. This keeps the default Note environment predictable while still allowing external packages to add new cell types and capabilities.
\nThe existing built-in cells now pass through the same extension system used by external integrations. This avoids maintaining two unrelated execution paths and ensures that the extension architecture is exercised by the standard Note workflow itself.
\nTo inspect the extensions currently visible to Vix Note, use:
\nvix note --list-extensionsThe command includes built-in, project-local, and globally installed extensions after applying the normal discovery and precedence rules.
\nThe .vixnote document model can now preserve cell types that are not built into the application.
For example, a document containing a python cell can be loaded, saved, and exported without Vix Note rewriting the cell as an unknown built-in type or discarding its original contribution metadata. The cell remains part of the document even when its extension runtime is not currently available.
This distinction matters for portable notebooks. Opening a document on a machine without one of its extensions should not damage the document. Execution may be unavailable until the required package is installed, but the notebook structure and source content remain intact.
\nPreserving external cell types also allows documents to move between projects and machines while retaining the information needed to restore their original execution environment.
\nExecutable Note extensions can communicate with Vix Note through the vix-note-extension-1 JSON protocol.
The initial implementation uses a generic external runtime. Vix Note starts the configured extension process, sends a structured execution request, and reads the structured response produced by that process. The request can include information such as the cell identifier, cell type, source code, execution count, working directory, document path, extension identity, and extension version.
\nKeeping the protocol language-independent allows an extension runtime to be implemented with the language or toolchain that fits its purpose. The package remains a Vix package, while the process behind the extension can execute Python, invoke a compiler, communicate with another runtime, or transform the cell content.
\nThe current runtime model is intentionally simple: each execution starts a one-shot process. This provides a clear isolation boundary and is sufficient for the first external integrations. Persistent kernels and long-running extension sessions require additional lifecycle and protocol work and are not part of this release.
\nVix Note now exposes discovered extensions through:
\nGET /api/extensionsThe Note frontend uses this endpoint to determine which cell types are currently available. New cell types no longer need to be duplicated in a static frontend list before they can appear in the interface.
\nThe endpoint provides the contribution metadata required by the editor, including the available types and their associated extension information. The frontend can therefore adapt to the current environment after an extension is installed, enabled, disabled, or removed.
\nThis is also the foundation for future extension-aware editor behavior. A later extension may need more than a name in the cell selector, but dynamic discovery must exist before richer contributions can be introduced cleanly.
\nVix Note now includes an extension management interface.
\nThe interface separates built-in, installed, recommended, and registry extensions so developers can understand where a contribution comes from and whether it is already available in the current environment. An extension can be installed, uninstalled, enabled, or disabled without leaving Note.
\nEach extension also has a details page containing its runtime information and contribution metadata. This provides a place to inspect the cell types, capabilities, aliases, and execution configuration associated with a package before using it in a document.
\nDisabling an extension keeps the package installed while removing its contributions from the active Note environment. Uninstalling removes the installed package and its registered extension metadata. These are intentionally separate operations because temporarily disabling an integration should not require downloading it again later.
\nThe package publication workflow now understands Note extension metadata.
\nWhen vix publish processes a package containing an extensions.note section, it validates the extension declaration and preserves the metadata in the published package entry. Invalid extension declarations are rejected before they become part of the registry.
vix search also supports extension-specific filters:
vix search --extension note --jsonAvailable options include:
\n--extension\n--capability\n--type\n--jsonExtension searches do not require a text query. A developer can search by contribution type or capability when the package name is not known.
\nOrdinary text search continues to work:
\nvix search json --jsonGlobal package installation now preserves extension metadata in the global installation registry. This allows Vix Note to discover an installed extension without needing to inspect or reinterpret every package directory on each startup.
\nTogether, these changes connect the complete workflow: publication records the contribution, search exposes it, installation preserves it, and Vix Note discovers it.
\nVix Reply receives a substantial interactive terminal update in v2.7.7.
\nThe terminal now opens with a Vix-branded banner that identifies the Reply version, compiler, platform, exit shortcut, clear shortcut, and help command. Native C++ snippet mode has its own prompt so it is visually distinct from the regular Reply session.
\nThe most significant changes are inside the C++ editor. Earlier versions were primarily designed for appending text to the end of a line. The updated editor maintains an active cursor position and can insert or delete content in the middle of existing code.
\nLeft and right arrow keys now move across the complete input line. Home and End move to the beginning or end, while Delete removes the character at the cursor. Common terminal editing shortcuts are also supported:
Ctrl+A move to the beginning\nCtrl+E move to the end\nCtrl+U remove content before the cursor\nCtrl+K remove content after the cursorThese operations continue to work while syntax highlighting is active.
\nNative C++ snippet mode now applies real-time lexical highlighting while code is entered.
\nThe highlighter recognizes common C++ structures including preprocessor directives, included headers, keywords, built-in types, strings, numeric literals, comments, namespaces, macros, and function calls.
\nThe highlighting is lexical rather than compiler-backed. It improves readability and gives immediate visual structure to a snippet, but it does not attempt full semantic analysis, type resolution, or language-server diagnostics.
\nCompiler errors still come from the real compilation step. Vix Reply continues to present structured compiler diagnostics after execution rather than treating terminal highlighting as a replacement for the compiler.
\nColor output follows terminal capabilities. NO_COLOR is respected, and highlighting is disabled when Reply is running in a non-interactive environment where terminal color sequences would be inappropriate.
C++ mode now tracks block depth and applies automatic indentation when a new line is created inside braces.
\nEntering a closing brace automatically dedents the current line to the appropriate level. Tab and Shift+Tab can also indent or unindent the active code line manually.
The Tab key has different behavior inside native C++ mode than in the regular Reply prompt. It edits code indentation instead of opening command completion. This prevents the normal Reply completion menu from interrupting snippet editing.
Backspace understands indentation levels at the beginning of a line and can remove one level cleanly rather than deleting whitespace one character at a time.
\nThe editor also preserves the source as it was entered. Indentation is no longer removed before a snippet is stored or executed, and empty lines inside a snippet remain part of the source without being converted into indentation-only lines.
\nContinuation prompts now align with the first C++ input line, making multi-line functions and blocks easier to read in the terminal.
\nVix Reply now includes an initial Vi-style editing mode.
\nIt can be enabled with:
\nVIX_REPLY_KEYMAP=vi vixThe first version focuses on a small set of navigation and editing commands:
\nh move left\nl move right\n0 move to the beginning\n$ move to the end\nw move to the next word\nb move to the previous word\ni enter insert mode\na insert after the cursor\nI insert at the beginning\nA insert at the end\nx delete the current characterThis is not intended to provide complete Vim compatibility. It establishes the editor state model and the most useful navigation commands without making the initial implementation difficult to understand or maintain.
\nThe regular terminal keymap remains the default.
\nThis release fixes an installation problem affecting some header-only packages that also build a command-line executable.
\nA package may be header-only as a library while still defining an executable target for a developer tool. Some of these packages do not provide an explicit CMake rule such as:
\ninstall(\n TARGETS my_command\n RUNTIME DESTINATION bin\n)Previous versions of vix install -g could build the executable successfully but fail to place it in the Vix global binary directory because the CMake install step had no runtime target to install.
Vix now detects the generated executable in this case and copies it into:
\n~/.vix/global/binWhen that directory is present on PATH, the command becomes available immediately.
Packages that already provide correct install(TARGETS ...) rules continue to use the standard CMake installation process. The fallback is used only when the package produces an executable but does not install it itself.
The vix note launcher now prefers installed frontend assets over stale assets left in a build directory.
This fixes cases where the executable had been updated but Note opened an older frontend from a previous local build. Installed deployments now resolve the assets associated with the installed version before considering development build-tree locations.
\nThe change keeps the application code and interface version aligned when Vix is installed or upgraded.
\nThe extension system was validated across discovery, package management, document storage, frontend integration, and external execution.
\nThe Vix Note module and Vix CLI were built successfully with the new extension infrastructure. Built-in extensions were discovered through vix note --list-extensions, and the install, enable, disable, and removal workflows were exercised through the extension manager.
Custom cell preservation was tested with Python cells by loading, saving, and reopening .vixnote documents. The /api/extensions endpoint was verified against the active extension registry, and execution was tested through a temporary external runtime implementing the vix-note-extension-1 protocol.
Registry search behavior was verified with both extension-aware and normal queries:
\nvix search --extension note --json\nvix search json --jsonThe global installation fallback was tested with:
\nvix install -g gaspardkirira/cli_test\ncommand -v cli_test\ncli_test chain 5A regression test now covers global installation of a header-only package that produces a CLI executable without CMake runtime installation rules.
\nThe complete Vix project was also built with the updated Reply module. Interactive verification covered syntax highlighting, automatic indentation, closing-brace dedentation, Tab, Shift+Tab, Backspace, arrow-key navigation, Home, End, Delete, and insertion in the middle of an existing line.
Native C++ snippet execution and structured compiler diagnostics were tested after the editor changes. The optional Vi keymap was verified with VIX_REPLY_KEYMAP=vi, and the updated Reply code builds without unused-function warnings.
Existing Markdown, HTML, C++, and Reply cells remain available. Their implementation now passes through the extension architecture, but the normal notebook workflow does not require users to install separate packages for these built-in types.
\nExisting .vixnote documents remain compatible. Documents can also contain external cell types without losing them when the corresponding extension is missing.
Registry packages that do not declare Note extensions continue to use the normal package workflow. Packages with valid extensions.note metadata gain the additional search, discovery, and management behavior introduced in this release.
The global installation fix does not replace standard CMake installation rules. Packages with an explicit runtime installation target continue to follow their existing install process.
\nExternal extension runtimes currently use one-shot processes. A new process is created for each execution, so the system does not yet provide persistent language kernels or reusable interactive sessions.
\nExternal process execution is currently available on POSIX platforms. On Windows, Vix Note reports an explicit unsupported runtime error rather than attempting an incomplete execution path.
\nInteractive permission prompts are not yet implemented. The manifest can describe permissions, but a complete user approval and permission persistence workflow will require additional work.
\nExtensions cannot yet provide frontend JavaScript, load through a native C ABI, or request an automatic local runtime build. These areas require stricter isolation, compatibility, and lifecycle rules before they can be supported safely.
\nAdditional end-to-end CTest coverage is also planned for the complete extension lifecycle.
\nVix Reply highlighting remains lexical and does not replace compiler-backed semantic tooling. The optional Vi keymap provides an initial focused command set rather than full Vim behavior.
\nVix.cpp v2.7.7 gives Vix Note an extension boundary that fits the rest of the Vix ecosystem.
\nExtensions are ordinary packages. They can be published through the Vix Registry, discovered from local or global installations, managed from the Note interface, and executed through a language-independent protocol. Custom cell types remain part of the document even when their runtime is unavailable.
\nThe Reply update improves a different part of the workflow: writing and testing native C++ directly in the terminal. Cursor-aware editing, highlighting, indentation, keyboard shortcuts, and the initial Vi mode make snippet entry more practical without changing the underlying compile-and-run model.
\nTogether with the global CLI installation and Note asset fixes, the release makes Vix more extensible while improving the reliability of the tools developers already use.
\n'; +const v2_7_7 = { + html +}; +export { + v2_7_7 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.8-C8-MN9er.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.8-C8-MN9er.js new file mode 100644 index 000000000..e638960c4 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.7.8-C8-MN9er.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.7.8 introduces first-class support for moving packages between repositories, namespaces, and package names without abandoning their existing registry history.
\nA package can now continue under a new identity while preserving its published versions, documentation, maintainers, keywords, and repository information. The previous package remains in the registry as a deprecated entry that points developers and package commands toward its replacement.
\nThis release also completes the migration workflow across vix publish, vix add, vix outdated, and vix update. Package moves are no longer only registry metadata; they are understood throughout dependency installation, lockfile generation, version checks, and project updates.
Alongside the registry work, vix publish can now create its registry pull request automatically, dependency-only workspace packages can be published without public headers, and vix build once again supports Vix installations discovered through normal CMake mechanisms when no compatible managed SDK profile is available.
Package identities sometimes need to change.
\nA project may move from a personal namespace to an organization, split one repository into several packages, adopt clearer package names, or transfer ownership to a new team. Before v2.7.8, such a change usually required publishing a separate package and manually explaining that the previous identity should no longer be used.
\nThat approach loses continuity. Existing users may continue installing the old package, dependent projects may retain obsolete identifiers, and the registry presents the replacement as an unrelated project even when both packages share the same source history.
\nVix.cpp v2.7.8 treats these changes as migrations rather than independent publications.
\nThe registry records the relationship between the previous and replacement identities. Package commands follow that relationship when resolving dependencies, and project manifests are updated to use the replacement package rather than keeping both names in the dependency graph.
\nThe result is a package move that remains visible and traceable without requiring users to reconstruct the relationship manually.
\nvix publish can now detect when an existing registry package has moved to a different repository location, namespace, or package name.
For example, a package previously published as:
\nsoftadastra/kordex-runtimecan continue as:
\nkordexjs/runtimeThe replacement entry preserves the package history associated with the original project, including:
\nThe previous package is not removed from the registry. It is marked as deprecated and receives a movedTo field pointing to the replacement identity. The replacement package receives a corresponding migratedFrom field.
This keeps old links and package references meaningful. A developer who encounters the previous package can still understand where the project moved, while new installations can resolve directly to the maintained identity.
\nPackage moves are detected using repository identity and shared Git history.
\nRepository URLs alone are not sufficient because repositories themselves can move between owners or organizations. Package names are also not sufficient because a project may deliberately change its namespace or split its publication layout.
\nBy considering both repository identity and Git history, vix publish can distinguish a real project migration from an unrelated package that happens to use similar metadata.
When a move is detected, the publication workflow prepares both sides of the migration:
\nThe migration remains part of the normal registry review process. It is represented as a clear change to the registry rather than an invisible redirect controlled only by the CLI.
\nvix publish now creates the registry pull request after pushing the publication branch.
Earlier versions could prepare and push the registry change while still requiring the developer to open the pull request separately. The command could also report a successful publication even when no pull request had been submitted, leaving the registry change incomplete.
\nThe updated workflow performs the complete submission sequence. After the branch is pushed, Vix checks for an existing pull request associated with that branch. If one already exists, it is reused. Otherwise, the command creates a new pull request and displays its URL.
\nThe pull request URL is also included in JSON output, allowing scripts and other tools to track the registry submission without parsing terminal text.
\nFor package migrations, the pull request title and description identify both package IDs. This makes the proposed move understandable during review without requiring maintainers to inspect the registry files individually.
\nPublication now fails clearly when the pull request cannot be created. This includes cases where the GitHub CLI is unavailable, gh is not authenticated, or GitHub rejects the pull request request.
A pushed branch without a corresponding registry pull request is therefore no longer reported as a completed publication.
\nvix addvix add now follows the movedTo relationship when a project requests a package that has been migrated.
For example:
\nvix add softadastra/kordex-runtimecan resolve to:
\nreplaced: softadastra/kordex-runtime -> kordexjs/runtimeThe replacement is not added beside the previous dependency. Vix removes the old identity and writes the new package ID into the project configuration.
\nThis applies to dependencies declared in both vix.json and module manifests using vix.module. The old dependency tree is removed before the lockfile is regenerated, preventing packages reachable only through the previous identity from remaining in vix.lock.
The final project state contains the replacement package and the dependency tree required by that replacement.
\nThis behavior is important for direct migrations, but it also applies when an old package appears through another dependency. The resolver can follow package moves while constructing the graph instead of treating the deprecated and replacement identities as separate packages.
\nvix outdatedvix outdated now reports package migrations separately from ordinary version updates.
A moved package is not considered current merely because the last version published under its old identity matches the installed version. The command follows movedTo, reads the available versions from the replacement package, and compares the project against the package that is still maintained.
The terminal output identifies the replacement:
\nmoved -> kordexjs/runtimeJSON output includes the migration state through the moved and moved_to fields.
This distinction allows developers and automation to separate two different maintenance tasks. An ordinary outdated package needs a version update under the same identity. A moved package requires the project to adopt a different package ID, potentially alongside a newer version.
\nvix updatevix update can now apply the package identity change directly.
When an old dependency is encountered, the command updates vix.json to use the replacement identity and regenerates vix.lock from the new package graph. Versions and hashes are then read from the replacement lockfile entry rather than from the package ID that was removed during migration.
Migration reporting is also available in dry-run and JSON modes. A project can therefore inspect the planned identity changes before modifying its manifest or consume the migration result through tooling.
\nThe update workflow keeps the manifest and lockfile aligned. It does not leave the previous package name in vix.json while resolving the replacement internally, because that would cause the migration to be repeated on every update and would make the declared project state misleading.
This release fixes a migration issue where both the previous and replacement package IDs could remain in the project after a move.
\nThat state was especially problematic when the two identities exposed overlapping dependencies. The lockfile could contain duplicate branches, retain transitive packages that were no longer needed, or make it appear that the project intentionally depended on both versions of the same package.
\nVix now removes the previous dependency tree before resolving the replacement.
\nAfter migration, vix.json and vix.lock contain only the replacement identity and the packages required by its current dependency graph.
Registry version selection now uses semantic version comparison instead of lexical string ordering.
\nLexical ordering compares version text character by character, which can produce incorrect results for versions such as:
\n2.9.0\n2.10.0Under string ordering, 2.9.0 may appear greater because the comparison does not understand version components. Semantic version comparison correctly treats 2.10.0 as the newer release.
This affects package resolution after migrations as well as normal registry operations. When Vix follows a moved package to its replacement, it now selects versions according to their semantic meaning rather than their textual representation.
\nvix publish now supports dependency-only workspace packages.
A workspace package can declare:
\n{\n "type": "workspace"\n}Unlike a library package, a workspace package does not need to expose public headers. Its purpose is to group related dependencies under one package identity so that a complete toolchain, framework distribution, or project environment can be installed as a unit.
\nFor example, a workspace package may depend on runtime, bindings, standard library, and command-line packages without containing a C++ library of its own.
\nHeader validation remains active for packages that publish source code or libraries. The workspace type only changes validation where public headers would not represent the role of the package.
\nThis distinction allows the registry to support aggregate packages without weakening the validation applied to normal C++ packages.
\nvix buildManaged SDK profiles remain the preferred way to provide a consistent Vix development environment, but they are no longer required for every project that uses Vix.
\nVix can be installed in several valid ways. A developer may use a managed SDK under ~/.vix/sdk, a system package, a local source installation, a custom installation prefix, or an existing Vix installation created before SDK profiles were introduced.
CMake already has established mechanisms for discovering these installations, including:
\nVix_DIR;CMAKE_PREFIX_PATH;Previous CLI behavior could stop the configuration before CMake ran when a compatible managed profile was not installed. This prevented projects from using otherwise valid Vix installations that CMake could discover normally.
\nVix.cpp v2.7.8 changes that selection process.
\nWhen a complete and compatible managed profile set is available, vix build continues to use it automatically. When no suitable managed profile exists, the CLI preserves the project environment and allows normal CMake package discovery to proceed.
A missing managed profile is therefore no longer treated as proof that Vix is unavailable.
\nProjects using Vix outside ~/.vix/sdk no longer need to run:
vix upgrade --sdk defaultsimply to pass the CLI configuration stage.
\nA project can use a system installation:
\ncmake -S . -B buildor provide an explicit prefix:
\nvix build -- \\\n -DCMAKE_PREFIX_PATH=/opt/vixIt can also rely on an existing Vix_DIR, a package-manager toolchain, or another CMake discovery mechanism already used by the project.
The CLI does not attempt to replace those environments with an incomplete managed profile. It selects the managed SDK only when the profile set is complete and compatible with the requested build.
\nThis preserves the benefits of managed profiles while keeping Vix compatible with normal CMake projects and installations created by earlier releases.
\nThe publication workflow now verifies that the registry pull request was actually created or found before reporting success.
\nFailures from the GitHub CLI are surfaced directly. The developer receives a clear error when gh is missing, authentication is unavailable, or pull request creation fails for another reason.
Existing pull requests for the same publication branch are reused rather than duplicated. This is useful when a publication command is repeated after a partial failure or when the registry branch was pushed before the pull request step completed.
\nThe resulting output now represents the real registry state: a publication is complete only when its review request exists.
\nvix update previously regenerated the lockfile using the replacement package identity but could still attempt to read version and hash information through the previous package ID.
Because the old entry no longer existed in the regenerated lockfile, the command could fail after successfully performing the migration itself.
\nThe update workflow now follows the resolved identity throughout the complete operation. Once a dependency has moved, lockfile lookup, version reporting, and hash reporting all use the replacement package ID.
\nDependency-only workspace packages were previously rejected because the publication validator expected every package to contain public headers.
\nThat rule is appropriate for libraries, but not for an aggregate package whose entire purpose is to declare a group of dependencies.
\nValidation now considers the package type. Workspace packages can be published without public headers, while source and library packages continue to require the files expected by their publication model.
\nPackage migration was validated through the Kordex namespace move:
\nsoftadastra/kordex-runtime -> kordexjs/runtime\nsoftadastra/kordex-bindings -> kordexjs/bindings\nsoftadastra/kordex-std -> kordexjs/std\nsoftadastra/kordex-cli -> kordexjs/cli\nsoftadastra/kordex -> kordexjs/kordexThis migration covered both individual packages and a workspace package that aggregates the complete Kordex environment.
\nPublication tests verified that Vix could identify the shared repository history, preserve the existing registry metadata, create the replacement entries, deprecate the previous identities, and submit the registry pull requests automatically.
\nDependency tests covered old package IDs in vix.json, dependencies declared through vix.module, direct dependencies, and packages reached transitively. After migration, the resulting manifests and lockfiles contained only the replacement identities and their required dependency trees.
The vix outdated and vix update workflows were tested in terminal, dry-run, and JSON modes. These checks verified that version information was read from the replacement package and that migration details remained available to scripts.
Workspace publication was validated with packages that provide dependency aggregation without public headers.
\nSDK discovery was tested with managed profiles, system installations, local installations, custom prefixes, and Vix installations created before managed SDK profiles were introduced. A complete Vix project was also built with the updated CLI module to verify that the fallback to normal CMake discovery did not interfere with standard managed SDK builds.
\nExisting packages do not need to declare migration metadata manually. Packages that have not moved continue to use the normal publication and resolution workflow.
\nOld package identities remain present in the registry after migration, so existing references can still produce a meaningful result. Package commands redirect those references to the replacement, while the registry preserves the historical relationship between both names.
\nProjects using current package IDs are unaffected. Projects using old identities can migrate through vix add or vix update, and vix outdated can report the move before any project files are changed.
Workspace packages introduce an additional package type without changing validation for libraries and source packages.
\nManaged SDK profiles also remain supported. The discovery change only affects the case where a complete compatible profile is unavailable. In that situation, Vix now allows CMake to use the environment already provided by the project or system.
\nVix.cpp v2.7.8 gives package identity changes a complete workflow across the registry and CLI.
\nA project can move to a new repository, namespace, or package name while preserving its published history. The registry records both sides of the move, publication creates the required pull request, and package commands update projects to use the maintained identity without retaining duplicate dependencies.
\nWorkspace packages extend the registry to dependency-only package groups, while semantic version ordering makes version selection reliable for both migrated and ordinary packages.
\nThe SDK discovery changes address a separate compatibility problem. Managed profiles remain available when they are complete, but projects using system, local, custom-prefix, package-manager, or legacy Vix installations can once again rely on normal CMake discovery.
\nTogether, these changes make package moves explicit, reviewable, and practical without narrowing the ways developers can install and build with Vix.
\n'; +const v2_7_8 = { + html +}; +export { + v2_7_8 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.8.3-fnMXoBpX.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.8.3-fnMXoBpX.js new file mode 100644 index 000000000..dbb0c934b --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.8.3-fnMXoBpX.js @@ -0,0 +1,8 @@ +const html = 'vix.cpp v2.8.3 is the first stable and supported release of the v2.8 line.
\nversions v2.8.0, v2.8.1, and v2.8.2 were published while release and distribution problems were still being resolved. they remain in the project history for traceability, but they should not be used as production releases. developers using an earlier v2.8 build should move to v2.8.3.
\nthe main change in v2.8 is the introduction of vix::realtime, a transport-independent runtime for authoritative stateful applications. it provides the application model needed for rooms, commands, events, logical sessions, snapshots, replay, reconnection, presence, and persistence without tying those concepts to a particular network transport.
this release is the point where that architecture is delivered as the supported v2.8 release.
\nrealtime applications often begin with a websocket connection and quickly grow beyond it. once several clients share state, the difficult part is no longer opening a socket. the application needs one authoritative version of that state, a defined order for mutations, a way to recover after a process restart, and enough session information to reconnect a client without losing consistency.
\nvix::realtime moves those responsibilities into a dedicated runtime.
applications define their room state and command handling logic. vix manages the execution boundary around that logic: commands are serialized, accepted state changes become authoritative events, events can be persisted, snapshots can be created, rooms can be restored, and logical sessions can continue across network reconnections.
\nthe runtime is deliberately separate from websocket. a websocket adapter is available, but rooms, sessions, replay, persistence, and state recovery belong to the realtime model itself rather than to one transport implementation.
\na realtime room owns one authoritative application state.
\ninstead of allowing multiple connections to mutate shared state independently, commands enter one serialized execution path. this gives the room a clear ordering model and prevents concurrent command handling from producing conflicting versions of the same state.
\napplications remain responsible for the state they want to model. a room can represent a game world, collaborative document, chat room, shared dashboard, presence space, or another application-specific domain. vix provides the lifecycle and consistency machinery around that state without defining what the state itself must contain.
\nrooms can be opened and closed explicitly, created from application-defined factories, joined by logical sessions, and configured with limits for command queues, memberships, snapshots, and inactive-room cleanup.
\nstate changes begin as commands.
\na command carries the information required to identify the room, session, request, expected room version, payload, metadata, and creation time. the room handler decides whether that command is valid and which events should result from it.
\naccepted events receive authoritative identifiers and room versions before they are persisted and applied to state. this ordering is important because persistence, replay, recovery, and client synchronization all need to refer to the same sequence of state transitions.
\nevents can be delivered to the entire room, only to the sending session, to every session except the sender, or to a selected set of sessions. audience selection is part of the realtime model, while the actual delivery remains the responsibility of the active transport adapter.
\nthis keeps application state deterministic without forcing every event to be broadcast in the same way.
\nlong-lived rooms cannot depend only on in-memory state.
\nvix::realtime can create snapshots automatically after a configured number of events, explicitly when requested, or when a room is closed. a configurable number of recent snapshots can be retained so the persistence layer does not have to keep every historical state representation.
recovery follows one consistent sequence. vix loads the latest available snapshot, restores its state and schema information, replays events created after that snapshot, restores the current room version and event position, then allows new commands to continue from the recovered point.
\nif no snapshot exists, the runtime can rebuild the room from its persisted event history.
\nthe important property is that recovery uses the same events that originally changed the room. restoring the same persisted history therefore produces the same authoritative state and room version, and reopening a room does not duplicate events that were already stored.
\nnetwork connections are temporary. application sessions usually are not.
\nthe realtime runtime therefore separates a logical session from the socket or transport connection currently carrying its messages. a session has a stable identifier, identity and metadata, room memberships, connection attachment state, a resume token, and acknowledgement positions for the rooms it has joined.
\na temporary connection loss does not immediately destroy that logical state.
\nwhen the client reconnects, the runtime can validate the resume token, attach the new connection, restore memberships, and determine which room events the client has not yet acknowledged.
\nthis model avoids making tcp or websocket connection lifetime the source of truth for application identity.
\na resumed session can continue from its last acknowledged event position.
\nif the missing range is small enough, vix replays the events that were persisted while the client was disconnected. a session can maintain a different acknowledgement position for each room, which matters when one client participates in several independent realtime spaces.
\nwhen the client is too far behind for bounded replay, the runtime can fall back to a snapshot. the client receives the latest available room snapshot, the events created after that snapshot, and the final replay position.
\nthis keeps reconnection practical even for rooms with long histories. a stale client does not need to replay every event that has ever existed before it can become current again.
\npresence is modeled separately from room state.
\nthe initial runtime includes local presence tracking for sessions inside rooms. presence records can carry identity, node ownership, connection information, metadata, heartbeat timestamps, and lifecycle state.
\na session can be present, temporarily detached, or explicitly left. expiration and stale-record cleanup make it possible to distinguish a short connection interruption from a session that should no longer appear in the room.
\nkeeping presence separate from application state also avoids forcing every room implementation to rebuild the same connection-awareness logic.
\nroommanager coordinates the runtime-level relationship between rooms, sessions, stores, presence, factories, and command routing.
it can register room factories, open and locate rooms, create and find logical sessions, join and leave memberships, attach and detach transport connections, route commands, enforce configured limits, clean up inactive rooms, and participate in controlled runtime shutdown.
\nthe module also introduces room directory and ownership abstractions. an active room can be associated with the node responsible for its authoritative execution.
\nthe first release still focuses on the local runtime, but separating room identity from node ownership provides the boundary needed for future multi-process and distributed routing.
\npersistence is exposed through interfaces rather than being embedded directly in room implementations.
\nthe realtime runtime defines stores for room events, room snapshots, and presence records. the initial implementation includes in-memory event and snapshot stores, along with local in-memory presence storage.
\nan application can therefore begin with a completely local runtime and later replace the persistence layer without changing its room state or command handlers.
\noptional postgresql event and snapshot stores are also available. postgresql support is independent from the transport layer, so persistent rooms do not require websocket and websocket applications do not require postgresql.
\nvix::realtime can be used without websocket support.
for applications that do use vix::websocket, v2.8 adds an adapter between the transport and the realtime runtime. the adapter handles the connection-facing parts of the protocol, including session opening and resumption, room joins and leaves, command forwarding, event delivery, acknowledgements, protocol errors, and connection backpressure.
the separation is intentional. websocket answers how messages move between a client and server. the realtime runtime answers how shared application state is ordered, persisted, recovered, and associated with logical sessions.
\nkeeping those responsibilities distinct allows another transport to reuse the same room and session model later.
\nthe module includes a versioned protocol envelope for communication between realtime clients and servers.
\nthe protocol covers session opening and resumption, room membership, commands, command acceptance and rejection, events, snapshots, acknowledgements, replay completion, presence updates, ping and pong messages, protocol errors, and server draining notifications.
\nprotocol parsing includes version checks and structured errors so malformed or incompatible messages can be rejected at the boundary before they reach application room logic.
\napplications that do not need the provided transport protocol can still use the underlying room runtime independently.
\nthe stable module entry point is:
\n#include <vix/realtime.hpp>advanced apis remain available through module-specific headers:
\n#include <vix/realtime/...>the public cmake targets are:
\nvix_realtime\nvix::realtimethe realtime module also has standalone package metadata under:
\nvix/realtimeits first standalone module version is 0.1.0.
this keeps the realtime runtime usable both as part of the complete vix sdk and as a module with its own package boundary.
\nfour examples are included to exercise the runtime through complete application flows rather than isolated api calls.
\nthe counter example demonstrates commands, deterministic events, automatic snapshots, state restoration, and continued room versions after recovery.
\nthe shared-room example uses multiple sessions against one authoritative state and shows room membership together with room-wide event delivery.
\nthe chat example adds persistent messages, room history, snapshots, and restoration.
\nthe reconnect example exercises acknowledgements, temporary disconnection, resume-token validation, missing-event replay, snapshot fallback, and restoration of the final authoritative state.
\nthese examples are useful because they test the boundaries between features. reconnection depends on sessions, acknowledgements, persistence, replay, and room state all agreeing on the same history.
\nthe first three v2.8 tags should be treated as superseded release attempts.
\nv2.8.0 introduced the new realtime architecture, but the release line still had distribution and packaging problems. v2.8.1 and v2.8.2 continued the stabilization work, including fixes to standalone module dependencies, but they were not accepted as stable releases.
\nfor that reason, the supported v2.8 line begins with v2.8.3.
\nthe older tags remain available because removing them would erase useful release history and make existing references harder to understand. their presence should not be interpreted as a recommendation to install them.
\nif a machine or ci environment is pinned to v2.8.0, v2.8.1, or v2.8.2, update that pin to v2.8.3.
\nthe realtime module has dedicated strict ci coverage across gcc and clang, debug and release configurations, websocket-enabled and transport-independent builds, examples, sanitizers, compiler warnings, static analysis, memory checks, postgresql store compilation, package metadata, and cmake package contracts.
\nthe test suite covers identifiers, commands, events, protocol parsing and round trips, room state, persistence stores, snapshot policy, sessions, presence, room lifecycle, command backpressure, ownership, room management, the websocket adapter, resume tokens, reconnection replay, snapshot fallback, and complete realtime session flows.
\nthe four runtime examples were also executed as part of validation:
\ncounter\nshared_room\nchat\nreconnectthe recovery tests verify monotonic room versions and event identifiers, event persistence, automatic snapshots, restoration after snapshots, full replay when no snapshot exists, continued execution after recovery, replay from acknowledged positions, and snapshot fallback for stale clients.
\nthe release was also checked through the standalone module and packaged-runtime paths so that the supported tag represents more than a successful source-tree build.
\nvix::realtime is a new module and does not replace the existing websocket runtime.
applications that only need websocket messaging can continue using vix::websocket directly. applications that need authoritative state, session recovery, replay, or persistent rooms can place the realtime runtime above the transport layer and use the websocket adapter when appropriate.
postgresql support remains optional. in-memory stores are available for local applications, tests, and simpler deployments.
\nthe public realtime umbrella header and cmake targets provide the stable entry points. lower-level headers remain available for applications that need more direct control over stores, protocols, sessions, or room management.
\ndo not use v2.8.0, v2.8.1, or v2.8.2 for a new installation.
\nexisting users of one of those versions should move to v2.8.3 and verify the installed version with:
\nvix --versionprojects using the realtime module should also rebuild against the v2.8.3 sdk or package set rather than carrying binaries or generated build state from one of the superseded releases.
\nvix.cpp v2.8.3 establishes the supported foundation for stateful realtime applications in vix.
\nthe new vix::realtime module gives shared application state an explicit execution and recovery model: rooms serialize commands, accepted changes become deterministic events, snapshots bound recovery cost, logical sessions survive temporary connection loss, acknowledgements define replay positions, and persistence remains replaceable behind store interfaces.
websocket is available as an adapter rather than being the architecture itself, and postgresql can be added when persistent room history is required.
\nmost importantly for the v2.8 release line, v2.8.3 is the version developers should actually install. v2.8.0, v2.8.1, and v2.8.2 remain in history as superseded release attempts; v2.8.3 is the first stable and supported v2.8 release.
\n'; +const v2_8_3 = { + html +}; +export { + v2_8_3 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.8.4-D4HeF3Zi.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.8.4-D4HeF3Zi.js new file mode 100644 index 000000000..2056f11d5 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.8.4-D4HeF3Zi.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.8.4 focuses on the part of development that is repeated most often: edit, build, run, change a file, and build again.
\nThe release reduces unnecessary compiler work in Vix public headers, improves the way standalone programs and full projects reuse previous build state, and brings vix build, vix run, and vix dev closer to one consistent execution model. It also tightens cache invalidation, improves diagnostics, and avoids consuming every available hardware thread during normal builds.
The result is not a new application model or a new module. It is a refinement of the development loop itself, with most of the work aimed at making common C++ workflows faster without hiding the information developers need when something goes wrong.
\nC++ build performance is affected by more than the compiler command that eventually runs.
\nA public header can force large implementation dependencies into every translation unit. A cache can save time when its inputs are correct, but create confusing behavior when dependency tracking is incomplete. A development watcher can rebuild quickly while still feeling slow if it performs redundant validation, restarts twice for one change, or floods the terminal with internal state.
\nv2.8.4 addresses these problems together.
\nThe public API has been made lighter where implementation details did not need to be visible. Standalone C++ execution keeps a direct compilation path when possible, while code that depends on compiled Vix libraries uses the CMake-backed path needed for correct linkage. Build caches now track source and header content more carefully, and the watch paths used by vix dev and vix build --watch share more of the same underlying behavior.
The goal is simple: unchanged work should not be repeated, changed work should invalidate the right artifacts, and the terminal should make it clear what Vix is doing.
\nvix build experiencevix build now uses one compact live build presentation across native builds, graph-executor builds, and CMake/Ninja builds.
The normal command remains:
\nvix buildVerbose mode uses the same presentation instead of switching to a different build experience:
\nvix build -v-v adds useful toolchain and build information while preserving the higher-level Vix output. Developers who need Vix's own structured diagnostics can use:
vix build --debugRaw CMake, Ninja, and compiler output remains available through:
\nvix build --cmake-verboseBuild logs can also be inspected directly:
\nvix build --logThis separation keeps the default build readable without removing access to the lower-level tools. Normal development can stay concise, while build-system investigation still has an explicit path to the complete output.
\nThe build command now exposes clearer controls for selecting native and cross-compilation environments.
\nThe host platform can be selected explicitly with:
\nvix build --target nativeAvailable native and cross toolchains can be inspected with:
\nvix build --targetsTarget toolchains can also receive an explicit sysroot through --sysroot.
These options make target selection visible at the Vix CLI level rather than relying entirely on implicit toolchain state. They do not replace CMake toolchains, but give the build command a clearer way to participate in cross-platform configuration.
\nA significant part of the work in v2.8.4 is below the CLI.
\nVix public headers previously exposed more implementation detail than many applications needed. Including a high-level type could indirectly pull router internals, HTTP server implementation, request handling, runtime execution details, Asio types, JSON-heavy configuration code, or logging implementation into user translation units.
\nThat increases parsing and template work even when an application only uses a small part of the public API.
\nThe App interface has now been decoupled from several of those implementation details. Router, HTTP server, request handler, runtime executor, and Asio internals are no longer exposed unnecessarily through the main application surface.
The core umbrella path has also been reduced. Including <vix.hpp> no longer means importing advanced HTTP and router implementation headers that are unrelated to the code being compiled.
JSON-heavy Config implementation has been moved out of headers where possible. Response implementation follows the same direction, logger internals no longer expose spdlog throughout user translation units, and RuntimeExecutor lifecycle implementation is kept outside application translation units where the public API does not require it.
These changes preserve common public workflows such as GET routes, POST JSON handling, middleware, configuration, logging, and runtime executors. The change is primarily about reducing what the compiler must see to use those APIs.
\nvix run now distinguishes more carefully between standalone C++ programs that can use direct compilation and programs that require compiled Vix runtime functionality.
A simple file can continue through the lightweight path:
\nvix run test.cppWhen the source requires compiled Vix libraries, Vix uses the CMake-backed path so that the program receives the correct targets, libraries, and transitive linkage.
\nThis avoids two opposite problems: forcing every small script through a full project build, or trying to compile a program directly when its dependencies require the compiled Vix runtime.
\nWarm executions reuse validated build state and compiled artifacts. When neither the source nor one of its relevant dependencies has changed, an unchanged script can run without invoking the compiler or linker again.
\nLocal and transitive dependencies remain part of validation, so the faster path does not treat the top-level source file as the only input that matters.
\nvix run controlsRuntime options that were previously driven mainly through internal configuration or environment variables are now exposed as documented CLI controls.
\nThe command supports:
\n--ui / --no-ui\n--env-hint / --no-env-hint\n--trace-cache / --no-trace-cache\n--compiler-fingerprint <fast|strict>These options make runtime behavior easier to reproduce from a command line or CI script.
\nThe compiler fingerprint mode is particularly useful when choosing how aggressively cached compilation state should be reused. The default development path can remain fast, while stricter validation is available when the environment or toolchain needs to be checked more carefully.
\nA fast cache is only useful when its invalidation rules are trustworthy.
\nScript caching now tracks source files together with local and transitive headers by content. Editing a header that affects a standalone program invalidates the relevant build even when the top-level .cpp file is unchanged.
The reverse case is also important: touching a file without changing its contents should not force compilation simply because its timestamp changed.
\nv2.8.4 uses content-aware dependency information to distinguish those cases more reliably.
\nFailed compilations are not stored as successful cache states, and compiled dependency graphs are rebuilt only when their inputs require it. Previously compiled source states can also be restored efficiently through the compiler cache when development moves back to code that has already been built.
\nThis makes the cache useful during real editing patterns rather than only during repeated execution of an untouched file.
\nvix dev for standalone filesThe standalone development loop has been simplified around the information a developer normally needs: what is being watched, whether the rebuild succeeded, how long it took, and what the program printed.
\nA normal session can now look like:
\nWatching test.cpp\nHello, world\nRebuilt test.cpp in 488ms\nHello, worldInternal reload messages, absolute paths, process identifiers, and build-system detail are no longer printed by default when they do not help explain the rebuild.
\nFast recompilations also avoid showing progress UI that lasts longer than the work itself. When a rebuild completes, its duration is reported directly and application output follows without unnecessary blank lines.
\nThe watcher tracks both the source and its transitive headers. One relevant change results in one rebuild and restart rather than several reactions to the same edit.
\nA failed build does not leave the development session in a broken state. Once the source is corrected, the watcher can rebuild and start the program again normally.
\nFull Vix projects keep the project-level development experience, but rebuild timing now reflects the real build duration.
\nFor example:
\nDev shop (dev)\n\n changed: src/main.cpp\n\n build [============================] done\n\n ✔ Rebuilt in 7.3s · Started pid=49809The project path still has more work to perform than a standalone file, so it retains the build progress and process information that are useful for a running application.
\nThe important change is that vix dev and vix build --watch now follow the same underlying build behavior instead of evolving as separate rebuild systems. Cache decisions, source changes, dependency handling, and build execution are therefore less likely to disagree depending on which watch command is used.
Using every hardware thread is not always the fastest development experience.
\nA large parallel C++ build can saturate the machine, increase memory pressure, and make the editor, browser, terminal, or other development tools noticeably less responsive.
\nAutomatic parallelism now keeps part of the machine available instead of assuming that every detected hardware thread should be occupied by compilation.
\nThe recommendation adapts to the available CPU resources. Developers who want a specific level of parallelism can still override it explicitly with --jobs.
This changes the default, not the control available to experienced users.
\nThe distinction between direct standalone compilation and compiled Vix functionality exposed several cases where a source file could compile but fail at link time because required implementations lived in Vix libraries rather than in headers.
\nv2.8.4 fixes that boundary.
\nPrograms that depend on compiled Vix components now use a build path that has access to the correct generated CMake targets and their transitive dependencies. The direct path remains for programs that can genuinely be compiled as standalone translation units.
\nLinker errors have also been made clearer when an implementation or required library is still missing, so failures point toward the linkage problem rather than appearing as an unrelated cache or script error.
\nVix can now be consumed more reliably directly from the current build tree.
\nLocal build-tree CMake package exports have been corrected so a project can resolve the Vix targets produced by the current source build without silently falling back to an installed runtime.
\nThis matters when developing Vix itself, testing changes against another local project, or validating an installation before publishing it.
\nReducing transitive public includes also exposed headers that had been relying on unrelated includes to compile. Those direct dependencies have been corrected so public headers remain self-contained under the lighter include model.
\nSeveral fixes in this release address cases where valid reusable build state existed but was ignored, or where stale state was accepted when it should have been invalidated.
\n--fast builds now reuse compatible configuration state correctly.
Graph-executor builds are no longer bypassed by unrelated cache paths, and generated CMake targets used for script builds are handled consistently.
\nStandalone script execution avoids redundant cache validation, while transitive compiled dependencies are rebuilt when one of their relevant inputs changes.
\nBuild-log lookup has also been corrected when a build directory is passed explicitly, so vix build --log resolves the log associated with the selected build instead of relying on unrelated default state.
Runtime startup now distinguishes more carefully between starting a process and successfully starting a server.
\nREADY is emitted only after startup has actually succeeded.
Port configuration is propagated correctly, and bind failures are returned through the normal error path rather than allowing the process to appear ready before the listening socket exists.
\nThis is especially important for development tooling and automation that uses startup output as a signal that the application can receive requests.
\nv2.8.4 separates normal build output from diagnostic depth more clearly.
\nThe default build remains compact. -v adds useful Vix-level information, --debug exposes structured internal diagnostics, and --cmake-verbose provides the raw output from the underlying CMake, Ninja, and compiler tools.
This means a developer can increase detail according to the problem being investigated instead of choosing between an overly quiet command and an uncontrolled stream of build-system output.
\nLink failures, cache decisions, build-path selection, and startup failures now have clearer places in that diagnostic model.
\nThe release was validated across standalone C++ files, complete Vix projects, direct script compilation, CMake-backed script builds, graph-executor builds, watched development sessions, local headers, transitive headers, and compiled Vix dependencies.
\nCache testing covered unchanged warm runs, source changes, direct header changes, transitive header changes, timestamp-only file touches, failed compilations, recovery after a failed build, and restoration of previously compiled source states.
\nDevelopment watching was tested for one-change/one-rebuild behavior, rebuild timing, process restart, application output, and recovery after compilation errors.
\nThe public-header work was checked against common application APIs including routing, JSON requests and responses, middleware, configuration, logging, and runtime execution.
\nBuild validation also covered managed and local build paths, generated CMake targets, graph execution, reusable configuration state, build-log resolution, startup readiness, port binding failures, and direct consumption of Vix from its current build tree.
\nThe public API used by normal Vix applications remains compatible. The header changes move implementation details out of user translation units rather than replacing the high-level interfaces developers already use.
\nStandalone programs still use direct compilation when their dependency model allows it. Programs that require compiled Vix functionality may now take the CMake-backed path where necessary for correct linkage.
\nExisting explicit --jobs values continue to take precedence over automatic parallelism.
--cmake-verbose remains available for developers who need the complete underlying build output, while the normal and -v modes use the unified Vix presentation.
The cache changes may cause an initial rebuild where older cache state cannot be validated under the new dependency rules. Once rebuilt, subsequent warm runs can reuse the new state normally.
\nVix.cpp v2.8.4 improves the daily C++ development loop rather than adding another layer to it.
\nPublic headers require less compiler work, standalone programs can reuse validated artifacts more effectively, and programs that depend on compiled Vix libraries now take the build path required for correct linkage. vix dev reacts to source and header changes with less terminal noise, while vix build --watch follows the same underlying behavior.
Caching is more careful about real content changes, build parallelism leaves room for the rest of the development environment, and diagnostics are divided more clearly between normal output, Vix debugging information, and raw CMake or compiler output.
\nThe common workflow remains the same:
\nedit -> build -> run -> change -> rebuildv2.8.4 makes each pass through that loop more predictable and avoids repeating work that has already been proven valid.
\n'; +const v2_8_4 = { + html +}; +export { + v2_8_4 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.8.5-CIYTmGNE.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.8.5-CIYTmGNE.js new file mode 100644 index 000000000..aa1b845b1 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.8.5-CIYTmGNE.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.8.5 stabilizes the Realtime module and strengthens the dependency model used by modular Vix applications.
\nThe release focuses on two areas that become increasingly important as projects grow. Realtime applications need reliable persistence, recovery, session handling, packaging, and concurrency behavior. Modular applications need equally reliable dependency ownership, graph validation, lockfile behavior, and project mutations.
\nv2.8.5 brings those concerns under stricter contracts.
\nGit dependencies can now belong to individual application modules, module relationships are validated through a canonical graph before CMake generation, dependency conflicts are detected across the application and its active modules, and project metadata changes are applied transactionally so partial failures do not leave vix.app, vix.module, or vix.lock in inconsistent states.
At the same time, Vix Realtime has completed another stabilization pass across persistence, recovery, presence, session resume, SDK packaging, PostgreSQL support, protocol integration, and concurrency behavior.
\nApplication modules give larger C++ projects a clearer internal structure. Once modules can own their own dependencies, however, package management can no longer treat the project as one flat list of libraries.
\nThe build system needs to know which module owns a dependency, whether two modules request compatible versions of the same package, whether a dependency belongs to the root application or a child module, and whether the resulting module graph can be built deterministically.
\nThose checks should happen before generated CMake files are produced.
\nThe same problem exists when changing project metadata. Installing or removing a dependency can affect several files at once. If one write succeeds and a later operation fails, a project can be left with a manifest that no longer matches its lockfile.
\nv2.8.5 addresses both problems by giving module structure and project mutations explicit models rather than relying on command-specific behavior.
\nvix::realtime continues to provide the authoritative state model introduced in the v2.8 line.
The module includes stateful rooms, serialized command execution, persisted events, snapshots, event replay, logical sessions, reconnection, presence, persistence abstractions, and optional WebSocket and PostgreSQL integrations.
\nv2.8.5 focuses on stabilizing how these pieces behave together.
\nAuthoritative room state can be reconstructed from persisted history, snapshots are handled transactionally, replay continues from deterministic event positions, and session resume restores the state needed for a client to continue after disconnection.
\nPresence lifecycle behavior has also been tightened around connection attachment, detachment, expiration, and session recovery.
\nThe release validates both in-memory and PostgreSQL persistence paths so application behavior does not depend on which store is selected.
\nRealtime persistence is designed around events and snapshots rather than direct mutation of stored room state.
\nAccepted commands produce authoritative events. Those events are persisted in order, applied to the room, and used later when the room must be reconstructed.
\nSnapshots reduce the cost of restoring long histories. Recovery can load the latest valid snapshot and replay only the events that follow it.
\nv2.8.5 strengthens the contracts around that process.
\nSnapshot creation, persistence, replay, room version restoration, and session resume are validated together rather than as isolated features. Recovery paths are expected to preserve the same authoritative state, room version, and event ordering that existed before the room was stopped.
\nThe PostgreSQL implementation follows the same model as the in-memory stores so applications can move between local and persistent environments without changing room logic.
\nRealtime sessions remain separate from individual network connections.
\nA temporary transport failure can detach a connection while the logical session, room memberships, acknowledgement positions, and resume information remain available.
\nWhen a client reconnects, session resume can restore its relationship with the rooms it previously joined and replay events that were not acknowledged before the disconnection.
\nPresence follows the same lifecycle.
\nA session can become detached without immediately being treated as gone. Expiration and cleanup rules determine when stale presence should be removed, while successful session recovery can restore active presence without creating a second logical participant.
\nv2.8.5 validates these transitions more strictly across connection loss, resume, room membership, replay, and presence recovery.
\nRealtime is now treated as a first-class installable Vix module.
\nIts public SDK surface is packaged with isolated headers and the module can be consumed without depending on private build-tree layout.
\nThis matters for two different workflows.
\nApplications using the complete Vix SDK need the realtime headers and CMake targets to behave like other Vix modules. Standalone package consumers need the module to expose only what belongs to its public contract.
\nThe packaging work in v2.8.5 validates both cases and checks that Realtime remains usable when installed independently from the development source tree.
\nThe Realtime module now exposes metrics and health interfaces for observing runtime state.
\nThese APIs provide a stable place for applications and infrastructure tooling to inspect the runtime without reaching into internal room, store, or connection implementation.
\nThey are intended to support operational checks around room activity, persistence, recovery, and runtime health while keeping those concerns separate from application command handlers.
\nGit dependencies can now be assigned directly to an application module.
\nFor example:
\nvix install https://github.com/gabime/spdlog \\\n --tag v1.15.3 \\\n --target spdlog::spdlog \\\n --module authThe dependency is written to the target module's vix.module rather than to the root application manifest.
The project still uses one root vix.lock and the shared Vix dependency cache.
This separation is deliberate. Dependency ownership belongs to the module that uses the package, while dependency resolution and reproducibility remain project-wide concerns.
\nA module therefore does not receive its own independent lockfile or duplicate Git checkout simply because it owns a dependency.
\nv2.8.5 introduces explicit dependency ownership across the application and its modules.
\nA dependency can belong to the root application or to one of its active modules. That information is carried into graph analysis and generated integration.
\nThis prevents one module from accidentally inheriting a sibling module's private dependency simply because both are part of the same project.
\nFor example, if auth declares a Git dependency, another module does not automatically receive that target unless the application architecture makes the relationship explicit.
The build graph can therefore reflect the project structure rather than flattening every dependency into one global CMake target list.
\nIsolation does not require duplication.
\nTwo modules can depend on the same package when their requirements are compatible. Vix can resolve the package once, record it once in the root lockfile, and reuse the same cached checkout and resolved target for both module owners.
\nThis gives the project one deterministic dependency graph while preserving ownership information.
\nThe important distinction is between package identity and package ownership.
\nThe resolved dependency can be shared, but Vix still knows which modules requested it and can validate whether their requirements agree.
\nvix.module is now represented through a canonical ModuleManifest model.
Instead of individual commands parsing module metadata differently, the CLI has one normalized representation for module identity, paths, dependencies, and configuration.
\nThis reduces a class of inconsistencies where one command could accept a module declaration that another interpreted differently.
\nThe canonical model also provides the input needed for architecture validation before generated build files are written.
\nThe application module structure is now represented through a canonical ModuleGraph.
The graph tracks module identity, normalized paths, dependencies between modules, cycles, and deterministic dependency ordering.
\nThis means module validation is no longer limited to checking whether a directory or manifest exists.
\nVix can reason about the architecture as a complete graph before build generation begins.
\nThe graph detects:
\nThe resulting module order is deterministic, so equivalent project metadata produces the same dependency ordering across runs.
\nModule dependency requirements are now analyzed together.
\nIf the root application and one or more modules request the same dependency with incompatible constraints, Vix reports the conflict before generated CMake integration is created.
\nThe same applies when two modules disagree about a Git dependency, target, revision, or other requirement that cannot be satisfied by one shared resolution.
\nEarlier behavior could allow one declaration to overwrite another depending on processing order.
\nv2.8.5 replaces that last-write-wins behavior with explicit conflict detection.
\nThis makes dependency resolution a property of the complete application graph rather than an accidental result of command ordering.
\nGit dependency identity has been normalized more carefully.
\nRepository-root subdirectories that are omitted and subdirectories written as . now represent the same source location.
This matters because two otherwise identical dependency declarations should not produce separate lock entries or cache identities only because one command serialized the repository root differently.
\nThe normalized identity is used when reconciling manifests, lockfiles, ownership, and cached Git checkouts.
\nCMake options associated with Git dependencies are now preserved through the lockfile and generated integration.
\nA dependency that requires a particular configuration can therefore be resolved once and regenerated later without losing the options that were part of its original installation contract.
\nThis is particularly important for dependencies whose exported targets or generated headers depend on CMake configuration.
\nThe lockfile records enough information for Vix to reconstruct the same dependency integration rather than only remembering the repository and revision.
\nDependency and module changes now use project-scoped transactional mutations.
\nCommands such as vix add, vix remove, vix update, vix install, and module mutation commands can update several project files as one logical operation.
Before changing those files, Vix acquires a project mutation lock.
\nThe lock prevents two commands from modifying project metadata concurrently and silently overwriting each other's changes.
\nWrites are staged before they replace the active project files. If a later step fails, the previous metadata can be restored instead of leaving only part of the mutation applied.
\nFailed project mutations restore the previous metadata byte-for-byte.
\nThis matters because a rollback should not merely create a logically similar manifest. It should restore the project state that existed before the command began.
\nA failed Git resolution, invalid module target, incompatible dependency constraint, lockfile error, or other mutation failure therefore does not leave behind a partially changed vix.app, vix.module, or vix.lock.
Direct Git installations use the same transactional behavior.
\nThe command can perform remote work, validate the result, and only commit the project metadata changes once the operation is known to be valid.
\nProject transactions are recorded under:
\n.vix/transactionsIf a mutation is interrupted after staging project changes, Vix can use the transaction state to recover the project rather than assuming that the partially written metadata is authoritative.
\nThis protects against a different class of failure than ordinary command errors.
\nRollback handles known failures inside a running command. Transaction recovery handles operations that did not get a chance to complete their own cleanup.
\nBoth paths use the same project mutation model.
\nA module-scoped Git install validates the target module before performing remote work.
\nFor example, Vix checks that the module exists, is active, and can participate in the current graph before cloning or resolving the requested repository.
\nThis avoids downloading and preparing a dependency only to discover afterward that the module declaration itself is invalid.
\nThe same principle applies to dependency conflicts.
\nArchitecture and ownership checks are performed as early as possible so expensive remote operations are not used to discover problems that can already be determined from local project metadata.
\nvix installvix install now reconciles vix.app and vix.lock instead of resolving the entire dependency set unconditionally.
Only new or changed dependencies need remote resolution.
\nUnchanged dependencies can reuse their existing resolved state, cached checkout, and generated integration.
\nThis improves both speed and predictability.
\nAn install command should not contact remote Git repositories or recreate links simply because another unrelated dependency was added to the project.
\nWhen the lockfile already proves that a dependency matches its manifest declaration, Vix can preserve that result.
\nResolved Git checkouts are reused directly from the Vix dependency cache.
\nMultiple compatible module owners can reference the same cached dependency, and repeated installs can avoid downloading repositories that have already been resolved.
\nThis reuse remains tied to the normalized dependency identity and lockfile state.
\nThe cache is therefore an implementation optimization around deterministic dependency resolution rather than an alternative source of truth.
\nDependency operations performed by vix install no longer require a fully buildable vix.app.
A project can install and reconcile dependencies while its application sources or other build-specific fields are still incomplete.
\nThis is useful during project setup, dependency recovery, and repository initialization where dependency metadata may need to be established before the application itself is ready to compile.
\nManifest syntax and dependency validity are still checked. The change is that dependency management is no longer unnecessarily coupled to build completeness.
\nGit installation progress now reflects actual remote activity.
\nVix reports remote work as it begins and surfaces real Git receiving progress instead of inventing a global percentage that cannot accurately represent the complete operation.
\nThis gives developers useful feedback during large clones or slow network operations without pretending that unrelated installation phases can be measured as one precise percentage.
\nv2.8.5 adds deterministic compatibility coverage for Git-hosted CMake dependencies.
\nThe contracts cover common layouts and behaviors that dependency installation must preserve, including:
\nThese tests are important because a Git dependency cannot be treated as only a repository checkout.
\nThe package's exported build contract must remain correct after Vix resolves it, records it in the lockfile, and integrates it into the application or module that owns it.
\nThe release also adds stricter contracts around module-scoped Git dependencies.
\nCoverage includes ownership, graph validation, dependency constraints, rollback, transaction behavior, and installation into valid and invalid module targets.
\nThese tests verify the complete workflow rather than only checking whether a dependency can be cloned.
\nA successful installation must leave the correct module manifest, root lockfile, ownership information, generated integration, and cached dependency state.
\nA failed installation must leave the previous project state intact.
\nVix no longer leaks its internal SPDLOG_FMT_EXTERNAL configuration into user dependencies.
Internal build choices should not silently alter the configuration of unrelated third-party packages compiled as part of an application.
\nv2.8.5 tightens that boundary so Vix's own logging configuration remains scoped to the targets that require it.
\nCompiler warning flags have also been corrected so GCC-specific and Clang-specific options are applied only to the compiler that understands them.
\nThis reduces toolchain noise and avoids dependency builds being affected by unrelated Vix implementation settings.
\nThe release was validated across Realtime, Git dependency installation, module ownership, graph construction, dependency constraints, transactional mutations, and generated CMake integration.
\nRealtime validation covered authoritative rooms, persisted events, snapshots, replay, recovery, session resume, presence lifecycle, in-memory persistence, PostgreSQL persistence, WebSocket integration, protocol handling, metrics, health APIs, SDK packaging, and concurrency behavior.
\nDependency tests covered header-only, static, shared, and alias targets, generated headers, nested subdirectories, CMake options, compile features, and transitive dependencies.
\nModule-scoped installation was tested with valid ownership, shared compatible dependencies, conflicting requirements, invalid modules, disabled modules, path and name collisions, self-dependencies, dependency cycles, and deterministic graph ordering.
\nTransaction tests covered successful multi-file mutations, failures during dependency installation, rollback, concurrent mutation protection, and recovery from interrupted transaction state under .vix/transactions.
Install reconciliation was also verified so unchanged dependencies can reuse lockfile and cache state without unnecessary remote Git resolution or identical generated CMake rewrites.
\nExisting application-level dependencies continue to work.
\nModule-scoped ownership adds a more precise model for projects that use vix.module, but it does not require every existing dependency to move into a module.
Projects continue to use one root vix.lock even when several modules own dependencies.
Compatible shared dependencies can therefore remain resolved once for the complete application.
\nThe stricter graph and constraint checks may reject project states that older versions allowed through last-write-wins behavior. Those failures indicate an ambiguous or incompatible dependency model that should be resolved explicitly rather than deferred to CMake or the linker.
\nTransaction infrastructure changes how project files are mutated, not the public manifest formats developers work with.
\nRealtime remains compatible with the architecture introduced earlier in the v2.8 line while tightening recovery, persistence, packaging, and integration contracts.
\nVix.cpp v2.8.5 makes two parts of the platform substantially more dependable.
\nRealtime now has stronger guarantees around persistence, recovery, session resume, presence, PostgreSQL integration, SDK packaging, health, metrics, and concurrency.
\nModular applications now have an explicit dependency architecture.
\nGit dependencies can belong to individual modules, compatible dependencies can still be shared through one root lockfile and cache, module relationships are validated as a deterministic graph, and incompatible requirements are reported before build generation.
\nProject mutations are also transactional. Commands that change manifests and lockfiles either complete as one operation or restore the previous state, including recovery support for interrupted transactions.
\nThe result is a more reliable foundation for Vix projects that are growing beyond a single application target, particularly projects that combine multiple modules, third-party Git dependencies, and stateful realtime systems.
\n'; +const v2_8_5 = { + html +}; +export { + v2_8_5 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.9.0-D5WiKWjO.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.9.0-D5WiKWjO.js new file mode 100644 index 000000000..0895dfc85 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/v2.9.0-D5WiKWjO.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp v2.9.0 is a release about ownership.
\nAs Vix has grown, several parts of the system had started doing work that belonged somewhere else. The build layer reconstructed information already owned by CMake and Ninja. Dependency management needed a clearer separation between what a project requests and what was actually resolved. SDK consumers could inherit machine-level requirements for dependencies that existed only because a Vix module used them internally. An asynchronous HTTP API still had places where the underlying work was not consistently asynchronous. Mobile support risked becoming useful only if Vix tried to replace the native toolchains that already understand Android and iOS best.
\nv2.9.0 addresses these problems by making the boundaries clearer.
\nVix should own project intent, dependency intent, dependency resolution, toolchain configuration, diagnostics, and the developer experience. Build backends should own the concrete compilation graph and incremental execution. Internal dependencies should remain internal when Vix can reasonably package them. Platform capabilities should remain platform capabilities. An asynchronous API should stay asynchronous across the entire operation.
\nThe result is a release that removes unnecessary work from the normal development loop, makes dependency resolution more reproducible, strengthens the networking stack, makes SDKs more self-contained, and adds practical Android and iOS project support without hiding the native platforms underneath.
\nA build tool should not duplicate the work of its backend.
\nEarlier Vix build paths had accumulated logic for scanning sources and headers, constructing build graphs, hashing state, and preparing information before invoking CMake and Ninja. Some of that machinery is useful for features that genuinely need a Vix-level view of the project, but it does not belong in every ordinary build.
\nCMake and Ninja already know the concrete compilation graph. Ninja already tracks whether a source file changed, which object depends on which header, and whether a target needs to be rebuilt. Reconstructing a second version of that information in the normal Vix path added work without adding corresponding value.
\nv2.9.0 changes that boundary.
\nThe normal build flow now lets Vix focus on the things only Vix is well placed to understand:
\nCMake and Ninja then own the mechanics of compilation, dependency tracking, and incremental execution.
\nThis removes the need for ordinary vix build to prepare a second source and header graph before invoking the backend. Build-graph work still exists where a feature actually needs it, but normal builds, incremental builds, and no-op builds no longer pay that cost by default.
The configuration model was also tightened. Presentation and execution options such as --verbose and --cmake-verbose no longer participate in build identity. Asking Vix to show more output should not create a different configuration of the program.
That distinction matters because a build configuration should describe what is being built, not how much output the user wants to see while it is being built.
\nThe CLI also received clearer progress rendering and compiler diagnostics. Source frames, warnings, error presentation, and terminal hierarchy are easier to read, while users who need the backend directly can still request raw CMake, Ninja, and compiler output.
\nThe principle behind these changes is simple:
\n\n\nVix should add value to the build, not add work to the build.
\n
A project should not have to replace its build system just to get a better dependency workflow.
\nv2.9.0 significantly expands vix install around that idea.
Vix dependencies can now be added directly from Git repositories and used by ordinary CMake projects. The project can keep its existing CMakeLists.txt and native CMake targets while Vix manages dependency intent, resolution, locking, integrity, and local materialization.
For example:
\nvix install https://github.com/vixcpp/async \\\n --tag v1.2.1 \\\n --target vix::asyncThe dependency becomes part of the project manifest:
\n[dependencies.async]\ngit = "https://github.com/vixcpp/async"\ntag = "v1.2.1"\ntarget = "vix::async"Vix then resolves that request to an exact revision and records the reproducible result in vix.lock, including the resolved commit and package integrity metadata.
This creates an important separation:
\nvix.app describes what the project requestsvix.lock records the exact dependency graph that was resolvedA project can therefore express a human-readable dependency such as a Git tag while still reproducing the exact commit selected at resolution time.
\nDependencies are materialized through Vix's local package store and exposed back to the project through generated CMake integration. Vix can also understand exported CMake targets, subdirectories, header-only packages, CMake options, and transitive dependency relationships.
\nThe important part is that CMake remains CMake.
\nA project can continue to define its library normally:
\nadd_library(vix_stress STATIC ...)\n\ntarget_link_libraries(\n vix_stress\n PRIVATE\n vix::requests\n vix::async\n)while Vix takes responsibility for obtaining and resolving the packages that provide those targets.
\nVix Stress already uses this model. It remains a standalone CMake project while declaring Vix dependencies separately:
\n[dependencies.async]\ngit = "https://github.com/vixcpp/async"\ntag = "v1.2.1"\ntarget = "vix::async"\n\n[dependencies.requests]\ngit = "https://github.com/vixcpp/requests"\ntag = "v1.2.1"\ntarget = "vix::requests"\n\n[dependencies.tests]\ngit = "https://github.com/vixcpp/tests"\ntag = "v0.1.1"\ntarget = "vix::tests"The lockfile records exact commits and integrity metadata for those dependencies, making the installed graph reproducible rather than merely remembering a floating repository reference.
\nThe goal is not to make CMake projects stop being CMake projects.
\nThe goal is to give them a simpler dependency contract:
\n\n\nDescribe what the project needs, lock what was resolved, and let Vix materialize it.
\n
An asynchronous HTTP API is only truly asynchronous if the entire request path remains asynchronous.
\nvix::requests has been strengthened around that idea.
The asynchronous path now stays asynchronous through DNS resolution, connection establishment, TLS negotiation, request writes, and response reads. This is important not only for performance, but also for predictability. An API that appears asynchronous at its surface should not unexpectedly block because one internal stage still performs synchronous work.
\nConnection and request lifetimes were also hardened. Networking code often fails not because the protocol itself is wrong, but because an endpoint, socket, buffer, request, or callback outlives the object that was supposed to own it, or disappears before an asynchronous operation completes. v2.9.0 strengthens those ownership boundaries so asynchronous operations keep the state they need for as long as they need it.
\nCompatible HTTP and HTTPS connections can now be reused through an internal origin-scoped pool. A request to the same compatible origin does not need to establish a completely new connection every time when reuse is safe.
\nResponses also gained a generic incremental body sink. Instead of always materializing the complete decoded response body in memory first, consumers can receive decoded bytes as they arrive.
\nThat changes what can be built efficiently on top of vix::requests.
For example, a large download can now be written directly to disk without first allocating enough memory to hold the entire response. The CLI updater uses this path so downloaded artifacts can be streamed instead of unnecessarily buffered.
\nThe CLI has also progressively moved GitHub requests, metadata lookups, health checks, and downloads away from external curl, wget, and PowerShell commands toward vix::requests.
This is intentionally not a rule that every appearance of curl must disappear. RunCommand still keeps its HTTP URI passthrough through curl, where that behavior is part of the command's existing semantics.
The goal is not to remove a tool for ideological reasons. The goal is to stop depending on an external process where Vix already owns the HTTP operation itself.
\nA dependency that exists only because a Vix module needs it internally should not automatically become a system administration problem for every Vix user.
\nThis release moves the SDK further in that direction.
\nSDK packaging is now driven by the selected profile rather than by modules that happen to be present in the CLI build. The contents of an SDK should describe the capabilities exported to its consumers, not the accidental shape of the machine that produced it.
\nSDK archives also no longer contain a second vix executable. The CLI and the SDK are related parts of Vix, but an SDK archive should not silently become another CLI distribution channel.
Profile metadata now follows the targets and headers that are actually exported to consumers.
\nVix now bundles several dependencies that exist solely to implement Vix modules:
\nTheir relevant headers and libraries can travel with the SDK capabilities that require them.
\nThis reduces machine-level prerequisites and, more importantly, makes the dependency contract more accurate. A consumer of vix::json should not need to understand how Vix internally obtains its JSON implementation. A consumer of compression support should not have to reconstruct the build environment used by the Vix repository.
The installed package contract was tightened so internal build targets and host-specific library paths do not leak into external consumers.
\nThis work exposed an important distinction between two kinds of dependencies.
\nSome dependencies are implementation details that Vix can reasonably own and distribute. Others are genuine platform capabilities.
\nOpenSSL remains in the second category for profiles that actually export OpenSSL-dependent functionality. Core server TLS is opt-in, so a user who does not select that capability should not inherit its cost.
\nThat is the broader rule behind the SDK work:
\n\n\nA capability that is not used should not impose a dependency.
\n
The SDK contract was also cleaned up in several smaller but important places.
\ncurl and wget are no longer generic SDK prerequisites.
Reply is now a public dependency of Note instead of Note carrying a second embedded implementation of the same functionality.
\nThe all profile includes the public tests module together with its aggregate header, so the name of the profile better matches what the SDK actually exposes.
These changes are not individually large features, but together they make the installed SDK behave more like a product with a deliberate dependency model and less like a copy of the source-tree build environment.
\nSupporting Android and iOS does not require pretending that Gradle and Xcode do not exist.
\nvix::ui now includes Android and iOS project generation and build support through a shared mobile application model.
On Android, generated projects use the native Gradle and WebView stack.
\nOn iOS, generated projects use Xcode and WKWebView.
\nThe CLI exposes corresponding mobile initialization, build, and run commands, while the UI module remains responsible for project generation and the mobile application model.
\nThe important part is the boundary.
\nVix provides a common entry point and a consistent project-level experience, but the platform toolchains still do the work they are designed to do. Android builds are still Android builds. iOS builds are still Xcode builds.
\nThe generated projects are validated against those native environments, including Gradle and emulator workflows for Android and Xcode simulator builds on macOS.
\nThis is the direction Vix wants for platform support in general: provide a simpler and more coherent interface without erasing the platform underneath it.
\nAn abstraction is useful when it removes accidental complexity. It becomes harmful when using it requires pretending the underlying system no longer exists.
\nA source tree compiling successfully is not enough to prove that an SDK is usable.
\nThe consumer never receives the Vix repository exactly as the Vix developers see it. The consumer receives installed headers, exported CMake targets, libraries, transitive requirements, and profile metadata.
\nv2.9.0 expands release validation around that reality.
\nSDK release checks now exercise installed artifacts and external consumer projects. They verify profile-specific capabilities, bundled dependency ownership, exported targets, public headers, and the behavior of projects that consume Vix from outside the source checkout.
\nThis work caught several classes of issue that a monorepo build can hide: dependencies accidentally satisfied by the source tree, exported targets carrying the wrong usage requirements, platform-specific linkage contracts, and installed headers depending on information that was available only during the original build.
\nThe packaged SDK is therefore becoming a first-class contract of Vix, not merely the by-product of a successful repository build.
\nMany of the changes in v2.9.0 come from the same observation: complexity grows when two layers both believe they own the same responsibility.
\nIf Vix and Ninja both maintain the incremental compilation graph, one of them is doing unnecessary work.
\nIf Vix resolves a project dependency but the build system still has to rediscover where it came from and what exact revision was selected, ownership is unclear.
\nIf Vix bundles an implementation dependency but the consumer must still install and configure that same dependency independently, ownership is unclear.
\nIf an API is called asynchronous but part of its internal path blocks, its abstraction and its behavior disagree.
\nIf a mobile abstraction can work only by replacing the native platform, it eventually has to reimplement an entire ecosystem.
\nv2.9.0 reduces those overlaps.
\nVix still does a lot, but the goal is not for Vix to own every part of the machine. The goal is for Vix to own the parts where it can provide a simpler, more reliable programming model, and compose correctly with the parts that already have a clear owner.
\nv2.9.0 closes an important chapter for Vix 2.
\nMany of the changes in this release came from looking again at decisions that were reasonable when Vix was smaller, but became harder to justify as the project grew. The duplicated build work, dependency ownership, SDK boundaries, and the relationship between Vix abstractions and native platforms are all examples of lessons that will influence the next major version.
\nThe next step is Vix 3.
\nVix 3 is not intended to be a larger collection of modules or another layer of abstractions. It is an opportunity to revisit the foundations of Vix with the implementation experience gained from Vix 2.
\nThe goal is to reduce the number of concepts users need to understand, make the remaining concepts more composable, and move complexity into places where Vix can own it reliably.
\nThat means questioning assumptions that have accumulated over time: how projects describe what they need, how dependencies are owned and distributed, where the boundary between Vix and the C++ toolchain should live, and which parts of common C++ development can be made simpler without hiding the language or the machine.
\nSome of the work in v2.9.0 already points in that direction.
\nThe build system now has clearer ownership boundaries. vix install separates dependency intent from reproducible resolution and can integrate those dependencies into existing CMake projects. SDK dependencies are becoming capabilities rather than machine setup instructions. Installed artifacts are treated as part of the public contract. Platform integrations preserve the native systems underneath them instead of trying to replace them.
Vix 3 will continue from those principles.
\nIts design is still being worked out, and early ideas should not become promises before they have been properly tested. The objective is not to add features for the sake of a major version number.
\nIt is to take what Vix has taught us so far and use it to build a smaller, clearer, and more durable foundation for what comes next.
\nVix v2.9.0 improves five major areas:
\nvix install can manage reproducible Git dependencies for existing CMake projects through vix.app and vix.lockvix::requests has a stronger fully asynchronous path, connection reuse, and streaming response supportvix::ui can generate and drive practical Android and iOS projects while preserving native toolchainsThe release also strengthens the installed SDK as a tested public contract rather than treating installation as the last step after a source-tree build succeeds.
\nMore broadly, v2.9.0 is less about making Vix own more of the system and more about making it own the right parts of the system.
\nThat direction will continue into Vix 3.
\n'; +const v2_9_0 = { + html +}; +export { + v2_9_0 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-CoPoSnqe.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-CoPoSnqe.js new file mode 100644 index 000000000..48d7ff4c2 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-CoPoSnqe.js @@ -0,0 +1,8 @@ +const html = 'Technical notes about vix.app, the simple manifest used to describe C++ applications without exposing users directly to CMake complexity.
vix.app changes an important part of vix build.
Before vix.app, a project was usually a CMake project.
That meant one directory often represented everything:
\nproject directory\nCMake source directory\nbuild identity\ndefault target nameFor many CMake projects, this works because the project root contains:
\nCMakeLists.txtand the build system can configure directly from that directory.
\nWith vix.app, the model changes.
The user project directory and the CMake source directory are no longer always the same thing.
\nFor a normal CMake project:
\nuserProjectDir = cmakeSourceDirFor a vix.app project:
userProjectDir = project root\ncmakeSourceDir = project/.vix/generated/appThis distinction is the foundation of correct build planning.
\nIf Vix confuses these two paths, the build may still work in small cases, but other systems can break:
\ntarget detection\nbuild directories\nsnapshots\nartifact cache\nwatch mode\nexport paths\ndiagnostics\nvix run executable lookupSo vix.app requires a more explicit build plan.
Build planning is the phase where Vix decides:
\nwhich project is being built\nwhich preset is active\nwhere the build directory is\nwhich source directory CMake should configure\nwhich target should be built\nwhich logs should be written\nwhether reconfigure is needed\nwhich cache state applies\nwhich executable should be resolved after buildIt is the bridge between project resolution and build execution.
\nProject resolution answers:
\nWhat kind of project is this?Build planning answers:
\nHow should this project be built?The old assumption was:
\nplan.projectDir is the projectThat works when:
\nplan.projectDir/CMakeLists.txtexists.
\nThen Vix can configure with:
\ncmake -S plan.projectDir -B plan.buildDirThe default target can be guessed from:
\nplan.projectDir.filename()The executable can be searched by that name.
\nFor a normal CMake project, this is acceptable.
\nFor a vix.app project, the real project root contains:
vix.app\nsrc/\ninclude/\nassets/But it does not contain:
\nCMakeLists.txtVix generates that file under:
\n.vix/generated/app/CMakeLists.txtSo if the build plan stores only one projectDir, there are two bad choices.
If:
\nplan.projectDir = myapp/then CMake configure would try:
\ncmake -S myapp -B myapp/build-ninjaBut myapp/ has no CMakeLists.txt.
The configure step fails.
\nIf:
\nplan.projectDir = myapp/.vix/generated/app/then CMake configure works:
\ncmake -S myapp/.vix/generated/app -B myapp/build-ninjaBut now other parts of the build may think the generated directory is the real project.
\nThat can cause problems.
\nThe default target may become:
\nappinstead of the manifest name.
\nExports may go to:
\n.vix/generated/app/instead of the user project root.
\nSnapshots may inspect the wrong directory.
\nWatch mode may watch generated files instead of source files.
\nThe fix is to stop using one path for two meanings.
\nA correct build plan separates the identities:
\nuserProjectDir\ncmakeSourceDir\ndefaultTargetName\ngeneratedFromVixAppFor a CMake project:
\nuserProjectDir = myapp/\ncmakeSourceDir = myapp/\ndefaultTargetName = myapp\ngeneratedFromVixApp = falseFor a vix.app project:
userProjectDir = myapp/\ncmakeSourceDir = myapp/.vix/generated/app/\ndefaultTargetName = manifest.name\ngeneratedFromVixApp = trueThis is the clean model.
\nEvery build operation can now use the correct value.
\nuserProjectDir is the real project root.
It should be used for user-facing project operations.
\nExamples:
\nbuild directory placement\nlocal metadata\n.env lookup\nwatch mode\nproject snapshots\nartifact cache state\nexported binaries\nresource source paths\nuser diagnosticsFor vix.app, this remains:
myapp/even though CMake configures from:
\nmyapp/.vix/generated/app/cmakeSourceDir is the directory passed to:
cmake -SFor a CMake project:
\ncmakeSourceDir = myapp/For a vix.app project:
cmakeSourceDir = myapp/.vix/generated/app/Only the configure step should need this path directly.
\nConceptually:
\nconfigure:\n use cmakeSourceDir\n\nbuild state:\n use userProjectDirdefaultTargetName is the target Vix builds when the user does not pass an explicit target.
For CMake projects, it can usually be:
\nproject folder nameFor vix.app, it must be:
manifest.nameExample:
\nfolder: hello-project/\nmanifest name: helloThe target should be:
\nhellonot:
\nhello-projectand not:
\nappThis matters for:
\ncmake --build --target\nvix run executable lookup\nartifact names\ndiagnostic messagesgeneratedFromVixApp tells the build system that the active CMake source was generated.
This helps with diagnostics.
\nFor example, Vix can print:
\nUsing project directory:\n myapp/\n\nUsing generated CMake source:\n myapp/.vix/generated/app/It also helps commands avoid treating generated paths as user-authored paths.
\nBuild directories should stay under the user project directory.
\nFor example:
\nmyapp/build-ninja/\nmyapp/build-dev/\nmyapp/build-release/They should not be placed under:
\nmyapp/.vix/generated/app/build-ninja/The generated CMake directory is not the project root.
\nIt is internal metadata.
\nThe configure command should use:
\ncmakeSourceDirConceptually:
\ncmake -S <cmakeSourceDir> -B <buildDir>For CMake:
\ncmake -S myapp -B myapp/build-ninjaFor vix.app:
cmake -S myapp/.vix/generated/app -B myapp/build-ninjaThis is the only place where the generated CMake source directory must be treated as the source directory.
\nThe build command should use:
\nbuildDir\ndefaultTargetNameConceptually:
\ncmake --build <buildDir> --target <defaultTargetName>For vix.app:
cmake --build myapp/build-ninja --target helloif the manifest says:
\nname = helloThe build target should not be derived from:
\n.vix/generated/appbecause that directory name is not the application target.
\nA build system needs to decide when CMake configure must run again.
\nFor vix.app, the configure signature should include the generated CMake input and the manifest state.
Important inputs include:
\nvix.app content\ngenerated CMake content\nCMake variables\npreset\ntoolchain\ncompiler launcher\nlinker settings\ntarget triple\npackage configurationIf the manifest changes, Vix should regenerate the internal CMake project and reconfigure when necessary.
\nA project fingerprint helps decide whether a build can be reused.
\nFor CMake projects, the fingerprint can include CMake configuration files.
\nFor vix.app, the fingerprint should include:
vix.app\ngenerated CMakeLists.txt\nimportant build optionsBut this should not make Vix forget the real project root.
\nThe fingerprint may inspect the CMake source directory, but cache state and build outputs still belong to the user project directory.
\nSnapshots should describe user project inputs.
\nFor vix.app, this should start from:
userProjectDirnot:
\ncmakeSourceDirThe generated CMake directory is derived output.
\nThe source of truth is the manifest and project files.
\nA snapshot should care about:
\nvix.app\nsrc/\ninclude/\nresources\nlock files\ndependency metadatanot only generated CMake.
\nArtifact cache identity should use stable project identity.
\nFor a vix.app project, the target identity should come from:
defaultTargetNamenot:
\ncmakeSourceDir.filename()If cmakeSourceDir is:
.vix/generated/appthen the filename is:
\nappThat is not a useful artifact name.
\nThe manifest target name is the correct identity.
\nThe object cache should be based on the actual compile inputs:
\nsource file content\nheader dependencies\ncompiler identity\ncompiler flags\ninclude directories\ndefines\ntarget triple\nbuild typevix.app can help here because it gives Vix direct structured data.
In the current generated CMake path, Vix can still import compile commands.
\nIn a future native path, Vix can create compile tasks directly from the manifest.
\nA build graph represents tasks and dependencies.
\nFor a generated CMake project, Vix can import:
\ncompile_commands.json\nbuild.ninja\ndependency filesFor a future native vix.app build, Vix can generate the graph directly from:
sources\ninclude_dirs\ndefines\ncompile_options\nlink_options\nlinks\nresourcesThat is why the manifest is important.
\nIt is not only a configuration shortcut.
\nIt can become build graph input.
\nThe current path is:
\nvix.app\n -> generated CMake\n -> CMake configure\n -> CMake buildThe future path can be:
\nvix.app\n -> BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkThis is possible because vix.app is declarative and limited.
Vix does not have to interpret arbitrary CMake logic.
\nIt can directly create build tasks.
\nCMake is powerful, but it has overhead:
\nconfigure step\ngenerate step\nbuild system files\ncache state\nindirection through generated rulesFor many projects, this is acceptable.
\nBut for simple vix.app projects, Vix can eventually avoid some of that overhead.
The goal is not to compile C++ magically faster.
\nThe goal is to avoid unnecessary work:
\ndo not reconfigure when inputs are unchanged\ndo not regenerate when manifest is unchanged\ndo not recompile clean objects\ndo not relink unchanged targets\nrestore cached artifacts when validThe clean long-term model is:
\nCMakeLists.txt -> compatibility path\nvix.app -> fast pathThe compatibility path keeps existing projects working.
\nThe fast path lets Vix optimize projects it understands directly.
\nThis split is more realistic than trying to replace CMake for every C++ project.
\nFor a normal CMake project, planning stays close to the existing model:
\nresolve project root\nselect preset\ncreate build directory\nconfigure CMake\nbuild selected target\nrun cache checksCMake remains the source of truth.
\nVix can still improve:
\ndiagnostics\ncache\noutput style\nartifact reuse\ntarget-aware buildsBut it should not try to understand arbitrary CMake better than CMake itself.
\nFor vix.app, planning has more direct knowledge.
The plan can know:
\ntarget name\ntarget type\nsources\ninclude directories\ndefines\npackages\nlinks\nresources\noutput directoryToday, that data is used to generate CMake.
\nLater, it can be used to generate a native build graph.
\nThe important part is that the build plan keeps this information structured.
\nvix run depends on build planning too.
It needs to know:
\nwhich target to build\nwhere the build output is\nwhich executable to run\nwhat project directory to useFor vix.app, vix run should use:
targetName = manifest.nameThen it searches common locations such as:
\nbuild-ninja/<target>\nbuild-ninja/bin/<target>\nbuild-ninja/src/<target>This is why build planning and run planning must agree on the target name.
\nWhen Vix exports or copies a final binary, it should use:
\nuserProjectDirnot:
\ncmakeSourceDirFor vix.app, exporting into:
.vix/generated/app/would be wrong.
\nThe generated CMake folder is not the user-facing output location.
\nWatch mode should watch:
\nuserProjectDirFor vix.app, this includes:
vix.app\nsrc/\ninclude/\nassets/Watching only:
\n.vix/generated/app/would miss real source changes.
\nDiagnostics should show the correct layer.
\nFor manifest errors, point to:
\nvix.appFor source errors, point to:
\nsrc/main.cpp\ninclude/...For generated CMake configure errors, point to:
\n.vix/generated/app/CMakeLists.txtFor user-facing project context, print:
\nProject directory: myapp/\nGenerated CMake source: myapp/.vix/generated/app/\nBuild directory: myapp/build-ninja/\nTarget: helloThis makes the build easier to debug.
\nA practical build plan should contain at least:
\nuserProjectDir\ncmakeSourceDir\nprojectDir\ndefaultTargetName\ngeneratedFromVixApp\npreset\nbuildDir\nconfigureLog\nbuildLog\nsignature\ncmakeVars\nlauncher\nfastLinkerFlag\nprojectFingerprintprojectDir can remain for backward compatibility.
New code should prefer the more specific fields:
\nuserProjectDir for real project operations\ncmakeSourceDir for CMake configure\ndefaultTargetName for target selectionThe plan can evolve without breaking existing code by keeping:
\nprojectDirbut treating it as the user project directory.
\nThen new fields provide clearer meaning.
\nThis avoids large risky rewrites while fixing the vix.app path model.
Wrong:
\nproject root = .vix/generated/appCorrect:
\nproject root = userProjectDir\nCMake source = cmakeSourceDirWrong for vix.app:
target = projectDir.filename()Correct:
\ntarget = defaultTargetNameWrong:
\n.vix/generated/app/myappCorrect:
\nmyapp/myappor another user-facing output path.
\nWrong:
\nwatch .vix/generated/appCorrect:
\nwatch userProjectDirFor any vix.app build, verify:
1. userProjectDir points to the real project root.\n2. cmakeSourceDir points to .vix/generated/app.\n3. buildDir is under userProjectDir.\n4. defaultTargetName equals manifest.name.\n5. cmake -S uses cmakeSourceDir.\n6. cmake --build uses defaultTargetName when no target is provided.\n7. snapshots use userProjectDir.\n8. exports use userProjectDir.\n9. watch mode uses userProjectDir.\n10. diagnostics distinguish generated files from user files.Build planning is not only about making the current generated CMake path work.
\nIt is also preparing Vix for a native build engine.
\nIf the plan keeps project identity clean, then Vix can later switch a vix.app project from:
generated CMake executionto:
\nnative BuildGraph executionwithout changing the user-facing manifest.
\nThe user still writes:
\nvix.appOnly the execution engine changes.
\nvix.app forced Vix to make build planning more precise.
A generated project has two important paths:
\nthe user project directory\nthe generated CMake source directoryIt also has a target name that comes from the manifest, not from the folder name.
\nKeeping these values separate makes vix build more correct today.
It also creates the foundation for a faster native build path later.
\nvix.app starts as generated CMake.\nvix.app can become native BuildGraph input.\nThe build plan is the bridge between both.';
+const vixAppBuildPlanning = {
+ html
+};
+export {
+ vixAppBuildPlanning as default,
+ html
+};
diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-generated-cmake-CDiZf8Js.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-generated-cmake-CDiZf8Js.js
new file mode 100644
index 000000000..67df8baa6
--- /dev/null
+++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-generated-cmake-CDiZf8Js.js
@@ -0,0 +1,8 @@
+const html = 'vix.app is the user-facing project description.
CMake is the compatibility layer underneath.
\nThe current implementation works like this:
\nvix.app\n -> parse manifest\n -> validate manifest\n -> generate .vix/generated/app/CMakeLists.txt\n -> configure with CMake\n -> build with CMake/NinjaThe generated CMake file is not meant to be edited by the user.
\nIt is an implementation detail that lets Vix support a simpler project format without breaking compatibility with the C++ ecosystem.
\nThe main reason is compatibility.
\nCMake already understands:
\ncompilers\ngenerators\ntoolchains\ntargets\nlinking\nfind_package(...)\nplatform differences\nNinja integration\nbuild directoriesInstead of replacing all of that immediately, Vix can start with a smaller layer:
\nvix.app -> generated CMakeThis gives the user a simple manifest while still using the existing build infrastructure underneath.
\nThe user writes:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]This file is small.
\nIt only describes the target.
\nIt does not need to contain:
\ncmake_minimum_required(...)\nproject(...)\nadd_executable(...)\ntarget_compile_features(...)\ntarget_include_directories(...)Vix generates those details internally.
\nFor vix.app projects, Vix writes the generated CMake file under:
.vix/generated/app/CMakeLists.txtExample project:
\nhello/\n vix.app\n src/\n main.cppAfter running:
\nvix buildVix may create:
\nhello/\n .vix/\n generated/\n app/\n CMakeLists.txtThis generated file is part of Vix’s internal build metadata.
\nDo not edit:
\n.vix/generated/app/CMakeLists.txtEdit:
\nvix.appThe generated file can be replaced whenever Vix regenerates the project.
\nIf you need to change the target, sources, include directories, links, packages, or resources, change the manifest.
\nInput vix.app:
name = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]The generated CMake is conceptually similar to:
\ncmake_minimum_required(VERSION 3.24)\n\nproject(hello LANGUAGES CXX)\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\nset(CMAKE_CXX_EXTENSIONS OFF)\n\nadd_executable(hello\n /absolute/path/to/project/src/main.cpp\n)The exact generated output may evolve, but the idea is stable:
\nmanifest fields become target-level CMake instructionsThe generator translates manifest fields into CMake concepts.
\n| vix.app field | \nGenerated CMake concept | \n
|---|---|
name | \ntarget name and project name | \n
type = executable | \nadd_executable(...) | \n
type = static | \nadd_library(... STATIC ...) | \n
type = shared | \nadd_library(... SHARED ...) | \n
standard | \nCMAKE_CXX_STANDARD | \n
sources | \ntarget source list | \n
include_dirs | \ntarget_include_directories(...) | \n
defines | \ntarget_compile_definitions(...) | \n
compile_options | \ntarget_compile_options(...) | \n
link_options | \ntarget_link_options(...) | \n
compile_features | \ntarget_compile_features(...) | \n
packages | \nfind_package(...) | \n
links | \ntarget_link_libraries(...) | \n
resources | \npost-build copy commands | \n
output_dir | \ntarget output directory properties | \n
The type field decides what target command is generated.
For an executable:
\nname = hello\ntype = executableVix generates the equivalent of:
\nadd_executable(hello\n ...\n)For a static library:
\nname = mathlib\ntype = staticVix generates the equivalent of:
\nadd_library(mathlib STATIC\n ...\n)For a shared library:
\nname = plugin\ntype = sharedVix generates the equivalent of:
\nadd_library(plugin SHARED\n ...\n)This keeps the manifest small while still producing a normal CMake target internally.
\nIn vix.app, source paths are written relative to the project directory.
Example:
\nsources = [\n src/main.cpp,\n src/app.cpp,\n]The generator resolves these paths relative to the directory containing vix.app.
Internally, it can emit normalized paths in the generated CMake file.
\nThis avoids ambiguity when CMake is configured from:
\n.vix/generated/app/rather than from the user project root.
\nThe generated CMake project lives in:
\n.vix/generated/app/But the user’s source files live in the real project directory:
\nsrc/\ninclude/\nassets/That means the generator must be careful.
\nIt cannot assume that relative paths inside the generated CMake file are relative to the original project root.
\nIt must resolve user paths safely.
\nThis is one reason generated CMake is handled by Vix instead of asking the user to edit it.
\nInput:
\ninclude_dirs = [\n include,\n third_party/asio/include,\n]Generated CMake is conceptually similar to:
\ntarget_include_directories(myapp PRIVATE\n /absolute/path/to/project/include\n /absolute/path/to/project/third_party/asio/include\n)The manifest stays relative and readable.
\nThe generated layer can use resolved paths.
\nInput:
\ndefines = [\n MYAPP_VERSION="1.2.3",\n MYAPP_ENABLE_LOGGING=1,\n]Generated CMake is conceptually similar to:
\ntarget_compile_definitions(myapp PRIVATE\n MYAPP_VERSION="1.2.3"\n MYAPP_ENABLE_LOGGING=1\n)Definitions remain target-local.
\nThey are not global compiler flags.
\nInput:
\ncompile_options = [\n -Wall,\n -Wextra,\n -Wpedantic,\n]Generated CMake:
\ntarget_compile_options(myapp PRIVATE\n -Wall\n -Wextra\n -Wpedantic\n)These options are emitted as raw CMake list items, not quoted strings, because compiler flags and CMake targets often need to remain raw.
\nInput:
\nlink_options = [\n "-Wl,--as-needed",\n]Generated CMake:
\ntarget_link_options(myapp PRIVATE\n -Wl,--as-needed\n)Values containing commas should be quoted in vix.app so the manifest parser does not split them incorrectly.
Input:
\ncompile_features = [\n cxx_std_23,\n]Generated CMake:
\ntarget_compile_features(myapp PRIVATE\n cxx_std_23\n)Most projects can use:
\nstandard = c++23But compile_features is available when explicit CMake features are needed.
Input:
\npackages = [\n Threads:REQUIRED,\n fmt:REQUIRED,\n "Boost:COMPONENTS=system,filesystem:REQUIRED",\n]Generated CMake is conceptually similar to:
\nset(THREADS_PREFER_PTHREAD_FLAG ON)\nfind_package(Threads REQUIRED)\nfind_package(fmt REQUIRED)\nfind_package(Boost REQUIRED COMPONENTS system filesystem)The package field only emits find_package(...).
It does not link imported targets automatically.
\nInput:
\nlinks = [\n Threads::Threads,\n fmt::fmt,\n Boost::system,\n Boost::filesystem,\n]Generated CMake:
\ntarget_link_libraries(myapp PRIVATE\n Threads::Threads\n fmt::fmt\n Boost::system\n Boost::filesystem\n)This separation is deliberate.
\npackages discovers packages.
links links targets or libraries.
The generator does not guess which imported targets a package should link.
\nCMake imported targets such as:
\nThreads::Threads\nfmt::fmt\nBoost::systemshould be emitted as CMake target names.
\nThey should not be treated like ordinary quoted strings.
\nThis is why the generator needs separate handling for:
\nquoted path-like values\nraw CMake target-like valuesFor target links, compile features, compile options, and link options, raw output is usually the correct behavior.
\nInput:
\noutput_dir = binGenerated CMake is conceptually similar to:
\nset_target_properties(myapp PROPERTIES\n RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"\n LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"\n ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"\n)A relative output_dir is resolved under the build directory.
So with:
\nbuild-ninja/the output becomes:
\nbuild-ninja/bin/Input:
\nresources = [\n assets,\n "data/config.json=config/config.json",\n]The generator emits post-build copy commands.
\nConceptually:
\nadd_custom_command(TARGET myapp POST_BUILD\n COMMAND ${CMAKE_COMMAND} -E copy_directory\n /path/to/project/assets\n $<TARGET_FILE_DIR:myapp>/assets\n)And for a renamed file:
\nadd_custom_command(TARGET myapp POST_BUILD\n COMMAND ${CMAKE_COMMAND} -E copy\n /path/to/project/data/config.json\n $<TARGET_FILE_DIR:myapp>/config/config.json\n)The exact generated command may differ, but the behavior is:
\nresources are copied next to the built target after buildThe generated CMake should be readable.
\nEven though users should not edit it, readability matters for debugging.
\nA readable generated file helps engineers understand:
\nwhat Vix parsed\nwhat Vix generated\nwhat CMake is configuring\nwhy a package is found or not found\nwhy a target links or does not link\nwhere resources are copiedGenerated code is still engineering output.
\nIt should not be treated as a black box.
\nIf a vix.app build fails, inspect:
.vix/generated/app/CMakeLists.txtThen run:
\nvix build -vor:
\nvix build --cmake-verboseYou can also pass extra CMake arguments after --:
vix build -- -DCMAKE_PREFIX_PATH=/path/to/prefixThis is useful for packages installed in custom locations.
\nThe best errors should happen before CMake runs.
\nFor example, Vix should catch:
\nmissing name\nmissing sources\ninvalid target type\ninvalid standard\nmalformed array\nunknown field\nsource file not found\ninvalid package syntaxThese errors belong at the manifest layer.
\nCMake should not be the first tool to discover that src/main.cpp does not exist.
Some errors can only happen at configure or build time.
\nExamples:
\npackage not found\nimported target not found\ncompiler flag not supported\nlinker flag not supported\nsymbol not found\nduplicate main()\nundefined referenceThese are normal build errors.
\nVix can improve diagnostics, but they still originate from the compiler, linker, or CMake.
\nInput:
\npackages = [\n fmt:REQUIRED,\n]Generated CMake finds fmt, but no link is emitted.
The build may fail if the source uses fmt.
Correct manifest:
\npackages = [\n fmt:REQUIRED,\n]\n\nlinks = [\n fmt::fmt,\n]This produces both:
\nfind_package(fmt REQUIRED)and:
\ntarget_link_libraries(myapp PRIVATE\n fmt::fmt\n)Input:
\nsources = [\n main.cpp,\n]But the real file is:
\nsrc/main.cppVix should fail during manifest validation:
\nvix.app source file not found: main.cppThe fix is:
\nsources = [\n src/main.cpp,\n]This is better than generating invalid CMake and waiting for CMake to fail later.
\nOne possible design would be:
\nvix app init\ngenerate CMakeLists.txt\nuser edits generated CMakeBut that would turn the generated file into the source of truth.
\nThat is not the goal.
\nThe source of truth should remain:
\nvix.appThe generated CMake is disposable.
\nThat allows Vix to improve the generator without forcing users to maintain generated build files.
\nThe generated CMake layer is the current compatibility path.
\nIt does not have to be the final build path.
\nBecause vix.app is structured, Vix can later build directly from it:
vix.app\n -> native BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkIn that future model, generated CMake may still exist as:
\ndebug output\nfallback path\ncompatibility mode\nexport formatBut the hot path for simple projects could become native.
\nArbitrary CMake is hard to optimize because CMake is a full language.
\nVix has to ask CMake what the build graph is.
\nBut vix.app is declarative and narrow.
Vix can understand it directly.
\nThat means Vix can eventually answer questions like:
\nWhich source files belong to this target?\nWhich include directories affect compilation?\nWhich definitions changed?\nWhich object files can be reused?\nDoes this target need to link again?\nWhich resources need copying?This is the foundation for a faster build path.
\nThe current design is a bridge.
\nIt gives users a small manifest today.
\nIt keeps CMake compatibility today.
\nIt prepares Vix for native build execution later.
\nThat is why generated CMake exists.
\nIt is not the final vision.
\nIt is the safe compatibility layer.
\nWhen debugging a generated CMake project:
\n1. Check vix.app first.\n2. Check .vix/generated/app/CMakeLists.txt.\n3. Check that sources were resolved correctly.\n4. Check include directories.\n5. Check packages.\n6. Check links.\n7. Check output_dir.\n8. Check resource copy commands.\n9. Run vix build -v.\n10. Use --cmake-verbose if configure output is needed.The generator should not try to invent complex logic.
\nIt should not guess:
\nwhich imported targets to link\nwhich optional packages to use\nhow to fetch dependencies\nhow to generate sources\nhow to install packages\nhow to run CTestThose belong in explicit user configuration or full CMake.
\nThe generator should be powerful, but not magical.
\nGenerated CMake is the bridge between vix.app and the existing C++ build ecosystem.
The user writes a small manifest.
\nVix validates it.
\nVix generates a normal CMake project internally.
\nCMake and Ninja build it.
\nThe generated file remains internal and disposable.
\nThis gives Vix a practical path:
\nsimple manifest today\nCMake compatibility today\nnative BuildGraph tomorrowThat is the engineering role of generated CMake in vix.app.
vix.app can describe internal application modules.\nThese modules are not external dependencies.\nThey are parts of the application itself.\nThe goal is simple:
application code stays modular\nthe manifest stays readable\nthe generated build handles the wiringAs a C++ application grows, putting everything into one source tree becomes hard to maintain.\nA backend application may quickly need separated areas such as:
\nWithout a module structure, the project can become a flat collection of headers and source files.\nWithout build automation, every new module also requires manual CMake edits.\nThat creates friction.\nA developer should be able to create a module, declare it in the app, and build.
\nInternal modules are created with:
\nvix modules add UserThis creates a module under:
\nmodules/User/The module has its own public header and implementation file.\nConceptually:
\nmodules/User/\n include/User/api.hpp\n src/User.cpp\n CMakeLists.txtThe module is part of the application.\nIt is not downloaded from the registry.\nIt is not a system package.\nIt is local app code.
\nA vix.app project declares internal modules with:
modules = [\n User,\n]Example:
\nname = api\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]\n\nmodules = [\n User,\n]This tells Vix:
\nthe app target depends on the internal module UserThe generated build links the module into the application target.
\nvix.app keeps different concepts separate.
modules internal application modules\ndeps external packages from the Vix Registry\npackages system or CMake packages resolved with find_package(...)\nlinks raw CMake targets or libraries linked manuallyThis separation is important.\nA module is code inside the current application.\nA registry dependency is external package code.\nA package is a CMake discovery rule.\nA link is a manual target-level link instruction.\nThe manifest stays explicit.
\nA backend app can use internal modules for application features:
\nname = api\ntype = executable\nstandard = c++20\noutput_dir = bin\n\nsources = [\n src/main.cpp,\n src/api/app/AppBootstrap.cpp,\n src/api/support/HttpResponse.cpp,\n]\n\ninclude_dirs = [\n include,\n src,\n]\n\nmodules = [\n User,\n Auth,\n Billing,\n]This makes the app structure visible directly in the manifest.\nThe reader can see that the app has internal modules for:
\nUserAuthBillingwithout opening the generated CMake file.
\nThe internal module flow is:
\nvix modules add User\n -> modules/User/\n -> modules/User/CMakeLists.txt\n\nvix.app\n -> modules = [ User ]\n\nvix build\n -> generate .vix/generated/app/CMakeLists.txt\n -> include cmake/vix_modules.cmake\n -> link api with api::User\n -> build with CMake/NinjaThe user works with:
\nvix modulesvix.appvix buildVix handles the generated CMake layer.
\nA module gets a canonical CMake alias based on the app name.\nFor an app named:
\nname = apiand a module named:
\nUserthe expected module target is:
\napi::UserSo this manifest:
\nname = api\n\nmodules = [\n User,\n]is conceptually linked as:
\ntarget_link_libraries(api PRIVATE api::User)The user does not write this manually in a vix.app project.
The app name is used as the project namespace for internal modules.\nExample:
\nname = blog\n\nmodules = [\n User,\n]Expected module alias:
\nblog::UserAnother app:
\nname = api\n\nmodules = [\n User,\n]Expected module alias:
\napi::UserThis keeps module targets local to the application.\nIt avoids generic target names like:
\nUserwhich could conflict with other libraries or modules.
\nBefore adding modules, a project can initialize the module layout:
\nvix modules initFor a vix.app project, Vix does not patch a root CMakeLists.txt.\nThere is no user-maintained root CMake file.
The output is simple:
\nvix.app project detected. CMake patch skipped.\nmodules initializedVix creates the module directory and module loader.\nThe generated CMake project later includes that loader automatically.
\nAdding a module:
\nvix modules add Usercreates:
\nmodules/User/\nmodules/User/include/User/api.hpp\nmodules/User/src/User.cppFor a vix.app project, the next step is:
add "User" to modules in vix.appThen:
\nvix buildThis is the intended workflow.
\nThe user does not edit generated CMake.
\nvix modules add User creates the module.
It does not automatically add it to vix.app.\nThat is intentional.\nCreating a module and using a module are different actions.\nA project may create a module that is not linked yet.\nA module may be experimental.\nA module may be used later.\nThe manifest should clearly show which modules the app target actually uses.\nThat is why the user declares:
modules = [\n User,\n]The generated CMake includes the module loader from the real project directory:
\ninclude("/absolute/path/to/project/cmake/vix_modules.cmake")The absolute path matters.
\nThe generated CMake file lives in:
\n.vix/generated/app/The module loader lives in:
\ncmake/vix_modules.cmakeA relative include could point to the wrong location.\nSo Vix resolves the module loader from the original project directory.
\nFor a classic CMake project, vix modules init can patch the root CMakeLists.txt.\nFor a vix.app project, that would be wrong.
The source of truth is:
\nvix.appThe generated CMake file is disposable.\nSo the correct behavior is:
\nCMake project -> patch CMakeLists.txt when requested\nvix.app project -> do not patch CMakeLists.txtThis keeps the vix.app workflow clean.
A module separates public API from implementation.
\nExample:
\nmodules/User/\n include/User/api.hpp\n src/User.cppThe public header is what other app code can include:
\n#include <User/api.hpp>The implementation file stays inside the module.\nThis encourages a clear boundary.\nThe application can depend on the module API without knowing the internal implementation layout.
\nInternal modules should follow safe boundaries.\nA public header should not include private implementation files.\nA module that includes another module should declare that relationship in its module CMake target.\nThis prevents hidden coupling.\nIt also makes the build graph easier to understand.\nA module system should not only create folders.\nIt should help preserve architecture.
\nWhen vix.app declares:
modules = [\n User,\n]Vix generates logic equivalent to:
\nif(TARGET api::User)\n target_link_libraries(api PRIVATE api::User)\nelse()\n message(FATAL_ERROR "vix.app module not found: User")\nendif()The exact generated output may evolve.
\nThe idea is stable:
\ndeclared modules become target linksIf a module is declared in vix.app but does not exist, the build should fail clearly.
Example:
\nmodules = [\n User,\n]But the module folder is missing:
\nmodules/User/The error should explain that the module declared in vix.app is not available.\nThis is better than a generic CMake target error.\nThe user should know which manifest entry caused the problem.
Internal modules and registry dependencies can be used together.\nExample:
\nname = api\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]\n\nmodules = [\n User,\n]\n\ndeps = [\n gk/email,\n]Here:
\nUser local application module\ngk/email external registry packageThe generated build links both into the app target.\nBut they remain different concepts in the manifest.
\nThe app should describe its architecture.\nWith modules, the manifest can say:
\nthis application is composed of these internal unitsThat is more meaningful than only listing source files.\nSource files are low-level build input.\nModules are higher-level application structure.\nThis is why modules belongs in vix.app.
As applications grow, architecture becomes more important than build commands.\nA backend project may have:
\nInside those areas, internal modules can represent clear feature boundaries.
\nExample:
\nmodules = [\n User,\n Auth,\n Orders,\n Notifications,\n]This gives the project a visible shape.\nThe manifest becomes more than a file list.\nIt becomes a small architecture map.
\nThe module workflow should feel direct:
\nvix modules init\nvix modules add UserThen edit:
\nmodules = [\n User,\n]Then:
\nvix buildThe output should avoid internal build jargon when it is not needed.\nFor example, in a vix.app project, vix modules add User should not tell the user to edit target_link_libraries(...).\nIt should tell the user to add the module in vix.app.
Vix does not silently link every module in modules/.\nThe user decides what the app uses.\nThis avoids accidental coupling.\nIt also allows modules to exist without being part of the current app target.\nThe manifest remains explicit:
modules = [\n User,\n Billing,\n]Only declared modules are linked.
\nInternal modules currently use generated CMake underneath.
\nThe flow is:
\nmodules/ -> cmake/vix_modules.cmake -> generated CMake -> CMake/NinjaThis is a compatibility layer.\nLater, Vix can use the same manifest data to build modules through a native build graph.\nThe important part is that vix.app now has a structured way to describe internal architecture.
vix.app can now work with internal application modules.\nThe developer can create a module with:
vix modules add UserThen declare it in the manifest:
\nmodules = [\n User,\n]Vix loads the module system.\nVix links the module into the app target.\nThe user does not maintain generated CMake.\nThis keeps the project simple at the surface and modular underneath.
\n'; +const vixAppInternalModules = { + html +}; +export { + vixAppInternalModules as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-manifest-design-BHjfrKWi.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-manifest-design-BHjfrKWi.js new file mode 100644 index 000000000..b7bcf926e --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-manifest-design-BHjfrKWi.js @@ -0,0 +1,8 @@ +const html = 'vix.app is designed around one idea:
a C++ project should be describable before it becomes a build-system programThe manifest is intentionally small.
\nIt does not try to expose every CMake feature.
\nIt describes the common structure of a C++ target in a way that Vix can parse, validate, generate, and later optimize.
\nA C++ project usually needs a build description.
\nEven for a small executable, the build system needs to know:
\ntarget name\ntarget type\nC++ standard\nsource files\ninclude directories\ndefinitions\nlibraries\ncompiler flags\nresourcesCMake can describe all of that.
\nBut CMake also has a much larger surface area:
\nfunctions\nmacros\ncustom commands\ngenerator expressions\ninstall rules\npackage exports\ntoolchain logic\nplatform branches\ndependency fetching\nmulti-target graphsThat power is useful.
\nBut it is not always necessary for a simple app.
\nvix.app separates the common project description from the full build-system language.
The central rule is:
\none vix.app = one targetA target can be:
\nexecutable\nstatic library\nshared libraryThis avoids turning vix.app into a complex multi-target language.
A simple executable:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]A simple static library:
\nname = mathlib\ntype = static\nstandard = c++20\n\nsources = [\n src/add.cpp,\n src/mul.cpp,\n]\n\ninclude_dirs = [\n include,\n]This model is predictable.
\nThe parser reads one target.
\nThe generator emits one target.
\nThe build planner knows the default target name.
\nvix run knows what executable to search for.
A multi-target manifest could look attractive:
\ntargets = [\n app,\n tests,\n examples,\n libs\n]But that creates many questions:
\nHow are targets linked together?\nHow are public and private includes represented?\nHow are per-target packages handled?\nHow are tests discovered?\nHow are examples grouped?\nHow are install rules expressed?\nHow is ordering represented?At that point, the manifest starts becoming a second CMake.
\nThat is not the goal.
\nThe V1 design keeps the boundary clear:
\nsimple target -> vix.app\ncomplex graph -> CMakeLists.txtFor tests and examples, the recommended model is:
\nproject/\n vix.app\n\n tests/\n vix.app\n\n examples/\n basic/\n vix.appEach target stays explicit.
\nA vix.app file is a key-value manifest.
The simplest form is:
\nkey = valueArrays can be written inline:
\nsources = [src/main.cpp, src/app.cpp]or across multiple lines:
\nsources = [\n src/main.cpp,\n src/app.cpp,\n]Comments use #:
# Application target\nname = helloInline comments are also supported:
\ntype = executable # executable targetValues can be quoted when needed:
\nsources = [\n "src/with space.cpp",\n]The format is intentionally boring.
\nThat is a feature.
\nA build manifest should be easy to read in a terminal, easy to review in a diff, and easy to generate from tools.
\nA useful target needs at least two things:
\nname\nsourcesExample:
\nname = hello\n\nsources = [\n src/main.cpp,\n]type and standard have defaults.
The default target type is:
\ntype = executableThe default C++ standard is:
\nstandard = c++20For clarity, most examples still write them explicitly:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]Explicit manifests are easier to understand.
\nThe name field defines the target name.
name = helloThis name is used for several things:
\ngenerated target name\ndefault build target\nexecutable lookup in vix run\nartifact identity\ndiagnosticsThis is why the name should be stable and simple.
\nRecommended:
\nname = myappname = mathlibname = softadastra_serverAvoid:
\nname = "my app"A target name is not a display title.
\nIt is part of the build identity.
\nThe type field defines what is generated.
type = executabletype = statictype = sharedThe common mapping is:
\nexecutable -> add_executable(...)\nstatic -> add_library(... STATIC ...)\nshared -> add_library(... SHARED ...)This is the most important build-system decision the manifest makes.
\nIf the target has main(), it should usually be:
type = executableIf the target is reusable code, it should usually be:
\ntype = staticor:
\ntype = sharedThe standard field chooses the language standard.
standard = c++20Supported values are intentionally explicit:
\nc++17\nc++20\nc++23The manifest does not use forms like:
\ncpp20\n20\nstd20The goal is to keep the syntax close to what C++ developers already recognize.
\nvix.app uses an explicit source list.
sources = [\n src/main.cpp,\n src/app.cpp,\n]This avoids hidden glob behavior.
\nGlobs look convenient at first, but they can make builds less predictable.
\nAn explicit list makes it clear what is part of the target.
\nIt also helps Vix validate the project before generating the internal build files.
\nIf a source file does not exist, Vix can fail early with a useful error instead of waiting for a lower-level build tool to fail later.
\nInclude directories are listed with include_dirs.
include_dirs = [\n include,\n]This maps to the include paths needed by the target.
\nRecommended layout:
\nmyapp/\n include/\n myapp/\n app.hpp\n src/\n main.cpp\n app.cppManifest:
\ninclude_dirs = [\n include,\n]Code:
\n#include <myapp/app.hpp>The manifest stays clear:
\nsources compile files\ninclude_dirs expose header search pathsPreprocessor definitions go under defines.
defines = [\n MYAPP_VERSION="1.0.0",\n MYAPP_ENABLE_LOGGING=1,\n]This keeps compile-time configuration visible in the manifest.
\nIt also avoids hiding important build configuration inside ad-hoc compiler flags.
\nCompiler flags go under compile_options.
compile_options = [\n -Wall,\n -Wextra,\n]These are target-level options.
\nThey are useful for warnings and local tuning.
\nThe manifest does not try to normalize every compiler flag across every compiler.
\nThat is a deliberate boundary.
\nFor portable projects, keep this list small.
\nFor advanced compiler-specific logic, use CMake.
\nLinker flags go under link_options.
link_options = [\n "-Wl,--as-needed",\n]This is separate from compile_options.
The split matters because compiler options and linker options have different meanings.
\nIncorrect:
\ncompile_options = [\n "-Wl,--as-needed",\n]Correct:
\nlink_options = [\n "-Wl,--as-needed",\n]This is one of the most important design choices.
\npackages is for discovery.
links is for linking.
packages -> find_package(...)\nlinks -> target_link_libraries(...)Example:
\npackages = [\n fmt:REQUIRED,\n]\n\nlinks = [\n fmt::fmt,\n]Vix does not automatically link fmt::fmt just because fmt was found.
That would be convenient in some cases, but fragile in others.
\nDifferent packages expose different target names.
\nExamples:
\nfmt -> fmt::fmt\nBoost -> Boost::system, Boost::filesystem\nThreads -> Threads::Threads\nOpenSSL -> OpenSSL::SSL, OpenSSL::CryptoThe manifest keeps this explicit.
\nThe package syntax is compact:
\n<name>\n<name>:REQUIRED\n<name>:COMPONENTS=a,b\n<name>:COMPONENTS=a,b:REQUIREDExamples:
\npackages = [\n Threads:REQUIRED,\n]packages = [\n "Boost:COMPONENTS=system,filesystem:REQUIRED",\n]Values with commas should be quoted.
\nThis prevents the parser from splitting the package into multiple array items.
\nRuntime files go under resources.
resources = [\n assets,\n "data/config.json=config/config.json",\n]The first form copies a file or directory using its basename.
\nresources = [\n assets,\n]The second form copies to a custom destination.
\nresources = [\n "data/config.json=config/config.json",\n]Resources are copied next to the built target.
\nThis is useful for:
\nassets\nconfig files\ntemplates\npublic files\ntest dataoutput_dir controls the target output location inside the build tree.
output_dir = binFor an executable, this usually gives a layout like:
\nbuild-ninja/\n bin/\n myappFor a library, a common value is:
\noutput_dir = libThis field is not an install prefix.
\nIt only controls the build output layout.
\nA JSON manifest would be easy for machines, but less pleasant for humans.
\nThis is noisy:
\n{\n "name": "hello",\n "type": "executable",\n "standard": "c++20",\n "sources": ["src/main.cpp"]\n}The vix.app form is closer to a build manifest:
name = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]It is easier to edit by hand.
\nIt also avoids JSON quoting everywhere.
\nYAML is powerful, but it has a large and sometimes surprising syntax surface.
\nvix.app uses a smaller format on purpose.
The goal is not to support every data-shaping feature.
\nThe goal is to describe a C++ target clearly.
\nTOML would also work.
\nBut vix.app uses a smaller custom format because the domain is narrow.
The manifest needs:
\nkey = value\narray = [...]\ncomments\nquoted valuesThat is enough for the current design.
\nA smaller parser also gives Vix tighter control over diagnostics.
\nThe manifest is not only parsed.
\nIt should be validated.
\nExamples of validation:
\nmissing name\nmissing sources\ninvalid target type\ninvalid standard\nunknown field\nmalformed array\ninvalid package syntax\nsource file not foundEarly validation gives better errors.
\nIt also keeps generated CMake cleaner because invalid states are rejected before generation.
\nToday, the manifest is translated into an internal CMake project.
\nExample flow:
\nvix.app\n -> parse manifest\n -> validate manifest\n -> generate .vix/generated/app/CMakeLists.txt\n -> configure\n -> buildThe generated CMake is not the source of truth.
\nThe source of truth is:
\nvix.appThis separation matters.
\nIt means the user edits a small manifest, while Vix handles the lower-level build details.
\nThe manifest is also useful beyond generated CMake.
\nBecause it is structured, Vix can later use it to build a native graph directly.
\nFuture path:
\nvix.app\n -> native BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkThat is harder with arbitrary CMake because CMake is a full language.
\nBut with vix.app, Vix already knows the target structure.
This makes the manifest a possible fast path.
\nA realistic manifest can look like this:
\nname = myapp\ntype = executable\nstandard = c++23\noutput_dir = bin\n\nsources = [\n src/main.cpp,\n src/app.cpp,\n src/network/client.cpp,\n]\n\ninclude_dirs = [\n include,\n third_party/asio/include,\n]\n\ndefines = [\n MYAPP_VERSION="1.2.3",\n MYAPP_ENABLE_LOGGING=1,\n]\n\npackages = [\n Threads:REQUIRED,\n fmt:REQUIRED,\n "Boost:COMPONENTS=system,filesystem:REQUIRED",\n]\n\nlinks = [\n Threads::Threads,\n fmt::fmt,\n Boost::system,\n Boost::filesystem,\n]\n\ncompile_options = [\n -Wall,\n -Wextra,\n -Wpedantic,\n]\n\nlink_options = [\n "-Wl,--as-needed",\n]\n\ncompile_features = [\n cxx_std_23,\n]\n\nresources = [\n assets,\n "data/config.json=config/config.json",\n]This is still a small file.
\nIt describes the target without exposing the full complexity of CMake.
\nGood fields for vix.app are fields that describe the target directly:
name\ntype\nstandard\nsources\ninclude_dirs\ndefines\nlinks\ncompile_options\nlink_options\ncompile_features\npackages\nresources\noutput_dirThese are stable concepts.
\nThey map well to common C++ projects.
\nSome things should stay out of the manifest.
\nExamples:
\ncomplex install rules\ncustom code generation\nlarge dependency graphs\nFetchContent\nCTest discovery\ntoolchain-specific branches\ncustom CMake functions\npackage export generationThese belong in CMake.
\nThe manifest should not grow until it becomes another build-system language.
\nThe design boundary is:
\nvix.app describes one target.\nCMake describes arbitrary build logic.That boundary keeps both tools useful.
\nvix.app makes the simple path simpler.
CMake remains the escape hatch for full control.
\nThe vix.app manifest is designed to be small, explicit, and predictable.
It focuses on the common shape of a C++ target:
\nname\ntype\nstandard\nsources\nincludes\npackages\nlinks\nresourcesIt avoids hidden magic.
\nIt keeps package discovery separate from linking.
\nIt uses generated CMake today for compatibility.
\nIt can become native BuildGraph input later.
\nThat is the main reason the manifest exists as a separate layer.
\nvix.app is not a second CMake.\nIt is a structured target description for Vix.';
+const vixAppManifestDesign = {
+ html
+};
+export {
+ vixAppManifestDesign as default,
+ html
+};
diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-project-resolution-BAZJoutx.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-project-resolution-BAZJoutx.js
new file mode 100644
index 000000000..e54ee49a6
--- /dev/null
+++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-project-resolution-BAZJoutx.js
@@ -0,0 +1,8 @@
+const html = 'vix.app project resolution is the step where Vix decides what kind of project it is working with.
Before Vix can build or run anything, it needs to answer a few questions:
\nWhere is the project root?\nIs this a CMake project?\nIs this a vix.app project?\nWhat source directory should CMake use?\nWhat target name should be built?\nWhere should build directories be created?This resolution step is small, but it is important.
\nIf project resolution is wrong, the build system can use the wrong directory, the wrong target name, or the wrong generated CMake source.
\nVix uses this rule:
\n1. If CMakeLists.txt exists, use CMakeLists.txt.\n2. Otherwise, if vix.app exists, use vix.app.This keeps existing CMake projects safe.
\nA project like this is resolved as a CMake project:
\nmyapp/\n CMakeLists.txt\n vix.app\n src/\n main.cppA project like this is resolved as a vix.app project:
myapp/\n vix.app\n src/\n main.cppCMake has priority because it is the full-control path.
\nvix.app is used only when there is no CMakeLists.txt.
CMake projects can contain arbitrary build logic.
\nIf a CMakeLists.txt exists, Vix should not ignore it.
That file may define:
\ncustom targets\ngenerated sources\ninstall rules\nCTest integration\ntoolchains\npackage exports\nplatform branches\ndependency setupUsing vix.app instead would risk breaking the project.
The safe rule is:
\nCMakeLists.txt is explicit full control.\nvix.app is the simple project path.The project root is the directory that contains one of these files:
\nCMakeLists.txt\nvix.appWhen Vix starts from a directory, it can search upward until it finds a project root.
\nExample:
\nmyapp/\n vix.app\n src/\n main.cpp\n features/\n auth.cppIf the user runs Vix from:
\nmyapp/src/features/Vix can walk upward and find:
\nmyapp/vix.appThe resolved project root is:
\nmyapp/For a normal CMake project:
\nmyapp/\n CMakeLists.txt\n src/\n main.cppthe resolved model is simple:
\nproject kind: CMake\nuser project dir: myapp/\nCMake source dir: myapp/\nCMakeLists path: myapp/CMakeLists.txt\ntarget name: usually myapp\ngenerated: falseIn this case, the user project directory and the CMake source directory are the same.
\nVix can configure CMake with:
\ncmake -S myapp -B myapp/build-ninjaFor a vix.app project:
myapp/\n vix.app\n src/\n main.cppVix resolves the project differently.
\nThe user project directory is still:
\nmyapp/But the CMake source directory is generated:
\nmyapp/.vix/generated/app/The resolved model becomes:
\nproject kind: vix.app\nuser project dir: myapp/\nCMake source dir: myapp/.vix/generated/app/\nCMakeLists path: myapp/.vix/generated/app/CMakeLists.txt\ntarget name: manifest name\ngenerated: trueSo if vix.app contains:
name = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]then the default target name is:
\nhellonot necessarily the project folder name.
\nThe target name is important because it is used by:
\nvix build\nvix run\nCMake target selection\nexecutable lookup\ndiagnostics\nartifact identityIf the project folder is called:
\nhello-project/but the manifest says:
\nname = hellothen Vix should build and run:
\nhellonot:
\nhello-projectThis is why vix.app resolution must expose the manifest target name.
For vix.app, there are two different directories:
userProjectDir\ncmakeSourceDirThey must not be confused.
\nThe user project directory is where the real project lives:
\nmyapp/It contains:
\nvix.app\nsrc/\ninclude/\nassets/\ntests/The CMake source directory is internal:
\nmyapp/.vix/generated/app/It contains the generated:
\nCMakeLists.txtThese two paths serve different purposes.
\nuserProjectDir should be used for user-facing project operations.
Examples:
\nbuild directories\n.env lookup\n.vix metadata\nresources\nsource path resolution\nsnapshots\nlocal cache state\nexported binaries\nwatch modeFor a vix.app project:
userProjectDir = myapp/That should remain true even though the generated CMake file is somewhere else.
\ncmakeSourceDir should be used for CMake configuration.
Examples:
\ncmake -S\ngenerated CMake diagnostics\nCMakeLists.txt path\nCMake configure source directoryFor a vix.app project:
cmakeSourceDir = myapp/.vix/generated/app/So Vix configures CMake with:
\ncmake -S myapp/.vix/generated/app -B myapp/build-ninjanot with:
\ncmake -S myapp -B myapp/build-ninjabecause the original project root does not contain a CMakeLists.txt.
A common mistake is to store only one projectDir.
For CMake projects, that works because:
\nprojectDir = user project dir = CMake source dirBut for vix.app, that breaks down.
If projectDir is changed to:
myapp/.vix/generated/app/then other systems may accidentally treat the generated directory as the real project.
\nThat can break:
\ntarget name detection\nbuild directory placement\nexport paths\ninput snapshots\nwatch mode\nresource paths\n.env lookup\ncache keysThe correct model is to keep both paths.
\nA build plan should distinguish:
\nuserProjectDir\ncmakeSourceDir\ndefaultTargetName\ngeneratedFromVixAppFor a CMake project:
\nuserProjectDir = myapp/\ncmakeSourceDir = myapp/\ndefaultTargetName = myapp\ngeneratedFromVixApp = falseFor a vix.app project:
userProjectDir = myapp/\ncmakeSourceDir = myapp/.vix/generated/app/\ndefaultTargetName = manifest.name\ngeneratedFromVixApp = trueThis makes the rest of the build system simpler.
\nEach operation can choose the correct path.
\nCMake configure should use:
\ncmakeSourceDirFor CMake projects:
\ncmake -S myapp -B myapp/build-ninjaFor vix.app projects:
cmake -S myapp/.vix/generated/app -B myapp/build-ninjaThis is the only path that should be passed to cmake -S.
Build directories should be created under the user project directory.
\nFor example:
\nmyapp/build-ninja/\nmyapp/build-dev/\nmyapp/build-release/Not under:
\nmyapp/.vix/generated/app/build-ninja/The generated CMake directory is internal source metadata.
\nIt should not become the visible project root.
\nFor vix.app, the default target should come from:
name = helloSo vix build should build:
cmake --build build-ninja --target hellonot:
\ncmake --build build-ninja --target appThe generated directory is named app, but that is not the target name.
The target name belongs to the manifest.
\nFor vix build, project resolution should produce a build plan.
The build plan should contain:
\nuserProjectDir\ncmakeSourceDir\nbuildDir\nconfigureLog\nbuildLog\ndefaultTargetName\ngeneratedFromVixAppThen the build command can do:
\nconfigure:\n cmake -S cmakeSourceDir -B buildDir\n\nbuild:\n cmake --build buildDir --target defaultTargetName\n\ncache/snapshot/export:\n use userProjectDirThis keeps CMake integration and user project handling separate.
\nvix run also needs the same resolved project metadata.
It needs to know:
\nwhere to configure\nwhere to build\nwhich target to build\nwhich executable to run\nwhere the real project livesFor vix.app, it should use:
resolved.userProjectDir\nresolved.cmakeSourceDir\nresolved.targetName\nresolved.generatedThen it can build the correct target and search for the executable by manifest name.
\nAfter building, vix run needs to find the executable.
For a vix.app project:
name = hello\noutput_dir = binVix should search common locations such as:
\nbuild-ninja/hello\nbuild-ninja/bin/hello\nbuild-ninja/src/helloThe lookup should use:
\ntargetName = hellonot the folder name and not the generated directory name.
\nWatch mode should watch the real project directory.
\nFor CMake projects:
\nwatch myapp/For vix.app projects:
watch myapp/It should not watch only:
\nmyapp/.vix/generated/app/The generated directory does not contain the user’s real source files.
\nWatch mode belongs to the user project directory.
\nProject resolution also affects diagnostics.
\nFor a generated vix.app project, build errors may involve:
generated CMakeLists.txt\nreal source files\nmanifest fieldsA good diagnostic should show the correct context.
\nExamples:
\nProject directory:\n myapp/\n\nGenerated CMake source:\n myapp/.vix/generated/app/\n\nBuild directory:\n myapp/build-ninja/This helps engineers understand which layer failed.
\nWhen configure fails for a vix.app project, the relevant CMake file is:
.vix/generated/app/CMakeLists.txtSo CMake diagnostics should point there.
\nBut source validation errors should point back to:
\nvix.app\nsrc/main.cpp\ninclude/The diagnostic layer should not confuse generated files with user-authored files.
\nA dedicated project resolver makes this logic reusable.
\nBoth vix build and vix run need the same answer:
What project is this?\nWhere is the real root?\nWhere is the CMake source?\nWhat target should I build?\nWas this generated from vix.app?If each command implements its own resolution logic, they can drift.
\nA shared resolver keeps behavior consistent.
\nA useful resolver result contains:
\nkind\nuserProjectDir\ncmakeSourceDir\ncmakeListsPath\nappManifestPath\ntargetName\ngenerated\nerrorFor a CMake project:
\nkind = CMake\nuserProjectDir = project/\ncmakeSourceDir = project/\ncmakeListsPath = project/CMakeLists.txt\ntargetName = project folder name\ngenerated = falseFor a vix.app project:
kind = vix.app\nuserProjectDir = project/\ncmakeSourceDir = project/.vix/generated/app/\ncmakeListsPath = project/.vix/generated/app/CMakeLists.txt\nappManifestPath = project/vix.app\ntargetName = manifest.name\ngenerated = trueThe resolver can start from:
\ncurrent directory\na file path\na directory passed with --dirThen it searches upward for:
\nCMakeLists.txt\nvix.appThe first directory containing either file becomes the project root.
\nInside that root, CMake has priority.
\nProject:
\nhello/\n vix.app\n src/\n main.cppCommand:
\ncd hello\nvix buildResolved result:
\nkind = vix.app\nuserProjectDir = hello/\ncmakeSourceDir = hello/.vix/generated/app/\ntargetName = manifest.nameProject:
\nhello/\n vix.app\n src/\n features/\n auth.cppCommand:
\ncd hello/src/features\nvix buildThe resolver walks upward and finds:
\nhello/vix.appResolved root:
\nhello/Project:
\nhello/\n CMakeLists.txt\n vix.app\n src/\n main.cppResolved result:
\nkind = CMake\nuserProjectDir = hello/\ncmakeSourceDir = hello/\ngenerated = falseThe vix.app file is ignored for project resolution.
Resolution can fail when neither file exists.
\nExample:
\nempty-folder/\n src/\n main.cppCommand:
\nvix buildError:
\nUnable to determine the project directory.\nMissing CMakeLists.txt or vix.app.The fix is to add either:
\nCMakeLists.txtor:
\nvix.appFor vix.app, resolution includes loading the manifest.
This can fail when:
\nname is missing\nsources are missing\ntype is invalid\nstandard is invalid\narray syntax is malformed\nunknown field is presentIn that case, project resolution should return a structured error.
\nThe command should display that error clearly and stop before CMake runs.
\nAfter the manifest is loaded, Vix generates the internal CMake project.
\nGeneration can fail when:
\nsource files do not exist\nresource paths are invalid\noutput paths are invalid\npackage syntax is invalid\ntarget name is invalidThese are still manifest-level or generation-level errors.
\nThey should be reported before the configure/build stage when possible.
\nProject resolution is also the foundation for future native vix.app builds.
The future build path may be:
\nvix.app\n -> native BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkThat path still needs the same resolved metadata:
\nuserProjectDir\ntargetName\nsources\ninclude_dirs\ndefines\noutput_dir\nresourcesSo clean project resolution is not only about generated CMake.
\nIt is also preparation for a native build engine.
\nA clean architecture has three layers:
\nProject resolution\n decides what project this is\n\nBuild planning\n decides what to configure, build, cache, and run\n\nExecution\n runs CMake, Ninja, native tasks, or the final executablevix.app should enter the system at the resolution layer.
It should not be patched into every command separately.
\nWhen changing Vix project resolution, keep this rule in mind:
\nCMake source directory is not always the user project directory.\nTarget name is not always the project folder name.This is the core lesson from vix.app.
For normal CMake projects, those values often look the same.
\nFor generated projects, they are different.
\nvix.app project resolution is about keeping identities separate.
A vix.app project has:
a real user project directory\na generated CMake source directory\na manifest-defined target name\na generated flagCMake projects remain the full-control path.
\nvix.app projects become the simple path.
The resolver connects both models through one consistent result.
\nThat consistency lets vix build, vix run, diagnostics, caching, and future native builds all reason about the project the same way.
vix.app can now declare dependencies from the Vix Registry directly in the application manifest.
The application stays simple.\nThe dependency system stays explicit.\nThe generated build keeps the native C++ integration underneath.
\nA C++ application often needs small external libraries.\nWithout a higher-level manifest, the user usually has to manage several things manually:
\nwhere the dependency is installed\nwhich include directory it exposes\nwhich CMake target it exports\nwhich transitive dependencies it needs\nhow the package is linked to the app targetThat is too much wiring for simple application projects.\nFor vix.app, the user should describe the application.\nThey should not have to maintain generated CMake glue by hand.
Registry dependencies are declared with deps.
Example:
\nname = api\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]\n\ndeps = [\n gk/email,\n]This means:
\nthe application depends on the Vix Registry package gk/emailThe user still installs dependencies with:
\nvix installThen builds normally:
\nvix buildvix.app now has several dependency-related fields, but they do not mean the same thing.
modules internal application modules created with vix modules\ndeps external packages from the Vix Registry\npackages system or CMake packages resolved with find_package(...)\nlinks raw CMake targets or libraries linked manuallyThis separation matters.\nA module is application code.\nA registry dependency is external package code.\nA package is a CMake discovery rule.\nA link is a target-level link instruction.\nKeeping these concepts separate makes the manifest predictable.
\nA backend app can use both internal modules and registry dependencies:
\nname = api\ntype = executable\nstandard = c++20\noutput_dir = bin\n\nsources = [\n src/main.cpp,\n src/api/app/AppBootstrap.cpp,\n]\n\ninclude_dirs = [\n include,\n src,\n]\n\nmodules = [\n User,\n]\n\ndeps = [\n gk/email,\n]Here:
\nUser is an internal application module\ngk/email is an external registry dependencyThe generated CMake handles both, but the manifest keeps them visually separate.
\nThe dependency flow is:
\nvix.app\n -> deps = [...]\n -> vix.json / vix.lock\n -> vix install\n -> .vix/deps/\n -> .vix/vix_deps.cmake\n -> .vix/generated/app/CMakeLists.txt\n -> CMake/Ninja buildvix.app declares the dependency.\nvix install installs the resolved packages.\nThe generated vix_deps.cmake exposes CMake targets.\nThe generated application CMake includes that file and links the declared dependencies.
vix.app is declarative.
It does not fetch packages by itself.\nDependency installation remains explicit:
\nvix installThis keeps the build reproducible.\nIt also keeps dependency installation separate from normal compilation.\nA missing dependency integration file gives a direct error:
\nvix.app dependencies are declared, but .vix/vix_deps.cmake was not found.\nRun: vix installThat is better than letting CMake fail later with a confusing missing include or missing target.
\nWhen deps is not empty, the generated application CMake includes:
include("/absolute/path/to/project/.vix/vix_deps.cmake")The path is absolute on purpose.\nThe generated CMake project lives under:
\n.vix/generated/app/The dependency integration file lives under:
\n.vix/vix_deps.cmakeA relative include such as:
\ninclude(.vix/vix_deps.cmake)would be wrong because it would be resolved relative to the generated CMake directory, not the user project root.\nSo Vix emits an absolute path.
\nA registry dependency uses this canonical target convention:
\nnamespace/name -> namespace::nameExample:
\ngk/email -> gk::emailSo this manifest:
\ndeps = [\n gk/email,\n]is linked conceptually as:
\ntarget_link_libraries(api PRIVATE gk::email)The user does not need to write that manually in a vix.app project.
Some registry packages are header-only.\nFor those packages, Vix should not require a full CMake project.\nIt can create an interface target:
\nadd_library(gk::email INTERFACE)\ntarget_include_directories(gk::email INTERFACE\n /path/to/.vix/deps/gk.email/include\n)The exact generated target may use an internal safe name and expose the public alias:
\ngk::emailThe important point is that the application can link the dependency by its canonical registry target.
\nSome packages include their own CMakeLists.txt.\nWhen the package is not header-only, Vix can load it with add_subdirectory(...).\nBut header-only packages are handled differently.\nEven if a header-only package contains a CMakeLists.txt, Vix can safely expose it as an interface dependency.\nThis avoids entering package CMake code that may be written for standalone builds.
A registry package may depend on other registry packages.
\nExample:
\ngk/email\n -> gk/jwt\n -> gaspardkirira/hmacThe lock file contains the full resolved dependency graph.\nvix install installs all resolved dependencies and generates CMake integration for each one.\nThat means the final project can have:
gk::email\ngk::jwt\ngaspardkirira::hmacavailable from .vix/vix_deps.cmake.\nThe app manifest only needs to declare what the app uses directly:
deps = [\n gk/email,\n]The transitive packages are still installed and made available by the lock.
\nA dependency can be installed correctly but still fail to link if no expected CMake target exists.
\nFor example:
\ndependency: gk/email\nexpected target: gk::emailVix solves this by ensuring a stable target exists for header-only packages.\nThat makes this work:
\ndeps = [\n gk/email,\n]without asking the user to know the internal build details of gk/email.
The generated CMake emits a stable Vix error marker when a declared dependency is not linkable.\nInstead of a generic CMake error like:
\nCMake configure failedVix can show:
\nerror: vix.app dependency is not linkable\ndependency: gk/email\ntarget: gk::emailThis is important.\nThe user should know that the dependency is installed, but the expected build target is missing.\nThat is a Vix dependency integration problem, not a random CMake failure.
\nFor a classic CMake project, vix install can tell the user to add:
include(.vix/vix_deps.cmake)\ntarget_link_libraries(app PRIVATE ...)But for a vix.app project, that message is wrong.
The user should not edit CMakeLists.txt.
For vix.app, the correct next step is:
vix buildSo the developer flow becomes:
\nvix add @gk/email\nvix install\nvix buildNo manual CMake wiring is needed.
\nA project starts with:
\nname = api\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]\n\ndeps = [\n gk/email,\n]The user runs:
\nvix installVix installs the dependencies:
\ngk/email\ngk/jwt\ngaspardkirira/hmacThen:
\nvix buildThe app builds through the generated CMake project.\nThe application manifest stays the source of truth.
\nThe goal of vix.app is not to hide C++.\nThe goal is to remove repetitive project wiring.\nDependency declarations are application-level information.\nThey belong in the application manifest.\nThe user should be able to read one file and understand:
That is the value of vix.app.
vix.app does not remove explicitness.
It still keeps these concepts separate:
\ndeps for Vix Registry packagespackages for CMake find_package(...)links for manual CMake targetsmodules for internal application modulesThis avoids hidden magic.
\nIf a dependency is from the Vix Registry, use deps.\nIf it is a system dependency, use packages.\nIf a target must be linked manually, use links.\nIf it is application code, use modules.
The current registry dependency integration still uses CMake underneath.
\nThe flow is:
\nregistry deps -> .vix/vix_deps.cmake -> generated CMake -> CMake/NinjaThis is still a compatibility layer.\nLater, Vix can use the same structured manifest and lockfile to build directly from a native build graph.\nThe important part is that the manifest is now structured enough to support both paths.
\nvix.app can now describe registry dependencies directly.
The developer writes:
\ndeps = [\n gk/email,\n]Vix installs the dependency graph.\nVix generates the CMake integration.\nVix links the declared dependency into the app target.\nThe user does not edit generated CMake.\nThis keeps the application manifest simple while still producing a normal native C++ build.
\n'; +const vixAppRegistryDependencies = { + html +}; +export { + vixAppRegistryDependencies as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-tests-and-examples-9qHCWkhj.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-tests-and-examples-9qHCWkhj.js new file mode 100644 index 000000000..5ff6c4eec --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-app-tests-and-examples-9qHCWkhj.js @@ -0,0 +1,8 @@ +const html = 'vix.app is intentionally designed around one rule:
one vix.app = one targetThat rule also affects how tests and examples should be organized.
\nInstead of adding a complex multi-target syntax to one manifest, the recommended approach is to use separate manifests:
\nproject/\n vix.app\n\n tests/\n vix.app\n\n examples/\n basic/\n vix.appThis keeps each target small, explicit, and easy to build.
\nA test executable is a different target from the library or application being tested.
\nAn example executable is also a different target.
\nIf vix.app tried to describe everything in one file, it would quickly need concepts like:
targets\ntest targets\nexample targets\ntarget dependencies\npublic includes\nprivate includes\nper-target packages\nper-target links\nper-target resourcesThat is already build-system territory.
\nFor vix.app V1, the simpler model is better:
root/vix.app -> main app or library\ntests/vix.app -> test executable\nexamples/basic/vix.app -> example executableEach folder is independently buildable.
\nFor a library with tests and examples:
\nmathlib/\n vix.app\n\n include/\n mathlib/\n math.hpp\n\n src/\n add.cpp\n mul.cpp\n\n tests/\n vix.app\n test_math.cpp\n\n examples/\n basic/\n vix.app\n src/\n main.cppThis gives three independent targets:
\nmathlib -> static library\nmathlib_tests -> test executable\nmathlib_basic_example -> example executableThe root manifest builds the library.
\nmathlib/vix.app:
name = mathlib\ntype = static\nstandard = c++20\n\nsources = [\n src/add.cpp,\n src/mul.cpp,\n]\n\ninclude_dirs = [\n include,\n]This manifest describes the library target only.
\nIt does not describe tests.
\nIt does not describe examples.
\ninclude/mathlib/math.hpp:
#pragma once\n\nnamespace mathlib\n{\n int add(int a, int b);\n int mul(int a, int b);\n}src/add.cpp:
#include <mathlib/math.hpp>\n\nnamespace mathlib\n{\n int add(int a, int b)\n {\n return a + b;\n }\n}src/mul.cpp:
#include <mathlib/math.hpp>\n\nnamespace mathlib\n{\n int mul(int a, int b)\n {\n return a * b;\n }\n}Build the library:
\nvix buildThe test manifest builds an executable.
\nmathlib/tests/vix.app:
name = mathlib_tests\ntype = executable\nstandard = c++20\n\nsources = [\n test_math.cpp,\n ../src/add.cpp,\n ../src/mul.cpp,\n]\n\ninclude_dirs = [\n ../include,\n]Notice the paths:
\ntest_math.cpp\n../src/add.cpp\n../src/mul.cpp\n../includeBecause this manifest is inside:
\nmathlib/tests/all paths are relative to that directory.
\nmathlib/tests/test_math.cpp:
#include <vix.hpp>\n#include <mathlib/math.hpp>\n\nint main()\n{\n if (mathlib::add(2, 3) != 5)\n {\n vix::print("add test failed");\n return 1;\n }\n\n if (mathlib::mul(4, 5) != 20)\n {\n vix::print("mul test failed");\n return 1;\n }\n\n vix::print("all tests passed");\n return 0;\n}Run the tests:
\ncd tests\nvix runExpected output:
\nall tests passedIn vix.app V1, there is no multi-target dependency graph inside one manifest.
So the test executable includes the implementation files it needs:
\nsources = [\n test_math.cpp,\n ../src/add.cpp,\n ../src/mul.cpp,\n]This is simple and explicit.
\nFor small libraries, it works well.
\nFor larger projects with many targets and dependencies, use CMakeLists.txt.
Applications should keep most logic outside main.cpp.
Recommended layout:
\nmyapp/\n vix.app\n\n include/\n myapp/\n app.hpp\n\n src/\n main.cpp\n app.cpp\n\n tests/\n vix.app\n test_app.cppRoot vix.app:
name = myapp\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n src/app.cpp,\n]\n\ninclude_dirs = [\n include,\n]Test vix.app:
name = myapp_tests\ntype = executable\nstandard = c++20\n\nsources = [\n test_app.cpp,\n ../src/app.cpp,\n]\n\ninclude_dirs = [\n ../include,\n]The test manifest includes:
\n../src/app.cppbut not:
\n../src/main.cppThis avoids duplicate main() errors.
Keep main.cpp small:
#include <myapp/app.hpp>\n\nint main()\n{\n return myapp::run();\n}Put testable logic in:
\nsrc/app.cpp\ninclude/myapp/app.hppThis makes the test target simple.
\ninclude/myapp/app.hpp:
#pragma once\n\nnamespace myapp\n{\n int add(int a, int b);\n int run();\n}src/app.cpp:
#include <vix.hpp>\n#include <myapp/app.hpp>\n\nnamespace myapp\n{\n int add(int a, int b)\n {\n return a + b;\n }\n\n int run()\n {\n vix::print("myapp running");\n return 0;\n }\n}src/main.cpp:
#include <myapp/app.hpp>\n\nint main()\n{\n return myapp::run();\n}tests/test_app.cpp:
#include <vix.hpp>\n#include <myapp/app.hpp>\n\nint main()\n{\n if (myapp::add(10, 20) != 30)\n {\n vix::print("add test failed");\n return 1;\n }\n\n vix::print("app tests passed");\n return 0;\n}Run:
\ncd tests\nvix runTests can be split across several files.
\nExample:
\nmathlib/\n tests/\n vix.app\n test_main.cpp\n test_add.cpp\n test_mul.cpptests/vix.app:
name = mathlib_tests\ntype = executable\nstandard = c++20\n\nsources = [\n test_main.cpp,\n test_add.cpp,\n test_mul.cpp,\n ../src/add.cpp,\n ../src/mul.cpp,\n]\n\ninclude_dirs = [\n ../include,\n]test_main.cpp:
#include <vix.hpp>\n\nint run_add_tests();\nint run_mul_tests();\n\nint main()\n{\n if (run_add_tests() != 0)\n return 1;\n\n if (run_mul_tests() != 0)\n return 1;\n\n vix::print("all tests passed");\n return 0;\n}test_add.cpp:
#include <vix.hpp>\n#include <mathlib/math.hpp>\n\nint run_add_tests()\n{\n if (mathlib::add(2, 3) != 5)\n {\n vix::print("add test failed");\n return 1;\n }\n\n return 0;\n}test_mul.cpp:
#include <vix.hpp>\n#include <mathlib/math.hpp>\n\nint run_mul_tests()\n{\n if (mathlib::mul(4, 5) != 20)\n {\n vix::print("mul test failed");\n return 1;\n }\n\n return 0;\n}Tests sometimes need input files.
\nExample layout:
\nmyapp/\n tests/\n vix.app\n test_config.cpp\n data/\n config.jsontests/vix.app:
name = config_tests\ntype = executable\nstandard = c++20\noutput_dir = bin\n\nsources = [\n test_config.cpp,\n]\n\nresources = [\n data,\n]Build and run:
\ncd tests\nvix runThe data directory is copied next to the test executable.
You can also rename or nest resources:
\nresources = [\n "data/config.json=config/config.json",\n]This copies:
\ndata/config.jsonto:
\nconfig/config.jsonnext to the test executable.
\nA test target can use packages and links like any other target.
\nExample:
\nname = threaded_tests\ntype = executable\nstandard = c++20\n\nsources = [\n test_threads.cpp,\n]\n\npackages = [\n Threads:REQUIRED,\n]\n\nlinks = [\n Threads::Threads,\n]The rule is the same:
\npackages finds packages\nlinks links targetsTest targets can have their own compiler options:
\nname = mathlib_tests\ntype = executable\nstandard = c++20\n\nsources = [\n test_math.cpp,\n ../src/add.cpp,\n]\n\ninclude_dirs = [\n ../include,\n]\n\ncompile_options = [\n -Wall,\n -Wextra,\n -Wpedantic,\n]This keeps test build settings close to the test target.
\nTest-specific definitions can be added with defines:
name = mathlib_tests\ntype = executable\nstandard = c++20\n\nsources = [\n test_math.cpp,\n ../src/add.cpp,\n]\n\ninclude_dirs = [\n ../include,\n]\n\ndefines = [\n MATHLIB_TESTING=1,\n]Then in C++:
\n#ifdef MATHLIB_TESTING\n// test-only behavior\n#endifExamples follow the same rule as tests:
\none example target = one vix.appRecommended layout:
\nmathlib/\n examples/\n basic/\n vix.app\n src/\n main.cpp\n advanced/\n vix.app\n src/\n main.cppEach example can be built independently.
\nexamples/basic/vix.app:
name = mathlib_basic_example\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n ../../src/add.cpp,\n ../../src/mul.cpp,\n]\n\ninclude_dirs = [\n ../../include,\n]examples/basic/src/main.cpp:
#include <vix.hpp>\n#include <mathlib/math.hpp>\n\nint main()\n{\n vix::print("2 + 3 =", mathlib::add(2, 3));\n vix::print("4 * 5 =", mathlib::mul(4, 5));\n return 0;\n}Run:
\ncd examples/basic\nvix runExample layout:
\nmyapp/\n examples/\n resources/\n vix.app\n src/\n main.cpp\n assets/\n message.txtexamples/resources/vix.app:
name = resources_example\ntype = executable\nstandard = c++20\noutput_dir = bin\n\nsources = [\n src/main.cpp,\n]\n\nresources = [\n assets,\n]Run:
\ncd examples/resources\nvix runExample:
\nname = fmt_example\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]\n\npackages = [\n fmt:REQUIRED,\n]\n\nlinks = [\n fmt::fmt,\n]This keeps package requirements explicit for the example itself.
\nIndependent examples are useful because they can be copied, tested, and understood alone.
\nA reader can enter the folder and run:
\nvix runwithout understanding the entire repository.
\nThat makes examples better for documentation and debugging.
\nA simple CI flow for a library can run:
\nvix build\n\ncd tests\nvix build\nvix runIf the project has examples:
\ncd examples/basic\nvix build\nvix runFor release builds:
\nvix build --preset releaseinside each target folder.
\nCTest is powerful, but it brings a larger model:
\ntest registration\ntest discovery\ntest properties\nfixtures\nlabels\nparallel execution\nworking directoriesThat belongs in full CMake for now.
\nFor vix.app V1, test executables are enough.
A test passes when the executable returns 0.
A test fails when it returns non-zero.
\nThis keeps the model simple.
\nUse CMakeLists.txt when tests need:
CTest integration\nGoogleTest discovery\nFetchContent\nmany test targets\nfixtures\ngenerated test files\ncoverage tools\ncustom test commandsvix.app is best for simple test executables.
Wrong:
\nsources = [\n test_app.cpp,\n ../src/main.cpp,\n ../src/app.cpp,\n]This can create duplicate main() errors.
Correct:
\nsources = [\n test_app.cpp,\n ../src/app.cpp,\n]Inside tests/vix.app, this is usually wrong:
sources = [\n src/add.cpp,\n]Because the file is probably one level above:
\nsources = [\n ../src/add.cpp,\n]If your test includes:
\n#include <mathlib/math.hpp>you need:
\ninclude_dirs = [\n ../include,\n]If the root project is:
\ntype = staticthen use:
\nvix buildTo run something, use:
\ntests/vix.appor:
\nexamples/basic/vix.appAvoid trying to describe an entire workspace in one vix.app.
Prefer:
\none folder\none target\none manifestmathlib/\n vix.app\n include/\n src/\n tests/\n vix.app\n test_math.cppmathlib/\n vix.app\n include/\n src/\n examples/\n basic/\n vix.app\n src/\n main.cppmyapp/\n vix.app\n include/\n src/\n tests/\n vix.app\n test_app.cppFor tests and examples, keep the model simple:
\nroot/vix.app -> main target\ntests/vix.app -> test executable\nexamples/name/vix.app -> example executableUse explicit sources.
\nUse relative paths carefully.
\nDo not include main.cpp in test executables.
Use CMake when the test system becomes complex.
\nvix.app is strongest when every manifest describes one clear target.
An object cache speeds up compilation at the source-file level.\nAn artifact cache works at a larger level.\nIt answers a different question:
\nHave we already built this target, package, or binary with the same relevant inputs?If the answer is yes, Vix can reuse the result instead of rebuilding it.\nThis is especially important for C++ because repeated builds often spend time not only compiling source files, but also rebuilding libraries, relinking executables, and rebuilding dependencies that did not really change.
\nThe object cache works on individual compilation outputs.
\nsrc/app.cpp -> app.oThe artifact cache works on larger outputs.
\nobjects + libraries + link options -> executableor:
\npackage source + compiler + build options -> compiled package artifactThe two caches solve different problems.
\nObject cache:\n reuse compiled object files\n\nArtifact cache:\n reuse larger build outputsA serious C++ build system needs both.
\nAn artifact is a build output that can be reused.
\nExamples:
\nexecutable binary\nstatic library\nshared library\ncompiled package\ngenerated install prefix\nexported headers and libraries\nfinal linked targetFor example:
\nbuild-ninja/bin/serveris an artifact.
\nSo is:
\nbuild-ninja/lib/libmathlib.aA compiled dependency can also be an artifact.
\nImagine a dependency that rarely changes.\nWithout an artifact cache, each project may rebuild it again.\nWith an artifact cache, Vix can build it once, store the result, and reuse it when the same inputs appear again.\nThis matters for:
\nglobal packages\ncompiled dependencies\nCI builds\nclean builds\nlarge libraries\nrepeated local builds\ncross-project reuseThe goal is not to hide compilation.\nThe goal is to avoid rebuilding known outputs.
\nThe basic artifact cache flow is:
\n1. describe the artifact\n2. compute a fingerprint\n3. check the cache\n4. if hit, restore or reuse the artifact\n5. if miss, build normally\n6. store the result after successA cache hit is only safe if the fingerprint is correct.
\nAn artifact needs a stable identity.\nFor example:
\npackage name\npackage version\ntarget name\ncompiler identity\nbuild type\ntarget triple\nbuild options\nsource fingerprint\ndependency fingerprintA compiled library built with GCC Debug is not the same as the same library built with Clang Release.\nThe artifact identity must include enough information to avoid invalid reuse.
\nA fingerprint is a compact representation of build-relevant inputs.\nFor an artifact, the fingerprint can include:
\nsource file hashes\nheader file hashes\nmanifest hash\nCMake configuration hash\ncompiler identity\ncompiler flags\nlinker identity\nlink options\ntarget triple\nbuild type\npackage versions\ndependency artifact hashesIf the fingerprint changes, the artifact is not the same.
\nThe artifact cache must follow one rule:
\nreuse only when the artifact identity matchesIf Vix is not sure, it should rebuild.\nA false cache miss is acceptable.\nA false cache hit is dangerous.\nA build cache must be conservative.
\nArtifact caching can also use local build state.\nA local state file can record:
\nlast target built\nlast artifact fingerprint\noutput path\ninput snapshot\nbuild options\nsuccess statusThis helps Vix detect no-op builds.
\nExample:
\nbuild-ninja/.vix-build-stateIf the state says the current target was already built with the same inputs, Vix may skip work.
\nA global artifact cache can live outside the project.
\nExample:
\n~/.vix/cache/build/This allows reuse across projects.
\nA possible structure:
\n~/.vix/cache/build/\n <target-or-package>/\n <compiler>/\n <build-type>/\n <target-triple>/\n <fingerprint>/\n manifest.json\n include/\n lib/\n bin/\n share/The exact layout can evolve.\nThe important idea is that reusable artifacts are stored by identity.
\nPackage artifacts are especially useful.\nSuppose a package is installed globally.\nThe source may live under:
\n~/.vix/global/packages/When compiled, the result can be cached under:
\n~/.vix/cache/build/Then another project can reuse the compiled result if:
\nsame package\nsame version\nsame compiler\nsame build type\nsame target triple\nsame build optionsThis reduces repeated dependency builds.
\nHeader-only packages do not need compiled artifacts.\nFor them, artifact cache may only record include paths and metadata.
\nExample:
\ninclude/\nmanifest.jsonNo library output is needed.\nThis distinction matters because header-only packages should not be treated like compiled packages.
\nCompiled packages can produce:
\nstatic libraries\nshared libraries\nCMake config files\nheaders\ngenerated metadataThese are good artifact cache candidates.\nThe cache can store a reusable prefix:
\ninclude/\nlib/\nshare/Then Vix can add that prefix to the build system.
\nFor compiled packages, Vix can expose cached artifacts through CMake.\nFor example, if a package artifact contains:
\nlib/cmake/package/packageConfig.cmakeVix can add the artifact prefix to:
\nCMAKE_PREFIX_PATHThen normal CMake package discovery can find it.\nThis keeps artifact reuse compatible with CMake.
\nIf a compiled artifact is not available, Vix can fall back to source-based integration.\nThe fallback might be:
\nuse add_subdirectory(...)\nbuild package from source\nstore artifact after successThis gives a practical path:
\ncache hit -> reuse compiled artifact\ncache miss -> build from sourceThen future builds become faster.
\nEvery cached artifact should have metadata.
\nExample:
\n{\n "name": "mathlib",\n "version": "1.0.0",\n "target": "mathlib",\n "compiler": "g++",\n "compiler_version": "13.3.0",\n "build_type": "Release",\n "target_triple": "x86_64-linux-gnu",\n "fingerprint": "...",\n "created_at": "...",\n "outputs": ["lib/libmathlib.a"]\n}The exact format can change.\nThe important part is explainability.\nVix should know what an artifact is and why it is valid.
\nAn artifact cache hit means Vix found a complete reusable output.\nExample:
\nartifact cache hit: mathlibThen Vix can reuse the cached artifact instead of rebuilding it.\nFor a package, that may mean adding a cached prefix to the build.\nFor a final target, that may mean restoring the binary or skipping the build.
\nAn artifact cache miss means no valid artifact was found.\nReasons can include:
\nfirst build\nsource changed\ncompiler changed\nbuild type changed\ntarget triple changed\ndependency changed\nlink options changed\npackage version changed\ncache entry missing\ncache entry invalidA miss should not be treated as an error.\nIt simply means Vix must build normally.
\nAfter a successful build, Vix can store the artifact.\nFor a library, store:
\nlibrary file\npublic headers if needed\nmetadata\ndependency informationFor an executable, store:
\nbinary\nresources if needed\nmetadataFor a package prefix, store:
\ninclude/\nlib/\nshare/\nmanifest.jsonStoring should happen only after the build succeeds.
\nA local artifact state can make no-op builds very fast.\nIf the current project inputs match the previous successful build state, Vix may avoid:
\nconfigure\ncompile\nlink\ncopyor at least avoid most of them.\nThe ideal no-op build is:
\nnothing changed\nnothing to do\ndoneThis is one of the places where Vix can feel much faster than traditional workflows.
\nA clean build normally removes the build directory.
\nrm -rf build-ninjaWithout a cache, everything must rebuild.\nWith a warm artifact cache, Vix may restore or reuse:
\ncompiled packages\nstatic libraries\nfinal binariesThe build directory is clean, but the global cache is not.\nThat can turn a clean build into a mostly restore operation.
\nThe strongest model combines both caches.
\nArtifact cache hit:\n reuse whole target or package\n\nArtifact cache miss:\n use object cache for individual compile tasks\n\nObject cache miss:\n compile sourceThis gives several layers of acceleration.\nVix should always try the largest safe reuse first.
\nA layered strategy can look like this:
\n1. Check local no-op state.\n2. Check artifact cache for target or package.\n3. Check object cache for compile tasks.\n4. Run compiler for remaining misses.\n5. Link only if needed.\n6. Store successful outputs.This is how Vix can avoid repeated work at multiple levels.
\nThe BuildGraph tells Vix what the target depends on.\nThe artifact cache tells Vix whether a larger output can be reused.\nThe graph helps compute the artifact fingerprint.\nFor example, a target artifact depends on:
\nobject files\nlibraries\nresources\nlink options\npackage artifactsIf those inputs are unchanged, the final artifact may be valid.
\nThe scheduler executes tasks.\nIf artifact cache hits, the scheduler may not need to execute lower-level tasks.
\nExample:
\ntarget artifact hit:\n restore executable\n skip compile tasks\n skip link taskIf the artifact cache misses, the scheduler can still use object cache during compile tasks.
\nLinking can be expensive.\nEven if object files are cached, the final link can still take time.\nArtifact caching can help avoid relinking when the linked output is already known to be valid.\nA future link cache could store:
\nlink inputs fingerprint -> final binaryThis would make repeated builds even faster.
\nResources can affect final runtime output.
\nExample:
\nresources = [\n assets,\n "data/config.json=config/config.json",\n]If resources are part of the final artifact, their content should be included in the artifact identity.\nIf a resource changes, the artifact should not be reused without updating the resource output.
\nvix.app is a good input for artifact caching because it is structured.
It directly lists:
\ntarget name\ntarget type\nsources\ninclude_dirs\ndefines\nlinks\ncompile_options\nlink_options\npackages\nresources\noutput_dirThat makes it easier to compute a stable artifact fingerprint.\nFor arbitrary CMake projects, Vix may need to rely on generated build files and CMake state.\nFor vix.app, Vix can eventually compute more directly.
For CMake projects, artifact caching should be conservative.\nCMake can contain arbitrary logic.\nSo Vix should base artifact decisions on generated outputs such as:
\ncompile_commands.json\nbuild.ninja\nCMakeCache.txt\nbuild state\ndependency filesIt should not try to guess what arbitrary CMake logic means.
\nPackage artifacts are one of the best initial use cases.
\nWhy ?\nBecause packages often change less frequently than application source code.\nIf Vix can reuse compiled packages across projects, it can reduce a lot of repeated work.
\nExample:
\nproject A builds package X\nproject B uses same package X\nproject B reuses cached compiled artifactThis is especially useful for local development and CI.
\nCI often starts from a clean workspace.\nThat makes artifact cache valuable.
\nA CI system can restore:
\n~/.vix/cache/build/before building.
\nThen Vix can reuse compiled dependencies or target artifacts when identities match.\nBut the cache key must account for:
\nOS\ncompiler\ncompiler version\ntarget triple\nbuild type\ndependency versionsOtherwise CI cache reuse can become unsafe.
\nCross-compilation requires separate artifact identities.
\nAn artifact built for:
\nx86_64-linux-gnucannot be reused for:
\naarch64-linux-gnuTarget triple must be part of the artifact key.\nSysroot and toolchain metadata may also be needed.
\nDebug and Release artifacts are different.\nDebug may include:
\ndebug symbols\nno optimization\nassertions enabledRelease may include:
\noptimization\nNDEBUG\ndifferent link behaviorSo build type must be part of the artifact identity.
\nArtifacts depend on the compiler.\nA static library built with one compiler may not be safe to reuse with another compiler.\nImportant compiler identity fields include:
\ncompiler name\ncompiler path\ncompiler version\nstandard library\ntarget triple\nABI-relevant optionsFor safety, Vix should separate artifacts by compiler identity.
\nABI compatibility matters for C++.\nEven if source code is unchanged, ABI can change with:
\ncompiler version\nstandard library\ncompile definitions\nvisibility flags\ntarget architecture\nbuild typeArtifact caching must respect ABI boundaries.\nThis is another reason artifact reuse must be conservative.
\nArtifact cache invalidation happens naturally when fingerprints change.
\nExamples:
\nsource file changed\nmanifest changed\ndependency version changed\ncompiler changed\nlink options changed\nresource changed\ntarget triple changedWhen the fingerprint changes, Vix looks under a different cache key.\nThe old artifact may remain in the cache, but it is not used for the new build.
\nArtifact caches can become large.\nVix will eventually need eviction policies.
\nPossible policies:
\nmaximum cache size\nleast recently used\nmaximum age\nmanual clean\nper-package cleanup\nper-target cleanupEviction should never affect correctness.\nIt only affects whether future builds are cache hits or misses.
\nEngineers need to trust the cache.\nVix should eventually explain:
\nartifact cache hit: mathlib\nartifact cache miss: compiler changed\nartifact cache miss: dependency fmt changed\nartifact cache miss: resource assets/logo.png changedThis is important.
\nA fast build that cannot be explained can feel unsafe.
\nVerbose output can show cache summaries.
\nExample:
\nartifact cache:\n target: myapp\n status: miss\n reason: source fingerprint changed\n\nobject cache:\n selected: 12\n hits: 10\n compiled: 2This makes performance visible.
\nIt also helps debug unexpected rebuilds.
\nA build state file can record the last successful artifact.
\nExample:
\nbuild-ninja/.vix-build-stateIt can store:
\ntarget\nartifact fingerprint\ninput snapshot\nbuild options\noutput path\ntimestampOn the next run, Vix can compare current state with previous state.\nIf nothing changed, it can skip work.
\nLocal state answers:
\nIs this build directory already up to date?Global artifact cache answers:
\nDo we have this artifact anywhere in the cache?Both are useful.
\nLocal state is very fast for no-op builds.\nGlobal cache is useful after clean builds, across projects, and in CI.
\nRestoring an artifact can mean different things.\nFor a final binary:
\ncopy cached binary to build output pathFor a package:
\nadd cached prefix to CMAKE_PREFIX_PATHFor a library:
\ncopy cached library and headersThe restoration strategy depends on artifact type.
\nRestoring must be atomic when possible.\nA partial restore can leave a broken build directory.\nA safe process can be:
\nrestore into temporary location\nverify expected files\nmove into final location\nupdate stateThis avoids corrupting build outputs if a restore fails.
\nBefore accepting a cache hit, Vix can verify:
\nmetadata exists\nexpected files exist\nfingerprint matches\nartifact type matches\ncompiler identity matches\ntarget triple matchesIf verification fails, treat it as a cache miss.
\nDo not use broken cache entries.
\nA build cache stores executable code.\nIf artifacts come only from the local machine, the risk is lower.\nIf artifacts are shared remotely, Vix must treat them carefully.\nRemote artifacts need stronger integrity checks.
\nPossible mechanisms:
\ncontent hashes\nsignatures\ntrusted cache sources\nmetadata verification\nsandboxed extractionFor a local-first build cache, start simple and safe.
\nA future remote cache could let teams share compiled outputs.\nThat requires strict identity and trust rules.\nA remote artifact cache must know:
\nwho produced the artifact\nwhich compiler was used\nwhich source fingerprint was used\nwhether the artifact is trustedThis is powerful, but it should come after local cache correctness is solid.
\nIn the future native path:
\nvix.app\n -> BuildGraph\n -> ObjectCache\n -> Scheduler\n -> Linkartifact cache can sit above the graph.\nBefore scheduling tasks, Vix can ask:
\nDo I already have the final target artifact?If yes, restore it.\nIf no, execute the graph.\nThis is the fastest path when safe.
\nIn the current path:
\nvix.app -> generated CMake -> CMake/NinjaVix can still use artifact cache.\nIt can fingerprint the generated CMake, manifest, and build configuration.\nThen it can decide whether a previous artifact is still valid.\nThis makes artifact caching useful before native builds are complete.
\nArtifact cache cannot make every first build instant.\nIf Vix has never seen an artifact before, it must build it.\nIf inputs changed, it must rebuild.\nIf the compiler changed, old artifacts may be invalid.\nSo the promise is not:
\nall builds are instantThe promise is:
\nrepeated builds avoid repeated workThat is realistic and valuable.
\nThe best first target for artifact caching is compiled package reuse.
\nWhy?
\npackages are reused across projects\npackage source changes less often\npackage build cost can be high\ncache hits are easy to explainFinal executable caching can come later.\nPackage artifacts provide immediate value.
\nA practical first artifact cache can support:
\ncompiled package prefixes\nlocal build state\ntarget artifact metadata\nbasic fingerprinting\ncache hit/miss logging\nsafe verification before reuseIt does not need remote cache or perfect link caching on day one.
\nStart with correctness and visibility.
\nLater improvements can include:
\nfinal binary restore\nlink result cache\nremote artifact cache\ncache eviction policies\nartifact signing\nteam cache\nCI cache integration\nexplainable miss reasons\nnative vix.app integrationThe system should grow in layers.
\nThe artifact cache should follow this principle:
\nreuse large outputs only when their full build identity is knownThat identity must include source, dependencies, compiler, linker, build type, target triple, and options.
\nIf identity is incomplete, the cache should miss.
\nThe artifact cache is the coarse-grained cache layer in vix build.\nIt complements the object cache.\nObject cache avoids recompiling individual source files.\nArtifact cache avoids rebuilding larger outputs such as libraries, executables, and compiled packages.\nTogether with the BuildGraph, Scheduler, and future native vix.app path, artifact caching gives Vix a realistic path toward dramatically faster repeated C++ builds.\nThe goal is not magic.\nThe goal is disciplined reuse:
same inputs\nsame build identity\nsame artifact\nreuse safely';
+const vixArtifactCacheDesign = {
+ html
+};
+export {
+ vixArtifactCacheDesign as default,
+ html
+};
diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-build-Ck9JqEiH.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-build-Ck9JqEiH.js
new file mode 100644
index 000000000..b1bfe469c
--- /dev/null
+++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-build-Ck9JqEiH.js
@@ -0,0 +1,8 @@
+const html = 'Technical notes about how vix build configures, plans, caches, and executes native C++ builds.
vix build does not try to remove CMake.
CMake remains the compatibility path for C++ projects.
\nThat is intentional.
\nC++ projects are not uniform. Some are small applications. Some are libraries. Some are monorepos. Some use generated sources, custom commands, package exports, install rules, CTest, toolchains, and platform-specific build logic.
\nA build tool for C++ cannot ignore that reality.
\nSo Vix takes a layered approach:
\nCMakeLists.txt -> compatibility path\nvix.app -> simple path\nfuture native -> fast path for projects Vix understands directlyThe compatibility path keeps existing projects working.
\nThe simple path makes new projects easier to start.
\nThe future native path gives Vix room to become faster for vix.app projects.
CMake is widely used because it solves hard C++ build problems.
\nIt can describe:
\nmultiple targets\ntarget dependencies\ngenerated source files\ncustom commands\ninstall rules\nCTest\nFetchContent\ntoolchains\npackage discovery\nplatform-specific branches\ncompiler-specific options\npackage exportsThis is not small functionality.
\nA serious C++ tool cannot simply say:
\ndo not use CMake anymoreThat would break too many real projects.
\nInstead, Vix keeps CMake as the advanced compatibility layer.
\nIf Vix still uses CMake, then what does Vix add?
\nVix adds a better application workflow around CMake.
\nIt can provide:
\nsimpler commands\nembedded presets\ncleaner output\nbetter diagnostics\ncompiler launcher integration\nfast linker integration\nproject resolution\ngenerated CMake from vix.app\nbuild graph imports\nobject cache\nartifact cache\nscript mode\nrun modeThe goal is not to pretend CMake does not exist.
\nThe goal is to make the common workflow smoother.
\nInstead of making every user remember the full CMake command sequence, Vix gives them:
\nvix buildand:
\nvix runFor a normal CMake project:
\nmyapp/\n CMakeLists.txt\n src/\n main.cppthe build flow is:
\nresolve project\ncreate build plan\nconfigure CMake\nbuild with CMake/NinjaConceptually:
\ncmake -S myapp -B myapp/build-ninja -G Ninja\ncmake --build myapp/build-ninja --target myappVix wraps this with better defaults, logging, target selection, and diagnostics.
\nVix resolves projects in this order:
\n1. CMakeLists.txt\n2. vix.appThis means that if a project contains:
\nCMakeLists.txt\nvix.appVix uses:
\nCMakeLists.txtThe reason is simple:
\nCMakeLists.txt means full build control.\nvix.app means simple project description.If the full-control file exists, Vix should respect it.
\nThis rule makes vix.app non-destructive.
Adding vix.app support does not break existing CMake projects.
A large project with advanced CMake logic can keep using its current build system.
\nA small project without CMake can use vix.app.
That gives Vix a smooth adoption path.
\nexisting projects keep working\nnew simple projects become easier\nadvanced projects still have full controlVix can provide built-in presets for common workflows.
\nExamples:
\ndev\ndev-ninja\nreleaseA typical mapping is:
\ndev:\n generator: Ninja\n build type: Debug\n build dir: build-dev\n\ndev-ninja:\n generator: Ninja\n build type: Debug\n build dir: build-ninja\n\nrelease:\n generator: Ninja\n build type: Release\n build dir: build-releaseThis means users do not have to start every project by deciding the same build directory and generator rules.
\nThey can run:
\nvix buildor:
\nvix build --preset releaseThe configure step is where CMake creates the build system files.
\nVix runs something conceptually equivalent to:
\ncmake -S <cmakeSourceDir> -B <buildDir> -G NinjaFor a normal CMake project:
\ncmake -S . -B build-ninja -G NinjaFor a vix.app project, Vix first generates CMake internally, then configures from that generated directory:
cmake -S .vix/generated/app -B build-ninja -G NinjaThe same compatibility path is used after generation.
\nAfter configure, Vix builds the selected target:
\ncmake --build <buildDir> --target <target>If the user passes an explicit target:
\nvix build --build-target serverVix builds:
\nserverIf no target is provided, Vix uses the default target name from the build plan.
\nFor CMake projects, that can be the project directory name.
\nFor vix.app, it should be the manifest name.
For CMake projects:
\nuserProjectDir = cmakeSourceDirFor vix.app projects:
userProjectDir = project root\ncmakeSourceDir = .vix/generated/appThat means Vix must pass the correct path to CMake configure.
\nConfigure uses:
\ncmakeSourceDirBut user-facing operations use:
\nuserProjectDirThis is one of the most important changes introduced by vix.app.
Vix can pass variables to CMake configure.
\nExample:
\nvix build -- -DCMAKE_PREFIX_PATH=/path/to/prefixEverything after -- is forwarded to CMake configure.
This is useful for:
\ncustom package locations\ntoolchain options\nfeature flags\ndependency prefixes\ncompiler optionsVix does not need to invent a separate mechanism for every advanced CMake variable.
\nIt can preserve the CMake escape hatch.
\nCMake is still the right place for many toolchain details.
\nA toolchain may define:
\ntarget system\ncompiler\nsysroot\narchitecture\nfind root path\ncross-compilation behaviorVix can generate or pass toolchain files, but CMake remains the compatibility layer that understands how to apply them.
\nThis is one reason CMake should not be removed from vix build.
CMake already has a package discovery model:
\nfind_package(...)vix.app maps to this through:
packages = [\n fmt:REQUIRED,\n]which generates the equivalent of:
\nfind_package(fmt REQUIRED)For full CMake projects, users can write the package logic themselves.
\nFor vix.app, Vix generates the common case.
CMake targets are explicit.
\nA package name is not always the same as the target name.
\nExamples:
\nfmt -> fmt::fmt\nThreads -> Threads::Threads\nBoost -> Boost::system, Boost::filesystem\nOpenSSL -> OpenSSL::SSL, OpenSSL::CryptoSo vix.app keeps package discovery and linking separate:
packages = [\n fmt:REQUIRED,\n]\n\nlinks = [\n fmt::fmt,\n]Generated CMake then emits both:
\nfind_package(fmt REQUIRED)and:
\ntarget_link_libraries(myapp PRIVATE\n fmt::fmt\n)For advanced projects, users can write the exact CMake logic themselves.
\nVix can integrate compiler launchers such as:
\nccache\nsccacheThese improve repeated builds by caching compiler outputs.
\nCMake supports launcher variables such as:
\nCMAKE_CXX_COMPILER_LAUNCHERVix can resolve and pass these values as part of the configure step.
\nThis is a good example of Vix improving workflow while still using CMake underneath.
\nVix can also prefer faster linkers such as:
\nmold\nlldC++ linking can become expensive.
\nA faster linker can reduce incremental build time, especially when only a few object files changed.
\nVix can detect and pass linker-related configuration while keeping the build compatible with CMake.
\nNinja is a good default build backend because it is fast and focused.
\nVix can use CMake to generate Ninja files:
\ncmake -S . -B build-ninja -G NinjaThen CMake build mode can invoke the generated build system:
\ncmake --build build-ninjaThis keeps the command portable while still getting Ninja performance.
\nVix can inspect Ninja files, and in the future it can use deeper graph execution.
\nBut calling CMake build mode has advantages:
\nportable command interface\nworks across generators\nrespects CMake state\nhandles target names\nworks with CMake-generated projectsSo the compatibility path uses:
\ncmake --buildwhile Vix can still inspect the generated files for caching and diagnostics.
\nCMake and compiler output can be noisy.
\nVix can capture logs while presenting a cleaner UI.
\nUseful logs include:
\nconfigure log\nbuild log\nraw compiler output\ndiagnostic extractionThis lets Vix show a clean error while keeping enough detail for debugging.
\nOne of Vix’s responsibilities is to make C++ build failures easier to read.
\nCMake compatibility does not mean raw CMake output must be the only user experience.
\nVix can parse and format errors from:
\nCMake configure\ncompiler output\nlinker output\nruntime crashes\nknown tool failuresThe compatibility path can still have a better interface.
\nConfigure failures usually come from:
\nbad CMakeLists.txt\npackage not found\ninvalid CMake variable\nbad toolchain\ninvalid generated CMakeFor vix.app, configure failures may point to:
.vix/generated/app/CMakeLists.txtBut the real cause may be a manifest field.
\nA good diagnostic should help the user connect the generated CMake error back to the manifest.
\nCompiler failures usually come from source code:
\nsyntax error\nmissing header\ntemplate error\ntype error\nunknown symbolVix can preserve the raw compiler log while also presenting a cleaner diagnostic.
\nThis is independent of whether the project came from CMake or vix.app.
Link failures are common in C++.
\nExamples:
\nundefined reference\nduplicate symbol\nmissing library\nimported target not found\nduplicate mainFor vix.app, a common mistake is:
packages = [\n fmt:REQUIRED,\n]without:
\nlinks = [\n fmt::fmt,\n]The compatibility path exposes the CMake error, but Vix documentation and diagnostics can explain the higher-level cause.
\nCMake writes configuration state in the build directory.
\nThis includes:
\nCMakeCache.txt\nCMakeFiles/\ngenerated Ninja files\ncompile_commands.jsonVix can use the presence of this state to decide whether configure is needed.
\nBut it also needs its own signature to know when configuration inputs changed.
\nA configure signature should represent the inputs that affect configuration.
\nExamples:
\npreset\nCMake variables\ntoolchain file\ncompiler launcher\nfast linker\ntarget triple\nproject fingerprint\ngenerated CMake contentIf the signature changes, Vix should reconfigure.
\nIf it does not, Vix can skip configure.
\nThis avoids unnecessary CMake work.
\nA project fingerprint captures build-relevant project inputs.
\nFor normal CMake projects, it may include:
\nCMakeLists.txt\nCMakePresets.json\ncmake/For vix.app, it may include:
vix.app\ngenerated CMakeLists.txtThe exact fingerprint strategy can evolve, but the goal stays the same:
\nreconfigure only when configuration inputs changedEven when CMake remains the compatibility layer, Vix can still learn from the generated build files.
\nAfter configure, Vix can inspect:
\ncompile_commands.json\nbuild.ninja\ndependency filesThis lets Vix understand compile tasks, link tasks, and dependencies.
\nThat knowledge is useful for:
\nincremental builds\nobject cache\nartifact cache\ntarget-aware execution\ndiagnostics\nfuture native schedulingcompile_commands.json provides exact compiler commands.
This matters because cache keys should not guess.
\nA correct object cache needs to know:
\ncompiler\nsource file\nworking directory\narguments\ndefines\ninclude paths\noutput objectCMake already knows this after configuration.
\nVix can import it.
\nbuild.ninja describes the generated build graph.
Vix can parse it to identify edges such as:
\nCompile\nArchive\nLink\nCopy\nInstall\nUtilityThis lets Vix understand what Ninja is going to do.
\nEven if CMake/Ninja execute the build, Vix can use this graph for analysis and caching.
\nCompiler dependency files show which headers affect each object file.
\nExample:
\nmain.o: src/main.cpp include/app.hpp include/config.hppThis is required for correct incremental behavior.
\nIf a header changes, dependent object files must be rebuilt.
\nCMake/Ninja can produce these files, and Vix can import them.
\nThe CMake compatibility path is stable and practical.
\nBut it is not always the fastest possible path for simple projects.
\nIt still has overhead:
\nCMake configure\nCMake generate\nNinja file generation\nbuild file parsing\nexternal build system coordinationFor arbitrary CMake projects, that is necessary.
\nFor vix.app, Vix eventually knows enough to avoid some of it.
Because vix.app is structured, Vix can later build directly from it.
Future path:
\nvix.app\n -> native BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkThis is different from the CMake compatibility path.
\nVix does not need to interpret arbitrary CMake.
\nIt only needs to understand the manifest it owns.
\nTrying to replace CMake for every project is not realistic.
\nBut optimizing the projects described by vix.app is realistic.
So the architecture becomes:
\nCMakeLists.txt -> compatibility and full control\nvix.app -> simple and eventually native fast pathThis gives Vix a strong technical boundary.
\nThe compatibility path should preserve:
\nexisting CMake projects\nmanual CMakeLists.txt behavior\nCMake presets when available\nCMake package discovery\ntoolchain workflows\ncustom targets\nadvanced build logicVix should not break these.
\nIt should improve the workflow around them.
\nEven on the CMake path, Vix can improve:
\nstartup command simplicity\ndefault presets\ndiagnostics\nlogs\ncompiler launcher setup\nfast linker setup\ncache integration\nbuild graph analysis\ntarget-aware behavior\nrun integrationSo CMake compatibility does not mean Vix is only a thin wrapper.
\nIt can still add significant value.
\napp/\n CMakeLists.txt\n src/\n main.cppCommand:
\nvix buildVix uses the existing CMake project.
\napp/\n vix.app\n src/\n main.cppCommand:
\nvix buildVix generates CMake internally, then builds it.
\nengine/\n CMakeLists.txt\n cmake/\n src/\n tests/\n tools/Command:
\nvix buildVix keeps the CMake path.
\nIf vix.app is not enough, the user can add a CMakeLists.txt.
Once it exists, Vix uses it.
\nThis gives a smooth migration path:
\nstart with vix.app\nmove to CMakeLists.txt when neededNo special migration command is required.
\nFor vix.app, generated CMake is internal.
It lives under:
\n.vix/generated/app/CMakeLists.txtIt should not be edited manually.
\nThe source of truth is:
\nvix.appIf the project needs manual CMake edits, it should become a real CMakeLists.txt project.
The engineering principle is:
\nDo not fight CMake where CMake is strongest.\nAvoid CMake where Vix has enough structured information.CMake is strong for complex build logic.
\nvix.app is strong for simple target descriptions.
Vix sits above both.
\nvix build keeps CMake as the compatibility path because C++ projects need it.
This makes Vix safe for existing projects and practical for advanced builds.
\nAt the same time, vix.app gives Vix a simpler structured input for common projects.
The current model is:
\nCMakeLists.txt -> CMake compatibility path\nvix.app -> generated CMake compatibility pathThe future model can add:
\nvix.app -> native BuildGraph fast pathThat is the balance:
\ncompatibility today\nsimplicity today\nnative speed later';
+const vixBuildCmakeCompatibility = {
+ html
+};
+export {
+ vixBuildCmakeCompatibility as default,
+ html
+};
diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-build-graph-design-uvRXb3GF.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-build-graph-design-uvRXb3GF.js
new file mode 100644
index 000000000..e33831501
--- /dev/null
+++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-build-graph-design-uvRXb3GF.js
@@ -0,0 +1,8 @@
+const html = 'vix build is not only a command that runs CMake.
The deeper direction is to understand the build as a graph.
\nA build graph lets Vix reason about:
\nfiles\nobjects\nlibraries\nexecutables\ncompile tasks\nlink tasks\ncopy tasks\ndependencies\ndirty state\ncache hits\ntarget selectionThis matters because a fast build system should not ask only:
\nHow do I build everything?It should ask:
\nWhat exactly changed?\nWhat depends on it?\nWhich tasks are dirty?\nWhich outputs can be restored from cache?\nWhich target did the user ask for?\nWhat can be skipped safely?That is the purpose of the Vix build graph.
\nA C++ build is naturally a graph.
\nA source file produces an object file.
\nAn object file contributes to a library or executable.
\nA header can affect many object files.
\nA generated file can affect another build step.
\nA resource copy can depend on a runtime asset.
\nConceptually:
\nsrc/main.cpp\n -> main.o\n -> app\n\ninclude/app.hpp\n -> main.o\n -> app\n\nassets/config.json\n -> copy resourceIf Vix can model this, it can make better decisions.
\nA build graph has two main concepts:
\nnodes\ntasksNodes represent things.
\nTasks represent work.
\nExample:
\nNode: src/main.cpp\nNode: build/main.o\nNode: build/myapp\n\nTask: compile src/main.cpp -> build/main.o\nTask: link build/main.o -> build/myappThe graph connects inputs, tasks, and outputs.
\nA build node represents an input or output in the build system.
\nExamples:
\nsource file\nheader file\nconfig file\npackage\nobject file\nstatic library\nshared library\nexecutableA node can have a state:
\nclean\ndirty\nmissingThis state helps Vix decide whether a task needs to run.
\nA source node represents a file that is compiled.
\nExample:
\nsrc/main.cpp\nsrc/app.cpp\nsrc/server.cppThese files usually become object files.
\nIf a source file changes, the compile task that depends on it becomes dirty.
\nA header node represents an included header.
\nExample:
\ninclude/myapp/app.hpp\ninclude/myapp/config.hppHeaders are important because they can affect many source files.
\nIf include/myapp/config.hpp changes, several object files may need to rebuild.
That is why dependency files matter.
\nAn object node represents a compiled output.
\nExample:
\nbuild/CMakeFiles/myapp.dir/src/main.cpp.oObject files are the main unit of incremental C++ builds.
\nIf an object file is still valid, Vix should not recompile it.
\nIf it is missing or stale, Vix should rebuild or restore it from cache.
\nA library node represents an archive or shared object.
\nExamples:
\nlibmathlib.a\nlibplugin.so\nmathlib.lib\nplugin.dllLibraries depend on object files.
\nIf the object files do not change, the library may not need to be rebuilt.
\nAn executable node represents the final runnable binary.
\nExamples:
\nmyapp\nserver\nhello.exeAn executable depends on object files and linked libraries.
\nIf none of those inputs changed, relinking can be skipped.
\nA build task represents an action.
\nCommon task kinds:
\ncompile\nlink\narchive\ncopy\ngenerateEach task has:
\ninputs\noutputs\ncommand\ndependencies\nstateThe command matters because changing compiler flags can invalidate outputs even if the source file did not change.
\nA compile task turns a source file into an object file.
\nConceptually:
\ncompile src/main.cpp -> main.oThe task depends on:
\nsource file\nheaders\ncompiler\ncompiler flags\ninclude dirs\ndefines\nC++ standard\ntarget tripleIf any of these change, the object is dirty.
\nA link task turns object files and libraries into an executable or shared library.
\nConceptually:
\nlink main.o app.o -> myappThe task depends on:
\nobject files\nlibraries\nlinker flags\nlinker identity\ntarget tripleIf no link inputs changed, Vix should avoid relinking.
\nAn archive task creates a static library.
\nConceptually:
\narchive add.o mul.o -> libmathlib.aThis is common for type = static projects.
A copy task moves files or directories.
\nFor vix.app, resources become copy tasks.
Example:
\nresources = [\n assets,\n "data/config.json=config/config.json",\n]Conceptually:
\ncopy assets -> $<TARGET_FILE_DIR>/assets\ncopy data/config.json -> $<TARGET_FILE_DIR>/config/config.jsonCopy tasks should run only when needed.
\nA generate task creates files used later in the build.
\nExamples:
\ngenerated source files\ngenerated headers\ngenerated config files\ngenerated CMake filesFor vix.app, generating:
.vix/generated/app/CMakeLists.txtis a generation step.
\nIn the future, Vix may use generate tasks for its own native build graph.
\nToday, CMake remains the compatibility path.
\nThat means Vix can learn the build graph from files generated by CMake and Ninja.
\nImportant files:
\ncompile_commands.json\nbuild.ninja\n*.d dependency filesThese files give Vix real build information.
\nVix should not guess compiler commands if CMake already generated them.
\ncompile_commands.json contains exact compile commands.
A typical entry describes:
\nworking directory\nsource file\ncompiler command\ncompiler arguments\nobject outputThis is useful because the object cache needs exact compiler inputs.
\nA cache key based on guesses would be unsafe.
\nA cache key based on actual compile commands is stronger.
\nbuild.ninja contains the generated Ninja build rules.
Vix can parse it to find build edges.
\nEdges can be classified as:
\nCompile\nArchive\nLink\nCopy\nInstall\nUtility\nUnknownThis gives Vix a lower-level view of what the build system will do.
\nC++ compilers can emit dependency files.
\nExample:
\nmain.o: src/main.cpp include/app.hpp include/config.hppThis tells Vix which headers affect an object file.
\nWithout dependency files, Vix would not know that changing a header should rebuild specific object files.
\nDependency files are essential for correct incremental builds.
\nDirty state tells Vix whether a node or task must be rebuilt.
\nA node may be dirty when:
\nthe file changed\nthe file is missing\na dependency changed\nthe command changed\nthe build fingerprint changed\nthe compiler changed\nthe target triple changedA task is dirty when any of its important inputs are dirty or invalid.
\nA node is clean when its output is valid.
\nExample:
\nmain.o is cleanmeans:
\nsource is unchanged\nheaders are unchanged\ncompiler command is unchanged\noutput exists\ncache metadata is validClean nodes can be skipped.
\nA node is missing when the expected output does not exist.
\nExample:
\nbuild/main.odoes not exist.
\nThen the compile task must run or restore the object from cache.
\nThe command hash is part of correctness.
\nIf this command changes:
\ng++ -std=c++20 -Iinclude -c src/main.cpp -o main.oto this:
\ng++ -std=c++23 -Iinclude -DMYAPP_DEBUG=1 -c src/main.cpp -o main.othe output object is no longer equivalent.
\nEven if the source file is unchanged, the object should be rebuilt.
\nSo tasks need command fingerprints.
\nA build system can use:
\nfile timestamps\nfile sizes\ncontent hashesTimestamps are fast but can be less reliable.
\nContent hashes are more reliable but more expensive.
\nA practical system can combine both:
\nuse metadata for quick checks\nuse hashes for cache keys and correctness-critical decisionsObject cache and artifact cache should be conservative.
\nCorrectness is more important than a false cache hit.
\nA graph allows target-aware execution.
\nIf the user asks for:
\nvix build --build-target serverVix should select only the tasks required for:
\nserverThe graph can compute the dependency closure:
\nserver\n depends on server.o\n depends on router.o\n depends on libcore.aThen unrelated tasks can be ignored.
\nThe dependency closure of a target is the set of tasks and nodes needed to build it.
\nExample:
\nmyapp\n main.o\n app.o\n config.oIf a project has other targets:
\ntests\nbenchmarks\nexamplesthey do not need to be built unless the selected target depends on them.
\nThis is important for large projects.
\nOnce Vix knows which tasks are needed, it can schedule them.
\nA scheduler runs tasks when their dependencies are ready.
\nExample:
\ncompile main.cpp\ncompile app.cpp\ncompile server.cpp\nlink myappThe compile tasks can run in parallel.
\nThe link task must wait for the object files.
\nParallel builds matter in C++ because each source file can often compile independently.
\nIf there are eight independent compile tasks, Vix can run several at once.
\nThe job count controls this:
\nvix build -j 8A good scheduler should respect dependencies and job limits.
\nThe build graph makes object cache decisions more precise.
\nFor each compile task, Vix can ask:
\nIs there a cached object for this exact input set?The input set includes:
\nsource content\nheader dependencies\ncompiler command\ncompiler identity\ntarget triple\nbuild typeIf the cache has a valid object, Vix can restore it instead of compiling.
\nThe artifact cache works at a larger level.
\nIt can reuse:
\ncompiled libraries\nexecutables\npackage artifacts\nwhole target outputsA graph helps decide whether a target artifact is still valid.
\nIf all inputs and build settings match, Vix may restore or skip the entire target.
\nThe graph is especially useful for no-op builds.
\nA no-op build means:
\nnothing changed\nnothing needs to runThe ideal result is:
\nskip configure\nskip compile\nskip link\nfinish almost immediatelyThis is one of the biggest opportunities for Vix.
\nAn incremental build happens when only part of the project changed.
\nExample:
\nsrc/app.cpp changedThen Vix should rebuild:
\napp.oand relink:
\nmyappBut it should not rebuild:
\nmain.o\nserver.o\nunrelated librariesA graph makes that possible.
\nHeader changes are harder.
\nIf this changes:
\ninclude/config.hppVix must know which source files include it.
\nThat information comes from dependency files.
\nIf three object files depend on the header, those three become dirty.
\nThe rest can stay clean.
\nResources should also be modeled.
\nIf this changes:
\nassets/logo.pngVix should not recompile C++.
\nIt should only rerun the resource copy task.
\nThis is another reason resources should be separate from sources.
\nFor vix.app, the current path is:
vix.app\n -> generated CMake\n -> CMake/Ninja files\n -> imported BuildGraphThis gives Vix a bridge.
\nThe manifest is simple.
\nCMake provides compatibility.
\nThe graph layer lets Vix analyze and optimize.
\nThe future path is more direct:
\nvix.app\n -> native BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkIn that model, Vix does not need to import a graph from CMake for simple projects.
\nIt can create the graph directly from:
\nsources\ninclude_dirs\ndefines\ncompile_options\nlink_options\nlinks\nresources\noutput_dirThis is why vix.app is strategically important.
CMake is a full language.
\nIt can do many things conditionally:
\nif platform is Linux\nif compiler is Clang\nif package exists\ngenerate files\nadd targets dynamically\ncall functions\nuse generator expressionsVix cannot safely understand all arbitrary CMake logic without letting CMake run.
\nThat is why the CMake path imports generated build files instead of trying to interpret CMake itself.
\nvix.app is narrow and declarative.
It says:
\nthese are the sources\nthese are the includes\nthese are the links\nthese are the resourcesThere is no arbitrary control flow.
\nThat makes it possible for Vix to build a native graph directly.
\nA build graph can be stored between builds.
\nStored graph data can include:
\nnodes\ntasks\ncommand hashes\ndependency state\noutput paths\ndirty state\ncache metadataOn the next build, Vix can reload this state and compare it with the current project state.
\nThat helps reduce repeated work.
\nA build graph must be correct before it is fast.
\nA wrong cache hit is worse than a slow build.
\nIf Vix is unsure whether an output is valid, it should rebuild.
\nGood build systems are conservative.
\nThe rule should be:
\nskip only when correctness is provenA useful build graph should be inspectable.
\nEngineers may need to know:
\nwhy this file rebuilt\nwhy this object was dirty\nwhy this target linked again\nwhy this cache entry was missed\nwhich header caused the rebuildOver time, Vix can expose commands or verbose output to explain graph decisions.
\nThis is important for trust.
\nFor this project:
\nmyapp/\n vix.app\n include/\n myapp/\n app.hpp\n src/\n main.cpp\n app.cppManifest:
\nname = myapp\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n src/app.cpp,\n]\n\ninclude_dirs = [\n include,\n]Conceptual graph:
\nNode: src/main.cpp\nNode: src/app.cpp\nNode: include/myapp/app.hpp\nNode: build/main.o\nNode: build/app.o\nNode: build/myapp\n\nTask: compile main.cpp -> main.o\nTask: compile app.cpp -> app.o\nTask: link main.o app.o -> myappIf src/app.cpp changes:
app.o dirty\nmyapp dirty\nmain.o cleanThat is the behavior Vix wants.
\nManifest:
\nresources = [\n assets,\n]Graph:
\nNode: assets/\nNode: build/bin/assets/\n\nTask: copy assets -> build/bin/assetsIf assets/logo.png changes, Vix should rerun the copy task.
It should not recompile unrelated C++ files.
\nManifest:
\npackages = [\n Threads:REQUIRED,\n]\n\nlinks = [\n Threads::Threads,\n]Graph-level model:
\nPackage node: Threads\nLink input: Threads::Threads\nTask: link myappIf package configuration changes, linking may become dirty.
\nNinja already has a build graph.
\nSo why does Vix need one?
\nBecause Vix needs its own higher-level decisions:
\nartifact cache\nobject cache\ndiagnostics\ntarget-aware UX\nfuture native builds\ncross-project reuse\nexplainable rebuildsNinja executes a graph very well.
\nVix needs to understand and augment the graph.
\nCMake generates the build graph.
\nVix can use CMake as the source of truth for complex projects.
\nBut for vix.app, Vix can eventually become the source of truth.
So the relationship is:
\nCMake project:\n CMake generates graph\n Vix imports and augments it\n\nvix.app project:\n Vix generates CMake today\n Vix can generate native graph laterThe long-term architecture can look like this:
\nProjectResolver\n -> BuildPlan\n -> BuildGraph\n -> ObjectCache\n -> ArtifactCache\n -> Scheduler\n -> LinkFor CMake projects:
\nCMakeLists.txt\n -> CMake configure\n -> import compile_commands.json\n -> import build.ninja\n -> graph analysisFor vix.app projects:
vix.app\n -> native graph generation\n -> graph executionwith CMake still available as fallback.
\nThe goal is not only faster builds.
\nThe goal is understandable builds.
\nVix should be able to explain:
\nwhat it is building\nwhy it is building it\nwhat changed\nwhat was cached\nwhat was skipped\nwhat failedA build graph makes that possible.
\nThe Vix build graph is the foundation for a smarter C++ build pipeline.
\nIt models files as nodes.
\nIt models work as tasks.
\nIt tracks dependencies and dirty state.
\nIt enables target-aware builds, object caching, artifact caching, and future native execution.
\nToday, Vix can import graph information from CMake and Ninja.
\nTomorrow, vix.app can feed the graph directly.
That is the direction:
\nCMake compatibility for complex projects\nnative BuildGraph for simple vix.app projects\ncache and scheduling across both';
+const vixBuildGraphDesign = {
+ html
+};
+export {
+ vixBuildGraphDesign as default,
+ html
+};
diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-build-roadmap-execution-CrHVFbcJ.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-build-roadmap-execution-CrHVFbcJ.js
new file mode 100644
index 000000000..d35221276
--- /dev/null
+++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-build-roadmap-execution-CrHVFbcJ.js
@@ -0,0 +1,423 @@
+const html = `vix build is becoming more than a CMake/Ninja frontend.
The goal is not to replace CMake and Ninja immediately. +The goal is to build a smarter layer above them:
+fast when safe
+correct by default
+fallback when neededThe latest work focused on turning the build roadmap into real implementation steps.
+The main areas were:
+This article summarizes what changed and why it matters.
+The first step was to make the build path predictable. +The rules are now clearer:
+vix build --build-target all
+ -> CMake/Ninja
+
+vix build --build-target <real-target>
+ -> Graph Target Executor
+ -> fallback CMake/Ninja
+
+vix build --fast --build-target <real-target>
+ -> build-state fast path
+ -> fallback Graph Target Executor
+ -> fallback CMake/Ninja
+
+VIX_GRAPH_EXECUTOR=0 vix build --build-target <target>
+ -> CMake/NinjaThis matters because build systems must never guess dangerously.
+The all target stays on the CMake/Ninja path because it can represent many things:
A real executable or library target can use the graph executor. +A global or ambiguous target falls back to CMake/Ninja.
+The principle is simple:
+real target -> Vix graph path
+global target -> CMake/Ninja path
+ambiguous target -> CMake/Ninja pathThe second step was to make the output more stable and less noisy. +A no-op fast path should look like this:
+Checking vix (dev)
+ ✔ Up to date in 0.30sA graph target build should look like this:
+Building vix (dev)
+ ✔ Graph target: vix
+ ✔ Up to date
+ ✔ DoneThe output rules are now:
+vix build
+ -> minimal user output
+
+vix build -v
+ -> detailed but still readable output
+
+VIX_LOG_LEVEL=debug vix build -v
+ -> internal graph/cache/build logsInternal details should not pollute normal builds. +Users should see what matters. +Developers debugging Vix internals can still access the deeper logs.
+--fastThe --fast path is only useful if it is safe.
+It should never say Up to date unless the target is really up to date.
+The build state validation was strengthened to check:
Some values such as launcher, linker and CMake variables are already part of the build signature. +The important rule is:
+state hit is not enough
+the final binary must still existSo if the last binary was deleted, Vix must fallback to the normal build path.
+Example:
+vix build --build-target vix
+rm -f build-ninja/vix
+vix build --fast --build-target vixThe last command must not return a false Up to date.
The next step was adding a dedicated safety test script. +The script covers the most fragile paths:
+--fast state hit--fast fallbackThe goal is regression protection.
+Every optimization must prove that it does not break correctness.
+The test script creates a small temporary CMake project, runs vix build in different modes, and checks the output behavior.
This gives Vix a safety net before adding more aggressive caching or native build execution.
+--fastBefore this step, the normal build path could still pay for:
+even when nothing changed.
+The improvement was to allow a valid build state hit to return early even without --fast.
+That means:
vix build --build-target vixcan also become fast when the build state proves that nothing changed. +The ideal no-op path becomes:
+read build state
+snapshot project inputs
+compare signatures
+verify last binary
+return up to dateThis turns the build state from a --fast-only feature into a general no-op optimization.
Speed is not the only goal.
+A build tool should also explain its decisions.
+The new --explain path is designed for this:
vix build --explain --build-target vixExpected output:
+Rebuilding BuildCommand.cpp
+ reason: source file changed
+
+Rebuilding CLI.cpp
+ reason: CLI.hpp changed
+
+Relinking vix
+ reason: object file changedThe first version uses the current graph and the previous graph to compare:
+This starts the foundation for a bigger feature:
+++Vix should not only rebuild. Vix should explain why it rebuilt. +That is very important for large C++ projects. +When a single header causes many files to rebuild, users should be able to see the reason.
+
Vix imports build.ninja so it can understand the generated build graph.
The goal is not to blindly reimplement Ninja. +The goal is to use Ninja metadata safely. +The improved rules are:
+--build-target all -> CMake/Ninja
+phony complex target -> CMake/Ninja
+real output target -> Graph Executor
+ambiguous target -> CMake/NinjaThis means Vix can import more Ninja edges, but still avoid unsafe execution. +The safer import path improves:
+But the executor only handles clear real outputs.
+For now:
+Link/Archive target -> safe candidate
+Copy/Install/Utility/phony -> fallback
+multiple matches -> fallback
+zero matches -> fallbackThe correction rule is more important than speed: if unsure, use CMake/Ninja.
+ObjectCache is responsible for avoiding unnecessary recompilation. +The cache key must be strong enough to prevent wrong reuse. +A compile cache key now depends on:
+The expected flow is:
+for each compile task:
+ compute object cache key
+
+ if cache hit:
+ restore .o
+ restore .d
+ skip compiler
+
+ else:
+ compile
+ store .o
+ store .dA key improvement is making the object cache survive build directory deletion. +Instead of only living under the build directory, the object cache can live under:
+~/.vix/cache/objectsThat enables this workflow:
+vix build --build-target vix
+rm -rf build-ninja
+vix build --build-target vixWith a warm cache, Vix should restore object files instead of recompiling everything.
+ObjectCache avoids recompiling .o files.
+ArtifactCache goes one level higher.
It can restore the final target itself:
+ArtifactCache -> restore final binary/library
+ObjectCache -> restore .o/.d
+Compiler -> compile only missesThe ideal flow is:
+check artifact cache
+
+if artifact hit:
+ restore final binary/lib
+ done
+
+else:
+ check object cache
+ compile only misses
+ link
+ store artifactThis matters for:
+For a target like vix, the cache can store the final binary under the artifact root:
~/.vix/cache/build/.../bin/vixThen a later build can restore it directly.
+This is the fastest path after build-state validation.
+vix.app build pathvix.app already exists.
Today, the compatibility path is:
+vix.app -> generated CMake -> CMake/NinjaThat is good because it supports more features safely. +The new direction is to add a native path for simple cases:
+vix.app simple executable
+ -> Native BuildGraph
+ -> ObjectCache
+ -> Scheduler
+ -> LinkBut the important rule stays:
+simple features -> native Vix build path
+complex features -> generated CMake fallbackVix already has:
+So the native path should reuse the existing AppManifest. +It should not create a second parser. +The safe V1 supports simple executable projects. +Complex features still fallback to generated CMake:
+This keeps compatibility while letting Vix start owning the native build path.
+A faster build is not enough. +When a build fails, the output should help the developer fix it quickly. +The diagnostic improvements focus on:
+Expected style:
+Build failed
+
+src/main.cpp:12:10
+ error: 'App' was not declared
+
+Hint:
+ Declare the symbol before use, include the right header,
+ or move the function definition above the call.For missing headers:
+Build failed
+
+src/main.cpp:2:10
+ error: fatal error: app.hpp: No such file or directory
+
+Hint:
+ Check that the header exists and that its directory is listed
+ in include_dirs, target_include_directories, or your compiler include paths.Warnings should be grouped:
+ warning 3 compiler warnings
+ • src/main.cpp:10:9: warning: unused variable 'x'
+ • src/app.cpp:4:12: warning: unused function 'foo'
+ • src/db.cpp:8:5: warning: control reaches end of non-void functionRaw commands should stay hidden by default. Debug mode can show them:
+VIX_LOG_LEVEL=debug vix build -vThis keeps normal output clean and makes internal debugging possible.
+The last step was adding a reproducible way to prove the gains. +The standard benchmark is:
+hyperfine --warmup 5 --runs 20 \\
+ 'vix build --fast --build-target vix' \\
+ 'vix build --build-target vix' \\
+ 'VIX_GRAPH_EXECUTOR=0 vix build --build-target vix'The official scenarios are:
+Every benchmark report should include:
+This matters because build performance depends heavily on the machine and environment. +A benchmark without environment details is not very useful.
+The build model now has multiple layers:
+Build state -> fastest no-op validation
+ArtifactCache -> restore complete target
+BuildGraph -> target-aware analysis
+ObjectCache -> restore .o/.d files
+Scheduler -> execute selected compile tasks
+CMake/Ninja -> compatibility fallbackThe routing model is:
+if build state proves clean:
+ return up to date
+
+else if complete artifact exists:
+ restore target
+
+else if real target is graph-safe:
+ use Graph Executor
+
+else:
+ use CMake/NinjaThis creates a progressive build system. +Each layer tries to solve the build earlier. +If a layer cannot prove correctness, Vix falls back to the next safer layer.
+C++ build tooling often forces users to choose between power and simplicity.
+Vix is taking a different path:
+This is not a rewrite of the C++ ecosystem. +It is a practical build layer that improves the developer workflow step by step.
+++Vix should be fast when it can prove correctness. +Vix should fallback when another tool is safer.
+
That principle applies to every part:
+all target -> fallback
+ambiguous target -> fallback
+complex vix.app -> fallback
+missing binary -> fallback
+changed inputs -> rebuild
+valid no-op state -> return fastThis is how Vix can become faster without becoming fragile.
+The latest vix build work turns the roadmap into a stronger build architecture.
Vix now has a clearer path toward:
+The long-term direction is now visible:
+CMake/Ninja -> for compatibility
+BuildGraph -> for intelligence
+ObjectCache -> for compile reuse
+ArtifactCache -> for target reuse
+vix.app -> for native simple builds
+diagnostics -> for developer experience
+CI/benchmarks -> for proofThis is the foundation of a modern C++ build workflow inside Vix.
+`; +const vixBuildRoadmapExecution = { + html +}; +export { + vixBuildRoadmapExecution as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-core-DZprlsQI.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-core-DZprlsQI.js new file mode 100644 index 000000000..1aeb7a914 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-core-DZprlsQI.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp Core now has an official benchmark baseline for v2.6.3.
\nThis is an important step for the project because performance is no longer only based on intuition, small manual tests, or local impressions.
\nThe baseline was generated in Release mode on:
\nOS: Linux\nArch: x86_64\nCompiler: GCC 13.3.0\nBuild type: Release\nMachine: vix-bench-runner-1The goal is simple:
\nMeasure performance.\nTrack performance.\nProtect performance.When working on a C++ framework, it is easy to introduce a performance regression without noticing it.
\nA change can look clean.
\nTests can still pass.
\nThe API can still behave correctly.
\nBut internally, something may become slower:
\nWithout benchmarks, these regressions are difficult to see.
\nWith a baseline, every serious change can be compared against a known reference.
\nThat is the purpose of this v2.6.3 benchmark baseline.
\nThe current Vix Core benchmark suite covers several areas:
\nruntime.task\nruntime.queue\nruntime.scheduler\nruntime.worker\n\nexecutor.submit\nexecutor.post\nexecutor.metrics\n\nrouter.match\nrouter.registration\n\nhttp.request\nhttp.response\n\nsession.fake_transport\n\napp.route_registration\napp.group_registrationThis gives visibility across both low-level runtime primitives and higher-level web framework behavior.
\nThe runtime benchmarks measure queues, workers, scheduler behavior, and task execution paths.
\nSome baseline results:
\nruntime.queue/push_clear 33.3M ops/sec\nruntime.queue/push_pop 49.6M ops/sec\nruntime.scheduler/submit_complete_tasks 677K ops/sec\nruntime.worker/submit_complete_tasks 747K ops/secThese numbers help protect the scheduling and queueing layer of Vix Core.
\nThat layer matters because the web framework, sessions, async work, and internal execution paths depend on it.
\nThe executor benchmarks measure task submission, posted work, counters, and metrics reads.
\nSome baseline results:
\nexecutor.metrics/idle_reads 112.2M ops/sec\nexecutor.submit/task_complete 465K ops/sec\nexecutor.post/void_tasks 397K ops/secThis gives a measurable view of the cost of executing work through the Vix executor.
\nThat is important because the executor sits behind many higher-level operations.
\nThe router benchmarks measure static routes, nested routes, parameterized routes, query strings, method normalization, missing routes, and large route trees.
\nSome baseline results:
\nrouter.match/strip_query 41.6M ops/sec\nrouter.match/static_route 9.37M ops/sec\nrouter.match/param_route 5.67M ops/sec\nrouter.match/nested_param_route 3.91M ops/secThe results show an expected pattern:
\nstatic route matching is faster than parameterized route matching\nnested parameterized routes cost more than simple static routesThat is normal.
\nThe important part is that the cost is now visible and tracked.
\nRoute registration is also benchmarked separately.
\nSome baseline results:
\nrouter.registration/static_routes 1.34M ops/sec\nrouter.registration/nested_static_routes 832K ops/sec\nrouter.registration/param_routes 680K ops/secThis helps track the cost of building the internal route tree.
\nRoute registration usually happens at startup, not on every request, but it still matters for applications with many routes.
\nThe HTTP request benchmarks measure construction, path/query parsing, header lookup, parameter lookup, JSON access, request state, copy, and move behavior.
\nSome baseline results:
\nhttp.request/default_construct 10.7M ops/sec\nhttp.request/construct_static_target 1.18M ops/sec\nhttp.request/construct_query_target 700K ops/secThis shows that basic request construction is fast, while query parsing naturally adds more work.
\nThat is useful to know because request creation is part of the request-processing path.
\nThe HTTP response benchmarks measure construction, status helpers, headers, common response helpers, JSON/text responses, and HTTP string serialization.
\nSome baseline results:
\nhttp.response/default_construct 3.38B ops/sec\nhttp.response/construct_status 6.58B ops/sec\nhttp.response/construct_status_body 63.3M ops/secVery small response construction benchmarks can produce extremely high ops/sec numbers because the measured operation is tiny.
\nThose numbers are useful as guardrails, but they should be interpreted together with larger response benchmarks such as full HTTP string serialization.
\nThe session benchmarks use an in-memory fake transport.
\nThis avoids external network noise while still testing a higher-level request-processing path.
\nSome baseline results:
\nsession.fake_transport/single_get_health 146K ops/sec\nsession.fake_transport/single_get_root 148K ops/secThis is not a real network benchmark.
\nIt is a framework-overhead benchmark.
\nThat distinction matters.
\nThe goal is to measure the internal session pipeline without depending on sockets, kernel scheduling, TLS, or external network behavior.
\nThe app benchmarks measure the higher-level Vix app API: route registration, group registration, nested groups, duplicate routes, automatic OPTIONS registration, middleware helpers, and route record scanning.
\nSome baseline results:
\napp.route_registration/get_routes 138K ops/sec\napp.route_registration/post_routes 138K ops/sec\napp.group_registration/create_group_objects 69K ops/sec\napp.group_registration/returned_group_get_routes 128K ops/secThis helps protect the ergonomics layer.
\nEven if low-level router registration is fast, the app layer can still add overhead through route normalization, automatic OPTIONS routes, group prefixes, middleware helpers, and route records.
\nNow that overhead is measurable.
\nBenchmarks must be generated from a Release build.
\nA dev/debug build is useful for development, debugging, and validating that everything compiles.
\nBut it is not useful for official performance numbers.
\nThe rule for Vix Core is now:
\ndev/debug = compile, test, debug\nrelease = measure performanceOfficial baselines must be created from Release builds only.
\nThe v2.6.3 baseline is now the reference point.
\nBefore a serious change, benchmarks can be run.
\nAfter the change, benchmarks can be run again.
\nThen the new results can be compared against the baseline.
\nIf performance improves, the improvement is visible.
\nIf performance regresses, the regression is visible.
\nIf a benchmark changes because the benchmark suite itself changed, that can be reviewed intentionally.
\nThe goal is not to block every small difference.
\nThe goal is to prevent silent performance regressions.
\nFor Vix.cpp, performance is not just a marketing point.
\nIt is part of the engineering discipline.
\nA framework can be correct and still become slower over time.
\nA benchmark baseline helps prevent that.
\nIt makes performance part of the development workflow.
\nIt gives future changes a measurable standard.
\nIt helps keep the project honest.
\nVix.cpp Core v2.6.3 now has an official Release benchmark baseline.
\nThis baseline covers runtime, executor, router, HTTP, session, and app-level behavior.
\nFrom now on, performance-sensitive changes can be compared against a known reference.
\nThat means Vix Core can move forward with more confidence.
\nPerformance should not be based on feelings.
\nIt should be measured, tracked, and protected.
\n'; +const vixCoreBenchmarkBaselineV263 = { + html +}; +export { + vixCoreBenchmarkBaselineV263 as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-dev-l-5yYGYx.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-dev-l-5yYGYx.js new file mode 100644 index 000000000..e8917d01f --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-dev-l-5yYGYx.js @@ -0,0 +1,8 @@ +const html = 'Technical notes about the Vix development workflow, watch mode, rebuilds, reloads, and full-stack development.
\nThe direct script runner is the simplest execution path in vix run.
It exists for one use case:
\nI have one C++ file.\nCompile it.\nRun it.Example:
\nvix run main.cppThis should not require a CMakeLists.txt.
It should not require a vix.app.
It should not require a project layout.
\nThe file itself is the entry point.
\nC++ is often treated as a language that needs a project before it can run.
\nFor large systems, that is reasonable.
\nBut for small experiments, examples, learning, tests, and local tools, requiring a full project is unnecessary friction.
\nA developer should be able to write:
\n#include <vix.hpp>\n\nint main()\n{\n vix::print("hello");\n return 0;\n}and run:
\nvix run main.cppThe direct script runner makes that possible.
\nFor a simple file, the flow is:
\nsource file\n -> compile\n -> link\n -> executeConceptually:
\nmain.cpp\n -> main.o\n -> main\n -> run ./mainThe exact output path is an implementation detail.
\nThe user-facing behavior should remain simple:
\nvix run main.cppDirect script mode is different from project mode.
\nScript mode input:
\none source fileProject mode input:
\nproject root\nCMakeLists.txt or vix.app\ntarget name\nbuild directorySo this:
\nvix run main.cppshould not behave the same as:
\nvix runinside a project.
\nAn explicit source file means script mode.
\nNo source file means project mode.
\nmain.cpp:
#include <vix.hpp>\n\nint main()\n{\n vix::print("hello from Vix script mode");\n return 0;\n}Run:
\nvix run main.cppExpected output:
\nhello from Vix script modeThe developer does not need to create:
\nCMakeLists.txt\nvix.app\nbuild-ninja/manually.
\nEven for one file, Vix still needs build information.
\nThe direct script runner must decide:
\nwhich compiler to use\nwhich C++ standard to use\nwhich include paths to use\nwhich libraries to link\nwhere to place outputs\nhow to pass runtime arguments\nhow to report compile errorsThe command is simple, but the execution still needs structure.
\nThe runner needs a compiler.
\nPossible sources:
\nenvironment variables\nVix defaults\ndetected system compiler\nconfigured toolchain\ntarget tripleCommon compiler candidates:
\nc++\ng++\nclang++\nclThe selected compiler becomes part of the script build identity.
\nIf the compiler changes, cached outputs may no longer be valid.
\nScript mode should have a reasonable default C++ standard.
\nFor Vix, a good default is:
\nc++20The user should be able to override this if needed.
\nExample idea:
\nvix run main.cpp --std c++23The exact CLI flag can evolve, but the model is clear:
\nscript mode has defaults\nadvanced users can override themThe direct script runner should avoid polluting the current directory.
\nInstead of producing:
\nmain\nmain.o\nmain.dnext to main.cpp, Vix can place outputs in an internal build or cache directory.
Possible layout:
\n.vix/run/\n.vix/cache/run/\nbuild-script/The exact path is less important than the rule:
\nscript outputs should be managed by VixA script build needs an identity.
\nFor:
\nvix run main.cppthe identity can include:
\nsource path\nsource content\ncompiler identity\ncompiler flags\nC++ standard\ninclude paths\nlinked libraries\ntarget triple\nruntime modeThis identity lets Vix decide whether it can reuse a previous script build.
\nIf nothing changed, Vix should avoid recompiling the script.
\nA no-op script run can be:
\nsource unchanged\ncompiler unchanged\nflags unchanged\nbinary exists\nrun existing binaryThis makes repeated vix run main.cpp calls fast.
But reuse must be conservative.
\nIf Vix is unsure, it should rebuild.
\nEven a single source file can include headers.
\nExample:
\n#include "message.hpp"If message.hpp changes, the script should rebuild.
That means the compile command should ideally emit a dependency file.
\nConceptual command:
\nc++ -std=c++20 -MMD -MP -MF main.d -c main.cpp -o main.oThe dependency file tells Vix which headers affect the script binary.
\nExample layout:
\nscratch/\n main.cpp\n message.hppmain.cpp:
#include <vix.hpp>\n#include "message.hpp"\n\nint main()\n{\n vix::print(message());\n return 0;\n}If message.hpp changes, vix run main.cpp should rebuild.
That is why dependency tracking matters even in script mode.
\nFor script mode, Vix may include the source file directory by default.
\nIf main.cpp is in:
scratch/main.cppthen local includes from:
\nscratch/should work naturally.
\nAdditional include paths may be provided through flags later.
\nExample design:
\nvix run main.cpp --include includeor through CMake fallback when the case becomes complex.
\nMany Vix examples use:
\n#include <vix.hpp>Some Vix APIs may be header-only.
\nOthers may require linking compiled Vix modules.
\nThe direct script runner needs to know how to link the required Vix components.
\nFor simple APIs such as printing, direct compilation may be enough.
\nFor compiled modules, the runner may need a fallback build path.
\nIf the script only uses header-only functionality, direct mode is straightforward.
\nExample:
\n#include <vix.hpp>\n\nint main()\n{\n vix::print("hello");\n return 0;\n}The runner can compile and link directly.
\nThis is the ideal fast path.
\nSome modules may require linking.
\nExamples may include:
\nkv\nhttp\ncrypto\nthreadpool\nnetworking modulesIf the script uses a compiled module, direct mode may not have enough information to link safely.
\nIn that case, Vix can use a fallback.
\nDirect compilation is fast because it is simple.
\nBut it cannot handle every dependency case.
\nA script may need:
\ncompiled Vix modules\nregistry packages\nexternal libraries\npackage discovery\ncomplex link flags\nplatform-specific setupTrying to force all of that into direct mode would make direct mode complex and fragile.
\nThe better design is layered:
\ndirect mode for simple scripts\nfallback mode for complex scriptsWhen direct mode is not enough, Vix can generate a temporary CMake project for the script.
\nFlow:
\nmain.cpp\n -> generated script CMake project\n -> CMake configure\n -> CMake build\n -> run executableThis keeps the user command the same:
\nvix run main.cppbut gives Vix more build power internally.
\nThe decision can look like:
\nif script can be compiled directly:\n use direct runner\nelse:\n use generated CMake fallbackDirect runner:
\nfast\nsimple\nminimal overheadCMake fallback:
\nmore compatible\nhandles complex linking\nsupports compiled modulesDirect mode is best when:
\nsingle source file\nsimple local headers\nno complex packages\nno generated sources\nno complex external linking\nknown Vix headers or simple modulesThis covers many learning and experimentation cases.
\nFallback is better when the script needs:
\ncompiled Vix modules\nregistry dependencies\nexternal CMake packages\ncomplex link options\ngenerated build metadata\nplatform-specific dependency setupThe user should not need to choose manually in most cases.
\nVix can try direct mode first, then fallback when necessary.
\nThe direct script runner must separate Vix flags from program arguments.
\nExample:
\nvix run main.cpp --run --name GaspardThe arguments after the runtime boundary should be passed to the program:
\n--name GaspardAnother common model is:
\nvix run main.cpp -- --name GaspardThe important rule is:
\nVix arguments configure Vix.\nRuntime arguments go to the script executable.A C++ program may use flags like:
\n--port\n--config\n--verbose\n--helpVix also has flags.
\nWithout a clear boundary, Vix may consume flags meant for the program.
\nThe direct script runner must keep this separation predictable.
\nAfter compilation, Vix runs the executable as a child process.
\nThe runner should preserve:
\nstdin\nstdout\nstderr\nexit code\nsignals when possibleA program run through Vix should feel like running the binary directly.
\nIf the program exits with code 1, Vix should report that as the program exit code, not necessarily as a Vix crash.
A non-zero exit from the user program is not the same as a build failure.
\nExample:
\nint main()\n{\n return 1;\n}The build succeeded.
\nThe program returned 1.
vix run should distinguish:
compile failure\nlink failure\nruntime exit code\nruntime crashThis distinction makes diagnostics clearer.
\nSome programs read from standard input.
\nExample:
\n#include <vix.hpp>\n\nint main()\n{\n auto name = vix::input("Name: ");\n vix::print("Hello", name);\n return 0;\n}The direct script runner should allow interactive input.
\nThat means process execution should not always fully capture stdin in a way that breaks interaction.
\nFor normal script runs, stdout and stderr should pass through naturally.
\nFor errors, Vix can still format diagnostics.
\nGood behavior:
\ncompiler errors are formatted\nprogram output is preserved\nruntime exit is reported clearlyThe user program should not feel trapped behind the tool.
\nIf compilation fails, Vix should show a useful diagnostic.
\nExample:
\nint main()\n{\n unknown_symbol();\n}The error should point to:
\nmain.cppnot to an internal generated file.
\nDirect mode gives Vix a clearer path to source-level diagnostics.
\nIf linking fails, Vix should explain the link error.
\nCommon causes:
\nmissing library\nmissing symbol\ncompiled module not linked\nwrong dependencyIf the error suggests direct mode is insufficient, Vix can fallback when possible or show a hint.
\nRuntime failures are different from build failures.
\nExamples:
\nprogram exited with code 1\nprogram crashed\nprogram timed out\npermission denied\nexecutable not foundThese should be reported as runtime errors.
\nThe build may still have been successful.
\nThe direct runner can use a script cache.
\nA cache entry can contain:
\nbinary path\nobject file\ndependency file\nsource hash\ncommand hash\ncompiler identity\nlast run metadataOn the next run, Vix can decide whether to reuse the binary.
\nThe direct script runner can also use the normal ObjectCache.
\nFor a single source file:
\nmain.cpp -> main.oIf the object cache has a valid object, Vix can restore it.
\nThen it only needs to link or reuse the existing binary.
\nFor a complete script binary, Vix can use a small artifact cache.
\nIf all inputs match, Vix can reuse:
\ncompiled executableThis makes repeated script runs very fast.
\nBut the same correctness rule applies:
\nreuse only when the full identity matchesScript mode can support watch mode.
\nExample:
\nvix run main.cpp --watchIn watch mode, Vix should rebuild and rerun when inputs change.
\nInputs include:
\nmain.cpp\nlocal headers from dependency file\npossibly runtime resourcesDependency files make watch mode more accurate.
\nA simple watch loop:
\nbuild and run once\nwatch source and dependency files\non change:\n stop previous process if needed\n rebuild\n rerunThis is useful for small tools and examples.
\nThe working directory matters for relative file access.
\nIn script mode, a reasonable default is:
\ncurrent working directoryIf the user runs:
\nvix run examples/hello.cppfrom the project root, the program may expect relative files from that root.
\nThis should be documented and consistent.
\nThe script runner should pass environment variables to the child process.
\nFor build behavior, Vix may also read variables such as:
\nCXX\nVIX_LOG_LEVELRuntime environment and build environment should be treated carefully.
\nDirect mode may create temporary files.
\nThese can include:
\nobject files\ndependency files\nbinaries\nlogs\nmetadataThey should live in a Vix-managed directory.
\nThe user should not need to clean them manually in normal use.
\nVix can keep script outputs for cache reuse.
\nIt should also provide ways to clean them.
\nExample concepts:
\nvix clean\nvix cache clean\nvix run --cleanThe exact command can evolve.
\nThe important idea is that cache should be useful but manageable.
\nvix run main.cpp is not the same as vix build.
But it still uses build concepts:
\ncompiler detection\ncompile task\nlink task\ncache\ndiagnostics\nprocess executionThe difference is input shape.
\nvix build builds a project target.
vix run main.cpp builds and runs one source file.
vix.app is for project mode.
Direct script mode does not need it.
\nHowever, both systems can share future build infrastructure:
\nBuildGraph\nObjectCache\nScheduler\nLink\nDiagnosticsSo the architecture can converge underneath while keeping user workflows separate.
\nThe direct script runner can eventually be modeled as a tiny BuildGraph.
\nFor:
\nvix run main.cppthe graph is:
\nNode: main.cpp\nNode: main.o\nNode: main executable\n\nTask: compile main.cpp -> main.o\nTask: link main.o -> executable\nTask: run executableThis makes script mode part of the same build architecture as native vix.app.
When fallback is needed, Vix can generate a temporary project and use the CMake compatibility path.
\nThat fallback can still produce graph data:
\ncompile_commands.json\nbuild.ninja\ndependency filesSo even fallback mode can participate in cache and diagnostics.
\nCommand:
\nvix run main.cppbut main.cpp does not exist.
Vix should report:
\nsource file not found: main.cppThe file exists, but the compiler fails.
\nVix should show the compiler diagnostic.
\nThe file compiles, but linking fails.
\nVix should report the linker error and possibly suggest missing links or fallback.
\nThe program exits with non-zero status.
\nVix should report the program exit code.
\nThis is different from compile or link failure.
\nWrong:
\nvix run main.cpp requires vix.appCorrect:
\nexplicit source file uses script modeWrong:
\nmain.o appears next to main.cppCorrect:
\nVix stores outputs in a managed directoryWrong:
\nVix consumes all flagsCorrect:
\nprogram arguments pass through after a clear boundaryWrong:
\ncompile on every run even when nothing changedCorrect:
\nreuse binary/object when inputs are unchangedA practical direct script runner should support:
\nsingle .cpp file\ndefault C++ standard\nlocal includes\nVix include path\nmanaged output directory\ncompile diagnostics\nlink diagnostics\nruntime argument forwarding\ninteractive stdin\nexit code preservation\nsimple cache reuse\nfallback when direct mode is insufficientThis is enough to create a strong first experience.
\nLater improvements can include:
\nobject cache integration\nartifact cache integration\ndependency-file-based watch mode\ncompiled module auto-linking\nregistry dependency support\nnative BuildGraph execution\nexplainable rebuilds\nbetter runtime working directory controlsThe runner can grow in layers.
\nThe direct script runner should follow this principle:
\nmake the simple case immediate\nfallback for complexityDo not make every script pay the cost of a full project.
\nDo not make complex scripts fail when a fallback path can handle them.
\nThis keeps script mode fast and practical.
\nThe direct script runner gives C++ a lightweight execution path inside Vix.
\nIt lets a developer run:
\nvix run main.cppwithout writing a project first.
\nThe runner should compile, link, execute, preserve runtime behavior, and reuse outputs when safe.
\nFor complex cases, it can fall back to generated build infrastructure.
\nThe long-term direction is to make script mode part of the same native build architecture as vix.app:
source file\n -> BuildGraph\n -> ObjectCache\n -> Scheduler\n -> Link\n -> RunThat keeps the simple path simple while giving Vix room to become faster and more capable underneath.
\n'; +const vixDirectScriptRunner = { + html +}; +export { + vixDirectScriptRunner as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-error-diagnostics-De4-bhrl.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-error-diagnostics-De4-bhrl.js new file mode 100644 index 000000000..fbff8da3f --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-error-diagnostics-De4-bhrl.js @@ -0,0 +1,664 @@ +const html = `C++ is powerful because it gives developers direct control over memory, ownership, templates, concurrency, system calls, and runtime behavior. +That power also comes with a cost. +When something goes wrong, the error is often technically correct but difficult to act on:
+terminate called after throwing an instance of 'std::runtime_error'
+Aborted (core dumped)Or:
+use of deleted functionOr:
+no matching function for call to ...Or:
+AddressSanitizer: heap-use-after-freeThe compiler, sanitizer, or runtime usually knows what failed. +But it does not always present the failure in a way that helps the developer fix the code immediately. +Vix.cpp treats this as a core developer experience problem. +The goal is not to hide C++. +The goal is to make C++ errors explain themselves.
+C++ errors usually come from several different layers:
+std::terminateEach layer speaks a different language.
+A template error may expose implementation details from <type_traits> or <concepts>.
+A runtime crash may only say Aborted.
A sanitizer report may contain the correct stack trace, but the important user frame can be buried inside a large log. +A filesystem error may be technically clear but not mapped to the line of user code that triggered it. +Vix tries to normalize these failures into one shape:
+The output should answer four questions quickly:
+Vix error handling is built as a rule-based diagnostic pipeline. +There are three major families:
+Each diagnostic rule is small, focused, and responsible for one family of errors. +A rule generally does four things:
+This makes the system extensible. +Instead of one large error parser trying to understand all of C++, Vix uses many precise rules.
+Runtime errors are the hardest because they can come from undefined behavior, exceptions, operating system failures, sanitizers, or library-specific failures. +Vix currently handles the following runtime families.
+AbortRuleThreadJoinableRuleUncaughtExceptionRuntimeRuleThese rules handle errors such as:
+std::terminate calledterminate called after throwing an instance of ...terminate called without an active exceptionAborted (core dumped)SIGABRTstd::thread destroyedA raw abort is often too generic.
+For example, this output is not enough:
+terminate called after throwing an instance of 'std::runtime_error'
+Aborted (core dumped)Vix extracts the actual exception reason when available:
+what(): Failed to load environment configuration:
+failed to parse .env content at line 1: invalid .env line: key is invalidThen it can point to the real file:
+runtime error: environment configuration parse failed
+
+--> /home/softadastra/tmp/.env:1:1
+code:
+ 1 | production.websocket.host=127.0.0.1
+ ^
+ 2 | production.websocket.port=9090
+ 3 | production.websocket.path=/ws
+
+hint: fix the invalid environment file line; use KEY=value with a valid key name
+at: /home/softadastra/tmp/.env:1That is the kind of diagnostic Vix is designed to produce.
+Not just:
+std::terminate calledBut:
+this exact config file has an invalid key on line 1C++ memory bugs are often catastrophic. +Vix recognizes the most common memory safety families:
+DoubleFreeRuleInvalidFreeRuleUseAfterFreeRuleMemoryLeakRuleBufferOverflowRuleStackOverflowRuleNullPointerRuleMisalignedAccessRuleThese rules handle logs from libc, AddressSanitizer, UndefinedBehaviorSanitizer, and raw crashes.
+Examples:
+The important design choice is that Vix avoids overly broad matches.
+For example, InvalidFreeRule does not trigger on invalid pointer alone, because that phrase can appear in unrelated contexts.
It requires stronger signals such as:
+free(): invalid pointermunmap_chunk(): invalid pointerbad-freeAddressSanitizer + attempting freeAddressSanitizer + not malloc()-edThis reduces false positives.
+For memory bugs, Vix also keeps the raw sanitizer excerpt visible because the sanitizer often contains multiple important locations:
+A friendly diagnostic should simplify the report without hiding evidence.
+STL errors are common in real C++ code.
+Vix handles:
+EmptyContainerFrontBackRuleOutOfRangeAccessRuleInvalidIteratorDereferenceRuleIteratorInvalidationRuleThese rules detect problems like:
+front() on empty containerback() on empty containerpop_front() on empty containerpop_back() on empty containertop() on empty containermap::at missing keyunordered_map::at missing keyThese are especially useful with debug STL modes and sanitizers. +For example, raw STL diagnostics may say:
+attempt to dereference a singular iteratorVix turns that into:
+runtime error: singular iterator dereference
+hint: initialize the iterator and refresh it after erase, insert, resize, reserve, or container reallocationThe goal is not to replace the STL diagnostic. +The goal is to translate it into an immediate correction path.
+Modern C++ reduces many memory bugs through RAII, but lifetime mistakes still happen. +Vix currently handles:
+StringViewDanglingRuntimeRuleSpanLifetimeRuleDetachedThreadLifetimeRuleUseAfterFreeRuleNullPointerRuleThese rules catch patterns such as:
+std::string_viewstd::string_view outlived local string datastd::string_view points to freed memorystd::span outlived local storagestd::span invalidated by vector reallocationThese diagnostics are important because std::string_view and std::span do not own memory.
+They are safe only when the underlying storage outlives the view.
+This is valid:
std::string name = "vix";
+std::string_view view = name;This is dangerous:
+std::string_view make_name()
+{
+ std::string name = "vix";
+ return name;
+}The compiler may not catch this. +A sanitizer may catch it later. +Vix turns that runtime failure into a lifetime-focused diagnostic.
+Concurrency bugs are among the hardest C++ problems to debug. +Vix handles several families:
+DataRaceRuleDeadlockRuleMutexMisuseRuleConditionVariableMisuseRuleThreadCreationFailureRuleThreadJoinableRuleDetachedThreadLifetimeRuleFuturePromiseRuleThese rules cover:
+pthread_create failedstd::thread destroyedConcurrency diagnostics must be careful.
+For example, a ThreadSanitizer data race report usually has at least two important locations:
+Vix does not hide that log.
+Instead, it prints a short human explanation and keeps the runtime log excerpt visible:
+runtime error: data race between read and write
+
+hint: protect every read and write of the shared value with the same mutex, or make the value atomic
+hint: do not ignore the runtime log: data races usually require comparing both conflicting stack tracesThis is important because data races are not single-line bugs. +They are relationship bugs between multiple execution paths.
+Vix also handles common undefined behavior families:
+DivisionByZeroRuleIntegerOverflowRuleUninitializedMemoryRuleMisalignedAccessRuleInvalidCastRulePureVirtualCallRuleThese detect errors such as:
+SIGFPEbad_any_castbad_variant_accessThese are often reported by UBSan, MSan, or the C++ runtime. +A raw UBSan message may be correct, but Vix makes the output more directly actionable:
+runtime error: signed integer overflow
+hint: use wider integer types or check bounds before arithmeticOr:
+runtime error: pure virtual function call
+hint: avoid calling virtual functions from constructors/destructors or after object destructionThese diagnostics matter because many undefined behavior bugs do not fail immediately in release mode. +They may silently corrupt program behavior.
+Not every runtime error is memory-related. +Vix also handles operational failures:
+FilesystemRuntimeRulePermissionDeniedRuleAddressAlreadyInUseRuleBrokenPipeRuleTimeoutRuntimeRuleJsonParseRuntimeRuleConfigParseRuntimeRuleThese cover:
+This matters because C++ applications increasingly behave like systems software:
+A good C++ runtime should explain not only pointer errors, but also system-level failures.
+Example:
+runtime error: address already in use
+hint: port 8080 is already in use; stop the other process or change the portOr:
+runtime error: broken pipe
+hint: the peer closed the connection before the write completed; handle disconnects and retry only when safeThis is not language-level C++ only. +It is production C++.
+Runtime diagnostics are only one side. +C++ also has extremely complex compile-time errors, especially around templates, concepts, overload resolution, coroutines, ownership types, and modern library features. +Vix currently handles these template and modern C++ families:
+DependentTypenameRuleNoTypeNamedRuleTemplateArgumentMismatchRuleInvalidTemplateTemplateArgumentRuleCtadFailureRuleRequiresExpressionFailureRuleConceptConstraintFailureRuleNoMatchingOverloadWithConstraintsRuleSubstitutionFailureRuleStaticAssertFailureRuleConstexprEvaluationFailureRuleMoveOnlyCopyRuleDeletedFunctionRulePrivateConstructorRuleInaccessibleMemberRuleIncompleteTypeRuleNoViableConversionRuleConstQualifierRuleInvalidReferenceBindingRuleInvalidInitializerListRuleNarrowingConversionRuleMissingBeginEndRuleOperatorNotFoundRuleAllocatorValueTypeMismatchRuleTupleVariantAccessRuleInvalidUseOfVoidRuleLambdaCaptureLifetimeRuleNonVirtualDestructorDeleteRuleObjectSlicingRuleBadOverrideRuleInvalidDowncastRuleCoroutineReturnTypeRuleMissingCoReturnRuleInvalidAwaitableRuleNoMemberAwaitReadyRuleNoMemberAwaitSuspendRuleNoMemberAwaitResumeRuleInvalidPromiseTypeRuleThis is a large part of the C++ developer experience problem. +A beginner may struggle with:
+cout not declaredBut an experienced C++ developer often loses time on:
+static_assert failureconsteval/constexpr failureVix aims to make those failures readable.
+Modern C++ uses concepts to encode requirements. +When constraints fail, the compiler often emits a long instantiation trace.
+Vix recognizes:
+ConceptConstraintFailureRuleRequiresExpressionFailureRuleNoMatchingOverloadWithConstraintsRuleSubstitutionFailureRuleThese diagnostics focus on the actual missing requirement. +Instead of leaving the user with a long template backtrace, Vix tries to produce a message closer to:
+error: concept constraint failed
+hint: check which required expression, type, or operation is not satisfiedThis is especially important for libraries that use heavily constrained APIs.
+C++ coroutines have very specific rules. +A coroutine type must expose the right promise type and awaitable operations. +Vix recognizes:
+CoroutineReturnTypeRuleMissingCoReturnRuleInvalidAwaitableRuleInvalidPromiseTypeRuleNoMemberAwaitReadyRuleNoMemberAwaitSuspendRuleNoMemberAwaitResumeRuleThese cover errors like:
+co_returnpromise_type missingawait_ready missingawait_suspend missingawait_resume missingThe goal is to map coroutine compiler errors back to the coroutine mental model:
+promise_typeco_await protocolco_returnawait_readyawait_suspendawait_resumeSome ownership bugs are runtime bugs. +Others are visible at compile time. +Vix handles compile-time ownership patterns such as:
+MoveOnlyCopyRuleDeletedFunctionRuleNonVirtualDestructorDeleteRuleObjectSlicingRuleInvalidDowncastRuleLambdaCaptureLifetimeRuleThese help with errors like:
+std::unique_ptrstd::threadFor example, a raw compiler error might say:
+use of deleted function 'std::unique_ptr<T>::unique_ptr(const std::unique_ptr<T>&)'Vix can turn that into:
+error: copy of move-only type
+hint: use std::move, pass by reference, or delete copying intentionallyThis is better because it explains the C++ rule, not only the failed symbol.
+The diagnostic pipeline is ordered. +This matters because many errors overlap. +For example:
+std::out_of_rangecould be handled by a generic uncaught exception rule. +But a better rule exists:
+OutOfRangeAccessRuleSo the specialized rule must run first. +Another example:
+failed to parse .env content at line 1could be seen as an uncaught std::runtime_error.
+But the better rule is:
ConfigParseRuntimeRuleSo it must run before generic exception handling. +The same applies to memory errors:
+AddressSanitizer: heap-use-after-freeshould be handled by:
+UseAfterFreeRulenot by a generic segfault or abort rule. +This is why Vix keeps broad fallback rules at the end:
+SegfaultRuleAbortRuleThey are still useful, but only when no better rule can explain the failure.
+Good diagnostics are not only about matching more errors. +They are also about avoiding wrong explanations. +Vix rules are intentionally conservative.
+Examples:
+InvalidFreeRule does not match invalid pointer alone, because that phrase is too generic.
+BrokenPipeRule does not match write failed alone unless socket, stream, or connection context is present.
+JsonParseRuntimeRule does not match unexpected token unless JSON context is present.
+FilesystemRuntimeRule steps aside when permission-specific signals are present, so PermissionDeniedRule can produce the better message.
+This is important.
A wrong friendly diagnostic is worse than a raw compiler error.
+Vix does not try to hide the original compiler, sanitizer, or runtime log. +Instead, it gives a better first explanation and keeps the relevant log excerpt visible. +This is especially important for:
+Many advanced C++ failures cannot be fully explained from a single line. +The diagnostic should guide the developer without removing the original evidence.
+Vix is not only a build tool. +Vix is becoming a C++ runtime and developer system that understands the failure modes of real C++ programs. +That includes:
+The goal is simple: +C++ should remain powerful. +The error experience should become humane.
+A developer should not need to decode a 200-line template trace just to understand that a type is missing begin().
A developer should not only see Aborted (core dumped) when the real issue is line 1 of .env.
+A developer should not lose time guessing whether a crash is a null pointer, use-after-free, invalid iterator, or joinable thread destruction.
+Vix gives the error a name, a location, and a next step.
AbortRuleThreadJoinableRuleUncaughtExceptionRuntimeRuleDataRaceRuleDeadlockRuleConditionVariableMisuseRuleMutexMisuseRuleFuturePromiseRuleThreadCreationFailureRuleDetachedThreadLifetimeRuleDoubleFreeRuleInvalidFreeRuleUseAfterFreeRuleMemoryLeakRuleBufferOverflowRuleStackOverflowRuleNullPointerRuleDivisionByZeroRuleIntegerOverflowRuleUninitializedMemoryRuleMisalignedAccessRuleInvalidCastRulePureVirtualCallRuleEmptyContainerFrontBackRuleOutOfRangeAccessRuleInvalidIteratorDereferenceRuleIteratorInvalidationRuleStringViewDanglingRuntimeRuleSpanLifetimeRuleFilesystemRuntimeRulePermissionDeniedRuleAddressAlreadyInUseRuleBrokenPipeRuleTimeoutRuntimeRuleJsonParseRuntimeRuleConfigParseRuntimeRuleSegfaultRuleDependentTypenameRuleNoTypeNamedRuleTemplateArgumentMismatchRuleInvalidTemplateTemplateArgumentRuleCtadFailureRuleRequiresExpressionFailureRuleConceptConstraintFailureRuleNoMatchingOverloadWithConstraintsRuleSubstitutionFailureRuleStaticAssertFailureRuleConstexprEvaluationFailureRuleMoveOnlyCopyRuleDeletedFunctionRulePrivateConstructorRuleInaccessibleMemberRuleIncompleteTypeRuleNoViableConversionRuleConstQualifierRuleInvalidReferenceBindingRuleInvalidInitializerListRuleNarrowingConversionRuleMissingBeginEndRuleOperatorNotFoundRuleAllocatorValueTypeMismatchRuleTupleVariantAccessRuleInvalidUseOfVoidRuleLambdaCaptureLifetimeRuleNonVirtualDestructorDeleteRuleObjectSlicingRuleBadOverrideRuleInvalidDowncastRuleCoroutineReturnTypeRuleMissingCoReturnRuleInvalidAwaitableRuleNoMemberAwaitReadyRuleNoMemberAwaitSuspendRuleNoMemberAwaitResumeRuleInvalidPromiseTypeRuleCoutNotDeclaredRuleHeaderNotFoundRuleMissingSemicolonRuleVectorOstreamRuleProcessNullptrAmbiguityRuleUniquePtrCopyRuleSharedPtrRawPtrMisuseRuleDeleteMismatchRuleUseAfterMoveRuleDanglingStringViewRuleReturnLocalRefRuleUseOfUninitializedRuleC++ does not need to become less powerful to become more accessible. +The language can stay explicit, native, and close to the system. +But the tooling around it should be better. +Vix.cpp is building that layer. +A layer that understands C++ errors. +A layer that turns raw compiler output, runtime crashes, and sanitizer logs into diagnostics developers can act on immediately. +That is the direction:
+C++ errors should not only be correct. +They should be useful.
+`; +const vixErrorDiagnostics = { + html +}; +export { + vixErrorDiagnostics as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-game-module-foundation-BiGuToG6.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-game-module-foundation-BiGuToG6.js new file mode 100644 index 000000000..3c95c3520 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-game-module-foundation-BiGuToG6.js @@ -0,0 +1,8 @@ +const html = 'Vix.cpp is not only about compiling and running C++ faster.\nIt is also about giving developers a cleaner runtime model for building real applications.\nvix/game is one step in that direction.
It introduces a game application foundation for Vix.cpp: a small, modular runtime layer for building games, simulations, prototypes, interactive tools, and custom engines.\nThe goal is not to replace Unity, Unreal, Godot, SDL, GLFW, Vulkan, OpenGL, Box2D, Lua, or any existing game technology.
\nThe goal is simpler:
\n\n\nGive C++ developers a serious foundation for real-time applications without locking them into a complete engine.
\n
Most C++ game projects start by rebuilding the same foundation:
\nThese systems are usually scattered across the application, tied to a specific backend, or mixed directly into game code.
\nvix/game exists to avoid that.
It provides a clean structure while keeping the developer in control.
\nThe module follows one clear principle:
\n\n\nBuild the foundation, not the prison.\nA game engine gives you everything, but often forces you into its architecture.\n
\nvix/gametakes a different path.\nIt gives you the runtime pieces needed to build your own architecture:
AppGameLoopFrameEventBusSceneManagerRegistryAssetManagerAsyncAssetLoaderJobSystemInputSystemWindowRendererRenderer2DGameRuntimeEditorRuntimeScriptRuntimeAudioRuntimePhysicsRuntimeGamePackageEach part stays explicit, readable, and backend-independent.
\nvix/game does not force a specific backend.
It does not require SDL.\nIt does not require GLFW.\nIt does not require OpenGL.\nIt does not require Vulkan.\nIt does not require Box2D.\nIt does not require Lua.\nThat is intentional.
\nThe first job of the module is to define a stable runtime surface. Real backends can be integrated later without changing the high-level architecture.
\nThis makes the module useful for:
\nThe current architecture is organized around runtime layers.
\nApp\n ├── GameLoop\n ├── EventBus\n ├── SceneManager\n ├── AssetManager\n ├── AsyncAssetLoader\n └── JobSystem\n\nGameContext\n ├── App access\n ├── InputSystem\n ├── Window\n ├── Renderer\n └── Renderer2D\n\nGameRuntime\n └── Coordinates runtime frame phases\n\nEditorRuntime\n └── Editor mode, play mode, editor context\n\nSceneRuntime\n └── High-level scene operations\n\nScriptRuntime\n └── Dependency-free scripting hook foundation\n\nAudioRuntime\n └── Dependency-free audio foundation\n\nPhysicsRuntime\n └── Dependency-free 2D physics foundation\n\nGamePackage\n └── Project metadata for future packaging workflowsThe important part is separation.
\nApp does not become a giant engine object.\nIt remains the root of the application lifecycle, while dedicated runtime objects coordinate the larger systems.
A minimal game can be written with a scene and a runtime.
\n#include <vix/game/all.hpp>\n#include <vix/print.hpp>\n\nclass MainScene final : public vix::game::Scene\n{\npublic:\n vix::game::GameBoolResult on_load() override\n {\n vix::print("Main scene loaded");\n return vix::game::Scene::on_load();\n }\n\n void on_update(const vix::game::Frame& frame) override\n {\n vix::print("frame:", frame.index);\n\n if (frame.index >= 5)\n {\n app().stop();\n }\n }\n};\n\nint main()\n{\n vix::game::App app;\n app.set_title("My Game");\n\n vix::game::GameRuntime runtime(app);\n\n auto runtime_init = runtime.init();\n if (!runtime_init)\n {\n vix::print("runtime init failed:", runtime_init.error().message());\n return 1;\n }\n\n auto scene = app.scenes().create<MainScene>("main");\n if (!scene)\n {\n vix::print("scene creation failed:", scene.error().message());\n return 1;\n }\n\n auto active = app.scenes().set_active("main");\n if (!active)\n {\n vix::print("scene activation failed:", active.error().message());\n return 1;\n }\n\n auto result = app.run();\n if (!result)\n {\n vix::print("game failed:", result.error().message());\n return 1;\n }\n\n return 0;\n}This example shows the direction of the module:
\nvix/game is also integrated with the Vix CLI.
A new game project can be generated with:
\nvix new mario --game\ncd mario\nvix build\nvix runThe generated project contains:
\nmario/\n assets/\n game.package.json\n README.md\n src/\n main.cpp\n vix.app\n vix.jsonThis matters because the goal is not only to provide C++ APIs.\nThe goal is to make the complete development workflow smoother.\nA developer should be able to create, build, and run a C++ game project without manually wiring everything from scratch.
\nGenerated game projects use vix.app.
Example:
\nname = "mario"\ntype = "executable"\nstandard = "c++20"\n\nsources = [\n "src/main.cpp",\n]\n\ninclude_dirs = [\n "src",\n]\n\ncompile_features = [\n "cxx_std_20",\n]\n\npackages = [\n "vix",\n]\n\nlinks = [\n "vix::game",\n "vix::io",\n]\n\nresources = [\n "assets=assets",\n "game.package.json=game.package.json",\n]\n\noutput_dir = "bin"This keeps the project simple while still allowing Vix to use its native build pipeline internally.\nThe developer gets a clean manifest.\nVix handles the build structure.
\nThe module has grown through three foundation stages.
\nV1 focused on the core runtime base:
\nAppTimeStepFrameEventBusSceneManagerRegistryAssetManagerJobSystemV2 added more real game architecture concepts:
\nV3 introduced higher-level runtime separation:
\nGameContextGameRuntimeEditorContextEditorRuntimeSceneRuntimeScriptRuntimeAudioRuntimePhysicsRuntimeGamePackagevix new --game templateThis gives the module a clearer long-term direction.
\nThe next step is real backend integration.
\nPlanned areas include:
\nThe important part is that these future pieces can now be built on top of a stable foundation.
\nVix.cpp is becoming more than a command-line tool.\nIt is becoming a runtime foundation for building real C++ software.\nvix/game proves that the same ideas behind Vix can apply to interactive applications:
C++ gives developers power.\nVix tries to make that power easier to use.\nvix/game brings that philosophy to games and real-time software.
vix/game is not trying to be a complete game engine.\nIt is trying to be the layer before the engine.
A foundation.\nA place where developers can start small, understand the runtime, and grow their own architecture without losing control.
\n'; +const vixGameModuleFoundation = { + html +}; +export { + vixGameModuleFoundation as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-game-runtime-export-workflow-wLIk7cIo.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-game-runtime-export-workflow-wLIk7cIo.js new file mode 100644 index 000000000..f513bf706 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-game-runtime-export-workflow-wLIk7cIo.js @@ -0,0 +1,8 @@ +const html = 'vix/game started as a clean game application foundation for Vix.cpp.\nThe first versions focused on the base runtime pieces:
That foundation matters because C++ game projects often become complex before the first real feature is even built.
\nBut a foundation is only useful if it can grow.\nV4 and V5 move vix/game from a simple runtime base toward something more complete:
The goal is still the same:
\n\n\nBuild the foundation, not the prison.\n
\nvix/gameis not trying to become a locked game engine.\nIt gives developers the runtime pieces needed to build games, simulations, tools, prototypes, and custom engines on top of Vix.cpp.
Before V4, the module already had a strong internal structure.
\nIt had:
\nAppGameLoopSceneManagerAssetManagerInputSystemWindowRendererRenderer2DGameContextGameRuntimeEditorRuntimeBut most of the architecture was still backend-independent.
\nThat was intentional.\nThe first job was to define the runtime surface before attaching it to real platform backends.\nV4 is where the module starts crossing that line.\nIt keeps the clean abstractions, but adds the first real backend path.
\nV4 makes GameRuntime the main runtime coordinator.\nInstead of pushing every responsibility into App, runtime orchestration lives in dedicated objects.\nThis keeps the architecture clean.
App\n ├── GameLoop\n ├── EventBus\n ├── SceneManager\n ├── AssetManager\n ├── AsyncAssetLoader\n └── JobSystem\n\nGameContext\n ├── App access\n ├── InputSystem\n ├── Window\n ├── Renderer\n └── Renderer2D\n\nGameRuntime\n └── Coordinates runtime frame phasesApp remains the lifecycle root.\nGameContext gives systems access to shared runtime services.\nGameRuntime coordinates the higher-level execution flow.\nThis separation is important because the module will later need editor tools, scripting, audio, physics, packaging, and diagnostics without turning App into a giant engine object.
V4 improves GameContext so runtime backends can be installed cleanly.\nThat means a game can run with:
This matters for testing and CI.\nA game module should not require a graphical backend just to validate core logic.\nHeadless execution remains possible, while real rendering becomes available when a backend is installed.
\nGameContext\n ├── InputSystem\n ├── Window\n ├── Renderer\n └── Renderer2DThis gives Vix a runtime model that can work both for local development and automated builds.
\nV4 adds the first SDL window backend path.\nThe module can now create an SDL-backed window while keeping the public API backend-independent.\nThe high-level code should not be forced to know whether the window comes from SDL, GLFW, a null backend, or a future platform layer.\nThat is the point of the abstraction.
\nGame code\n -> Window interface\n -> SDLWindow backendThe result is simple:
\nvix/gameWindowing alone is not enough.\nA real runtime also needs input.\nV4 connects SDL input events to the backend-independent InputSystem.\nThe input layer supports:
Game code can bind actions without being tied directly to SDL events.
\nExample:
\ninput.bind_key("jump", vix::game::InputKey::Space);\n\nif (input.action_pressed("jump"))\n{\n // jump\n}This keeps the game-facing API stable.\nSDL becomes an implementation detail.
\nV4 also introduces an SDL renderer backend.\nThis is a major step because the module moves from abstract rendering concepts to visible output.\nThe rendering path becomes:
\nRenderer2D\n -> DrawSpriteCommand\n -> Renderer\n -> SDLRendererRenderer2D stays as the high-level 2D rendering API.\nSDLRenderer handles the backend-specific rendering work.\nThis gives Vix a first real path toward 2D games, tools, and simulations without locking the architecture to SDL forever.
V4 adds sprite rendering through the SDL renderer path.
\nThe flow is:
\nAssetManager\n -> Asset bytes\n -> Renderer::upload_texture()\n -> SDLRenderer texture store\n -> Sprite\n -> Renderer2D\n -> DrawSpriteCommand\n -> SDLRenderer::draw_sprite()This is important because it connects multiple systems together:
\nThat means vix/game is no longer only a runtime skeleton.\nIt can now demonstrate a real rendering pipeline.
V4 also adds runtime diagnostics and inspection APIs.\nThis prepares the module for more serious tooling.\nA game runtime should not be a black box.\nDevelopers need to inspect:
\nThis is especially important for future editor tools.\nThe editor layer cannot be added cleanly if the runtime cannot expose useful information.\nV4 starts preparing that surface.
\nV4 makes the runtime more real.\nV5 makes the workflow more complete.\nA game project is not only code that runs locally.
\nIt also needs:
\nV5 adds that layer.\nThe main feature is:
\nvix game exportThis command turns a game project into an exported directory with copied assets, package metadata, and an export manifest.
\nV5 builds on GamePackage.
A game project can describe itself with metadata such as:
\nThis metadata is the base for future workflows:
\nThe important part is that this metadata is explicit.\nVix should not guess everything silently.\nThe project should be inspectable.
\nV5 also improves the generated game template.\nA new game project can be created with:
\nvix new mario --game\ncd mario\nvix build\nvix dev\nvix game exportThe generated layout is simple:
\nmario/\n assets/\n game.package.json\n README.md\n src/\n main.cpp\n vix.app\n vix.jsonThe generated project uses:
\nvix/gameGameRuntimeSceneSceneManagerGamePackagevix.appvix.jsonThat matters because Vix is not only a library collection.\nIt is also a workflow.\nThe developer should be able to create a game project, build it, run it, and export it without manually wiring every file.
\nThe generated game project uses vix.app.
Example:
\nname = "mario"\ntype = "executable"\nstandard = "c++20"\n\nsources = [\n "src/main.cpp",\n]\n\ninclude_dirs = [\n "src",\n]\n\ncompile_features = [\n "cxx_std_20",\n]\n\npackages = [\n "vix",\n]\n\nlinks = [\n "vix::game",\n "vix::io",\n]\n\nresources = [\n "assets=assets",\n "game.package.json=game.package.json",\n]\n\noutput_dir = "bin"This keeps the project readable.\nThe developer sees a small manifest.\nVix handles the native build structure internally.\nThat is the direction of Vix:
\n\n\nKeep the workflow simple without removing the power of C++.
\n
V5 adds a complete export workflow.\nA game can now be exported with:
\nvix game exportThe command reads game.package.json, scans the asset root, copies exportable files, and generates an export manifest.
Example output:
\n✔ Game exported.\n • Output : ./dist/mario\n • Name : mario\n • Version : 0.1.0\n • Asset root: assets\n • Copied files: 4\n • Copied directories: 1Generated layout:
\ndist/\n mario/\n assets/\n game.package.json\n README.md\n export.jsonThis is the first step toward real packaging.\nIt is not yet a full release builder.\nIt does not try to solve everything immediately.\nBut it gives the project a stable export shape.
\nThe generated export.json makes the export inspectable.\nIt can contain:
This matters because export should not be a hidden copy operation.\nA developer should be able to inspect what was exported and why.\nThat also prepares future features:
\nV5 adds a small asset export pipeline.\nThe pipeline scans the configured asset root and classifies exported assets.\nSupported asset categories include:
\nExample exported asset metadata:
\n{\n "path": "player.png",\n "type": "image",\n "size_bytes": 1024\n}The pipeline also ignores temporary and cache files.
\nExamples:
\n.gitkeep.DS_StoreThumbs.dbcache/tmp/temp/build/dist/*.tmp*.cache*.logThis keeps the export clean.\nThe first version does not transform, compress, hash, or bundle assets yet.\nIt only discovers, classifies, copies, and records them.\nThat is enough for a clear V5 export foundation.
\nV5 also fixes vix dev behavior for short-lived game applications.\nThis is important because the default generated game template may run for only a few frames and then stop.\nThat is normal for a smoke test or generated starter project.\nA development command should handle that cleanly instead of treating every short-lived run as a broken workflow.
This improves the first experience after:
\nvix new mario --game\ncd mario\nvix devThe generated application can initialize, run, print frames, and shut down cleanly.\nExpected output:
\nMain scene loaded\ngame app initialized title=mario\nframe: 0\nframe: 1\nframe: 2\nframe: 3\nframe: 4\nframe: 5\ngame app shutdown title=marioTogether, V4 and V5 prove that vix/game is moving in the right direction.\nV4 proves the runtime can connect to real backends:
V5 proves the workflow can become complete:
\nvix game exportvix dev behaviorThis is the bridge between a runtime foundation and a real game development workflow.
\nV6 should build on this foundation.
\nThe next logical steps are:
\nThe important thing is that these features now have a place to live.\nThey do not need to be forced into App.\nThey can build on the existing runtime layers, package metadata, and export pipeline.
Vix.cpp is not only about making C++ builds easier.\nIt is about making C++ application development feel more direct.\nvix/game shows that this philosophy can apply to games and real-time software:
The goal is not to compete directly with Unity, Unreal, or Godot.\nThe goal is different.\nvix/game is the layer before the engine.\nIt gives C++ developers a foundation they can understand, extend, and control.
V4 made the runtime visible.\nV5 made the project exportable.\nThat is an important step for Vix.cpp.\nA C++ game project should not begin with build system pain, backend confusion, and scattered runtime code.
\nIt should begin with a clean foundation:
\nvix new mario --game\ncd mario\nvix dev\nvix game exportThat is the direction of vix/game.
C++ builds become slow when the build system repeats work that did not need to happen.
\nThe compiler may be fast enough for one file.
\nThe problem appears when the build system recompiles too much:
\nunchanged source files\nunchanged headers\nunchanged compiler flags\nunchanged dependencies\nunchanged build configurationThe purpose of an object cache is simple:
\nif this exact source file was already compiled with the exact same inputs,\nreuse the object file instead of compiling it againFor vix build, this is one of the most important foundations for faster incremental builds.
In a normal C++ build, each source file is usually compiled into an object file.
\nExample:
\nsrc/main.cpp -> main.o\nsrc/app.cpp -> app.oThen the linker combines object files into the final output:
\nmain.o + app.o -> myappSo if only src/app.cpp changed, the ideal incremental build is:
recompile app.cpp\nreuse main.o\nrelink myappIt should not recompile every source file.
\nA simple project:
\nmyapp/\n include/\n myapp/\n app.hpp\n src/\n main.cpp\n app.cppBuild graph:
\nsrc/main.cpp -> main.o\nsrc/app.cpp -> app.o\n\nmain.o + app.o -> myappIf src/app.cpp changes:
main.o stays valid\napp.o becomes dirty\nmyapp must relinkA good build system should rebuild only:
\napp.o\nmyappnot:
\nmain.oIncremental builds already avoid some work.
\nBut an object cache goes further.
\nIt can reuse compiled objects even when the build directory was cleaned, recreated, or moved, as long as the compile inputs are identical.
\nExample:
\nfirst build:\n compile src/main.cpp -> main.o\n store main.o in object cache\n\nlater build:\n same source\n same headers\n same flags\n same compiler\n restore main.o from cacheThis turns repeated compilation into a file restore.
\nA normal incremental build asks:
\nIs the existing object file in the build directory still valid?An object cache asks:
\nHave I ever built this exact object before?That distinction matters.
\nIf the build directory is removed:
\nrm -rf build-ninjaa normal incremental build loses its objects.
\nBut an object cache may still restore them.
\nAn object cache must be conservative.
\nA wrong cache hit is worse than a slow build.
\nIf Vix is unsure whether an object file is valid, it should recompile.
\nThe rule should be:
\nreuse only when the full compile identity matchesThe cache key must include every input that can affect the object file.
\nThe compile identity is the full set of information that makes one object file valid.
\nImportant inputs include:
\nsource file content\nheader dependencies\ncompiler executable\ncompiler version\ncompiler arguments\ninclude directories\npreprocessor definitions\nC++ standard\ntarget triple\nbuild type\ntoolchain\nsystem headers when relevantIf any of these changes, the cached object may no longer be valid.
\nThe source file is the obvious input.
\nIf this changes:
\nsrc/app.cppthe object file must be rebuilt.
\nA source file can be checked through:
\ntimestamp\nfile size\ncontent hashFor cache keys, content hashes are safer.
\nHeaders are just as important as source files.
\nExample:
\n#include <myapp/app.hpp>If include/myapp/app.hpp changes, then src/app.cpp may need to be recompiled.
This is why the object cache cannot rely only on the .cpp file.
It must know the dependency set.
\nCompilers can generate dependency files.
\nExample:
\napp.o: src/app.cpp include/myapp/app.hpp include/myapp/config.hppThese files tell Vix which headers affect an object file.
\nIf a header changes, Vix can mark the correct object files as dirty.
\nWithout dependency files, the cache would either be unsafe or too conservative.
\nThe compiler command is part of the object identity.
\nThis command:
\ng++ -std=c++20 -Iinclude -c src/app.cpp -o app.ois not the same as:
\ng++ -std=c++23 -Iinclude -DDEBUG=1 -c src/app.cpp -o app.oEven if the source file is unchanged, the output object may differ.
\nSo Vix needs a command hash.
\nThe compiler itself matters.
\nThese are not necessarily equivalent:
\ng++ 13\ng++ 14\nclang++ 18A cache entry produced by one compiler version may not be safe for another compiler version.
\nThe object cache key should include compiler identity.
\nAt minimum:
\ncompiler path\ncompiler version\ntarget tripleDebug and release builds are different.
\nA debug object may be compiled with:
\n-g\n-O0A release object may be compiled with:
\n-O3\n-DNDEBUGThose outputs are not interchangeable.
\nThe build type or full compiler command must be part of the cache key.
\nInclude directories affect which headers are found.
\nThis command:
\ng++ -Iinclude -c src/app.cppcan produce a different result from:
\ng++ -Iother_include -c src/app.cppEven if the source file text is the same, the compiler may read different headers.
\nInclude paths must be part of the compile identity.
\nPreprocessor definitions affect compilation.
\nExample:
\ndefines = [\n MYAPP_ENABLE_LOGGING=1,\n]This can change compiled code.
\nSo definitions must be included in the cache key.
\nThe selected standard changes how code is parsed and compiled.
\nstandard = c++20is not equivalent to:
\nstandard = c++23The C++ standard must be part of the object identity.
\nCross-compilation changes the output.
\nA cached object for:
\nx86_64-linux-gnucannot be reused for:
\naarch64-linux-gnuThe target triple must be part of the cache key.
\nA compile task can follow this flow:
\n1. compute compile identity\n2. look for object in cache\n3. if cache hit:\n restore object file\n restore dependency file if available\n4. if cache miss:\n run compiler\n store object file in cache\n store dependency file in cacheThis gives a simple and safe model.
\nA cache hit means:
\nVix found a previously compiled object with the same compile identity.Then Vix can copy or restore:
\ncached object -> build output object\ncached dependency file -> build dependency fileThis avoids running the compiler.
\nA cache miss means:
\nno safe cached object existsThen Vix runs the compiler.
\nAfter successful compilation, Vix stores the result for future use.
\nCache misses are normal.
\nThey happen when code changes, flags change, or a project is built for the first time.
\nThe object cache must invalidate entries when relevant inputs change.
\nExamples:
\nsource changed\nheader changed\ncompiler changed\nflags changed\ndefines changed\ninclude_dirs changed\ntarget triple changed\nbuild type changed\ntoolchain changedThe easiest safe model is content-addressed caching.
\nThe key is derived from the full compile identity.
\nWhen identity changes, the key changes.
\nWithout an object cache, incremental build relies on the current build directory.
\nExample:
\nbuild-ninja/\n main.o\n app.oIf app.cpp changes:
app.o rebuilds\nmain.o staysThis is good, but local to the build directory.
\nIf the build directory disappears, the work is lost.
\nWith an object cache:
\n~/.vix/cache/objects/or another cache location can store compiled outputs.
\nThen Vix can restore objects even after:
\nclean build\nnew build directory\nreconfigured project\nCI cache restoreas long as the compile identity matches.
\nTools like ccache already cache compiler outputs.
So why should Vix have an object cache?
\nBecause Vix can integrate caching into the build graph.
\nVix can know:
\nwhich target is being built\nwhich task is dirty\nwhich dependency caused the rebuild\nwhich object was restored\nwhich artifact can be skippedccache works at the compiler invocation layer.
Vix can work at the build orchestration layer.
\nThey can also complement each other.
\nThe object cache becomes more powerful when connected to the BuildGraph.
\nThe graph knows:
\ncompile tasks\nsource inputs\nheader dependencies\nobject outputs\nlink inputs\ntarget outputsThe object cache knows:
\nwhich compile outputs can be restoredTogether, they allow Vix to skip more work safely.
\nThe scheduler can treat a cache restore as a task result.
\nFor each compile task:
\nif object cache hit:\n restore object\nelse:\n compile sourceIndependent restores and compiles can still happen in parallel.
\nThe scheduler does not need to care whether a task ran the compiler or restored a cached object.
\nIt only needs the output to become valid.
\nEven if all objects are restored from cache, the final link may still be needed.
\nBut link can be skipped if the final executable or library is also known to be valid.
\nThat is where the artifact cache or link cache becomes useful.
\nObject cache handles object files.
\nArtifact cache handles larger outputs.
\nProject:
\nsrc/main.cpp\nsrc/app.cpp\nsrc/server.cppChange:
\nsrc/app.cppExpected behavior:
\nmain.o -> cache hit or clean\napp.o -> compile\nserver.o -> cache hit or clean\nmyapp -> relinkThis is the basic incremental build experience.
\nProject:
\nsrc/main.cpp includes include/app.hpp\nsrc/server.cpp includes include/server.hppChange:
\ninclude/app.hppExpected behavior:
\nmain.o -> dirty\nserver.o -> clean\nmyapp -> relinkThe dependency file tells Vix which object depends on which header.
\nManifest changes:
\ndefines = [\n ENABLE_LOGGING=1,\n]to:
\ndefines = [\n ENABLE_LOGGING=0,\n]Expected behavior:
\naffected compile tasks become dirty\nobjects rebuild or cache miss\ntarget relinksEven if source files did not change, the object identity changed.
\nCompiler changes from:
\ng++ 13to:
\nclang++ 18Expected behavior:
\nobject cache keys change\nold objects are not reused\nproject rebuilds safelyThis is correct.
\nFirst build:
\ncompile main.cpp\ncompile app.cpp\nlink myapp\nstore objectsThen:
\nrm -rf build-ninja\nvix buildWith warm object cache:
\nrestore main.o\nrestore app.o\nlink myappIf artifact cache also has the final binary, even linking may be skipped.
\nA no-op build means nothing changed.
\nIdeal behavior:
\nconfiguration unchanged\ngraph unchanged\nobjects unchanged\ntarget unchanged\nfinish immediatelyObject cache is not always needed for no-op builds if the build directory is already valid.
\nBut object cache helps when build outputs are missing.
\nA cache entry can store:
\nobject file\ndependency file\nmetadata\ncompile identity\nsource hash\ndependency hashes\ncompiler info\ncommand hash\ncreated timeThe metadata helps Vix explain cache behavior.
\nExample:
\ncache hit: src/app.cpp\ncache miss: command hash changed\ncache miss: header include/config.hpp changedExplainability matters.
\nA safe cache key should be stable and content-based.
\nConceptually:
\nhash(\n source content,\n dependency contents,\n compiler identity,\n compiler arguments,\n include directories,\n defines,\n standard,\n target triple,\n build type\n)The exact implementation can evolve.
\nThe important rule is:
\nsame key means same compile resultor at least close enough to be safe under the build model.
\nMetadata can include:
\nsource path\nobject path\ncompiler\narguments hash\ndependencies\ndependency hashes\ntarget triple\nbuild typeThis is useful for debugging.
\nWhen a cache miss happens, Vix can eventually explain why:
\nmiss: compiler changed\nmiss: header hash changed\nmiss: command hash changedA cache can grow over time.
\nEventually, Vix may need cache eviction.
\nEviction policies can use:
\nleast recently used\nmaximum cache size\nmaximum age\nmanual clean command\nper-project cleanupThe first priority is correctness.
\nEviction is a storage management problem, not a build correctness problem.
\nObject cache can help CI when cache directories are restored between runs.
\nA CI pipeline can restore:
\n~/.vix/cache/Then repeated builds can reuse objects.
\nBut CI environments vary.
\nCompiler paths, compiler versions, system headers, and target triples can differ.
\nThe cache key must account for those differences.
\nA deeper future version could share cache entries between machines.
\nThat requires stronger identity checks.
\nImportant inputs become even more critical:
\ncompiler version\ntarget triple\nsystem headers\nstandard library\ntoolchain\nenvironmentDistributed cache is powerful, but it must be conservative.
\nvix.app makes object caching easier to reason about.
The manifest directly lists:
\nsources\ninclude_dirs\ndefines\ncompile_options\nstandard\ntarget typeThat gives Vix structured compile input before it even asks CMake.
\nToday, Vix can use generated CMake and imported compile commands.
\nLater, Vix can create compile tasks directly from vix.app.
The future native path is:
\nvix.app\n -> BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkIn this model, object caching is not an add-on.
\nIt is part of the build execution model.
\nFor each source file, Vix can decide:
\nrestore object\nor compile sourcebefore scheduling link.
\nFor arbitrary CMake projects, Vix should not guess.
\nIt should import:
\ncompile_commands.json\nbuild.ninja\ndependency filesThen cache decisions are based on real generated build information.
\nThis keeps compatibility with complex CMake logic.
\nSome inputs are hard to capture perfectly.
\nExamples:
\nsystem headers\ncompiler plugins\nenvironment variables\nimplicit include paths\ngenerated headers\nprecompiled headersIf these are not modeled, Vix must be conservative.
\nA build cache should prefer a miss over a wrong hit.
\nPrecompiled headers complicate object caching.
\nThey introduce additional binary inputs.
\nIf Vix supports them deeply, the cache identity must include:
\nPCH source\nPCH flags\ncompiler identity\ndependent object relationshipFor simple initial object caching, Vix can avoid special PCH support or rely on CMake/Ninja behavior.
\nGenerated headers must be handled carefully.
\nIf a source depends on a generated header, the object is valid only after the generated header is up to date.
\nThe graph must represent:
\ngenerate header\ncompile sourcewith the correct ordering.
\nThis is easier in CMake compatibility mode because Ninja already knows the generated dependency graph.
\nFor native vix.app, Vix would need explicit support.
Object cache does not eliminate linking.
\nIf any object changes, the linked target usually becomes dirty.
\nSo the full incremental build path is:
\nrestore or compile objects\nthen relink if link inputs changedA separate artifact cache can optimize final outputs.
\nObject cache:
\nsource -> objectArtifact cache:
\nobjects/libs/config -> executable/library/packageObject cache is fine-grained.
\nArtifact cache is coarse-grained.
\nBoth are useful.
\nA deep build system needs both.
\nUseful metrics include:
\ncompile tasks selected\nobject cache hits\nobject cache misses\nobjects restored\nobjects compiled\ntime spent restoring\ntime spent compiling\nlink time\ntotal build timeVix should eventually expose this in verbose output.
\nExample:
\nobjects: 18 selected, 16 cache hits, 2 compiledThis helps engineers trust the cache.
\nFast builds are useful.
\nExplainable builds are better.
\nVix should eventually answer:
\nWhy did this file rebuild?Example explanations:
\nsrc/app.cpp rebuilt because source changed\nsrc/main.cpp rebuilt because include/config.hpp changed\nsrc/server.cpp rebuilt because compile options changedThis is a major developer experience improvement.
\nWrong:
\nreuse g++ object for clang++ buildCorrect:
\ncompiler identity is part of cache keyWrong:
\ncache key = source hash onlyCorrect:
\ncache key includes dependency headersWrong:
\nsame source means same objectCorrect:
\nsource + command + dependencies define object identityTimestamps are useful, but cache keys should be stronger.
\nFor correctness, use content-based identity where it matters.
\nA practical first object cache can support:
\ncompile command hash\nsource hash\ndependency file hash\ncompiler identity\nobject output\ndependency outputFlow:
\nread compile_commands.json\nread dependency file if present\ncompute key\nrestore object on hit\ncompile on miss\nstore object after successThis is enough to create real value.
\nLater improvements can include:
\nbetter dependency hashing\nsystem header modeling\nremote cache\ncache eviction\nexplainable cache misses\nlink result cache\nper-target cache summaries\nnative vix.app graph integrationThe key is to build the cache in layers.
\nThe object cache should follow one principle:
\nnever trade correctness for speedIf Vix cannot prove that a cached object is valid, it should compile.
\nA slow correct build is acceptable.
\nA fast wrong build is not.
\nObject caching is one of the main ways vix build can become significantly faster.
It works by reusing compiled object files when the full compile identity matches.
\nThat identity includes more than the source file.
\nIt includes headers, compiler, flags, defines, include paths, standard, target triple, and build configuration.
\nCombined with the BuildGraph, Scheduler, and ArtifactCache, the object cache gives Vix a path toward much faster incremental builds.
\nThe long-term direction is:
\nvix.app\n -> BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkThat is where Vix can make repeated C++ builds feel dramatically faster without pretending that C++ compilation itself is free.
\n'; +const vixObjectCacheIncrementalBuilds = { + html +}; +export { + vixObjectCacheIncrementalBuilds as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-replay-D153V5vm.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-replay-D153V5vm.js new file mode 100644 index 000000000..3f32fa2d0 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-replay-D153V5vm.js @@ -0,0 +1,8 @@ +const html = 'vix replay replays a previously recorded Vix execution.
It helps you reproduce a run that failed, crashed, or behaved unexpectedly. Use it when you want to rerun the same command without guessing what happened.
\n\n\n\n
vix rundoes not record replay data by default.\nTo create a replay record, run your command with--replay.
vix replay [id|last|failed] [options] [-- app-args...]vix replay loads a recorded execution from .vix/runs/ and runs it again with the stored context.
It can:
\nReplay records are created only when vix run is executed with --replay.
# Record a project run\nvix run api --replay\n\n# Record a built executable run\nvix run ./build-ninja/api --replay\n\n# Record a manifest run\nvix run app.vix --replay\n\n# Record a single-file C++ run\nvix run main.cpp --replayWithout --replay, vix run runs normally and does not create .vix/runs/.
vix run api\nvix run main.cppThese commands do not create replay data.
\n# Replay the latest recorded run\nvix replay\n\n# Replay the latest run explicitly\nvix replay last\n\n# Replay the latest failed run\nvix replay failed\n\n# Replay a specific run\nvix replay 2026-05-05-18-42-11-a91fUse vix replay when an execution fails and you want to reproduce it quickly.
Typical workflow:
\nvix run api --replay\n# something fails\n\nvix replay failedOr:
\nvix run server.cpp --replay\n# unexpected result\n\nvix replay lastWithout replay, you often need to remember: which command was used, which directory it ran from, which arguments were passed, which environment variables were active, which output was produced, and whether the run failed, crashed, or was interrupted.
\nvix replay keeps that context in a recorded run.
| Command | \nBest for | \nRecords/replays context | \n
|---|---|---|
vix run | \nmanual run | \nrecords only with --replay | \n
vix dev | \nactive development | \nrecords development executions when enabled | \n
vix replay | \nreproducing a previous run | \nreplays recorded execution | \n
vix replay does not replace vix run or vix dev. It uses recorded executions created by replay-enabled runs.
vix replayEquivalent to:
\nvix replay lastYou can also use:
\nvix replay latestvix replay failedYou can also use:
\nvix replay failThis is useful when several successful runs happened before or after a failure.
\nEach recorded run has an id:
\nvix replay 2026-05-05-18-42-11-a91fRun ids are stored under .vix/runs/.
vix replay list\n\n# Show only failed runs\nvix replay list --failed\n\n# Show only successful runs\nvix replay list --success\n\n# Show only interrupted runs\nvix replay list --interrupted\n\n# Limit the number of results\nvix replay list --limit 10# Show the latest run\nvix replay show last\n\n# Show the latest failed run\nvix replay show failed\n\n# Show a specific run\nvix replay show 2026-05-05-18-42-11-a91fThis prints the recorded metadata, command, status, duration, logs, and replay hint.
\nUse --dry-run to print the replay command without executing it:
vix replay last --dry-runUseful when you want to inspect what will be replayed before running it.
\nArguments after -- are appended to the replay command:
vix replay last -- --port 8080vix replay last --env VIX_LOG_LEVEL=debugMultiple variables:
\nvix replay last --env VIX_LOG_LEVEL=debug --env APP_ENV=localBy default, vix replay reads from .vix/runs/ in the current directory.
Use --dir or --cwd to read from another location:
vix replay last --dir ./api\nvix replay list --cwd ./apivix replay cleanRemoves recorded replay runs from .vix/runs/.
A recorded run is stored as:
\n.vix/runs/<id>/\n run.json\n stdout.log\n stderr.log\n combined.logThe latest marker stores the most recent run id:
\n.vix/runs/latest| Option | \nDescription | \n
|---|---|
--dry-run | \nPrint the replay command without executing it | \n
--summary | \nPrint the record summary before replaying | \n
--no-summary | \nDo not print the record summary | \n
--dir, --cwd | \nUse another directory containing .vix/runs | \n
--env KEY=VALUE | \nAdd an environment variable during replay | \n
-- | \nAppend remaining arguments to the replay command | \n
-h, --help | \nShow command help | \n
| Option | \nDescription | \n
|---|---|
--replay | \nRecord this vix run execution under .vix/runs/ | \n
Example:
\nvix run api --replay\nvix run ./build-ninja/api --replay\nvix run app.vix --replay\nvix run main.cpp --replay| Option | \nDescription | \n
|---|---|
--all | \nShow all replay runs | \n
--failed, --fail | \nShow failed replay runs | \n
--success, --ok | \nShow successful replay runs | \n
--interrupted, --interrupt | \nShow interrupted replay runs | \n
--limit <n> | \nLimit number of rows | \n
--dir, --cwd <path> | \nUse another directory containing .vix/runs | \n
# Record and replay a project run\nvix run api --replay\nvix replay last\n\n# Record and replay a single-file C++ run\nvix run main.cpp --replay\nvix replay last\n\n# Replay the latest failed run\nvix replay failed\n\n# Inspect the latest run before replaying\nvix replay show last\nvix replay last\n\n# List failures\nvix replay list --failed\n\n# Replay with debug logs\nvix replay failed --env VIX_LOG_LEVEL=debug\n\n# Print the replay command only\nvix replay last --dry-run\n\n# Clean old replay data\nvix replay cleanWrong:
\nvix run api\nvix replay lastCorrect:
\nvix run api --replay\nvix replay lastvix run does not create replay records by default. Use --replay when you want the execution to be recorded.
Wrong:
\ncd ..\nvix replay lastCorrect:
\ncd api\nvix replay lastOr:
\nvix replay last --dir ./apivix replay reads .vix/runs/ from the current directory unless --dir or --cwd is provided.
vix replay failedThis does not replay every failed run. It replays only the latest failed run.
\nTo list all failures:
\nvix replay list --failedWrong:
\nvix replay last --port 8080Correct:
\nvix replay last -- --port 8080The -- separates replay options from arguments appended to the replayed command.
| Command | \nPurpose | \n
|---|---|
vix run | \nBuild and run manually | \n
vix dev | \nStart dev server with auto-reload | \n
vix build | \nConfigure and compile | \n
vix check | \nValidate build, tests, runtime, and sanitizers | \n
vix tests | \nRun tests | \n
Technical notes about how vix run resolves files, scripts, projects, targets, CMake fallback, and runtime arguments.
vix run should make the simple case fast.
For a single file, the ideal path is direct:
\nmain.cpp\n -> compile\n -> link\n -> runBut not every script is simple.
\nSome files need compiled modules, external packages, generated build metadata, or more complex linking.
\nThat is where the CMake fallback exists.
\nThe user still writes:
\nvix run main.cppBut internally, Vix can choose a more powerful build path when direct execution is not enough.
\nA direct script runner is good for simple files.
\nExample:
\n#include <vix.hpp>\n\nint main()\n{\n vix::print("hello");\n return 0;\n}This can be compiled directly.
\nBut a script may use features that need more than one compiler command.
\nExamples:
\ncompiled Vix modules\nregistry dependencies\nexternal libraries\nCMake packages\nplatform-specific link flags\ngenerated build metadataIn those cases, direct compilation can fail or become too fragile.
\nThe goal of the fallback is:
\nkeep the command simple\nuse a stronger build path internally when neededThe user should not need to manually create a CMakeLists.txt just because a script needs a compiled dependency.
The command should stay:
\nvix run main.cppVix decides whether direct mode is enough or whether fallback is needed.
\nThe direct path is:
\nsource file\n -> compiler\n -> linker\n -> executable\n -> runThis is the fast path.
\nIt is best for:
\nsingle-file programs\nsimple examples\nlocal experiments\nheader-only usage\nsmall toolsThe direct path has minimal overhead.
\nThe fallback path is:
\nsource file\n -> generated CMake project\n -> CMake configure\n -> CMake build\n -> executable\n -> runThis path has more overhead, but it is more compatible.
\nIt can use CMake’s normal machinery for:
\ntargets\npackages\nlinking\ncompiled modules\ntoolchains\nNinja\ncompiler launchersCMake fallback exists because C++ linking is not always trivial.
\nA single source file can depend on compiled code.
\nFor example, this may look like a script:
\n#include <vix/kv.hpp>\n\nint main()\n{\n // use a compiled Vix module\n}But if vix::kv requires a compiled library, then direct mode needs to know how to link that library.
If the dependency graph becomes complex, CMake fallback is safer.
\nThe fallback should not change the user-facing workflow.
\nThe user should not need to know whether Vix used:
\ndirect compileor:
\ngenerated CMakeunless they ask for verbose output.
\nThe command stays:
\nvix run main.cppVerbose output can show the chosen path:
\nscript mode: CMake fallbackWhen fallback is needed, Vix can generate a temporary CMake project for the script.
\nA possible generated layout:
\n.vix/\n run/\n generated/\n main/\n CMakeLists.txtThe exact path is an implementation detail.
\nThe important point is:
\nthe generated project is internal\nthe source file remains the user inputThe generated CMake file should not become the user’s project.
\nIn fallback mode, the source of truth is still:
\nmain.cppnot the generated CMake file.
\nThe generated CMake exists only to build the script.
\nIf the user needs a real project, they should create:
\nvix.appor:
\nCMakeLists.txtFallback is for script mode, not for converting scripts into permanent projects.
\nFor a simple script:
\nvix run main.cppthe generated CMake can be conceptually similar to:
\ncmake_minimum_required(VERSION 3.24)\n\nproject(vix_script LANGUAGES CXX)\n\nadd_executable(vix_script\n /absolute/path/to/main.cpp\n)\n\ntarget_compile_features(vix_script PRIVATE cxx_std_20)For scripts using compiled modules, Vix can add more generated logic.
\nFor example:
\ntarget_link_libraries(vix_script PRIVATE\n vix::kv\n)The exact generated output can evolve.
\nFallback should happen when direct mode is not enough.
\nPossible triggers:
\ncompiled Vix module required\nregistry dependency required\nexternal package required\ndirect link failed with known recoverable cause\nuser requested CMake fallback\nplatform requires generated build metadataThe first implementation can start with explicit or conservative rules.
\nA practical strategy is:
\ntry direct mode\nif direct mode is supported:\n run direct\nelse:\n use CMake fallbackAnother strategy is:
\ninspect required dependencies first\nchoose direct or fallback before compilingBoth can work.
\nThe important rule is correctness.
\nDo not keep retrying blindly if the failure is a real code error.
\nIf the compiler reports a source code error, fallback will not help.
\nExample:
\nint main()\n{\n this_function_does_not_exist();\n}That is not a direct-mode limitation.
\nThat is a compile error.
\nVix should show the error instead of trying a fallback.
\nFallback is useful for build model limitations, not for invalid C++ code.
\nSome linker errors mean the code or dependencies are wrong.
\nExample:
\nundefined reference to user_function()If this is caused by a missing user source file, CMake fallback may not fix it.
\nFallback should not hide real errors.
\nIt should be used when Vix knows the direct runner lacks needed build information.
\nGood reasons to fallback include:
\ncompiled Vix module detected\npackage metadata requires CMake\nregistry dependency has CMake integration\ndirect runner cannot resolve required link target\nscript uses features that require generated target setupBad reasons to fallback include:
\nsyntax error\nmissing semicolon\nundefined user function\nduplicate main\ninvalid C++ codeFallback should not change runtime argument behavior.
\nThis:
\nvix run main.cpp -- --name Gaspardshould pass:
\n--name Gaspardto the program whether Vix uses direct mode or CMake fallback.
\nThe build path should not affect the runtime interface.
\nFallback should preserve exit behavior.
\nIf the program returns:
\nreturn 7;then vix run should report or return that exit code consistently.
The user should not see a different result just because fallback was used.
\nFallback must also support interactive programs.
\nExample:
\n#include <vix.hpp>\n\nint main()\n{\n auto name = vix::input("Name: ");\n vix::print("Hello", name);\n return 0;\n}If this runs through CMake fallback, stdin should still work.
\nThe generated build path should not break the runtime process.
\nFallback should preserve predictable working directory behavior.
\nThe script is user-authored.
\nThe generated CMake directory is internal.
\nSo the program should not accidentally run from:
\n.vix/run/generated/...unless that behavior is explicitly intended.
\nA reasonable default is to run from the current working directory or the source file directory.
\nThe behavior should be consistent with direct script mode.
\nFallback needs a build directory.
\nPossible layout:
\n.vix/run/build/or:
\n.vix/cache/run/The build directory should be managed by Vix.
\nIt should not pollute the user’s source directory with:
\nCMakeCache.txt\nCMakeFiles/\nbuild.ninjaThe user asked to run a file, not to create a visible project.
\nFallback should keep logs.
\nUseful logs include:
\ngenerated CMake configure log\nbuild log\ncompiler output\nlinker outputWhen fallback fails, logs help debug the issue.
\nVerbose mode can show where the generated files and logs are stored.
\nDiagnostics should point to user files when possible.
\nIf main.cpp has a compile error, the diagnostic should point to:
main.cppnot only to:
\n.vix/run/generated/CMakeLists.txtIf generated CMake fails, the diagnostic can mention the generated file, but should explain the script context.
\nConfigure errors can happen when:
\na package is missing\na generated target is invalid\na CMake variable is wrong\na toolchain is unavailableThese are fallback build errors.
\nVix should show enough context:
\nscript file: main.cpp\nfallback: generated CMake\nconfigure log: ...Build errors can happen during compilation or linking.
\nCompilation errors should point to the script source.
\nLinking errors should show the missing symbol or target.
\nIf the failure is due to a missing compiled dependency, Vix can suggest installing or linking it.
\nGenerated CMake is internal, but it should still be readable.
\nReadable generated files help engineers debug:
\nwhich source was used\nwhich standard was selected\nwhich libraries were linked\nwhich packages were found\nwhich target was generatedGenerated files should not be mysterious.
\nFallback builds can use cache too.
\nThe generated CMake path can still produce:
\ncompile_commands.json\nbuild.ninja\ndependency filesVix can import those files and use:
\nObjectCache\nArtifactCache\nBuildGraphSo fallback is not necessarily slow every time.
\nIt has more setup overhead, but repeated builds can still improve.
\nThe fallback project should have a stable identity.
\nInputs include:
\nscript source path\nscript source content\ncompiler identity\nC++ standard\nselected Vix modules\ndependency metadata\nruntime build options\ntarget triple\ngenerated CMake contentThis identity helps decide whether the fallback project needs reconfigure or rebuild.
\nIf the generated CMake content did not change, Vix should avoid reconfiguring.
\nThe fallback can store a configure signature.
\nInputs include:
\ngenerated CMake content\nCMake variables\ncompiler\ntoolchain\ndependency metadata\npreset or build typeIf unchanged, configure can be skipped.
\nEven in fallback mode, the script source can compile to an object file.
\nIf the compile identity matches, Vix can restore it from ObjectCache.
\nThis makes repeated script runs faster.
\nIf the whole script executable was already built with the same identity, Vix can reuse it.
\nThis is especially useful for repeated runs of the same script.
\nThe artifact identity must include all build-relevant inputs.
\nIf Vix supports registry dependencies for scripts, fallback can be the integration point.
\nExample flow:
\nscript imports or uses dependency\nVix resolves dependency metadata\ngenerated CMake links dependency\nscript builds\nscript runsThis keeps the direct runner simple while still allowing richer scripts.
\nvix.app and script fallback are different features.
vix.app is for projects.
Script fallback is for single-file execution.
\nBut both can use generated CMake internally.
\nThe difference is source of truth:
\nvix.app project:\n source of truth = vix.app\n\nscript fallback:\n source of truth = main.cpp + run optionsProject mode should not use script fallback.
\nIf the user runs:
\nvix runinside a project, Vix should use project resolution.
\nIf the user runs:
\nvix run main.cppVix should use script mode.
\nThe explicit source file decides script mode.
\nIt may be useful to let users force fallback.
\nExample design:
\nvix run main.cpp --cmakeor:
\nvix run main.cpp --fallback cmakeThis can help debug direct runner problems.
\nThe exact flag can evolve.
\nIt may also be useful to disable fallback.
\nExample design:
\nvix run main.cpp --no-fallbackThis helps test the direct runner.
\nIt also lets advanced users see whether a script can run without generated build infrastructure.
\nVerbose mode should show the selected strategy.
\nExample:
\nRunning script: main.cpp\nMode: CMake fallback\nGenerated source: .vix/run/generated/main/\nBuild directory: .vix/run/build/main/\nTarget: mainThis makes fallback behavior transparent without making normal output noisy.
\nWrong:
\nprogram working directory = .vix/run/generated/main/unless explicitly intended.
\nCorrect:
\nworking directory remains predictable for the userWrong:
\nsource of truth = generated CMakeLists.txtCorrect:
\nsource of truth = main.cpp and run optionsWrong:
\nsyntax error -> fallback to CMakeCorrect:
\nsyntax error -> show diagnosticWrong:
\nall linker errors trigger fallback silentlyCorrect:
\nfallback only when the missing link is a known direct-mode limitationA good first CMake fallback can support:
\ngenerate temporary CMakeLists.txt\nconfigure with Ninja\nbuild script executable\nrun with preserved stdin/stdout/stderr\nforward runtime arguments\nstore logs\nreuse configure when unchanged\nfallback only for known dependency casesThis gives Vix a reliable compatibility layer for scripts.
\nLater improvements can include:
\ndependency-aware fallback selection\ncompiled module auto-linking\nregistry dependency integration\nobject cache import from fallback builds\nartifact cache for script executables\nbetter diagnostics from generated CMake\nexplicit fallback flags\nexplainable fallback reasonsThe fallback can grow without changing the user command.
\nThe fallback should follow this principle:
\ndirect when possible\ngenerated CMake when necessary\nclear diagnostics alwaysThis keeps script mode fast for simple cases and powerful for complex ones.
\nThe CMake fallback exists because not every C++ script can be built safely with one direct compiler command.
\nSome scripts need compiled modules, packages, or richer build metadata.
\nInstead of forcing the user to create a project, Vix can generate an internal CMake project and build the script through the compatibility path.
\nThe user still runs:
\nvix run main.cppThe implementation chooses the right path:
\nsimple script -> direct runner\ncomplex script -> CMake fallbackThat keeps C++ script execution simple from the outside while preserving the power needed for real-world dependencies.
\n'; +const vixRunCmakeFallback = { + html +}; +export { + vixRunCmakeFallback as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-run-runtime-arguments-BMxNsraJ.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-run-runtime-arguments-BMxNsraJ.js new file mode 100644 index 000000000..aa647bedf --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/vix-run-runtime-arguments-BMxNsraJ.js @@ -0,0 +1,8 @@ +const html = 'vix run has two responsibilities.
It must control Vix itself.
\nIt must also run the user program.
\nThose two responsibilities create an important problem:
\nWhich arguments are for Vix?\nWhich arguments are for the program being executed?For example:
\nvix run main.cpp --name GaspardDoes --name belong to Vix?
Or does it belong to main.cpp?
A good runtime argument design must answer this clearly.
\nCommand-line tools use flags.
\nVix has flags.
\nUser programs also have flags.
\nExample Vix flags:
\n--watch\n--preset\n--build-target\n--dir\n--clean\n--cmake-verboseExample user program flags:
\n--port\n--config\n--verbose\n--name\n--helpIf there is no clear boundary, Vix can accidentally consume arguments intended for the user program.
\nThat makes vix run unpredictable.
The core rule should be:
\nArguments before the runtime boundary belong to Vix.\nArguments after the runtime boundary belong to the program.The most common boundary is:
\n--Example:
\nvix run main.cpp -- --name GaspardHere:
\nvix run main.cppbelongs to Vix.
\nThis:
\n--name Gaspardbelongs to the program.
\nGiven this file:
\n#include <vix.hpp>\n\nint main(int argc, char **argv)\n{\n for (int i = 0; i < argc; ++i)\n vix::print(argv[i]);\n\n return 0;\n}Run:
\nvix run main.cpp -- --name GaspardThe program should receive:
\nargv[0] = path to executable\nargv[1] = --name\nargv[2] = GaspardVix should not try to parse --name.
Inside a project:
\nserver/\n vix.app\n src/\n main.cppRun:
\nvix run -- --port 8080 --config config/app.jsonVix should build and run the project.
\nThe program should receive:
\n--port 8080 --config config/app.jsonThose arguments are runtime arguments.
\nThey are not Vix build options.
\nWithout a boundary, this command is ambiguous:
\nvix run --verboseIt could mean:
\nrun Vix in verbose modeor:
\npass --verbose to the user programWith a boundary, the meaning is clear.
\nVix verbose mode:
\nvix run --verboseProgram verbose mode:
\nvix run -- --verboseThis is predictable.
\nArguments before the boundary configure Vix.
\nExamples:
\nvix run main.cpp --watchvix run --preset releasevix run --build-target servervix run --dir ./examples/helloThese affect how Vix builds or runs the program.
\nThey are not passed to the program unless they appear after the boundary.
\nArguments after the boundary are forwarded to the executable.
\nExample:
\nvix run main.cpp -- --input data.txt --limit 10The program receives:
\n--input\ndata.txt\n--limit\n10Vix does not interpret them.
\nYou can combine Vix options and runtime arguments.
\nExample:
\nvix run --preset release -- --port 8080Meaning:
\n--preset release\n used by Vix\n\n--port 8080\n passed to the programThis makes the command expressive without ambiguity.
\nExample:
\nvix run main.cpp --watch -- --name GaspardMeaning:
\nmain.cpp\n script input\n\n--watch\n Vix option\n\n--name Gaspard\n program argumentsWhen the file changes, Vix rebuilds and reruns the program with the same runtime arguments.
\nSome Vix workflows may also use a runtime marker such as:
\n--runExample:
\nvix run main.cpp --run --name GaspardIn that model, arguments after --run belong to the program.
The idea is the same:
\nthere must be a clear point where Vix parsing stops\nand program arguments beginThe -- separator is still the most standard CLI convention.
The recommended rule is:
\nUse -- to pass arguments to the program.Example:
\nvix run main.cpp -- --name GaspardFor project mode:
\nvix run -- --port 8080This is familiar to engineers who use tools like npm, cargo, go, and many Unix commands.
\nOne possible design is:
\nif Vix does not recognize a flag, pass it to the programThat sounds convenient, but it creates problems.
\nExample:
\nvix run --watcIs that a typo for:
\n--watchor a program argument?
\nIf unknown flags are forwarded silently, Vix may hide user mistakes.
\nAn explicit boundary is safer.
\nWith an explicit boundary, Vix can report unknown Vix flags clearly.
\nExample:
\nvix run --watcVix can say:
\nunknown option: --watc\ndid you mean --watch?But this:
\nvix run -- --watcis clearly a program argument.
\nVix should forward it.
\nVix should forward runtime arguments exactly.
\nIf the user writes:
\nvix run main.cpp -- --message "hello world"The program should receive:
\n--message\nhello worldVix should preserve quoting according to the shell’s argv behavior.
\nThe shell handles quotes first.
\nVix receives already-tokenized arguments.
\nSome programs may need empty string arguments.
\nExample:
\nvix run main.cpp -- ""The program should receive an empty string argument.
\nVix should not drop it.
\nArgument forwarding should preserve the argv list as accurately as possible.
\nAfter the boundary, arguments are program arguments even if they look like Vix flags.
\nExample:
\nvix run main.cpp -- --watch --preset releaseThe program receives:
\n--watch\n--preset\nreleaseVix should not treat them as its own options.
\nBefore the boundary, Vix parses the arguments.
\nExample:
\nvix run main.cpp --watch --preset releaseHere:
\n--watch\n--preset releasebelong to Vix.
\nThey should not be forwarded to the program.
\nIn direct script mode, the flow is:
\nparse Vix args\ncompile source\nlink executable\nrun executable with runtime argsExample:
\nvix run main.cpp -- --count 5The compile and link steps do not use:
\n--count 5Only the final executable receives them.
\nIf script mode falls back to generated CMake, runtime arguments should behave the same.
\nExample:
\nvix run main.cpp -- --count 5Whether Vix uses:
\ndirect compiler pathor:
\ngenerated CMake fallbackthe program should receive:
\n--count 5The build path should not change the runtime interface.
\nProject mode follows the same rule.
\nExample:
\nvix run --build-target server -- --port 8080Vix uses:
\n--build-target serverThe program receives:
\n--port 8080The target resolution and build planning happen before the runtime arguments are forwarded.
\nFor a vix.app project:
name = server\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]Run:
\nvix run -- --port 8080Vix should:
\nresolve vix.app\nbuild target server\nfind executable server\nrun server with --port 8080The runtime arguments do not affect the manifest.
\nThey only affect the launched process.
\nIf vix.app uses:
output_dir = binVix may run:
\nbuild-ninja/bin/serverwith the runtime arguments:
\n--port 8080The executable path and argument list are separate:
\nexecutable path: build-ninja/bin/server\nargv: --port 8080Runtime arguments are not the only runtime concern.
\nThe working directory also matters.
\nExample:
\nvix run -- --config config/app.jsonThe program receives:
\nconfig/app.jsonBut whether that path works depends on the process working directory.
\nVix should define a predictable runtime working directory.
\nPossible choices:
\ncurrent working directory\nproject root\nexecutable directoryThe best choice should be consistent and documented.
\nFor project mode, the cleanest default is often:
\nproject rootbecause users usually expect paths to be relative to the project.
\nFor script mode, the cleanest default is often:
\ncurrent working directorybecause the user explicitly runs a file from a shell location.
\nIf resources are copied next to the executable, Vix may also need an option to run from the executable directory.
\nThe important rule is predictability.
\nSuppose a vix.app project has:
resources = [\n "data/config.json=config/config.json",\n]and the user runs:
\nvix run -- --config config/config.jsonIf the working directory is the project root, the program looks for:
\nproject/config/config.jsonIf the working directory is the executable directory, it looks for:
\nbuild-ninja/bin/config/config.jsonThis is why runtime working directory must be defined clearly.
\nRuntime arguments affect the user program.
\nThe user program may exit successfully or fail.
\nExample:
\nint main(int argc, char **argv)\n{\n return argc > 1 ? 0 : 1;\n}If the program exits with code 1, Vix should preserve that meaning.
A non-zero program exit is not the same as:
\ncompile error\nlink error\nVix internal failureThese are different:
\nbuild failed:\n compiler or linker failed\n\nruntime failed:\n program ran and returned non-zero\n\nruntime crashed:\n program terminated abnormallyvix run should distinguish them.
This matters for scripts, tests, CI, and automation.
\nRuntime argument forwarding should not break interactive programs.
\nExample:
\n#include <vix.hpp>\n\nint main(int argc, char **argv)\n{\n auto name = vix::input("Name: ");\n vix::print("Hello", name);\n return 0;\n}Run:
\nvix run main.cpp -- --interactiveThe program receives:
\n--interactiveand should still be able to read from stdin.
\nWhen running the program, Vix should preserve:
\nstdin\nstdout\nstderrThe user program should feel like it is running normally.
\nIf Vix captures output for diagnostics, it must avoid breaking interactive programs.
\nRuntime arguments are not environment variables.
\nBut both affect process execution.
\nVix should pass the environment to the child process by default.
\nExample:
\nMYAPP_ENV=dev vix run -- --port 8080The program should be able to read:
\nMYAPP_ENV=devunless Vix intentionally sanitizes the environment.
\nIn watch mode, Vix should reuse the same runtime arguments on each rerun.
\nExample:
\nvix run main.cpp --watch -- --name GaspardWhen the file changes:
\nrebuild\nrerun with --name GaspardRuntime arguments should not be lost between reruns.
\nIn watch mode, if the previous process is still running, Vix may need to stop it before starting the next one.
\nThe runtime argument list should stay the same.
\nFlow:
\nstart program with args\nfile changes\nstop program\nrebuild\nstart program with same argsThis makes watch mode predictable.
\nA test executable may accept filters.
\nExample:
\nvix run -- --filter mathThis should pass:
\n--filter mathto the test program.
\nFor vix.app tests:
cd tests\nvix run -- --filter addThe test executable receives the filter.
\nMany programs use:
\n--helpTo pass it to the program:
\nvix run -- --helpIf the user runs:
\nvix run --helpthat should show Vix help.
\nThis is another reason the boundary is necessary.
\nSame rule:
\nvix run -- --versionpasses --version to the program.
vix run --versionshows Vix version or Vix command behavior.
\nCommand:
\nvix run main.cpp --name GaspardIf --name is not a Vix option, Vix should probably report:
unknown option: --nameThe correct command is:
\nvix run main.cpp -- --name GaspardThis teaches the boundary.
\nIncorrect:
\nvix run main.cpp -- --watchif the user intended Vix watch mode.
\nThis passes --watch to the program.
Correct:
\nvix run main.cpp --watchor:
\nvix run main.cpp --watch -- --program-argRuntime args do not change the build.
\nThis:
\nvix run -- --mode releasepasses --mode release to the program.
It does not build in release mode.
\nTo build in release mode:
\nvix run --preset releaseor:
\nvix run --preset release -- --mode releaseIf both are supported, their behavior should be documented clearly.
\nRecommended simple model:
\n-- is the standard runtime argument boundary.If --run exists for compatibility, it should behave consistently.
Example:
\nvix run main.cpp --run --name Gaspardmeans program receives:
\n--name GaspardBut the standard form should remain:
\nvix run main.cpp -- --name GaspardInternally, argument parsing can produce two arrays:
\nvixArgs\nruntimeArgsExample command:
\nvix run main.cpp --watch -- --name GaspardParsed result:
\nvixArgs:\n main.cpp\n --watch\n\nruntimeArgs:\n --name\n GaspardThen Vix uses vixArgs to build and runtimeArgs to run the process.
When execution starts, Vix should invoke:
\nexecutable + runtimeArgsExample:
\nbuild-ninja/bin/server --port 8080But internally it should avoid shell-string reconstruction when possible.
\nIt is safer to pass argv directly to the process API.
\nThis preserves spaces and special characters correctly.
\nVix should not construct one big shell string like:
\n"./server --name " + userInputIt should pass arguments as an argv vector when possible.
\nThis avoids quoting bugs and shell injection risks.
\nConceptual model:
\nargv[0] = executable\nargv[1] = --name\nargv[2] = GaspardThe shell handles quotes before Vix receives arguments.
\nCommand:
\nvix run main.cpp -- --message "hello world"Vix receives:
\n--message\nhello worldIt should forward those two arguments as-is.
\nIt should not split hello world again.
Verbose output can show runtime arguments when useful.
\nExample:
\nRun:\n executable: build-ninja/bin/server\n args: --port 8080Be careful with sensitive data.
\nIf users pass secrets as arguments, logs can expose them.
\nA future version may need redaction rules.
\nIn CI, runtime arguments are useful for tests.
\nExample:
\nvix run -- --ci --report junit.xmlVix should return the program exit code so CI can fail correctly.
\nThis makes vix run useful for test executables.
For a test project:
\ntests/\n vix.app\n test_math.cppRun:
\ncd tests\nvix run -- --case addThe test executable receives:
\n--case addThis keeps test filtering inside the test program.
\nFor examples:
\ncd examples/server\nvix run -- --port 8080This should run the example server with port 8080.
The example manifest controls build.
\nRuntime args control execution.
\nScript mode:
\nvix run main.cpp -- --name GaspardProject mode:
\nvix run -- --port 8080Vix option plus runtime args:
\nvix run --preset release -- --port 8080Watch mode plus runtime args:
\nvix run main.cpp --watch -- --name GaspardExplicit target plus runtime args:
\nvix run --build-target server -- --port 8080If the user passes an unknown Vix option before the boundary, the error should be helpful.
\nExample:
\nvix run main.cpp --name GaspardPossible message:
\nunknown Vix option: --name\n\nIf this option belongs to your program, pass it after --:\n\n vix run main.cpp -- --name GaspardThis teaches the correct model.
\nThe design principle is:
\nVix owns arguments before the boundary.\nThe program owns arguments after the boundary.This keeps the command predictable.
\nIt also prevents Vix from guessing too much.
\nvix run must separate build/tool arguments from runtime arguments.
Use:
\n--as the runtime boundary.
\nExamples:
\nvix run main.cpp -- --name Gaspardvix run -- --port 8080vix run --preset release -- --port 8080Before the boundary, arguments configure Vix.
\nAfter the boundary, arguments are forwarded to the user program.
\nThis rule works for:
\nscript mode\nproject mode\nvix.app\nCMake projects\ndirect runner\nCMake fallback\nwatch mode\ntests\nexamplesA clear argument boundary makes vix run predictable, scriptable, and safe for real CLI programs.
vix run supports two different execution models:
script mode\nproject modeThey solve different problems.
\nScript mode is for quickly running one C++ file.
\nProject mode is for building and running a real project.
\nThe command can look almost the same from the outside, but internally the flow is different.
\nvix run main.cppuses script mode.
\nvix runinside a project uses project mode.
\nUnderstanding the difference matters because vix run must know what to compile, where to place outputs, how to resolve dependencies, and how to pass arguments to the final program.
C++ has two common workflows.
\nThe first workflow is quick experimentation:
\nI have one file.\nCompile it.\nRun it.The second workflow is project execution:
\nI have a project.\nBuild the target.\nRun the executable.These workflows should not require the same setup.
\nA single-file program should not need a CMakeLists.txt.
A full project should not be treated like one loose source file.
\nSo vix run separates them.
Script mode runs a single C++ file.
\nExample:
\nvix run main.cppThis is useful for:
\nquick tests\nsmall examples\nexperiments\nlearning C++\ndebugging snippets\nsingle-file toolsThe source file is the entry point.
\nVix compiles it and runs the produced executable.
\nProject mode runs a project.
\nExample:
\nvix runfrom inside:
\nmyapp/\n vix.app\n src/\n main.cppor:
\nmyapp/\n CMakeLists.txt\n src/\n main.cppIn project mode, Vix must first resolve the project.
\nThen it builds the correct target.
\nThen it finds and runs the executable.
\nThe first question is:
\nDid the user pass a source file?If yes, Vix can use script mode:
\nvix run main.cppIf not, Vix tries project mode:
\nvix runProject mode searches for:
\nCMakeLists.txt\nvix.appusing the normal project resolution rules.
\nProject:
\nscratch/\n main.cppCommand:
\nvix run main.cppmain.cpp:
#include <vix.hpp>\n\nint main()\n{\n vix::print("hello from script mode");\n return 0;\n}Vix can compile and run this file without requiring a project manifest.
\nProject:
\nhello/\n vix.app\n src/\n main.cppvix.app:
name = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]Command:
\nvix runVix resolves the vix.app project, builds the target named hello, then runs the produced executable.
Project:
\nhello/\n CMakeLists.txt\n src/\n main.cppCommand:
\nvix runVix resolves the CMake project, builds the default or selected target, then runs the executable.
\nCMake remains the compatibility path.
\nProject mode uses this resolution order:
\n1. CMakeLists.txt\n2. vix.appIf both files exist, Vix uses:
\nCMakeLists.txtThis preserves existing CMake behavior.
\nvix.app is used only when no CMakeLists.txt exists.
Script mode should stay lightweight.
\nIf the user writes:
\nvix run main.cppthey are asking for immediate execution.
\nThey should not need:
\nvix.app\nCMakeLists.txt\nproject layout\nbuild directory setupThat is the point of script mode.
\nIt gives C++ a fast entry path for experimentation.
\nA project has more structure.
\nIt may contain:
\nmultiple source files\ninclude directories\nresources\npackages\nlinks\ncompile options\noutput directories\ntests\nexamplesA single source file is not enough to describe it.
\nSo project mode should use project metadata from:
\nCMakeLists.txtor:
\nvix.appThat metadata tells Vix what to build.
\nScript mode input:
\none source fileProject mode input:
\nproject root\nmanifest or CMakeLists.txt\ntarget name\nbuild configurationThis difference affects the entire execution pipeline.
\nIn script mode, the build identity can be derived from the source file.
\nExample:
\nvix run main.cppPossible identity:
\nsource: main.cpp\ntarget: main\nmode: scriptVix can place outputs in an internal cache or build directory.
\nThe exact output path is an implementation detail.
\nIn project mode, the build identity comes from the project.
\nFor CMake projects:
\ntarget name may come from project/build settingsFor vix.app projects:
target name comes from manifest.nameExample:
\nname = serverTarget identity:
\nserverThis is why project mode needs project resolution.
\nScript mode can follow a direct pipeline:
\nparse command\nresolve source file\nchoose compiler settings\ncompile source\nlink executable\nrun executableIf the file uses installed Vix modules or registry dependencies, script mode may need additional linking logic.
\nBut the entry point remains one source file.
\nProject mode follows a project pipeline:
\nparse command\nresolve project\ncreate build plan\nbuild target\nresolve executable path\nrun executableFor CMake projects, this goes through the CMake compatibility path.
\nFor vix.app, this currently goes through generated CMake, then the same build path.
Script mode can have a fallback path when direct compilation is not enough.
\nFor example, a script may need:
\ncompiled Vix modules\nregistry dependencies\nextra link inputs\ncomplex flagsA CMake fallback can generate a temporary build project for the script.
\nThis keeps script mode simple at the command level while still supporting more complex cases internally.
\nFor simple files, Vix can use a direct script runner.
\nConceptually:
\nmain.cpp\n -> compile\n -> link\n -> runThis avoids creating a full user project.
\nIt is useful for fast feedback.
\nScript mode may need fallback when:
\nthe script uses compiled dependencies\nthe script needs generated build metadata\ndirect linking cannot resolve required modules\nplatform-specific build logic is neededFallback should be internal.
\nThe user should still run:
\nvix run main.cppvix.app gives project mode a simple manifest.
Example:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n src/app.cpp,\n]\n\ninclude_dirs = [\n include,\n]vix run uses this to know:
target name\nsource files\ninclude directories\noutput layout\nresourcesThe manifest is the project description.
\nFor vix.app, Vix currently generates:
.vix/generated/app/CMakeLists.txtThen it builds the generated CMake project.
\nThe user project remains:
\nproject/The generated CMake source is:
\nproject/.vix/generated/app/vix run must keep these separate.
For project mode, especially vix.app, Vix must distinguish:
userProjectDir\ncmakeSourceDir\ntargetNameFor CMake:
\nuserProjectDir = cmakeSourceDirFor vix.app:
userProjectDir = project/\ncmakeSourceDir = project/.vix/generated/app/\ntargetName = manifest.nameThis prevents Vix from treating generated files as the real project.
\nIn script mode, Vix arguments and program arguments need a clear boundary.
\nExample:
\nvix run main.cpp --run --name GaspardThe idea is:
\narguments before the runtime boundary belong to Vix\narguments after the runtime boundary belong to the programThis prevents Vix from consuming arguments that the program expects.
\nIn project mode, the same problem exists.
\nExample:
\nvix run -- --port 8080Here:
\nvix runconfigures Vix.
\nArguments after:
\n--can be passed to the executable.
\nThe boundary should be predictable.
\nC++ CLI programs often accept flags.
\nExample:
\nmyapp --port 8080 --verboseIf Vix does not separate arguments clearly, it may treat:
\n--port\n--verboseas Vix flags instead of program flags.
\nA clear boundary avoids that.
\nScript mode watch can watch the input file.
\nExample:
\nvix run main.cpp --watchWhen main.cpp changes, Vix recompiles and reruns.
If the script includes local headers, watch mode may eventually need to track those too.
\nProject mode watch should watch the user project directory.
\nFor CMake projects:
\nwatch project/For vix.app projects:
watch project/Not:
\nproject/.vix/generated/app/The generated directory is not the source of truth.
\nThe runtime working directory matters in both modes.
\nIf the program opens:
\nstd::ifstream file("config/app.json");then relative path behavior depends on where Vix starts the process.
\nScript mode may run from the current directory.
\nProject mode may run from the project root or executable directory.
\nThis behavior should be consistent and documented.
\nvix.app supports resources:
resources = [\n assets,\n "data/config.json=config/config.json",\n]These are copied next to the built target.
\nvix run should run the executable in a way that makes resource behavior predictable.
If the executable is under:
\nbuild-ninja/bin/and resources are copied there, the working directory decision matters.
\nScript mode output can be internal.
\nFor example:
\n.vix/run/\n.vix/cache/\nbuild-script/The exact path is less important than the behavior:
\ncompile the file\nrun the result\nreuse when safe\nclean up when appropriateProject mode output follows the project build configuration.
\nFor CMake and vix.app, this usually means:
build-ninja/\nbuild-dev/\nbuild-release/With vix.app:
output_dir = binthe executable may be under:
\nbuild-ninja/bin/Common script mode errors:
\nsource file not found\ncompile error\nlink error\nmissing dependency\nruntime crash\ninvalid runtime argument boundaryVix should report these as script execution errors.
\nThe diagnostic should point to the source file when possible.
\nCommon project mode errors:
\nproject not found\ninvalid vix.app\nCMake configure failed\nbuild failed\ntarget not found\nexecutable not found\nlibrary target cannot be runThe diagnostic should explain whether the failure came from:
\nproject resolution\nbuild planning\nCMake configure\ncompile\nlink\nrunIf the user runs:
\nvix runoutside a project, Vix may report:
\nMissing CMakeLists.txt or vix.app.The fix is to either:
\nrun from a project directory\npass --dir\nrun a source file directly\ncreate vix.app\ncreate CMakeLists.txtExample:
\nvix run main.cppfor script mode.
\nIf the user runs:
\nvix run src/main.cppinside a project, Vix should treat it as script mode because a source file was explicitly provided.
\nThis is useful for quick experiments inside a larger repository.
\nThe explicit file input should be respected.
\nIf the user runs:
\nvix runwith no source file, Vix should use project mode.
\nIt should search for:
\nCMakeLists.txt\nvix.appand run the project target.
\nProject mode can also use an explicit directory.
\nExample:
\nvix run --dir ./examples/helloThen Vix should resolve the project from that directory.
\nIf that directory contains vix.app, the manifest defines the target.
For project mode, the user may choose a target:
\nvix run --build-target serverThis is most useful for CMake projects with multiple targets.
\nFor vix.app, there is usually one target, so the manifest name is enough.
A clean implementation avoids mixing concepts.
\nScript mode should not require project resolution.
\nProject mode should not guess from a random .cpp file.
The high-level split is:
\nif source file input exists:\n script mode\nelse:\n project modeThis keeps behavior predictable.
\nEven though script mode and project mode are different, they can share lower layers.
\nShared systems may include:
\ncompiler detection\ncache\ndiagnostics\nprocess execution\nargument forwarding\nstyle/output\nruntime crash handlingBut the input model remains different.
\nWhen vix.app gets a native build path, project mode should still look the same to the user.
Current:
\nvix.app -> generated CMake -> build -> runFuture:
\nvix.app -> BuildGraph -> ObjectCache -> Scheduler -> Link -> runThe command stays:
\nvix runThe implementation changes underneath.
\nThe strength of vix run is that it can cover several workflows with one command.
But that only works if the internal modes are clear.
\nScript mode should optimize for immediacy.
\nProject mode should optimize for correctness and project structure.
\nvix.app makes project mode easier for simple projects.
CMake keeps project mode powerful for complex projects.
\nvix run has two main modes:
script mode:\n vix run main.cpp\n\nproject mode:\n vix runScript mode treats a source file as the entry point.
\nProject mode resolves a CMake or vix.app project.
For vix.app, the manifest defines the target name.
For CMake, CMake remains the compatibility path.
\nThe clean boundary is:
\nexplicit source file -> script mode\nproject root -> project modeThat boundary keeps vix run simple from the outside and precise inside.
C++ is usually seen as a systems language.\nThat is true, but it does not mean C++ should stay far away from modern web development workflows.\nWith Vix.cpp v2.6.0, we started experimenting with a full-stack development workflow where a Vue frontend can run next to a Vix-powered C++ backend.\nThe idea is simple:
\nVue frontend\nVix C++ backend\nOne development workflowModern frontend developers already have a strong workflow.\nThey use tools like Vue, Vite, hot reload, browser devtools, and fast feedback loops.\nC++ developers often have something very different:
\nCMake\nmanual setup\nbuild directories\ncompiler flags\nruntime configurationBoth worlds are powerful, but they are usually separated.\nVix is trying to reduce that gap.
\nA Vue + Vix project can be created with:
\nvix new shop --template vueThis generates a project with:
\nsrc/main.cpp Vix C++ backend\nfrontend/ Vue frontend\nfrontend/src/App.vue Vue application\nvix.app Vix application manifest\nvix.json project metadata and tasksThen development starts with:
\nvix devIn this mode, Vix starts the backend and the Vue/Vite frontend together.\nThe frontend runs with Vite.\nThe backend runs with Vix.\nThe API stays powered by C++.
\nVue is simple, progressive, and approachable.\nThat matters because the goal is not to force frontend developers to abandon what they already know.\nThe goal is to give them a path into C++ without destroying their existing frontend experience.\nA developer can keep writing Vue components while using Vix for backend APIs, performance-sensitive logic, local-first systems, networking, storage, or runtime features.
\nvix run should stay focused.\nIt runs the Vix application or target.\nFor a full development environment, the right command is:
vix devThat keeps the mental model clean:
\nvix run run the Vix app\nvix dev run the development environment\nvix build build the projectSo for Vue + Vix projects:
\nvix run\n runs the Vix backend\n\nvix dev\n runs the Vix backend and Vue frontend\n\nvix build\n builds the applicationDuring development, the Vue frontend can call:
\n/api/*Vite proxies those requests to the Vix backend:
\nhttp://localhost:8080So frontend code can stay simple:
\nconst response = await fetch("/api/hello");\nconst data = await response.json();The browser talks to Vue.\nVue talks to /api.\nVix handles the backend.
This is not about replacing Vue.\nThis is not about replacing Vite.\nThis is about making Vix a better bridge between modern frontend workflows and C++ backend development.\nThe long-term direction is clear:
\nKeep the frontend experience developers love.\nBring C++ closer to application development.\nMake the workflow simple enough to try in minutes.Vix.cpp v2.6.0 is a step in that direction.
\n'; +const vueFullstackDevWorkflow = { + html +}; +export { + vueFullstackDevWorkflow as default, + html +}; diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/assets/why-vix-app-exists-uAZWuAmv.js b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/why-vix-app-exists-uAZWuAmv.js new file mode 100644 index 000000000..8a37da589 --- /dev/null +++ b/vix-site/.vite-ssg-temp/1mc6wisw06/assets/why-vix-app-exists-uAZWuAmv.js @@ -0,0 +1,8 @@ +const html = 'vix.app exists because starting a C++ project should not require writing a build system first.
C++ gives you control, performance, and long-term stability. But the first step is often too heavy:
\ncreate a folder\nwrite CMakeLists.txt\nchoose a generator\nconfigure the build\nunderstand targets\nunderstand include paths\nunderstand link libraries\nthen finally write codeFor experienced C++ engineers, this is normal.
\nFor application developers, it is friction.
\nvix.app is Vix.cpp’s answer to that friction.
It is a small project manifest that lets a developer describe a C++ target directly.
\nthis is the target name\nthis is the target type\nthese are the source files\nthese are the include directories\nthese are the packages\nthese are the libraries\nbuild it\nrun itC++ does not have a single default application workflow.
\nIn many ecosystems, a new project starts with one command and one simple config file.
\nIn C++, even a small application often begins with build-system decisions.
\nA minimal CMake project is already a small build-system program:
\ncmake_minimum_required(VERSION 3.24)\n\nproject(hello LANGUAGES CXX)\n\nadd_executable(hello\n src/main.cpp\n)\n\ntarget_compile_features(hello PRIVATE cxx_std_20)This is not too complex.
\nBut it is still not the application.
\nIt is setup.
\nFor a bigger project, the setup grows quickly:
\ntarget_include_directories(...)\ntarget_compile_definitions(...)\ntarget_compile_options(...)\ntarget_link_libraries(...)\nfind_package(...)\nset_target_properties(...)\nadd_custom_command(...)These are powerful tools.
\nBut not every project should need to start there.
\nThe goal of vix.app is not to replace CMake.
The goal is to make the common path smaller.
\nA simple C++ application should be able to start with:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]Then:
\nvix build\nvix runThat is the whole point.
\nvix.app makes the first step smaller.
vix.app is a manifest.
It describes one C++ target.
\nExample:
\nname = myapp\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n src/app.cpp,\n]\n\ninclude_dirs = [\n include,\n]This is not a new programming language.
\nIt is not a complete build-system replacement.
\nIt is a compact description of the target that Vix can understand.
\nFrom this manifest, Vix can generate the internal build configuration needed to compile the project.
\nvix.app is not trying to become a second CMake.
It should not grow into a huge language with every possible build-system feature.
\nThat would recreate the same complexity under a different file name.
\nThe design rule is:
\nvix.app stays simple.\nThe generated build layer can be powerful.\nCMake remains available for full control.This keeps the model clean.
\nVix uses a simple project resolution rule:
\n1. If CMakeLists.txt exists, use CMakeLists.txt.\n2. Otherwise, if vix.app exists, use vix.app.This matters.
\nIt means vix.app is non-destructive.
Existing CMake projects keep working exactly as before.
\nA project that needs full CMake control can still use CMake.
\nA project that does not need that complexity can use vix.app.
CMake is powerful because it can describe very complex projects.
\nIt handles:
\nmultiple targets\ncustom commands\ngenerated sources\ninstall rules\nCTest\nFetchContent\ntoolchains\nplatform-specific logic\npackage exports\nlarge dependency graphsvix.app should not try to hide or duplicate all of that.
For advanced C++ projects, CMake is still the right tool.
\nFor simple and medium projects, vix.app gives a smaller entry point.
Today, vix.app works by generating an internal CMake project.
The flow is:
\nvix.app\n -> .vix/generated/app/CMakeLists.txt\n -> CMake configure\n -> CMake build\n -> executable or libraryThe user edits:
\nvix.appVix generates:
\n.vix/generated/app/CMakeLists.txtThe generated file is internal.
\nIt can be inspected for debugging, but it should not be edited manually.
\nGenerating CMake gives Vix a compatibility path.
\nIt allows vix.app to work with the existing C++ ecosystem while keeping the user-facing configuration small.
This gives Vix three important properties:
\nsimple user experience\ncompatibility with existing build tools\na migration path to full CMake when neededIt also lets vix.app become official without requiring a complete native build system on day one.
The long-term direction is more ambitious.
\nFor vix.app projects, Vix can eventually avoid CMake in the hot path.
The future model can become:
\nvix.app\n -> native BuildGraph\n -> ObjectCache\n -> Scheduler\n -> LinkThat is important because vix.app gives Vix structured information directly:
sources\ninclude_dirs\ndefines\nlinks\ncompile_options\nlink_options\npackages\nresources\noutput_dirFor a normal CMake project, Vix has to ask CMake to produce the build graph.
\nFor a vix.app project, Vix already knows enough to create a native graph.
That makes vix.app not only a simpler interface, but also a possible fast path for future builds.
The long-term architecture is:
\nCMakeLists.txt -> compatibility path\nvix.app -> fast pathThis does not mean removing CMake support.
\nIt means Vix can optimize the projects it understands directly.
\nA simple vix.app project can eventually skip unnecessary configure/generate work and go straight to the build graph.
That opens the door to faster incremental builds.
\nC++ build times are affected by many things:
\nheaders\ntemplates\ntranslation units\nlinking\ndependency scanning\nbuild-system generation\nconfiguration stepsVix cannot magically make C++ compilation free.
\nBut it can avoid unnecessary work.
\nA good build system should know when nothing changed.
\nIt should know which source file changed.
\nIt should know which object file can be reused.
\nIt should know when linking is unnecessary.
\nIt should know when an artifact can be restored from cache.
\nvix.app gives Vix a cleaner starting point for this.
A small C++ app should not need a large build file.
\nThis should be enough:
\nname = hello\ntype = executable\nstandard = c++20\n\nsources = [\n src/main.cpp,\n]A library should be just as direct:
\nname = mathlib\ntype = static\nstandard = c++20\n\nsources = [\n src/add.cpp,\n src/mul.cpp,\n]\n\ninclude_dirs = [\n include,\n]Tests can stay explicit too:
\nmathlib/\n vix.app\n tests/\n vix.appOne manifest per target keeps the system predictable.
\nThe tradeoff is intentional.
\nvix.app does not try to cover every case.
It covers the common case well.
\nWhen a project becomes complex, the right answer is not to keep adding more syntax forever.
\nThe right answer is:
\nUse CMakeLists.txt.This keeps the boundary clear.
\nvix.app follows a few principles.
A manifest describes one target.
\nThat target can be:
\nexecutable\nstatic library\nshared libraryThis keeps parsing, build planning, diagnostics, and documentation simple.
\npackages finds packages.
links links targets.
Example:
\npackages = [\n fmt:REQUIRED,\n]\n\nlinks = [\n fmt::fmt,\n]Vix does not guess that fmt should automatically link fmt::fmt.
That kind of magic can become fragile.
\nSource files are listed explicitly:
\nsources = [\n src/main.cpp,\n src/app.cpp,\n]Include directories are listed explicitly:
\ninclude_dirs = [\n include,\n]This makes the build easy to inspect.
\nVix may generate CMake internally.
\nBut the source of truth remains:
\nvix.appThe generated CMake file is not the user interface.
\nThe engineering reason for vix.app is separation of concerns.
CMake is a powerful build description language.
\nvix.app is a product-level project description.
Those are not the same thing.
\nAn application developer often wants to describe the product target:
\nname\ntype\nstandard\nsources\ndependencies\nresourcesThe build engine can translate that into lower-level build operations.
\nThat translation can target CMake today.
\nIt can target Vix’s native BuildGraph later.
\nWith vix.app, the first experience becomes:
mkdir hello\ncd hello\nmkdir src\ntouch src/main.cpp\ntouch vix.app\nvix build\nvix runThe developer can focus on the application first.
\nThe build system is still there, but it is not the first thing they have to fight.
\nThe boundary is simple:
\nIf your project is one clear target, use vix.app.\nIf your project needs advanced build logic, use CMakeLists.txt.This is a stable boundary.
\nIt lets Vix improve the simple path without pretending that all C++ projects are simple.
\nvix.app exists to make C++ project setup smaller.
It gives Vix a simple, structured project description.
\nIt keeps CMake available for advanced projects.
\nIt creates a future path for native Vix builds.
\nMost importantly, it lets a developer start a C++ project by describing the application, not by writing the build system first.
\nvix.app is the simple path.\nCMake is the compatibility path.\nVix connects both.';
+const whyVixAppExists = {
+ html
+};
+export {
+ whyVixAppExists as default,
+ html
+};
diff --git a/vix-site/.vite-ssg-temp/1mc6wisw06/blog/rss.xml b/vix-site/.vite-ssg-temp/1mc6wisw06/blog/rss.xml
new file mode 100644
index 000000000..8e789bcc7
--- /dev/null
+++ b/vix-site/.vite-ssg-temp/1mc6wisw06/blog/rss.xml
@@ -0,0 +1 @@
+${ssrInterpolate(unref(hero).description)}
${ssrInterpolate(section.description)}
#include<future>#include<iostream>#include<thread>intmain(){ std::promise<int> promise; auto future = promise.get_future(); std::thread worker([p =std::move(promise)]() mutable {}); worker.join(); std::cout << future.get() <<'\\n';}${ssrInterpolate(unref(whyVix).description)}
${ssrInterpolate(reason.description)}
${ssrInterpolate(unref(buildWithVix).description)}
${ssrInterpolate(domain.description)}
${ssrInterpolate(unref(production).description)}
A release about ownership.
Vix.cpp v2.9.0 clarifies responsibility across the build system, networking, SDK packaging, and mobile platform support.
Vix focuses on project intent while CMake and Ninja own the concrete compilation graph.
The asynchronous HTTP path now remains asynchronous throughout the operation.
SDKs own more of their internal dependencies and expose a cleaner consumer contract.
Android and iOS support works with their native Gradle and Xcode toolchains.
${ssrInterpolate(unref(community).description)}
${ssrInterpolate(unref(community).action.label)}${ssrInterpolate(unref(softadastra).description)}
${ssrInterpolate(unref(softadastra).action.label)}${ssrInterpolate(unref(sponsors).description)}
${ssrInterpolate(unref(sponsors).note)}
${ssrInterpolate(unref(sponsors).foundingSponsor.description)}
${ssrInterpolate(unref(getStarted).description)}
The Vix.cpp community is open. Anyone can create a space where people using or interested in Vix.cpp can meet, exchange ideas, share projects, and help each other.
This page lists the community spaces currently known around Vix.cpp. New local, language-specific, or online communities can be added as they appear.
Talk about Vix.cpp, ask questions, share projects, exchange ideas, and meet other people interested in C++ development.
Join the Discord →Vix.cpp is maintained by Softadastra, the organization responsible for its long-term development, infrastructure, and project direction.
For organizational, partnership, or project-related inquiries, contact Softadastra directly.
Vix.cpp was created by Gaspard Kirira.
For personal questions, talks, collaboration, or conversations around Vix.cpp and C++ development, you can reach him directly.
Learn how Vix.cpp fits into a C++ project, then move from a single source file to a complete application workflow.
Start with a single C++ source file and understand the basic Vix.cpp development workflow.
Use Vix.cpp with a C++ project, its build system, dependencies, tests, and existing libraries.
Follow the application workflow from development and execution through testing and production.
Reference for commands, project configuration, libraries, and the capabilities available in Vix.cpp.
Technical articles, release notes, development updates, and deeper explanations from the Vix.cpp project.
Ask questions, share what you build, exchange ideas, and meet other people interested in Vix.cpp.
Vix.cpp
News, technical deep dives, release notes, and development updates from the Vix.cpp project.
Latest release
A release about ownership.
Vix.cpp v2.9.0 clarifies responsibility across the build system, networking, SDK packaging, and mobile platform support.
`); + _push(ssrRenderComponent(_component_RouterLink, { + to: `/blog/${unref(featuredPost).path}`, + class: "featured-post__link" + }, { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(` Read release notes `); + } else { + return [ + createTextVNode(" Read release notes "), + createVNode("span", { "aria-hidden": "true" }, "→") + ]; + } + }), + _: 1 + }, _parent)); + _push(`${ssrInterpolate(post.description)}
`); + } else { + _push2(``); + } + _push2(`No other posts have been published yet.
`); + } + _push(`The article you are looking for does not exist.
The page you are looking for does not exist.
`); + _push(ssrRenderComponent(_component_RouterLink, { + class: "not-found__link", + to: "/" + }, { + default: withCtx((_, _push2, _parent2, _scopeId) => { + if (_push2) { + _push2(` Back to Vix.cpp → `); + } else { + return [ + createTextVNode(" Back to Vix.cpp → ") + ]; + } + }), + _: 1 + }, _parent)); + _push(`