Skip to content

Rust Is Not the Enemy. Rust Is the Control Group.

Rust Is Not the Enemy. Rust Is the Control Group.

Section titled “Rust Is Not the Enemy. Rust Is the Control Group.”

Why hardcore Rust developers should care about Janus without abandoning Rust

Section titled “Why hardcore Rust developers should care about Janus without abandoning Rust”

I am not writing this to convince Rust developers to abandon Rust.

That would be stupid.

Rust is one of the few genuinely successful systems-language revolutions of the last twenty years. It did not win because of marketing. It won because it made a brutal promise and mostly kept it: memory safety without a garbage collector, fearless concurrency without data races, high-level abstraction without giving up low-level control.

For people building crypto, Substrate runtimes, consensus systems, wallets, networking stacks, and hostile-environment infrastructure, Rust is not fashion. Rust is body armor.

So let us start with respect.

Rust moved entire categories of bugs out of code review and into the compiler. That is not a small achievement. That is civilization. Before Rust, too much systems programming was an oral tradition of sharp knives: “be careful with this pointer,” “don’t outlive that buffer,” “this looks safe unless a thread sneezes.” Rust gave these hazards syntax, rules, diagnostics, and social force.

The borrow checker became the bouncer at the memory nightclub. Annoying? Often. Wrong? Sometimes. Necessary? Absolutely.

But here is the uncomfortable thesis:

Rust solved the memory discipline problem better than anything mainstream before it.

It did not solve the whole sovereignty problem.

And that is where Janus enters.

Not as a Rust replacement today. Not as a cargo-cult “Rust killer.” Not as another adolescent language waving a toy sword in the crater of C++.

Janus is a question aimed at the next layer of systems programming:

What if the compiler could prove not only memory ownership, but also side effects, authority, resource access, syscall surface, supply-chain identity, termination, value predicates, and script-to-production promotion?

That is the Janus bet.

It is too early. It is not safe to pretend otherwise. But it is also too interesting for serious Rust people to ignore.


Rust’s promise can be summarized in four old slogans:

  • Memory safety without garbage collection.
  • Concurrency without data races.
  • Abstraction without overhead.
  • Stability without stagnation.

That was not empty rhetoric. The borrow checker is Rust’s central enforcement mechanism. Ownership, borrowing, and lifetimes make aliasing and mutation visible enough that the compiler can reject many memory and concurrency errors before the program exists.

This matters especially in crypto and blockchain.

A runtime bug in a web app is embarrassing. A runtime bug in consensus code is an expensive religious event. Everyone gathers around the smoking validator and invents theology.

Rust reduces that risk. That is why Substrate chose it. That is why crypto engineers tolerate its ceremony. That is why “just use Go” sounds insane in certain rooms.

Rust also gave us a real ecosystem: crates, Cargo, RustSec, Clippy, rustfmt, good docs, serious libraries, and an enormous amount of accumulated operational knowledge. A young language does not get to fake that. Ecosystem maturity is not vibes. It is scars, releases, bug reports, abandoned packages, security advisories, ugly migrations, and enough people still showing up anyway.

Rust has all of that.

Janus does not. Not yet.


The borrow checker is magnificent. It is also specific.

It governs ownership, borrowing, mutation, and lifetimes. It does not, by itself, answer these questions:

  • Can this function touch the filesystem?
  • Can this code open a network connection?
  • Can this dependency exfiltrate environment variables?
  • Can this binary acquire authority not declared in its manifest?
  • Can this function perform IO even though its signature looks pure?
  • Can this crate’s transitive dependency run a build script that does something disgusting?
  • Can this parsing routine prove the captured value is in range?
  • Can this handler be proven to terminate?

Rust has tools, patterns, crates, linters, policies, review cultures, sandboxing strategies, cargo-audit, RustSec, supply-chain projects, and a growing security ecosystem around these problems. Good. Necessary.

But much of that is outside the language contract.

That is the gap Janus wants to attack.

Rust made memory discipline a compile-time norm.

Janus wants to make operational authority a compile-time norm.

Different battlefield.


The Ecosystem Problem: Cargo Is Powerful, Therefore Dangerous

Section titled “The Ecosystem Problem: Cargo Is Powerful, Therefore Dangerous”

Rust’s ecosystem is one of its greatest strengths. It is also a live attack surface.

This is not a Rust-specific moral failure. Every serious package ecosystem becomes a sewer system with marble statues on top. npm demonstrated the horror first at industrial scale. Python has its own haunted carnival. Go has module trust issues. C and C++ spent decades pretending copy-pasted tarballs were civilization.

Rust is better than most, but Rust is not exempt from physics.

