Ivyware Platforms Windows · Linux C++ · C · Java · .NET · PowerShell · PHP · JavaScript Melbourne, AU
Ivyware

Ivyware/Platforms

Platforms & languages

Runs where
you run.

One source tree builds the kernel and the store on Windows and Linux, with I/O completion ports and io_uring behind a single interface. One flat C ABI, one macro-free facade and one COM server put a hub within reach of C++, C, Java, C#, PowerShell, VBScript, VBA and anything else that can create an object. Hub peers written in Java, PHP and browser JavaScript join the same address space over WebSocket.

And a store written on one operating system loads on the other with no conversion, because the image is byte-identical. That claim has a hash.

2Operating systems, one tree
9Languages with a working harness
282Flat C entry points, each with a UTF-8 twin
1Store image, identical on both platforms
0JNI or jextract in the Java binding

Every runtime

How each one gets in

Each card names the route and what has been verified on it. Nothing here is a plan: every entry has an example tree that exits with the number of failed checks, and the number is zero.

WinWindowsx64 and Win32. Visual Studio 2022, C++17 and later. I/O completion ports, Windows CNG crypto, services with event-log diagnostics.Reference build
LinuxLinux x86-64GCC 15 or Clang through CMake. One io_uring ring per pump thread, OpenSSL 3, AF_UNIX for pipes, systemd units with sd_notify. Sanitizer builds are part of the gate.Port, tested not assumed
C++C++The kernel classes for code built with the same toolset, or the macro-free facade: one header, one import library, lambdas for handlers.TargetFacade · MsgFacade
CCA flat extern "C" ABI over the store with 282 entry points, each paired with a UTF-8 twin so a caller never reasons about the host's wchar_t width.Msgcore_c.h
JavaJavaPure Panama FFI over the facade vtables on JDK 22 and later, no JNI, no jextract, no generated header. Plus a native Java port of the hub, with the same routing rules and golden vectors.java.lang.foreign · com.p2peerhub
C#.NETThe COM layer with a 99-line hand-written interop file, no TlbImp. Events on the connection point, HRESULTs as exceptions. Verified on .NET Framework 4.8, x64.TargetCom · MsgcoreCom
PSPowerShellLate-bound through the registered coclass: New-Object -ComObject and everything after it is by name. No compiler, no header, no interop assembly.IDispatch
VBSVBScript · VBA · ExcelCreateObject from the oldest scripting host there is. If it works under cscript it works from VBA, an Excel macro and a WSH logon script, so that is what is tested.IDispatch
PHPPHPA hub peer as a Composer package, PHP 8.1 and later, with a daemon, a systemd unit, an FPM drop-in and an optional C++ extension. Six CI cells across Windows and Ubuntu.P2PeerHub_Php
JSJavaScript in the browserA hub peer inside a page, speaking the frame codec over a WebSocket. The codec's golden vectors round-trip byte-identical against the Java side, both directions.P2PeerHub_Js
PyPythonChartboard embeds Python 3.11 as a hub of its own: advisor, modelling and scanner scripts talk to the chart engine and the datastore over the kernel.Chartboard
COMAny automation hostDual interfaces, so early-bound clients get a vtable and late-bound ones get IDispatch. ISupportErrorInfo means every refusal comes with a sentence.TargetCom.P2PNetwork · MsgcoreCom.MsgStore

One image, two operating systems

The claim with a hash

A Msgcore store is one contiguous, offset-addressed heap, and the strings inside it are pinned to UTF-16 code units regardless of what the host calls wchar_t. So a store written by the Windows build and one written by the Linux build from the same program are not merely compatible. They are the same bytes.

Golden test

Identical, byte for byte

The cross-platform golden test writes the same store under MSVC x64 and under GCC 15 on Linux and compares the files. Same length, zero differing bytes, same SHA-256. It runs clean under AddressSanitizer and UndefinedBehaviorSanitizer on the production shared object.

Width

UTF-16 in the image, UTF-8 at the edge

Every wide-character entry point has a UTF-8 twin. Inside the image the string width does not move; at the API boundary a caller picks whichever encoding its language already speaks. Astral characters survive the round trip as surrogate pairs on both platforms.

Sentinel

Recognised, not misread

An endian sentinel travels with every image and doubles as its layout generation. A store from a different byte order or addressing width is refused with a reason rather than silently followed into the wrong offsets.

Two I/O engines, one kernel

