Product Update

Introducing SIML Studio: keep the meaning, move fewer bytes

Systems repeatedly move the same kinds of information: a device state, a simulation mode, a command. Often, the set of possible meanings is small. Carrying those meanings in larger representations can mean more memory traffic, storage and network transfer than the task needs.

The opportunity is lower energy use through less data movement, with an easier path to integration. Where movement dominates a workload, the potential savings could be significant. The US Department of Energy's computing roadmap identifies data movement as an energy-efficiency challenge. That motivates this work; it does not establish Studio's energy savings.

SIML Studio turns enum declarations into compact, verifiable payloads and code in your own language. Drop in Rust, Python or C++ source, review the mapping, and download modified source with an explicit packed encoder and decoder. The first release is an invited beta.

Studio verifies byte counts and roundtrips and measures processing time. It has not measured energy savings. Packing and unpacking also takes work; the net result must be measured on the complete workload and target hardware.

Why fewer bytes · Your enums to packed code · A short guided tourRead the transcript ↗

Your code in. Packed code out.

Start with an enum-only file. The importer accepts plain fieldless Rust enums, Python Enum/IntEnum classes and C++ enums with literal values. It parses the whole file as text in your browser. It never executes the uploaded code or sends it to a compiler on a server.

The first release deliberately rejects methods, payload variants, aliases, expressions, macros and unrelated code. Extract the relevant declarations into a small file before importing. Confirm the complete domains; a few observed values are not proof of every value your system can send.

For example, a state enum might declare Idle = 0, Running = 4 and Fault = 255. Those original values remain unchanged. A separate dense mapping assigns wire codes 0, 1 and 2, so the state occupies two bits in the packed representation.

Combine it with a three-member command enum and the record needs four logical bits, stored in one byte. In the included native example, Running / Stop becomes 09. Studio's byte-aligned representation of those same two fields needs two bytes. This compares wire payloads, not the size of an enum object in memory.

After you approve the mapping, download the modified source or the full bundle: original source, modified source, a reviewable patch, an exact wire manifest, reference vectors and integration notes. Generated codecs use only the target language's standard library. Rust stays Rust. Python stays Python. C++ stays C++.

The generated record contains one value from each imported enum. Integrate the codec at both endpoints and test it in your application. Studio does not automatically rewrite call sites, change native enum memory layout or migrate an existing protocol. Browser/Node TypeScript integration remains available in the advanced workspace.

See where the bytes go

Studio connects a typed schema with the bytes it produces. Start with an example, inspect the fields, change a record and decode the result. The interface shows the representation alongside the values it carries.

The actuator example has seven states, a position between zero and 1023, and five commands. Those fields need three, ten and three bits respectively: sixteen bits in total.

A real 16-bit schema

2 payload bytes
7 states0–10235 commands
holding · 513 · reset0a70Exact roundtrip ✓
Stable category codes and explicit ranges. The frame header is separate from this payload.

For the example record holding / 513 / reset, the packed payload is 0a70: two bytes. The aligned payload is 02010203: four bytes. Both decode to the same values. The separate frame header adds 48 bytes, so the complete single-record frames are 50 and 52 bytes respectively.

That distinction matters. A dramatic payload reduction can mean a modest saving in a small frame. Send more records together and the balance changes.

Wire size, made visible

See where the bytes go.

Calculated · actuator example
Packed112 bytes total

64 payload bytes + 48 header bytes

Aligned176 bytes total

128 payload bytes + 48 header bytes

Frame header Record payload

The same values, with different layouts. One frame holds 32 records. Payload: 2 bytes packed or 4 aligned per record. This is a size calculation, not a CPU benchmark.

Measure the whole tradeoff

Compact messages can reduce storage and transfer volume. Packing and unpacking them also takes work. Studio compares packed, aligned and JSON representations using the same seeded records, with raw observations available to inspect and export.

Timing results describe the device and workload on which they were recorded. There is no promise that the smallest layout will also be the fastest or use the least energy. Measure joules for the baseline and packed path on the same hardware and workload, including encoding, decoding, movement, storage and framing. Report throughput and measurement uncertainty alongside energy. An inconclusive result is useful information too.

Your first five minutes

  1. Open the Studio introduction, then choose Open Studio.
  2. Enter your invited email address on the sign-in page.
  3. Open the latest email link. It expires in fifteen minutes and works once; there is no password to create.
  4. Drop an enum-only source file into the workspace, or choose a Rust, Python or C++ example.
  5. Review the original values and packed codes, approve the mapping, and download modified source plus the bundle and patch.
  6. Integrate both endpoints, run the supplied reference vectors and measure the result on your system. Use Inspect in workspace to explore the reviewed schema and compare layouts.

If GitHub sign-in is configured, invited GitHub accounts can also use it. Email and GitHub accounts remain separate; matching email addresses do not merge ownership automatically. Need an invitation? Contact the lab.

For local development, npm run studio:local starts the app, a persistent local PostgreSQL database and a captured email inbox. The terminal prints both addresses and the invited local test address. Request a link from the sign-in page, open the local inbox, and follow the link. This exercises the real login flow without sending email outside your machine.

Keep the result, not just a screenshot

Studio supports native enum import and code generation, typed graph editing, explicit category codes and ranges, schema inspection, reviewed CSV/JSON Schema imports and advanced browser integration. Exported projects keep the schema and its representation together.

Browser checkpoints remain on your device and are separated by account. Cloud save is an explicit action that sends the selected project to your account. Cloud storage adds project history, revisions and scoped, expiring agent tokens; agents do not need your browser session.

Use synthetic or non-sensitive examples while exploring. Browser checkpoints persist on that browser profile, so use a private profile on shared devices. A downloaded project is a file you control.

What this beta establishes

The included actuator and synthetic entity examples illustrate data representation. The synthetic DIS/HLA-style template is not a protocol-compliance claim. Conceptual connector metadata is not a physics or electrical simulation.

The aim is practical: move and store fewer bytes without losing meaning, make integration straightforward, and establish when that improves the complete system. Byte savings are the first proof. Energy savings are the next measurement.

Explore SIML Studio or request beta access.