The crate graph can become huge. Transitive dependencies accumulate. Build scripts can execute code. Maintainers disappear. Typosquatting exists. Malicious crates appear. Unsoundness in “safe” APIs still happens. Crypto crates can have vulnerabilities. Even if the Rust language is doing its job, the ecosystem becomes a distributed trust machine.

And distributed trust machines rot unless they are aggressively audited.

Rust has RustSec and other ecosystem defenses. That is good. But the burden remains: names, versions, maintainers, features, build scripts, transitive trust, and human review.

Janus’s Hinge model attacks this from a different angle: content-addressed module identity, signed capsule manifests, CID verification, and dependency identity by what the code is, not merely where it was found or what name it claimed.

That does not magically solve supply-chain security. Nothing does. But it changes the primitive.

Cargo begins with package identity.

Hinge begins with content identity.

That distinction matters.

A name can lie. A hash is at least forced to be specific.


The Janus Bet: Eight Axes, Not One Borrow Checker

Section titled “The Janus Bet: Eight Axes, Not One Borrow Checker”

Rust’s great axis is ownership.

Janus’s ambition is broader. The current Janus design can be understood as eight enforcement axes:

Janus borrows the seriousness of Rust, Zig, Pony, and capability systems, but it does not want invisible magic. Parameter intents such as view, edit, take, and make are meant to make data movement explicit. The goal is not to clone Rust’s borrow checker line by line. The goal is to make ownership, mutation, and transfer readable to humans and provable to tools.

Rust taught the industry that memory discipline belongs in the type system.

Janus accepts the lesson and asks: why stop at memory?

A function that performs IO should say so.

A function that allocates should say so.

A function that touches network, time, randomness, disk, GPU, or foreign code should not be able to cosplay as pure business logic.

Janus effect rows are designed to make side effects part of the function contract. This is the kind of thing Rust developers already simulate with traits, marker types, async boundaries, feature discipline, and review culture. Janus wants it in the language.

Not because ceremony is beautiful.

Ceremony is ugly. That is why it works. It leaves fingerprints.

Rust can stop you from using a dangling pointer.

It does not stop arbitrary code from calling std::fs::File::open() if that code is linked and reachable.

Janus’s capability model aims at “no ambient authority.” A function should not read a file because the universe has files. It should read a file because it received a filesystem capability. It should not connect to the network because sockets exist. It should connect because a network capability was passed into scope.

This is a deeper claim than memory safety.

This is authority safety.

4. Pledge and unveil: syscall surface as contract

Section titled “4. Pledge and unveil: syscall surface as contract”

At the operating-system edge, Janus wants syscall promises to become language-visible. Think OpenBSD pledge/unveil, but lifted into compile-time effect analysis and mapped across OpenBSD, Linux, and NexusOS-style capability primitives.

The naïve version is “call pledge() somewhere.”

The Janus version is “the compiler knows what syscall surface this function claims, and rejects code that violates it.”

That is the difference between a runtime seatbelt and a compile-time road closure.

Rust has excellent types, but many value invariants still become wrapper types, runtime checks, or unsafe assumptions.

NonZeroU32. NonNull. Index bounds. Alignment. Slice length. “This integer is less than that buffer length.” “This address is 16-byte aligned.” “This value is positive.”

Janus refinements aim to express these predicates directly and prove them with SMT only when requested. Pay for proof when you need proof. Do not invoke the theorem goblin for a hello-world binary.

For crypto people, this should ring bells. So many bugs live not in the broad type, but in the forbidden value.

The shape is correct. The value is cursed.

Refinements are about catching cursed values.

Some functions are allowed to run forever. Event loops, reactors, daemons, actors.

Some functions must not.

Crypto primitives, parser hot paths, consensus transitions, deterministic runtime logic, serialization code, migration handlers — these should often terminate by construction. Janus’s totality axis is an attempt to make termination a declared and checked property.

Rust can write terminating code. Obviously.

Janus asks whether termination should become part of the contract where it matters.

Janus has profiles: script, core, service, cluster, compute, sovereign.

This is not just branding. The profile system is meant to encode which powers are available and which disciplines are enforced. Janus also uses explicit phase sigils: compile-time, extraction, metadata. The point is visual law. When code crosses phase, authority, or extraction boundaries, the reader should see it.

Rust has macros, const evaluation, unsafe, features, build scripts, proc macros, and conditional compilation. Powerful, yes. But the phase map can become foggy.

Janus wants fewer fog machines.

Hinge is Janus’s package and capsule direction: content-addressed identity, signed manifests, CID verification, profile-aware imports, and no dependency identity based only on names floating through a registry.

This matters for people building crypto infrastructure.