IOCP · io_uring

The kernel was built on Windows I/O completion ports: one port per pump thread, overlapped reads and writes, a completion key per connection. The Linux port keeps that model exactly and puts io_uring under it, so the routing code above the platform layer is the same source on both.

What the platform layer maps
ConcernWindowsLinux
Completion modelOne IOCP per pump threadOne io_uring ring per pump thread; completions carry the same key
Wake a pump from elsewherePostQueuedCompletionStatusMulti-producer queue plus eventfd
TCPWinSock, ConnectEx, AcceptExSockets through the ring
Local pipesNamed pipes with a protected DACL, remote clients rejectedAF_UNIX sockets in a mode 0700 directory
SerialCOM ports, overlappedtermios
CryptographyWindows CNGOpenSSL 3, pinned to CNG by a known-answer test
Running as a serviceService control manager, event logsystemd unit, sd_notify, journal
BuildVisual Studio 2022 projects, authoritative for the Windows productCMake presets, GCC or Clang, ASan, UBSan and TSan configurations
StringsUTF-16 wchar_tUTF-16 pinned in the image; char16_t at the boundary

Same numbers, independently. Ten thousand hubs on four worker threads open eleven descriptors before and eleven after on Linux, because a hub is a mailbox and a strand, not a thread and a socket. The Windows build was measured to the same two numbers first. Thread-per-peer is not a cost on either platform.

Hubs in other languages

The same address space

A hub does not have to be C++. Peers written in Java, PHP and JavaScript implement the same routing rules over the same hierarchical addresses, and a front door built from the C++ kernel serves them to the web.

JavaA native port of the hub. Its address routing is checked against 729 decisions from a nine-address cross product, and its frame codec is the reference the browser and PHP peers round-trip against.
PHPA Composer package: a hub peer, a daemon that holds the socket, a systemd unit, an FPM drop-in and an optional C++ extension that replays the same fixtures. Floor measured at PHP 8.1, not declared.
JavaScriptA hub peer that runs inside a browser page over a WebSocket, self-assigns an address under the gateway's subtree and is routed to like any other peer.
P2PeerWebThe HTTP and HTTPS front door, built as a tree of hubs: one site hub per domain, one session hub per WebSocket, certificates from Let's Encrypt out of the box. It serves Ivyware's own site.

The format outlives the compiler

Conformance corpus

Specified

The frame and the image are documents

The wire frame and the store image are written up as format specifications with a canonical form, and a corpus of conformance vectors is generated from the C++ tree and read, never copied, by every other implementation.

Reproduced

Independent implementations agree

Clean-room re-implementations of the message kernel in Rust and in Zig, written from the format documents alone, reproduce the fourteen conformance vectors byte for byte on the first run, on Linux and on Windows. A format two strangers can reproduce is one you can keep for decades.

Continued

An engineering track, not a promise

Those ports are a research track that informs the C++ product, and they are described here as exactly that. What ships is the C++ kernel and store on Windows and Linux, with the bindings above. What the track proves is that the formats do not depend on one compiler's idea of a struct.

Build matrix

What is built and how
Platforms and toolchains
ComponentWindowsLinuxShape
MsgcoreVS 2022 v143, x64 and Win32, Debug and ReleaseCMake, GCC 15 or Clang, x86-64MFC extension DLL or static archive; shared object or static archive
TargetCoreVS 2022 v143, x64 and Win32, plus static-library variantsCMake, io_uring, liburing 2.5 or later on kernel 6.1 or laterDLL or static archive; shared object or static archive
TargetFacade · MsgFacadeVS 2022, x64 and Win32Facade ABI is platform-neutral; the Linux build consumes the flat C ABI todayDLL with one exported factory
TargetCom · MsgcoreComATL in-process servers, per-user registration, no elevationNot applicableDual interfaces, connection points
P2PeerWebReference build onlyRelease target: CMake, systemd, ACMEOne process, many sites
ChartboardWindows 10 or later, x64, Python 3.11 bundledNot applicableDesktop application
Java, PHP, JavaScript peersJDK 22+; PHP 8.1 to 8.5; any modern browserSameMaven, Composer, ES modules

One rule about linking, on both platforms. Every module in one process must reach Msgcore the same way, all importing the one shared library or exactly one module absorbing the archive. Mixing the two compiles, links, runs and then corrupts data, because an offset minted against one copy's heap resolves against the other's. The Msgcore reference says why.