MayaFlux 0.4.0: A Substrate
June 2026
0.3 completed the offline compute grammar, the Nexus spatial simulation layer, and the GPU-CPU bridge in both directions. 0.4 does something different in character: it turns MayaFlux from a framework into a substrate.
The change is architectural rather than additive. Every third-party runtime abstraction that existed for portability has been replaced with platform-native implementations. The build system has been rebuilt around composable presets. The JIT environment has been extracted into a standalone library any C++ project can embed. A complete GPU-resident compute pipeline lands alongside a symmetric write/export layer covering every data type the engine can ingest. Portal::Forma graduates from scaffolding to a production interactive surface system. CrossRoutine closes the cross-domain scheduling gap without a mutex in sight.
The result is a collection of focused, first-class systems that compose with each other and can be used independently: Lila without MayaFlux, Forma without the audio pipeline, GPU compute without the rendering loop, capture without the spatial system. None of these required the others. They interoperate because they share the same scheduler, the same buffer machinery, and the same data carriers, not because they are coupled.
Platform
Every third-party backend abstraction has been replaced on Linux and Windows. GLFW is gone on both platforms. RtAudio is gone on all platforms. RtMidi is gone on Linux and Windows.
Windowing: native Wayland backend with full xkb key mapping, scroll direction correction, client-side key repeat via timerfd, and deferred wl_display_disconnect. Native Win32 backend with lock-free event queue and client-side key repeat. MAYAFLUX_LINUX_USE_GLFW restores the GLFW path when needed. macOS retains GLFW pending a native Cocoa backend.
Audio: native PipeWire backend on Linux with RT scheduling, device name resolution, pw_time exposure, xrun detection, and rate-match quantum. Native WASAPI backend on Windows with WASAPI hardware buffer size decoupled from the engine buffer size. Native CoreAudio backend on macOS with separate HAL units for input and output.
MIDI: native PipeWire/ALSA MIDI backend on Linux via the ALSA sequencer enumerated through PipeWire. Native WinMM MIDI backend on Windows. Native CoreMIDI backend on macOS with refresh deadlock eliminated and port cleanup unified.
System dialogs: Portal::System provides native file choosers on all platforms: XDG Desktop Portal via libdbus-1 on Linux, IFileOpenDialog/IFileSaveDialog via Shell COM on Windows, NSOpenPanel/NSSavePanel via AppKit on macOS. Depot exposes typed convenience functions with native dialog backing: choose_audio, choose_video, choose_image, choose_mesh, choose_mesh_network, save_audio, save_image.
Build system
The build system has been rebuilt around CMakePresets.json with a composable preset hierarchy. A windows-base standalone mixin and the MAYAFLUX_BUILD_PROJECT option make MayaFlux embeddable downstream without fighting the build system. XCode support has been dropped. LLVM is at 22.1.6 on Windows and macOS. ccache integration with PCH sloppiness flags lands across all paths.
Engine initialization state is now correctly split: is_engine_configured() covers whether Init() has completed and managers are ready; is_running() covers active processing. These were conflated before.
CI switches to Arch Linux for both dev-release and standard builds, aligning the CI baseline with the Steam Deck deployment environment. Dev releases move to a nightly schedule. The MAYAFLUX_CONFIG_OVERRIDE compile flag and --config-override launcher argument allow config injection without rebuilding. Shader sources are exposed in the Visual Studio Solution Explorer via the compile_shaders target. reconfigure target and launch.bat generation land for Windows developer ergonomics.
Lila and MayaFluxHost
MayaFluxHost is extracted as a standalone shared library with its own CMake target, independent of MayaFluxLib. This is a significant boundary. Any C++ project can now link MayaFluxHost and gain a complete live C++23 evaluation environment backed by LLVM ORC JIT with Clang’s IncrementalCompilerBuilder, with no dependency on Vulkan, audio backends, or any other MayaFlux system. The only hard dependencies are LLVM/Clang, magic_enum for enum introspection, and nlohmann/json for structured serialization. Transitive and Lila come transitively.
MayaFlux::Host::attach_lila enables in-process JIT attachment for embedding workflows. skip_host_library_load allows headless initialization. The Runtime API exposes JIT environment configuration externally.
LiveArena integrates into Persist and gains automatic exposure of Creator objects: any object constructed via the Vega factory API is immediately available to subsequent JIT compilations via live_cast<T>(key) without explicit registration. live_cast_impl routes through the DLL export table, resolving the Windows cross-boundary symbol resolution that was causing JIT crashes. Transitive is split into Transitive_MD and Transitive_MT OBJECT targets to resolve the MSVC CRT mismatch between MayaFluxHost and Lila.
GPU-resident compute pipeline
TextureExecutionContext gains OutputMode::IMAGE: the output storage image stays GPU-resident after dispatch with no CPU download. get_output_image(0) retrieves the VKImage for direct use as a render texture or as input to a subsequent dispatch. This enables fully GPU-side texture production pipelines where the CPU dispatches, polls a FenceID, and binds the result, never touching the pixel data.
The pattern from TextureExecutionContext is uniform across the GPU compute layer. ShaderExecutionContext::dispatch_async returns a FenceID; ShaderFoundry::is_fence_signaled polls it; the calling code responds to completion. GpuComputeNode wraps this pattern for the node graph: it owns a ShaderExecutionContext, dispatches asynchronously via dispatch_async, polls the returned fence on each compute_frame() call, and fires on_complete callbacks with a GpuComputeContext once signaled.
TextureExecutionContext also gains stage_image for callers holding a live VKImage directly (render-pass output, camera frames, swapchain readback), bypassing the container resolution path. set_input_layer selects among array layers before dispatch. aux_bindings allows additional buffer bindings alongside the image.
ComputeMeshBuffer and SDFMeshProcessor apply the same fence-polling pattern to geometry: the SDF field is evaluated on the GPU and marching cubes runs as a compute shader, producing a triangle mesh in a GPU-side SSBO without any CPU-side isosurface traversal. set_dirty() triggers a new dispatch on the next cycle. set_iso_level and the field processor’s runtime parameters (set_time, set_param0, set_param1) update push constants on the next dispatch. Multiple named SDF field shader variants ship in shaders/sdf/.
InstanceNetwork and InstanceNetworkBuffer enable GPU-driven instanced rendering. Each slot holds a GeometryWriterNode and a mat4 transform. InstanceSSBOProcessor packs all transforms into an SSBO per cycle for a single vkCmdDrawIndexed call. InstanceFieldOperator supports an optional GPU path via ShaderExecutionContext that computes all transforms on the GPU and writes back through on_complete, eliminating per-slot CPU transform evaluation entirely.
All shaders are at GLSL 460 and SPIR-V 1.6. shaderc gains FileIncluder support for #include directives. The bitonic sort replaces odd-even in sort_by_attribute.comp. noise.glsl and domain_warp.glsl are available as includes.
Portal::Forma
Forma is a signal-driven geometry system for interactive surfaces. Every element is a typed state mapped through a geometry function to a vertex stream. There is no retained widget tree, no layout engine, no panel hierarchy.
Surface is the top-level composition unit: a Window, a Layer, and a Context. Portal::Forma::create_surface is the primary entry point. Layer is a flat registry of Element instances in NDC space with hit-test predicates and optional parent-child cascade via relate. Context is the event router: on_press, on_release, on_drag, on_scroll, on_move, on_enter, on_leave, keyboard focus with on_held for repeat-driven interaction, focused() and clear_focus().
FormaBuffer is the GPU vertex buffer for a single element, rewritten each cycle by the element’s geometry function. Mapped<T> is the complete element descriptor: a MappedState<T> plus an Element. create_element<T> constructs the buffer, wires the geometry function, runs one sync() so bounds and containment are live before the first frame, and registers with Bridge.
The geometry primitive library in Portal::Forma::Geometry covers: horizontal_fader, vertical_fader, stroke_slider (arc-length scrubber along any polyline), toggle, level_meter, radial, point, crosshair, position_picker, drawable_canvas. Kinesis::Geometry2D provides lower-level filled and outlined shapes for static geometry: filled_rect, filled_rounded_rect, filled_circle, filled_ring, filled_arc, filled_polygon, rect_outline, circle_outline, polyline, and arc_path for path sampling.
Bridge is the application-wide two-way binding orchestrator. Inbound paths drive MappedState values each frame: bind(state, node, projection) reads a node’s last output via a GraphicsRoutine; bind(state, callable) calls a std::function<float()>. Outbound paths route element values: write(state, constant_node), write(state, shader_processor, offset) for push constants, write(state, buffer, shader_path, descriptor_name) for descriptor bindings, write(state, audio_write_proc) for audio routing, write(state, span_sink) for arbitrary bulk float consumers including IIR coefficient arrays and wavetable buffers. wire_canvas_drag wires a drawable_canvas element’s full interaction in one call, including gap interpolation under fast drag.
Collapsible is a foldable header strip built on FormaBuffer and Layer. LayoutCursor accumulates vertical NDC position across element placement calls. Link drives repeating update loops for live-rerendering text rows.
Inspector provides live views into NodeGraphManager and BufferManager as Forma surfaces. inspect_node_graph() and inspect_buffer_manager() create or show dedicated inspection windows. QueryUtils provides ValueSpec, ValueRow, ValueGroup, and InspectResult for building structured inspector panels from arbitrary reader functions. make_value_row drives periodic repress updates on text images through Link::tap().
Portal::Forma::initialize() stores engine-level references for all subsequent factory calls, matching the initialization contracts of Portal::Text and Portal::Graphics.
Portal::Forma::Plot
PlotContainer is a SignalSourceContainer holding named scalar series, each bound to a data acquisition path at construction time and updated by process_default(). Plot::source() builds a container incrementally: .as(name, count, role, modality).from(node), .from(callable), or .from(audio_buf).
Plot::series() describes the geometry: .x() and .y() accumulate axis role mappings with AxisRange (fixed, auto-scale, or condition-gated). .as_waveform(), .as_scatter(), .as_bars(), .as_filled_waveform() terminate into a SeriesSpec carrying the geometry function, topology, and buffer capacity arithmetic. Multiple .x() and .y() calls pair by mapping index, enabling multiple scatter clouds or phase portraits in a single draw call. The palette cycles across all matching series. .background(), .bounds(), .y_ticks(), .x_ticks(), .legend(), and .label() add adornments materialized automatically when using Portal::Forma::plot().
Portal::Forma::plot(title, width, height, container, spec) is the single-call entry point: creates the window, surface, buffer, and first sync, returning the Mapped and Surface. Plot::place() places onto an existing surface. Plot::series_by_role() exposes the raw series lookup for custom geometry lambdas.
Viewport navigation
Four navigation controllers are available as one-call bindings, each wiring event handlers and driving set_view_transform_source on any RenderProcessor:
bind_fly_preset: first-person WASD/QE translation with right-mouse-drag yaw/pitch, scroll dolly, and numpad ortho snaps. Remappable via FlyKeyMap.
bind_orbit_preset: focal-point orbit. MMB drag rotates around the focal point; Shift+MMB pans it. Scroll dollies the distance. Ortho snap slots match Blender conventions. OrbitConfig tunes distance, elevation, sensitivity, and depth range.
bind_pan_zoom_preset: 2D orthographic pan and zoom. Drag translates; scroll scales the orthographic half-height. View matrix remains identity throughout.
bind_screenspace_preset: translates the eye along the camera’s local right and up axes without modifying rotation, the natural mode for 2D canvas workflows with perspective preserved.
All four share unbind_viewport_preset for teardown and can be swapped at runtime without touching the rendering pipeline. Per-processor and per-window overloads are provided for all four modes.
set_view_transform_source accepts any callable, including closures over node outputs, NavigationState, or Nexus entity positions, making the viewpoint a live signal in the data graph.
Nexus
Conventional spatial simulation systems give you an actor hierarchy, a scene graph, a world object, a camera type, a light type. Nexus gives you none of those, which means you are not constrained to build the things they were designed for. Instead: Fabric is a commit-driven simulation container whose entities perceive their spatial neighborhood and push influence in the same step. Emitter fires influence without perceiving. Sensor perceives without acting. Agent does both, and what “perceiving” and “acting” mean is entirely user-defined. These are not archetypes, they are roles. The same entity can drive a render processor’s view transform, modulate an audio sink’s amplitude, and update a shader push constant in the same commit cycle.
Locus is an Agent whose position tracks a NavigationState, making the camera a spatial entity that participates in proximity queries, gets detected by Sensor neighbors, and can trigger Expanse crossings. Presence adds distance-attenuated influence via falloff_curve and falloff_radius, giving any entity a soft spatial field without specifying what that field does to its targets. Tapestry manages a collection of Fabric instances and owns named Expanses that span multiple fabrics. An Expanse is a named spatial region with a ContainsFn predicate and on_enter/on_exit crossing callbacks evaluated on each commit, usable for anything from parameter zone triggers to game region detection to reactive audio spaces.
StateEncoder/StateDecoder reach schema v5: five RGBA32F EXR rows per entity covering position/intensity, color/size, radius/query radius/type, trigger/timing/sink bits, and Locus navigation parameters. The EXR format is intentional: spatial state is image data, addressable, compositable, and readable by anything that reads images. user_state passthrough allows application-defined data to survive round-trips. StateDecoder::reconstruct constructs entities from schema records without them needing to exist in the live Fabric, enabling cold-start session reconstruction from a saved performance state.
Wiring gains mouse_drag, on_scroll, on_release, and key_held trigger variants. The Fabric function registry maps string names to InfluenceFn, ContainsFn, and crossing functions, enabling StateDecoder to resolve callable names back to live function objects across sessions.
Cross-domain scheduling
CrossRoutine is the dual-clock coroutine. It lives in the MULTI_RATE task list scanned by both the sample-clock pump on the audio thread and the frame-clock pump on the graphics thread. MultiRateDelay arms both clocks simultaneously; a zero count on one axis disarms that clock for the current suspension. A compare-exchange on active_delay_context ensures exactly one thread resumes the handle when both pumps reach the gate. Added with initialize=false; Fabric::use(CrossFactory) handles initialization automatically for Nexus-driven workflows.
FreeRoutine is backed by conditional_promise and resumed by a dedicated CONDITIONAL scheduler thread evaluating a stored predicate on each iteration. No clock, no polling cadence, arbitrary condition.
BroadcastSource<T> and BroadcastAwaiter<T> provide coroutine-native one-to-many event broadcast. audio_output_tick() is a BroadcastSource factory that fires on every completed audio output cycle, letting any coroutine await the output tick the same way it awaits any other event. AudioOutputContainer wraps the live engine output as a first-class DynamicSoundStream, making the engine’s own output tap-able for metering, recording, and visualization without a separate capture thread.
ProcessingToken is propagated through EventChain, Timer, TemporalActivation, metro, sequence, pattern, line, and Gate.
Write and capture
The read/write axis is now symmetric. Every major data type MayaFlux can ingest can be exported.
Images: ImageWriterRegistry dispatches by file extension to registered writer factories. STBImageWriter covers PNG, JPG, JPEG, BMP, TGA, and HDR via stb_image_write. EXRWriter covers full-precision float export via vendored tinyexr. IOManager::save_image has four overloads: from a live VKImage (GPU download async, encode dispatched to worker thread), from a TextureBuffer, from a TextBuffer (GPU text-rendered images), and from a pre-downloaded ImageData. wait_for_pending_saves() provides explicit flush semantics.
Video: VideoFileWriter is an asynchronous encoder with a lock-free SPSC work queue and a dedicated worker thread that owns all FFmpeg state. It accepts five input paths: the DisplayService frame observer for live swapchain capture (encoder opened lazily on the first delivered frame, dimensions taken from the live swapchain), raw uint8_t pixel spans, TextureContainer pixel bytes, VideoStreamContainer/CameraContainer frames, and TextureBuffer with async GPU download fallback. SwsContext handles dimension and format rescaling internally. IOManager::capture_window wraps this as a single call returning an opaque handle. stop_capture finalizes the container and flushes the worker. create_writer provides direct encoder access for custom frame submission workflows.
Audio: SoundFileWriter encodes to any FFmpeg-supported container from interleaved span<double>, planar vector<DataVariant>, AudioBuffer, or SoundStreamContainer, on a worker thread via lock-free queue. IOManager::capture_output registers with AudioBackendService’s output observer to tap the engine’s live output continuously into a SoundFileWriter. AudioOutputContainer is the container counterpart: a DynamicSoundStream subclass whose write head advances each output cycle via AudioOutputAccessProcessor, making the engine output addressable as a first-class Kakshya container for any downstream consumer.
IO introspection
IOManager gains reader introspection APIs: get_video_reader_ids(), get_video_reader(id), get_camera_reader_ids(), get_camera_reader(id), get_audio_readers(), get_video_writers(), get_video_capture_ids(). NodeGraphManager, BufferManager, InputManager, and TaskScheduler gain parallel introspection APIs used by the Forma Inspector subsystem and accessible from Lila sessions.
Breaking changes
DataWriteProcessor replaces both GeometryWriteProcessor and TextureWriteProcessor. The distinction was architectural noise; DataWriteProcessor accepts NDData-typed payloads from Bridge outbound paths and stages them modality-aware into any VKBuffer target. Call sites in RenderSink, Bridge, and any user code routing element values to geometry or texture buffers must migrate to DataWriteProcessor.
PointNode is removed. PointCollectionNode is the replacement throughout.
Native windowing is the default on Linux and Windows. Code depending on GLFW window handles directly, or on GLFW event callbacks, must be reviewed. MAYAFLUX_LINUX_USE_GLFW and GLFW_BACKEND restore the GLFW path.
ComputeOutNode is removed. GpuComputeNode is the replacement for arbitrary GPU dispatch in the node graph. ComputeMeshBuffer with SDFMeshProcessor is the path for GPU marching cubes.
The ViewTransform is a UBO at set=0, binding=0. This was established in 0.3.3 but any shaders still using the push constant path for ViewTransform will not compile against 0.4 descriptors.
Source: github.com/MayaFlux/MayaFlux Docs: mayaflux.org License: GPLv3
Commit Summary
See full diff: Github
c774621ad chore(release): prepare 0.4.0
27cfd1101 chore(examples): Update to new API
c694444d7 fix(Buffers): relax GeometryBuffer texture detection to honour default_texture_binding
a5ff3cf54 docs: add Yantra compute guide and OpenCL migration reference
7f6400a3d chore(examples): More TextureExecutionContext usage
ab0ec3057 fix(WindowContainer): correct resize buffer allocation for both grow and shrink
60fefe69b fix(TextureExecutionContext): eliminate per-dispatch Vulkan object churn
063c82eb8 fix(ShaderFoundry): free command buffer on release_fence
33e293440 ShaderFoundry: add release_fence to destroy VkFence after async dispatch
8c4d65f8d TextureExecutionContext: add OutputMode::IMAGE for zero-cost GPU-resident output
333816e56 unify download_image_data: persistent staging, fenced path, remove waitIdle
42c34b364 TextureExecutionContext: use persistent staging buffer for CONTAINER readback
697497c33 TextureContainer: add from_image/from_image_array staging overloads
ab1dbee4e TextureLoom: add download_data persistent-staging overload
addfc0d2a add Seqlock primitive to Transitive/Memory
c939d721a fix(Journal): close remaining thread safety gaps identified in security audit
e744ccc48 feat(Memory/Journal): add MPSCPolicy to RingBuffer; fix Archivist thread safety
014ecc447 refactor(Journal): remove mutex from Archivist, guarantee flush before throw/abort
ed76d827f update examples to use TextureExecutionContext, move old shaders to it
3eea2490b feat(Yantra/shaders): texture array compute shader set
8dd6960df feat(Yantra): aux_bindings parameter on TextureExecutionContext
784add0db yantra: fix TextureExecutionContext descriptor bindings and collect paths
cc0e5d064 feat(kakshya): add staging-buffer upload overloads for TextureContainer image conversion
a7e3959d9 kakshya: add to_image_array / from_image_array / get_layer_count to TextureContainer
0ed62d659 kakshya: add IMAGE_COLOR_ARRAY modality for multi-layer TextureContainer
3a01645a5 shaders: bump all shaders to #version 460, remove spurious core qualifier
749cc6168 yantra: add image_sample_reduce.comp
7a7994e92 build,core: target Vulkan 1.3 / SPIR-V 1.6 across all shader compilation paths
9cc438daa yantra: replace odd-even sort with bitonic in sort_by_attribute.comp
23d819edf yantra: redesign TextureExecutionContext for DataIO contract
9bc276ee2 refactor: hoist Mirror, JSONSerializer and Serializer to Transitive
48ef71a08 chore(examples): Update to use all the new changes
f3bce9ec4 fix(macos): copy immutable config in Sinks to update topology
10b87073d feat(sdf): expose freq and warp_strength as runtime parameters on SDF field shaders
71414bfee refactor(shaders): eliminate line fallback verts, unify line shader interface
1c85c934b chore(shaders): add missing instance_textured_lit.frag shader
395a8ab5c refactor(shaders): eliminate _lit.vert variants, always emit world_pos
54493fe89 feat(nexus): make influence UBO descriptor placement configurable
5f93ec6e3 refactor(buffers): consolidate additional texture bindings onto set=0
fc6fa491e feat(buffers): add additional_textures support to InstanceNetworkBuffer
aa18cca69 quickfix(Kakshya): swap image_at function arg (currently unused)
96a58fc09 feat(Portal): add TextureLoom::create_2d_array
b076dc4bc fix(Kakshya): flush WindowContainer ring on surface resize
3b9be0e1d feat(nexus): add on_scroll wiring trigger
2f0c57f12 docs(Getting_Started): rewrite against 0.4 state
d8cad3c24 XCode is dead weight and increasingly hostile to C++. Drop it in favor of CMakePresets
0b5881d82 update examples to use new wiring signature
85e99e492 refactor(Wiring): Remove scheduler arg from Factory
4fdc95563 update examples for windows
5175e18c2 Vruta: delete copy on SoundRoutine/GraphicsRoutine; add MAYAFLUX_NOINLINE
0174f8966 fix(windows): remove MAYAFLUX_API from template classes, add to exported concrete symbol
1dd8c522e fix(audio/io): snapshot lifetime hazard and close() double-future crash
8989ee41e fix(windows): bake FFMPEG_ROOT/bin into debugger PATH and set startup project
df5742be8 fix(windows): Expose more free functions via declspec
55ccf3647 fix(windows): align FFmpeg to Gyan.FFmpeg.Shared winget package
987587a92 chore(git): make submodule non error prone
050db2956 chore: extract examples into private submodule
7a05f4cec chore(Docs): Update README.md
837543a12 docs/Digital_Architecture.md: Sync to latest changes
6c0555f51 feat(api): add bind_screenspace_preset; fix unbind iterator-after-erase bug
15c2ad8fd refactor(kinesis)!: move viewport files into Kinesis/Viewport subdirectory
434076d71 refactor(api)!: remove config parameter from bind_viewport_preset
b412d2780 feat(api): add bind_pan_zoom_preset with PanZoom2DState and PanZoom2DKeyMap
3ae3c3d04 feat(api): add bind_orbit_preset with OrbitState and OrbitKeyMap
ed246aa90 feat(api): add bind_fly_preset with remappable FlyKeyMap
1352a5790 feat(depot): add choose_video and save_image dialog-backed free functions
eddc7552a feat(depot): add choose_audio, choose_image, choose_mesh, choose_mesh_network, save_audio
b6e06334b fix(portal): percent-decode URI path from XDG portal response
5bb8067c9 docs(Portal/Forma): update Forma reference and UI patterns docs
afbd9f563 feat(Forma/Bridge): add generic bulk span sink write overload
da006c1ee feat(Forma/Geometry): add drawable_canvas geometry function and wire_canvas_drag helper
41028884b feat(Forma/Bridge): route bulk_reader through AudioWriteProcessor and DataWriteProcessor
ec78b398e feat(Forma/Bridge): add bulk_reader to ElementRecord for vector state types
6733d84d4 feat(Forma): add keyboard step adjustment for Mapped controls
43f9a4012 refactor(Forma): eliminate coordinate conversion duplication
110bfd1fe feat(Forma/Context): add keyboard focus and key event routing
604816e75 fix(Portal/Forma): track drag events beyond element bounds
d50682e5a docs(Portal/Forma): add UI patterns guide with ImGui migration reference
aa7cde7fd docs(Portal/Forma): geometry primitives reference and plot adornments
64bad04cf feat(Portal/Forma/Plot): plot adornments - labels, ticks, legend
1eb619f2d feat(forma/plot): add plot_grid, plot_cursor, FilledWaveformBuilder
7360e279a feat(forma/geometry): add vertical_fader, toggle, level_meter, crosshair GeometryFn primitives
8b62a8de6 feat(kinesis): add Geometry2D — 2D NDC shape primitives for filled and outline drawing
319b68f81 feat(Kinesis): add Scalar.hpp : scalar math utilities
309bfbf78 feat(Portal/Forma/Geometry): add stroke_slider geometry factory
46517374d feat(Portal/Forma): add on_drag to Context
d3fabc679 remove GLFW dependency on Linux; macOS retains GLFW/Cocoa backend
38e1a4017 refactor(buffers): remove TextureBuffer-specific path from DataWriteProcessor
f2a650b35 remove(Buffers): delete GeometryWriteProcessor and TextureWriteProcessor
f66ac4f89 refactor(Forma/Bridge): replace GeometryWriteProcessor with DataWriteProcessor
f7a3f9d1d refactor(Nexus/Buffers): replace GeometryWriteProcessor with DataWriteProcessor in RenderSink
b89254206 feat(Buffers): add set_pixel_data and set_render_processor to DataWriteProcessor/VKBuffer
bd1c8119b feat(Kakshya/Buffers): introduce VERTICES_3D modality with full interleaved vertex assembly
6ee820486 feat(buffers): add DataWriteProcessor
e91c9de1e docs(lila_server): mark as reference implementation
d4252b763 feat(host): expose JIT environment configuration via Runtime API
64d76c71d fix(lila): supply backend defines and magic_enum path to JIT compiler
126dee9c0 build(ide): expose shader sources in compile_shaders target for Solution Explorer visibility
94b7735a0 build: extract ide_commands.cmake for VS solution organisation and unix symlink
e2c7d7ad3 build(windows): add reconfigure target and launch.bat generation
4e32df905 build(windows): consolidate windows-base as standalone preset mixin
15c1347bd build(windows): sanitise env path separators early in compiler_config
3dd0f9bc8 build(windows): replace per-target DLL copy with shared copy_runtime_dlls target
c05c179a0 fix(Nexus): add MAYAFLUX_API to Agent, Emitter, and Sensor
62bd74f0b feat(nexus/state): complete Presence round-trip in schema v5
bd4b40fc8 feat(nexus): add Presence fn naming and FalloffCurve for state round-trip
e4d657e26 feat(nexus/state): add user_state passthrough to Tapestry encode/decode
763379d67 refactor(nexus/state): drop pre-v5 schema backwards compatibility
503a4d8a8 fix(reflect): use magic_enum::case_insensitive in string_to_enum_case_insensitive
a377279a4 feat(nexus/state): add Tapestry encode/decode and prerequisites
c1318d989 feat(nexus/state): complete Fabric round-trip coverage
2e2e15c02 feat(nexus/state): decode Agent subkind, Locus nav, and Expanses
89d0cc368 feat(nexus/state): encode Agent subkind, Locus nav, and Expanses
60a05d6c6 feat(nexus): add crossing fn name fields to Expanse
e99f2203a feat(nexus): add Expanse introspection and fn registry to Fabric
83e634eb0 feat(nexus/state): extract shared schema to State::Schema.hpp
b856041cc feat(nexus): add mouse-drag wiring overload to Wiring
5d5399e51 fix(ci): Update to arch linux
9ef1f7949 chore: vendor magic_enum as header-only third_party target
b6465675b ci(linux): Switch dev-release to arch linux instead
593e31165 ci(build): Add arch linux to eliminate manual builds
b065ad6d7 sync(Weave): remove pch include, downstream has its own
cbcea7682 update(cmake): export pch file location for downstream use
a8f88cb27 chore(cmake): Move config override option to user scope
6c910081c feat(buffers/render): topology-correct instanced rendering shaders
70d6632da refactor(nodes/graphics): remove ComputeOutNode
1863e63ac refactor(nodes/graphics): remove GpuSDFNode
43be37299 feat(nodes/network): add GPU dispatch path to MeshFieldOperator
376512a22 feat(nodes/network): add GPU dispatch path to InstanceFieldOperator
66d4d6138 feat(nodes): add GpuComputeNode async GPU dispatch node
82cc06eca feat(yantra): add async dispatch path to GpuResourceManager, GpuDispatchCore, ShaderExecutionContext
af32e2b9a feat(api): register InstanceNetwork and InstanceNetworkBuffer in public API
1e916099d feat(nodes/network): add InstanceNetwork and instanced render pipeline
897ee3546 feat(nodes/network): add InstanceNetwork slot type and field operator
18fd02d3f feat(render): add instance_count to RenderProcessor draw calls
7b5cfdfac chore(diagnostics): Various cmake and log fixes
bf5f355ab feat(nodes/network): implement CONTINUOUS exciter mode for WaveguideNetwork
abbcc49ab refactor(nodes/network): lift extract_node_samples to NodeNetwork base
b073894b7 fix(nodes/network): replace per-sample node AM with peak-ceiling model for burst exciters
6a975483f feat(nodes/network): implement CONTINUOUS exciter mode and exciter lifecycle management
7de5ec995 feat(nodes/generators): add get_frequency() virtual to Generator base
139fc9d88 feat(kinesis/discrete): add estimate_frequency from zero-crossing intervals
2b49b53c9 feat(nodes/network): wire exciter node into ModalNetwork burst and continuous paths
e0e20095f fix(msvc): Remove unnecessary warnings for CI
57f643398 chore(API): Promote ComputeMeshBuffer to public global API
3ade40a12 feat(shaders): refactor SDF field shaders into named variants with shared scaffold
5da6b7d14 feat(shaders): add domain_warp.glsl include
599e257c8 feat(shaders): add noise.glsl include with gradient noise, FBM, turbulence
8c697503a feat(buffers): GPU-field constructor for ComputeMeshBuffer and SDFMeshProcessor
5ddbb6283 feat(buffers,shaders): add SDFFieldProcessor and GPU SDF field shaders
27486af39 feat(buffers): add SdfPrepProcessor for GPU-field marching cubes chain
b19e4cbc5 fix(shaderc): implement #include directive support via FileIncluder
7715e2178 feat(Buffers): add ComputeMeshBuffer
6b7080e08 feat(Buffers): add SDFMeshProcessor
af344c89a feat(Buffers): add Usage::HOST_STORAGE to VKBuffer
356093a59 fix(Yantra): build pipeline layout from GpuBufferBinding declarations
5a7d9ffb2 perf(Yantra): persistent mapped memory in GpuResourceManager
7e37db656 perf(Nodes): skip auto-readback for vertex buffer in GpuSDFNode
fcf7a3b72 fix(Kinesis): correct NEON vcltq_f32 cast in compute_cube_index
c976f7505 feat(Nodes): GpuSDFNode single-pass atomic marching cubes
166ba11aa feat(Nodes): add GpuSDFNode with GPU marching cubes via ShaderExecutionContext
6c7615173 fix(Yantra): use explicit binding layout in GpuResourceManager::initialise
9710058a8 perf(Kinesis): optimize marching cubes normal generation
11d85ad13 chore(API): Add schedule_task overload for freeroutine
9eed6353e perf(Kinesis): optimize generate_sdf_mesh inner loop
8edea3b8f refactor(Buffers): cascade apply_render_config across all VKBuffer children
b401bc4eb refactor(Buffers): promote apply_render_config and m_render_processor to VKBuffer
0a024b256 feat(Nodes::GpuSync): add GeometryReadbackNode
520b4e644 refactor(Buffers::Staging): replace vk:: format checks with Kakshya modality
5e18fca1b feat(Buffers::Staging): abstract vk:: buffer copies behind BufferService slots
b0b59f10b feat(Buffers::Staging): add download_from_gpu_async
0261903e1 feat(Nodes::GpuSync): add SDFNode
aee379ce8 feat(Buffers): MeshBuffer node constructor path
37ec9548d feat(Kinesis): add generate_sdf_mesh marching cubes isosurface extractor
7f3634e0e feat(Nodes::GpuSync): add GlyphGeometryNode
b93f69f7b feat(Portal::Text): add GlyphOutline vector decomposition path
3e6f30d14 chore(Audio): remove RtAudio dependency on macOS
4d8b94288 feat(CoreAudio): decouple output and input into separate HAL units
67d6d799e feat(CoreAudio): register native macOS backend as platform default
f9fe69f38 feat(CoreAudio): add native input capture support
5e733739e feat(CoreAudio): establish native output backend baseline
88ca64324 refactor(Core): replace RtMidi with native CoreMIDI backend on macOS
191b43217 fix(CoreMIDI): eliminate refresh deadlock and unify port cleanup
835efc413 feat(CoreMIDI): replace RtMidi backend on macOS
63badeca7 fix(windows): Resolve journal write path
c19f9078d fix(windows): undef CALLBACK macro from Windows SDK before Region.hpp namespace
16c1456d4 feat(launcher): --config-override flag and MAYAFLUX_CONFIG_OVERRIDE compile define
01fa6ee03 feat(config): JSON journal config with severity, sinks, and component/context filters
4efd12098 feat(config): JSON file loading for engine config structs
9e31655ce fix(nodes): fix LineSegmentsNode constructor buffer init corruption
e6a6a550f feat(kriya): add mouse_dragged event / on_mouse_drag API
c14ee833c refactor(nodes): remove PointNode in favour of PointCollectionNode
7ea7e72ff feat(nodes): add PathOperator::add_node for external subtype injection
6dfdae63a feat(nodes): add LineSegmentsNode for discrete LINE_LIST geometry
defea55c6 feat(Vruta): add CONDITIONAL domain to TaskScheduler
55e38de9a feat(Vruta): add conditional_promise and FreeRoutine
282127574 feat(Vruta): add CONDITIONAL ProcessingToken and ConditionAwaiter
a1c05d95f feat(core/backends): add NSBackend - NSOpenPanel/NSSavePanel via AppKit
402dd9483 feat(core/backends): add COMBackend : IFileOpenDialog/IFileSaveDialog via Shell COM
08055aa74 feat(portal): add Portal::System with DBusBackend lifecycle
7a59180de feat(portal/system): add Dialog::Chooser with open_file and save_file
c94355973 feat(core/backends): add DBusBackend - XDG Desktop Portal file chooser via libdbus-1
1c71f36ca feat(core/backends): add ISystemBackend abstract interface for OS service backends
ceb88d6ba chore(deps): add dbus-1 to Linux build, CI, and packaging
1f2996d77 feat(IO): IOManager video capture getters
2588555d1 feat(IO): IOManager video write infrastructure; capture_window
53d5cd610 feat(IO): VideoEncodeContext dimension-aware encode; add VideoFileWriter
57a884c69 feat(IO): add VideoEncodeContext
e74207c49 feat(kriya): add window_frame_tick and WindowFrame broadcast source
b0d5e7ab3 fix(graphics): pass buf by copy into last_frame store on Linux
12a2f87fa feat(Kakshya): extend WindowContainer to hold N rendered frames
43f8b8866 feat(Graphics): add macOS-compatible lock-free capture state ownership
f7c7efbb1 refactor(graphics): extract ensure_capture_state from capture_frame
3340b50e8 fix(graphics): guard capture cleanup and observer unregister robustness
21f4d2fa4 feat(display): per-window frame observers on the readback thread
0cbf48b26 feat(window): add per-window capture toggle, default off
f5af1562d refactor(surface): crop readback_region from cached frame instead of GPU copy
a7e76ae67 feat(display): expose last captured frame via DisplayService::get_last_frame
2c95e5940 feat(vulkan): async per-window frame readback off the graphics thread
c9bf982b1 fix(vulkan): add eTransferSrc to swapchain usage when surface supports it
d349eed76 feat(Nexus): add ProcessingToken to Wiring::every and for_duration
5caaaf466 refactor(Kriya): drop scheduler parameter from line, Gate, Trigger, Toggle
405388c69 refactor(Kriya): metro drops scheduler parameter, gains ProcessingToken
492bea914 refactor(Kriya): sequence drops scheduler parameter, gains ProcessingToken
125d3b173 refactor(Kriya): pattern drops scheduler parameter, gains ProcessingToken
22aca6c5b feat(Vruta): add global rate state to ChronUtils
7293aa56f refactor(Chronie): remove create_ intermediates
3e011d51e feat(Kriya): add ProcessingToken to EventChain
3b70c49c1 feat(Kriya): add ProcessingToken to Timer, TimedAction, TemporalActivation
d03a9badb fix(Nexus): Add Expanse.cpp missed in the last merge
eac72d5e3 feat(nexus): Expanse becomes multi-Fabric registry; Tapestry owns world-level Expanses
9e6ffd060 feat(nexus): Agent supports multiple influence targets
44ac2b092 feat(Kinesis): add tube extrusion and surface-of-revolution generators
1520b2fa5 docs: add ViewTransform spatial placement guide
4c508a29c feat(kinesis): add generate_grid and generate_parametric_surface
2ec08311f refactor(kinesis): replace BoxGeometry with MeshData in generate_box
37da42bdc feat(nodes): add MeshWriterNode::set_mesh(MeshData) overload
913b0c654 feat(kinesis): AABB3D struct and Morphology.hpp geometric moment functions
e40417196 feat(Vruta): pump MULTI_RATE list from both clock contexts
be75aeb90 docs(Vruta): add field-level doxygen to cross_promise
f67fa535d fix(Vruta): CrossRoutine both-armed resume requires all clocks satisfied
035c0b51b feat(Vruta): register external clock for token domain
5f584fd40 feat(vruta): implement CrossRoutine class and gate
96f3241c4 feat(vruta): implement CrossRoutine, the dual-clock coroutine
33330002e feat(kinesis): add generate_box solid mesh primitive
047dccefa feat(GeometryBuffer): runtime texture binding via Forma deferred-bind model
27ab50f26 fix(graphics): propagate depth format to secondary command buffers
7f2a936d5 fix(shaders): bind mesh_textured_lit Influence UBO at set=1 binding=0
503525230 fix(Kakshya): add uv field to Vertex for true 60-byte universal layout
3296714d7 chore(update): Reflect example docs with new API simplifications
84d74b81f chore(headers): remove unnecessary includes (various)
8c9f660b7 feat(Portal/Forma): add texture and text binding to Element
f80c85934 feat(Buffers/Forma): defer submit and set_texture before setup_processors
ee376b0ef refactor(forma): use filled_rect in horizontal_fader geometry function
ebdccb704 feat(kinesis): add filled_rect, textured_rect, cuboid_wireframe to GeometryPrimitives
782a2aabe feat(kakshya): add VertexLayout::for_raw and vertex_layout_for<Vertex> branch
c9fd79c96 refactor(kinesis): apply_* color functions return Kakshya::Vertex
3ad38348f refactor(kakshya): introduce Vertex as type-neutral geometry substrate
b76c26088 docs(Forma): UI elements and Plotting
c23e82f00 chore(docs): Add basic text rendering documentation
40b46b691 fix(windows): Expose more internal namesapce functions
855af7512 refactor(forma): remove capacity from public create_element Surface overload
529ac2176 refactor(forma): remove capacity from public create_buffer API
f82c7ac48 feat(forma): add topology-only FormaBuffer constructor
000f1bced refactor(forma): reorder create_element params: topology before capacity
65e63dbdc feat(forma): add write_verts single-vertex overload and Geometry::point
269493031 feat(forma): add vertex-deducing create_buffer overloads
6eaf35952 feat(GraphicsOperator, PhysicsOperator): force_internal_dt flag and upstream seeding
611bc5825 feat(GraphicsOperator, OperatorChain, FieldOperator, NetworkGeometryProcessor, PointCloudNetwork): rendering participation flag and upstream seeding
17dbcfb62 feat(NetworkGeometryProcessor): operator chain rendering support
f288ead27 feat(NetworkGeometryBuffer): operator chain rendering support
b678edc54 refactor(PointCloudNetwork): delegate vertex state to operators, add chain processing
53c07251f fix(IO): anchor relative write paths to SOURCE_DIR
55272b42d feat(IO): add audio write orchestration to IOManager
a2dbbe689 refactor(IO): pass GlobalStreamInfo by ref to IOManager
7b4399a1a feat(IO): add SoundFileWriter
a1824edf3 feat(IO): add AudioEncodeContext
635036da4 feat(IO): add FFmpegMuxContext
2257b0683 fix(nexus): key held flag, WindowEventTrigger variant, on() overload cleanup
f27d04bdf fix(wasapi): decouple engine buffer size from WASAPI hardware buffer size
7fb808ce0 fix(windowing/win32): resolve numpad identity inversion under NumLock
979e295da fix(io): resolve_path in SoundFileReader::can_read and ImageReader static paths
936a73411 fix(Windows): add MAYAFLUX_API to Kinesis and Nexus free functions
70e2452fd refactor(windowing): replace magic repeat numbers with KeyRepeatConfig
23210d5ba feat(win32): implement client-side key repeat in poll()
42b6edd38 fix(win32): emit KEY_REPEAT instead of KEY_PRESSED for held keys
69b5b2f3c feat(nexus): Wiring KeyTrigger uses key_held when on_release is present
eda264bbf feat(kriya): add key_held event coroutine
0a5352d6d feat(wayland): implement client-side key repeat via timerfd
393fb3d36 feat(Kinesis): add eye_constraint hook to NavigationState
e2c49b5f7 feat(Kinesis): add ray_at_depth and 3D spatial predicates
f8d3cefd3 feat(nexus): extend Wiring::on(button) with optional release callback
b632bd779 feat(nexus): extend Wiring::on(key) with optional release callback
18a215c6e fix(nexus): Locus uses advance_navigation + build_view_transform in invoke_perception
c6a8ebe4a refactor(kinesis): split compute_view_transform into advance_navigation + build_view_transform
bff619d98 feat(nexus): add Expanse and integrate crossing detection into Fabric
2f67e5333 feat(nexus): add Presence Agent specialisation
b125ba40c feat(nexus): add Locus Agent specialisation
b306956ec feat(linux): add MAYAFLUX_LINUX_USE_GLFW option to restore GLFW backend
cd1553217 build(linux): add wayland-protocols and xkbcommon to all packaging
c67239c2f fix(windowing/wayland): defer wl_display_disconnect to destructor
53e845daf build(linux): install Wayland protocol headers and expose link deps in config
d9a49cc8a fix(windowing/wayland): correct key mapping, scroll direction and scale
b4cafd5e1 feat(linux): switch default windowing backend to native Wayland
3b74e29c6 feat(vulkan,windowing): wire Wayland backend into VKContext and WindowManager
1b476cd3a feat(windowing/linux): add WaylandWindow native backend
e5de10e07 feat(windowing/linux): add xkb key mapping for native Wayland backend
6ffbb9c65 build(linux): add Wayland native backend build infrastructure
133c03398 fix(platform): Guard Win32 Key mapping with preprocessor directives
12e315487 refactor(windowing/win32): remove Win32 message pump infrastructure
39680308e refactor(windowing/win32): remove GLFW dependency from Windows builds
0097718a9 refactor(cmake/win32): make GLFW dependency conditional on GLFW_BACKEND
f7049f728 feat(cmake): enable Win32 native windowing backend on Windows
bdbd918d2 feat(windowing/win32): wire Win32Window into WindowManager and VKContext
51b0466e0 feat(windowing/win32): native Win32 window backend with lock-free event queue
a616b83fa refactor(windowing): gate Win32 message pump behind WIN32_MESSAGE_PUMP
4e442578e refactor(windowing): gate GLFW behind GLFW_BACKEND, add WIN32_BACKEND default on Windows
8c5a8978b feat(windowing/win32): add to_win32_key() and is_valid_win32_key()
28f9b1a77 refactor(windowing): replace SDL/NATIVE with WINDOWS/WAYLAND in WindowingBackend
efb71f320 feat(windowing): add Window::poll() virtual with no-op default
d78e0d58a refactor!(filters): remove string-based shift configuration
24a11558b update(windows): Try msvc 18/19
138b42b1b refactor(nexus): reorganise into Principals/, Pheme/, and State/
457300f49 refactor(buffers,io): update Nodes:: vertex type references to Kakshya::
9de4e8f96 refactor(kakshya): move vertex format structs to Kakshya::VertexFormats
3f6564bcc fix(kriya): gate TRANSFORM write-back to capture buffer
d5d3511f6 fix(ubuntu): make miniz and tinyexr PIC
6c9dd66e5 fix(windows,rpath): isolate dev builds from installed MayaFlux
adabbcab7 fix(kakshya): centralise RegionGroup include in SignalSourceContainer
8253b73b7 `feat(Forma): add inspect free functions for per-element and manager-level introspection`
c79ec43eb refactor(Bridge): make spawn_sync public
d147e6ce0 feat(Inspect): add destroy() to release persistent or per-element InspectResults
4ceaf66ff feat(Inspect): make manager inspect methods persistent via static optional members
5013ac712 feat(forma): add Forma::plot() automation entry point
f6a1fb043 feat(forma/plot): add optional background to Series and SeriesSpec
3791ff862 feat(forma): add WindowManager to Forma::initialize()
84118a277 refactor(forma/plot): reorganise Plot/ namespace structure
56b1fcf34 feat(forma/plot): add PlotSource builder for container construction
8682d364e refactor(kakshya/plot): unify bind_* overloads to bind() on PlotContainer
a1d516279 feat(forma/plot): bypass version gate for live plot elements
32d076c68 feat(Plot): add place() free function for plot element construction
f0882b9a8 feat(Plot): introduce SeriesSpec as terminal return type for SeriesBuilder
6490f8def refactor(Forma): collapse Layer+Context+Window into Surface across Inspect
ce77d4671 feat(forma): Surface factory and Surface-taking create_element overload
b7a7b7cd4 feat(forma): introduce Surface: named owner of (Window, Layer, Context)
60ddc1415 feat(kinesis,api): ndc_size_to_pixels for converting NDC extents to pixel dimensions
910dd85e8 feat(inspect): add EventManager and Event inspection
fc0762252 refactor(inspect): restructure NodeGraphManager tree via RootNode
934ae0987 refactor(Forma): move row_pixel_dims to QueryUtils as free function
870ff6981 refactor(Forma): decouple Inspect layer from Forma module globals
67c642efe refactor(Forma): Collapsible fluent API, drop Bridge sync loop
aa09681fc refactor(forma/plot): remove waveform/scatter/bars free functions, drop VertexSpec
788587ddc feat(forma/plot): SeriesBuilder with fluent axis/color configuration
32c0450a0 refactor(forma/plot): extract AxisRange into its own header
a99e44195 feat(forma): Bridge::Binding handle and rename get_bridge to bridge
ddeede087 feat(forma): Layer::add returns Slot for chained post-registration mutations
84fee9a44 feat(forma): fluent setters on Element
5eb087d84 feat(forma): improve vertex write ergonomics for FormaBuffer and GeometryFn
0e910983f chore(windows): Bump llvm version to 22.1.6
f7bdd97bf fix(launchpad): override install prefix for preset
1980d07d9 fix(ci): Store preset in env var
f837f84b3 build(windows): rename LLVM env vars to LLVM_DEV_DIR/Clang_DEV_DIR
4bb3d2c03 build: migrate to CMakePresets.json, add MAYAFLUX_BUILD_PROJECT option
9f440de89 fix(ci/linux): add alsa-lib-devel to Fedora and Ubuntu package lists
320743e82 build: remove RtAudio dependency from Windows and Linux
9fb845576 feat(audio/windows): replace RtAudio with native WASAPI backend
6aaaf55c0 build: integrate ccache with PCH sloppiness across all build paths
cdefae5b1 build: optimize MSVC build performance for CI and local environments
b0daf32f6 chore(deps): remove RtMidi from Linux and Windows, scope to macOS only
911398bd0 feat(input): add WinMM MIDI backend for Windows
be9a08ede build(midi): gate RtMidiBackend behind RTAUDIO_BACKEND, scope RtMidi link to non-PipeWire
f9b3dedd4 feat(input): add PipeWire/ALSA native MIDI backend, replace RtMidi on Linux
df03344bc refactor(input): rename MIDIBackend to RtMidiBackend, introduce platform dispatch alias
b289b14d4 feat(API): convenience functions for multi-component/context filtering
33dc55b7c feat(Journal): context filtering to journal system
7d76e03db feat(Journal): MF_PRINT macro for quick formatted output
14bb7006d Rename MF_PRINT to MF_LOG for semantic clarity
d27af9908 feat(Kriya): add audio_output_tick() BroadcastSource factory
ee74d3f29 feat(Kakshya): add AudioOutputContainer and AudioOutputAccessProcessor
0191a8beb chore(API): Promote BroadcastEvents to global API
7c053bd5b feat(Kriya): add BroadcastEvents: coroutine factory patterns for BroadcastSource<T>
1d0945df9 feat(AudioSubsystem): notify thread, snapshot atomics, AudioBackendService
334418885 feat(Registry): add AudioBackendService
9b4adae22 feat(Vruta): add BroadcastSource<T> and BroadcastAwaiter<T>
ff69b79de refactor(Vruta,Kriya): NetworkSource and NetworkAwaiter derive from EventSource/EventAwaiter
7059c8d20 refactor(Vruta,Kriya,Nexus): introduce EventSource/EventAwaiter/EventFilter base hierarchy
2489fdd59 build(cmake): fix minimum version for Linux distros, explain Windows local speedup
13b3d94a9 fix(ci): Install latest cmake on all runners
3c8285d72 build(cmake): disable module scanning, drop macOS 14 workarounds, set deployment target
5c62cff7b build(cmake): modernize Windows build infrastructure
e6737b2df fix(reflect): make compiler detection exclusive and guard cxxabi.h from Windows JIT
a157ce119 refactor(journal): migrate legacy std stream and throw paths to Journal across core runtime code
632b05081 fix(Core): guarantee all subsystems are live before start_all_subsystems returns
ce3cc74bc feat(Forma/Inspector): add scheduler() and tasks(token) queries
fb2e83a1f feat(Vruta/Scheduler): expose get_all_tasks() for inspection
43ea54db6 feat(Forma/Inspector): add buffer, root buffer, and buffer_manager queries
a0877ea43 feat(Buffers/BufferManager): expose input buffer count and per-channel access
f4ae1ddcc feat(Forma/Inspector): add node, node_network, and node_graph_manager queries
5bb518b13 fix(Portal::Forma): recurse into nested relations in Layer::set_visible
e04fe02f8 fix(Portal::Text): correct VKImage press/repress clipping at sub-line-height render bounds
11afa0c6d Portal::Forma::Inspect: fold NodeQuery into Inspector, rename get_inspector
689d3914a Portal::Forma::Inspect: rewrite NodeQuery on ValueGroup, drop bm arg
a96467fc6 Portal::Forma::Inspect: add QueryUtils with ValueSpec/Row/Group
21aa33823 Portal::Forma::Collapsible: snapshot cursor position at construction
57ab3121f Portal::Forma: gate render via mark_for_processing, sync visibility on relate
ed55fe1d1 forma/collapsible: fix geometry position, element id, label support, and toggle
b94d09737 text/inkpress: pass deferred=true in repress(VKImage) staging upload path
456d4991f vk/backend: overload upload_image_data with staging + deferred flag, drop _with_staging suffix
e0821feaa vk/backend: implement record_deferred_commands via semaphore-signalled pre-frame submission
b2200e036 feat(Forma): introduce Inspector subsystem and get_inspector()
34a602045 feat(Forma/Inspect): InspectResult, NodeQuery rewritten for VKImage path
84a432772 wip(Forma): multi-texture FormaBuffer, VKImage InkPress overloads
5731b452f feat(Portal::Forma): add create_buffer overload accepting additional_textures
d6a3bbe41 feat(Forma): multi-texture array path via vertex weight selector
c46855813 feat(Portal::Text): add VKImage overloads for press/repress
8ab68476b feat(forma): add Link, LayoutCursor, and Collapsible primitives
95472beac refactor(memory): delegate LiveArena live_type_name to Reflect::short_type_name
000ca7fef feat(reflect): add TypeInfo.hpp with compile-time and runtime type name utilities
e5f44d604 chore(API): Add graphics task scheduling wrapper
2a012c655 fix(windows): LLVM 22, relocatable artifact layout, clean JIT flags
2911309e3 Quick test ci for new windows workflow features
c05a85d19 ci(docs): Switch from push to cron
6e5afb40e fix(windows): Assign atomic dirty flag instead of initialization
5a0b551ae feat(forma): add Portal::Forma::Plot : geometry functions for PlotContainer
2a3098ac2 fix(forma): support non-scalar T in Bridge::register_element and create_element
4b9b5978c refactor(kakshya): remove redundant members from PlotContainer
0426e7f18 feat(kakshya): add PlotContainer and PlotProcessor for N-series scalar data
449d9c01b add permissions to copr ci
f56908461 ci(dev_release): Switch to nightly instead of on commit
49cacc9df feat(nexus): expose raw cursor position through InfluenceContext
f5feb034c introspect(io): expose video, camera, audio, image, and model readers on IOManager
0713c32c5 introspect(core): add InputManager::get_nodes()
297b83b01 introspect(vruta): implement get_all_events and add get_task_names(token) overload
177c50155 feat(buffers): add get_preprocessor/postprocessor/final_processor accessors to BufferProcessingChain
7fae3f97e refactor(nodes): consolidate NodeGraphManager network/node accessors
b6790d7de feat(nodes): expose RootNode::nodes() const accessor for introspection
37d4ef65d feat(nodes): add ModulatorRole, ModulatorTree, and get_modulators() introspection API
9710a6dd4 refactor(nodes): drop type_id string from NodeContext; migrate as<T>() to dynamic_cast
788714bc0 refactor(nodes): migrate InputNode callbacks to TypedHook<InputContext>
cb264bfa3 refactor(nodes): migrate remaining node classes to typed callback surfaces
069b47f96 refactor(nodes): migrate Logic callbacks to TypedHook<LogicContext>
50452f8d7 refactor(nodes): lift notify_tick to Generator; add typed on_tick/on_tick_if overloads
f8ec2526a refactor(nodes): drop printGraph/printCurrent from Generator hierarchy
cac859711 refactor(nodes): replace string registry with unordered_set in NodeGraphManager
5be9b1e82 fix(pipewire): remove pw_stream_set_active from stop/pause/close paths
306c0c643 refactor(core): stop subsystems in parallel to prevent sequential hang
3dc286042 fix(pipewire): set node.description and app process properties for session visibility
56debb90b update validated funding.json
32fa51743 feat(cmake): Allow forcing RTAUDIO backend on Linux
96b5b3800 chore(github): Add funding yml file
07c8db38a chore: add funding.json manifest for FLOSS/fund
0a128bd7b fix(vruta): make TaskScheduler task registration RT-safe via pending op queue
def30207a fix: operator token release, ResonatorNetwork output mode, shadow buffer
e9fa5df9d fix(cmake): remove double prefix in miniz search path
984ed642c fix(cmake): resolve relative CMAKE_INSTALL_LIBDIR for non-Fedora installs
869117cc4 fix(operators): add shutdown guard to access token spin in PathOperator, TopologyOperator, PhysicsOperator
9725288e2 feat(operators): atomic access token for collection mutation in PathOperator, TopologyOperator, PhysicsOperator
ceb380037 feat(nodes): expose samples_per_segment, max_control_points and tension on add_path
df4a15996 fix(nodes): set aggregate vertex_count on get_vertex_layout for collection operators
fc1bb5b9c fix(nexus): capture Fabric by ref and entity id by value in MouseTrigger lambda
ae34636da feat(nodes): extend set_samples_per_segment to TopologyOperator
4a1f719f0 feat(nodes): add get_path and get_topology accessors on operator collections
fd2545890 feat(buffers): register CompositeGeometryBuffer in proxy registry and public header
07852bdd2 refactor(api): unify Temporal channel binding with DomainSpec
1bb667355 update README.md
8c1e8b287 fix(fedora): Correct postscript prompt for mayaflux-dev
9aa1efe8e fix(ubuntu): Manually configure INSTALL_LIBDIR
d7115a3c7 fix(cmake): anchor miniz search path to PACKAGE_PREFIX_DIR
112911625 fix(cmake): use GNUInstallDirs for lib directory resolution
1b17a3654 feat(logo): Initial design of logo for reference
2902f1c04 fix(engine): robust shutdown gate for Linux across terminal and headless contexts
b876a682e fix(windowing): resolve GLFW platform hint before applying in configure()
4041e6f8f fix(build): Remove duplicate AudioBackendFactory definition
aaf42611e build: backend-aware audio dependency and config resolution
f72c15986 feat(packaging/fedora): PipeWire RT scheduling setup
e87e27c8c feat(packaging/ubuntu): PipeWire RT scheduling setup
c25478fa8 feat(audio/pipewire): backend_options passthrough
cc3a2145d feat(audio): pause/resume on AudioStream interface
8d3b61487 feat(audio/pipewire): device_name resolution and pw_time exposure
51cab6abd feat(audio/pipewire): xrun detection and rate match quantum
2d53b0538 feat(audio): PipeWire native backend
b7eb72da9 feat(audio): PipeWire backend scaffolding
6d7b2ec86 fix(macos): explicit types for min/max
c57ccd386 feat(engine/forma): promote Forma to engine lifecycle and global header
272e70173 feat(forma): require target buffer on Bridge::write descriptor overload
ba60d2b7b fix(FormaBindingsProcessor): Update descriptor mappings
e044ae916 fix(FormaBindingsProcessor):
678fa92ea fix(Forma):
5622bcc7a feat(portal/forma): own sync loop in Bridge, reduce create_element boilerplate
8592b7d25 feat(portal/forma): construct Bridge in initialize(), expose via get_bridge()
b04271535 refactor(forma/bridge): replace get_id void* cast with direct state->id access
1412aed34 feat(portal/forma): add initialize() lifecycle matching Portal::Text and Portal::Graphics
cb8b9936b Forma/Bridge: introduce binding orchestrator with direct state id resolution
2d9947313 Forma/Bridge prep: add raw reader bindings and inline state id lookup
ddb74136c feat(forma): add Forma factory free functions
f9a783134 feat(forma): add FormaBindingsProcessor
007a3ba6e feat(forma): element relations on Layer
37fdcc980 feat(forma): textured triangle variant for FormaBuffer
23cbd8ccc feat(forma): texture binding on FormaBuffer via FormaProcessor
88206205d feat(forma): FormaProcessor as default processor for FormaBuffer
885cc4838 feat(forma): add FormaBuffer : 2D screen-space VKBuffer subclass
bb9c8196e feat(forma): add Primitives - Mapped value carrier and Geometry helpers
b4cf42e97 feat(forma): add Portal::Forma Context
15e89fcdc feat(forma): add Portal::Forma Layer and Element
d26813227 feat(kinesis): add Bounds.hpp - AABB2D and 2D containment callables
80072c179 fix(ci): Dont cache nlohmann-json with homebrew
cd6549f30 refactor: separate engine configuration state from runtime state
dfe276984 fix(MeshNetworkBuffer): move per-slot texture bindings from binding=2 to binding=3
70cc1919f fix(MeshNetworkProcessor): ensure slot sort order before first GPU upload in on_attach
cf90af26d update(JSONSerializer): use FileReader::resolve_path to help windows discovery
316793a6d chore(deps): add json to all builds and scripts
84f591725 feat(nexus): Layer 0 and Layer 2 EXR rows in StateEncoder
0a1f74124 feat(nexus): encode audio and render sinks in StateEncoder
6293225b7 fix(Nexus): replace manual nlohmann::json with reflective JSONSerializer
5f41b1886 feat(nexus): reconstruction mode in StateDecoder —> every/move_to/commit_driven
33c77497d refactor(Wiring): Ensure named callable registration occurs before early returns in Wiring::finalise
02ebf23b8 feat(nexus): add per-Fabric function registry with auto-registration at finalise()
39faeff33 feat(nexus): v1 state round-trip — all three Kinds, schema v2, multi-row EXR
afc00b444 refactor(nexus): replace hand-rolled schema with JSONSerializer
08ac0d92c build(io): add nlohmann/json and introduce JSONSerializer
ece94b543 feat(nexus): add StateDecoder v0 for Emitter state round-trip
5ab79626d feat(nexus): add StateEncoder v0 for Emitter state round-trip
2ce4047dd feat(nexus): add optional name field to Fabric propagated by Tapestry
4f03e4596 fix(fedora/copr): add miniz build deps
471239ce2 fix(packaging): Add mayaflux host lib to fedora spec file
2ed6ffdfc feat(nexus): add Tapestry owning collection of Fabrics
55d5b1cd9 feat(nexus): add Fabric introspection API for entity enumeration
4e0c64f12 feat(nexus): expose sink vectors for introspection
95285c910 feat(nexus): add optional name fields to Wiring callables
7befa8c59 feat(nexus): add optional name fields to AudioSink and RenderSink producers
dbe538aa8 feat(nexus): add optional name fields to Emitter, Sensor, Agent callables
cfccd69b2 feat(nexus): preserve Wiring configuration in Registration for introspection
7253f209e quickfix(API): Add exr support check in Depot
1218ae9a7 feat(io): EXR read support via tinyexr
0a37f0267 feat(kakshya): widen TextureContainer storage to uint8/uint16/float variants
63fceda35 feat(portal,service): non-queue-blocking image download via fenced submit
0274d076d fix(deps): Remove misleading double tinyexr inclusion
d1d2e9931 build(tinyexr): vendor tinyexr, replace all package manager dependencies
af8a170c3 chore(vendor): add tinyexr vendor script and vendored sources
ef6d43ee1 propagate tinyexr dependency to all builders/setup scripts
61105d76d feat(io): add EXRWriter backed by tinyexr
8d244fe46 chore(deps): Add tinyexr dependency
ad02a37ae feat(io): async save_image on IOManager with one verb, overload set
87d8fa88a feat(io): add STBImageWriter for PNG, JPG, BMP, TGA, HDR
88956e125 feat(io): add GPU image export helpers (download + save)
6053a8fce feat(portal): complete ImageFormat <-> vk::Format bidirectional mapping
7a52c1e5f feat(io): add ImageWriter base and ImageWriterRegistry
9dde18c3a feat(io): widen ImageData pixels to variant over uint8/uint16/float
1764b989a refactor(Portal): move FontDiscovery from Transitive into Portal::Text
889e7436e refactor(pch): Host, Transitive and Lila switch to pch_minimal.h
21817c272 refactor(pch): Create scoped pch files
7a5909ad4 fix(Transitive): exclude LiveArena.cpp from Transitive_MT to prevent duplicate globals
f96631163 fix(LiveArena): route live_cast through exported impl to fix Windows JIT symbol resolution
9e2d719f3 fix(Lila): stabilise Windows JIT eval task dispatch
c9592632b fix(host): resolve Windows CRT mismatch between MayaFluxHost and Lila
179136819 feat(host): add MayaFlux::MayaFluxHost and MayaFlux::Lila to CMake package config
6a361199c refactor(host): extract MayaFluxHost as independent shared library
41bd779fb feat(transitive): integrate live arena into Persist
7e208fb68 feat(transitive): auto-expose Creator objects to live arena
a8e77c9a8 feat(transitive): POC live arena for JIT instance access
296c69713 feat(Host): add MayaFlux::Host::attach_lila for in-process JIT attachment
93c8713cd feat(Lila): add skip_host_library_load parameter to initialize
944104fd0 fix(Transitive): link glm::glm publicly on Unix for PCH include resolution
b54120182 fix(Config): remove Lila exported target and Fontconfig from MayaFluxLib public deps
00824b8ea fix(Windows): resolve dllimport/dllexport inconsistency across Transitive_MT and Lila
53a50dff8 refactor(Platform): generalize format_library_name with LibraryType, update find_dep_library for shared libs
387a3aa9b fix(Lila): replace MayaFluxLib static load with LoadDynamicLibrary via install prefix
09754b340 refactor(Platform): add INSTALL_PREFIX to Config, rename find_library to find_dep_library
e3853dd33 fix(Windows): split Transitive into MD/MT OBJECT targets for CRT compatibility
1136e693d refactor(Transitive): promote to standalone OBJECT library
fa1a81abb fix(Lila): inject FreeType include path into JIT compiler flags
ba7f2961b refactor(API): remove CreationProxy, PendingChannel, and Domain operator| overloads (0.3.1)
d0cb61c97 bump(version): Kick off 0.4.0-dev