If your entire system is based on cryptographic identity, but your code supply chain still trusts names and mutable distribution channels, you have a philosophical tumor.

Hinge tries to cut it out.


Janus Status Today: Promising, Early, Uneven

Section titled “Janus Status Today: Promising, Early, Uneven”

Now the part where we refuse to lie.

Janus is not Rust.

Janus is not production-grade like Rust.

Janus does not yet have Rust’s compiler maturity, ecosystem, crates, tooling, IDE support, long-term security process, user base, or battle testing. If you are shipping a Substrate runtime today, use Rust. If you are writing production crypto libraries today, use Rust unless you have a very specific reason not to.

Janus is still a forge, not a city.

Some pieces are landing. Today, Turbovec landed. janq and rex landed too — Janus-native answers to jq and rg. That is important because languages do not become real through manifestos. They become real when someone uses them to cut logs, query data, process text, inspect repos, and replace daily tools.

A systems language must first become useful in small, sharp places.

janq and rex matter because they are not grand theory. They are teeth.

But the eight-axis Janus vision is not fully implemented. Some parts are live. Some are draft. Some are ratified design. Some are still steel cooling in the mold. Anyone claiming otherwise is selling incense.

The honest claim is narrower and stronger:

Janus is a serious experimental systems-language project with a coherent doctrine, an expanding implementation surface, and a set of design goals Rust does not currently attempt to cover in-language.

That is enough.

No need to pretend the cathedral is finished when the foundation is the interesting part.


Rust did not emerge from two starving monks in a basement and conquer the world through purity alone.

Rust had institutional oxygen.

It began inside Mozilla. It grew through Mozilla Research. Servo mattered. Firefox mattered. Paid engineers mattered. Infrastructure mattered. Governance mattered. Eventually the Rust Foundation became the independent institutional home.

Was there a clean “Rust had exactly a $100 million budget” line item called “make Rust inevitable”? I would not state that as fact without a ledger.

But the broader point is true: Rust had a mothership when motherships mattered.

Janus does not.

That makes Janus weaker.

It also makes contribution leverage higher.

A Rust developer contributing to Rust today joins a continent. A Rust developer contributing to Janus today can still move tectonic plates.

That is the real pitch.

Not “come worship my language.”

Come shape the wound before it scars.


Why Rust Developers Are the Right People for Janus

Section titled “Why Rust Developers Are the Right People for Janus”

Janus does not need hype men.

It needs people who already understand why systems languages are hard.

Rust developers, especially Substrate and crypto developers, have the right scars:

  • You understand determinism.
  • You understand hostile inputs.
  • You understand serialization.
  • You understand consensus failure.
  • You understand transitive dependency paranoia.
  • You understand why “probably safe” is not safe.
  • You understand that abstractions are guilty until proven zero-cost.
  • You understand that an unsafe boundary is a legal crime scene.

That mindset is exactly what Janus needs.

Not because Janus is already better than Rust.

Because Janus will become garbage without people who know what Rust got right.


I do not want Rust developers to ditch Rust.

I want some of the hardcore Rust people to look at Janus and think:

“There is something here.”

Not “I will rewrite my production stack tomorrow.”

Not “Rust is dead.”

Not “new shiny language, new cult robes.”

Just:

“This project is trying to push compile-time proof beyond memory. I want to help test whether that is real.”

That is enough.

Contribute a small tool. Audit Hinge. Attack janq. Break rex. Compare Turbovec against Rust SIMD. Write a Rust-Janus adapter. Try to model a Substrate-style state transition in Janus. Port a tiny crypto primitive and document every place where Janus is not yet worthy. File ruthless issues. Make the compiler bleed in public.

That is contribution.

Not loyalty.

Pressure it.


Rust Remains The Present And Future. Janus Might Be Soon One Future.

Section titled “Rust Remains The Present And Future. Janus Might Be Soon One Future.”

Rust is the present answer for serious memory-safe systems work.

Janus is an attempt to ask the next question:

After memory safety, what else should the compiler know?

My answer is: authority, effects, supply-chain identity, syscall surface, value predicates, termination, phase boundaries, and script promotion.

That is a larger claim than Rust made.

It is also a more dangerous claim. Larger claims fail more often. The graveyard is full of languages that wanted to fix everything and shipped nothing. The difference must be discipline: small tools, green tests, real users, boring documentation, hostile review, no fake maturity.

That is why Rust people matter.

Rust developers know the difference between a promise and a proof.

Janus needs proof.

So keep Rust in production.

Keep Substrate in Rust.

Keep crypto in Rust where Rust is the right weapon.

But send a few engineers to the Janus forge.

Not to kneel.

To hammer.