A surface that’s honest about what’s underneath.
Translucent panels show the load-bearing geometry — types, lifetimes, ownership — without burying it in chrome. You see the prototype thinking.
01pub trait Prototype<T> where 02 T: Compilable + Send + Sync, 03{ 04 type Output; 05 type Error: std::error::Error; 06 07 fn declare(&self) -> Spec<T>; 08 fn scaffold(spec: Spec<T>) -> Frame; 09 fn compile(frame: Frame) -> Build; 10 fn test(build: &Build) -> Report; 11 fn ship(self) -> Result< 12 Self::Output, Self::Error 13 >; 14}
prototype.rs is a Rust-first scaffold for turning rough sketches into running software in five disciplined moves: declare, scaffold, compile, test, ship. Every panel below is the same code at a different stage of becoming.
01[workspace] 02members = [ 03 "core", 04 "surface", 05 "runtime", 06] 07 08[prototype] 09shape = "split" 10depth = 3 11finish = "frosted" 12iterate-on-save = true
Translucent panels show the load-bearing geometry — types, lifetimes, ownership — without burying it in chrome. You see the prototype thinking.
Every UI primitive carries a debug trail. Hold ⌥ on any element to peel back the polish and see the wire underneath.
The runtime keeps a typed snapshot of every state your prototype has ever been in — so iteration never costs you the last working version.
✓ resolving 142 crates from registry ✓ compiling proc-macro2 v1.0.86 ✓ compiling syn v2.0.79 ✓ compiling tokio v1.40.0 ✓ compiling prototype-core v0.7.2 ✓ compiling prototype-surface v0.7.2 ❯ linking _
#[tokio::test] async fn stress_glass() { let p = Prototype::new(); for _ in 0..10_000 { p.tick().await?; } assert_eq!(p.cracks(), 0); }
10,000 iterations across the surface API. No allocations on the hot path. No cracks in the glass.
$ cargo prototype ship ✓ signed ✓ notarized ✓ published — live in 0.3s
The same five panels — declare, scaffold, compile, test, ship — are how you start, iterate, and release. The prototype doesn’t get thrown away. It hardens into the product.