Your source is sent to a server that compiles it and nothing else — the same
cx binary from the public release, invoked as cx --emit-risc. The bytecode
comes back and the CX+AI register VM, compiled to WebAssembly, runs it on your own
machine. Nothing you write is executed on the server.
Press Run.
This is the real CX+AI register VM — the same one a native cx build uses — compiled to
wasm32 and running inside your browser's sandbox. The rule is simple, and it is the only one
you need: whatever CX+AI can do in a browser, it does. What a browser genuinely cannot do,
CX+AI refuses by name — it never fakes a result.
fwrite, fread and the rest of the file builtins work.
They read and write a filesystem that lives inside this tab — real files as far as your
program is concerned, and invisible to everything else. Nothing here can touch your disk,
and nothing is uploaded: your source is compiled on our server, but it runs only in
your browser. The tab's files vanish when you reload the page.system() stops with CX-E5037, naming the capability and refusing to
invent a return value — a browser tab has no shell. Try the last example and read it._C{} blocks stop with CX-E5003. A _C{} escape hatch is
literal C compiled into a native binary, and there is no native binary here. Those
programs need the downloadable compiler.ai* builtins are native-only: they need a native HTTP client
and a key, so they are not part of the register VM on any backend and the compile itself
refuses with CX-E1013. That is the same answer a native cx --runvm
gives.httpGet and httpPost work, over the browser's own
fetch. Same names, same signatures, same code as a native build — your program
does not know which target it is on. CORS is the browser's law, not ours:
a tab can only read a site that allows it to, so a request to a server without the right
Access-Control-Allow-Origin header is refused by the browser before it reaches
us. CX+AI reports that as a named network error and an empty body — check
httpStatus() and netError(). The browser deliberately does not say
which of CORS, DNS or an unreachable host it was, so neither do we; inventing a
confident reason would be worse than naming the possibilities.sshexec stops with CX-E5037, like system(). A tab
cannot open an outbound SSH session, and no flag changes that — so it refuses by name rather
than handing back an empty string. That is the line: what a browser can do, CX+AI
does; what it genuinely cannot, CX+AI refuses out loud.
Everything else is the language as shipped. Every builtin you can call here is in the
manuals and the
builtins reference, and for the full toolchain —
native builds, _C{}, files, networking, graphics, the module system — the releases
are on GitHub.