Ivyware Platforms Windows · Linux C++ · C · Java · .NET · PowerShell · VBScript 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.

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
7Languages with a working harness
282Flat C entry points, each with a UTF-8 twin
1Store image, identical on both platforms
0Lines of JNI, on either Java route

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. Open a card to jump straight to that example tree in the IvywareAU organisation, which is being opened up repository by repository — a link may still ask you to sign in until its tree is public.

WinWindows x64 and Win32. Visual Studio 2022, C++17 and later. I/O completion ports, Windows CNG crypto, services with event-log diagnostics. Reference build Examples on GitHub
LinuxLinux x86-64 GCC 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 Examples on GitHub
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 Examples on GitHub
CC A 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 Examples on GitHub
JavaJava Two routes, both pure Panama and neither needing JNI: hand-written bindings that call a facade vtable slot directly and build a vtable of their own for handlers (JDK 22+), or jextract-generated bindings over the flat C ABI, guarded by a coverage test that fails the build if an entry point goes unbound (JDK 23+). java.lang.foreign · mscs.p2pf · com.targetcore Examples on GitHub
C#.NET The 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 Examples on GitHub
PSPowerShell Late-bound through the registered coclass: New-Object -ComObject and everything after it is by name. No compiler, no header, no interop assembly. IDispatch Examples on GitHub
VBSVBScript · VBA · Excel CreateObject 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 Examples on GitHub
PyPython Chartboard 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 Python in the org
COMAny automation host Dual 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 Examples on GitHub

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.

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

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.