Private beta

· macOS + Windows

Describe the machine.
Haviland engineers the rest.

Describe the machine.
Haviland engineers the rest.

Describe the machine.
Haviland engineers the rest.

It designs the 3D-printable parts, writes the Arduino firmware and checks the whole build in simulation — before you print a thing.

Runs on your computer

Asks before it acts

Says how sure it is

stops in 68 mm — in simulation, and it says so
lobbymodelfirmwarespeclog
rover · rev A
You said
voice
“
Requirements · 4
R1stops inside the 200 mm it keeps clear
R2stops within what its sonar can see
R3runs an hour on one set of batteries
R4stands on its own wheels
The gate
checking…
$ simulate.py rover
—stops-short
—stops-in-sight
—runs-an-hour
—stands
Verified in simulation. Not yet on a real floor.
10 parts18 connectionsone printed plate
idledrag to turn the modelgate: waiting

Haviland drives the tools you already use

Claude

Claude

OpenSCAD

OpenSCAD

Blender

Blender

arduino-cli

arduino-cli

whisper.cpp

whisper.cpp

git

git

Why Haviland

A drawing isn’t a machine. Haviland designs the parts, writes the firmware and checks the whole build — then tells you exactly how sure it is.

A drawing isn’t a machine. Haviland designs the parts, writes the firmware and checks the whole build — then tells you exactly how sure it is.

A drawing isn’t a machine. Haviland designs the parts, writes the firmware and checks the whole build — then tells you exactly how sure it is.

What you get

Parts, firmware and proof. From one sentence.

You describe the machine and the numbers it has to hit. Haviland turns that into things you can check: parts, code and a verdict.

You describe the machine and the numbers it has to hit. Haviland turns that into things you can check: parts, code and a verdict.

01

Parts · OpenSCAD + Blender

Printable, to the millimetre.

Every part is designed with the tolerances a printer needs, and Haviland knows how the whole machine sits together.

VIEW A · LEFT ELEVATION · UNITS MMOBSTACLE6820032.543.7SIMULATED STOPKEEPS CLEAR · REQUIREMENT0305010706080204

chassis.scad

110 × 205 × 4 mm

M3 clearance · 3.4 mm

printed PLA

02

Firmware · Arduino

Code that knows the machine.

It writes and compiles the sketch, and knows which constant sets which number on the machine.

// rover.ino
const int SPEED_PWM = 196;
// 60 ms between pings, or it
// hears the last one’s echo.
const unsigned long
CONTROL_PERIOD_MS = 60;
const long STOP_MM = 200;

03

The gate · simulation

A verdict, with its working.

It measures the assembled machine: parts that collide, gaps too tight to assemble, whether it tips, whether the battery lasts.

PASS

stops-short

68 mm

PASS

stops-in-sight

68 / 4000 mm

PASS

runs-an-hour

≈ 2.4 h

PASS

stands

stands

04

Voice · whisper.cpp

Talk to it like a colleague.

Start a change out loud and finish it at the keyboard. It’s one conversation, transcribed on your own computer.

“make the plate 50 mm”

05

Projects · git

Every change, undoable.

Projects live on your disk with their own history, so undo reaches back to the first minute.

All four requirements pass

rev A · run 6

Firmware caps the motors at 196/255

run 3

Motors hang on zip ties, clear of the plate

run 2

Left motor turned to face its wheel cleanly

run 1

Case study · rover, rev A

Every no came with a reason.
 Then all four passed. 

Every no came with a reason.
 Then all four passed. 

Every no came with a reason.
 Then all four passed. 

Ten parts on one printed plate: an Arduino, a sonar and two gear motors, designed, wired, programmed and checked by Haviland. The gate turned it down until all four requirements passed in simulation.

