Most multi-target / “write once” tools optimize for coverage. If a construct almost maps, they emit something close and hope.
CuNi does the opposite.
You write one .cuni source. The compiler emits to Python, Go, and JavaScript under an exactness contract: identical stdout on all three, or it refuses. There is no approximate mode.
Why refuse?
Silent drift is expensive. Teams paper over it with “known differences” docs. CuNi’s product surface is the gate itself:
-
cuni checkemits and runs the gated targets and requires matching output - Free Studio (no install): cuni-studio.fly.dev — load the default sample → Run exactness → identical py/go/js or refuse → Publish can register a contract on Agent-Rider
The hosted demo gates the flagship trio (Python / Go / JS). The CLI can exercise a wider list for CI; Studio only promises the seats it actually runs.
What this is not
- Not a claim of production maturity (v0.1.x, early)
- Not a Haxe replacement (Haxe optimizes for breadth; we optimize for a refusal property on a small surface)
- Not a ranking story about other languages
Try it
- Studio: https://cuni-studio.fly.dev/
- Repo: https://github.com/ceedot-rock/cuni
- Link tutorial (shared HTTP contracts): https://github.com/ceedot-rock/cuni/blob/master/docs/LINK_TUTORIAL.md
If you have a construct that should refuse — or one that refuses too eagerly — I want the failing case.
— Corey Tasz · Slid Phi Labs
Top comments (0)