Gate historyrover · rev A
$ python3 graph_check.py rover
# run 1
ERRORmotor_l and wheel_l share solid material — 6 mm³. Separate them by at least 8 mm along X.
# run 2
UNCHECKEDchassis/motor_l — 16.8% of sample rays hit a surface that isn’t watertight. Give it clearance.
# run 3
ERRORmotor driven at 6.5 V, above its 5.0 V rating.
# run 6 · requirements added
$ python3 simulate.py rover
PASSstops-short stops inside the 200 mm it keeps clear
PASSstops-in-sight stops within what its sensor can see
PASSruns-an-hour an hour or more on one set of batteries
PASSstands stands on its own wheels at rest
$ python3 graph_check.py rover
FAIL10 components · 18 connections · 0 errors · 1 unchecked
It never rounds “unmeasured” up to “fine”.
Gate historyrover · rev A
$ python3 graph_check.py rover
# run 1
ERRORmotor_l and wheel_l share solid material — 6 mm³. Separate them by at least 8 mm along X.
# run 2
UNCHECKEDchassis/motor_l — 16.8% of sample rays hit a surface that isn’t watertight. Give it clearance.
# run 3
ERRORmotor driven at 6.5 V, above its 5.0 V rating.
# run 6 · requirements added
$ python3 simulate.py rover
PASSstops-short stops inside the 200 mm it keeps clear
PASSstops-in-sight stops within what its sensor can see
PASSruns-an-hour an hour or more on one set of batteries
PASSstands stands on its own wheels at rest
$ python3 graph_check.py rover
FAIL10 components · 18 connections · 0 errors · 1 unchecked
It never rounds “unmeasured” up to “fine”.
0mm
0mm

to come to a stop

Simulated

0.0h
0.0h

on six AA cells

Calculated

0/ 4
0/ 4

requirements met

In simulation

0
0

errors at the gate

1 unchecked · still FAIL

Nothing here has met a real floor yet. The figures say so.

Evidence

Assumed isn’t measured. Haviland knows the difference.

Every number Haviland gives you says how it knows it.
Here are the rover’s, from least sure to most.

Every number Haviland gives you says how it knows it. Here are the rover’s, from least sure to most.

← Less sure

More sure →

01

Assumed

stated without a source

floor grip μ 0.7

estimated masses

02

Sourced

from a datasheet or vendor

motor geometry

Adafruit CAD

03

Calculated

worked out from sources

≈ 2.4 h

1071 mAh at 444 mA

04

Simulated

a model of the machine, run

stops in 68 mm

drives at 0.64 m/s

the rover is here

05

Measured

taken off the real machine

nothing yet

06

Validated

measured, and confirmed in use

nothing yet

Nothing on the rover is measured yet, so nothing on this page says it is.

Permission

It asks before it acts. One rung at a time.

Twelve rungs, from reading your project to moving a machine. By default it stops at compiling, and a yes buys exactly one rung, for one turn.

Twelve rungs, from reading your project to moving a machine. By default it stops at compiling, and a yes buys exactly one rung, for one turn.

12

Operate machine

drive something that moves in the world

Never

11

Control instrument

drive a scope, a supply, a meter

Never

10

Control device

make a connected board do something

Autonomous ceiling

09

Flash device

write the binary to a board

08

Run part code

execute a part file as a program

One yes above default

07

Compile

turn firmware into a binary

Default stops here

06

Modify EDA

change schematics and boards

05

Modify CAD

build geometry from the project’s files

04

Modify files

change the project’s own files

03

Simulate

ask whether the machine would work

Collaborator ceiling

02

Read hardware

see what’s plugged in, without touching it

01

Read project

look at the project and the library

Kept on your machine

Runs locally.

Projects live on your disk, not on a server.

Its window only answers itself.

The interface checks where every request comes from.

Refusals survive approval.

Saying yes to one step never unlocks what’s forbidden.

Every change can be undone.

Each project keeps its own history, back to the first minute.

FAQ

Questions, answered.

Something we missed? Ask when you request an invite.

Start with  one sentence. 

Start with  one sentence. 

Start with  one sentence. 

The beta is invite-only. Leave an email to ask for a place.

We’ll use your email only to send your invite and beta updates, as our Privacy Policy explains. Under 13? Ask a parent or guardian to request the invite.

Not sure what to build? Try “a quiet desk fan that stops when nothing is in front of it.”

Invite-only beta