SIMULATE YOUR HARDWARE BEFORE THE NEXT RESPIN
Python system simulation for founders and founding engineers building custom electromechanical products. Don't throw away what the bench teaches you. Model your system, then fold real bench data back in so it gets sharper every build.
pip install hardwave
STOP FINDING OUT THE HARD WAY
In hardware, you usually don't know something's wrong until you've already built it: ordered the parts, soldered the board, powered it on, and watched a motor draw twice the current it should. Hardwave moves that moment of truth earlier. You describe your circuit, motor, or control system as code, and Hardwave tells you how it will actually behave before it costs you a shipment or a week.
MODEL IT
Describe a resistor, motor, or microcontroller as a typed Python component. No CAD file, no breadboard, no waiting on a supplier.
RUN IT
Wire components into a graph and simulate the whole system at once, capturing the voltages, torques, and temperatures it would produce if it already existed.
TRUST IT
Once the real hardware exists, feed its telemetry back in. The model earns your trust a little more with every bring-up, not just the first one.
ONE GRAPH FOR YOUR WHOLE PRODUCT
One Python graph models your whole system, and its fidelity grows as bench data arrives, no restructuring, just a solver swap.
TYPED COMPONENTS & PORTS
Define components with typed input/output ports, parameters, and solvers. Wire them into a graph and run steady-state or transient simulation.
1from hardwave.components import Component, ComponentMeta
2from hardwave.ports import input_port, output_port
3
4class Thermostat(Component):
5 meta = ComponentMeta(
6 name="Thermostat", display_name="Thermostat",
7 version="1.0.0", description="Temp → openness",
8 docs="", category="Control",
9 )
10 ports = [
11 input_port("temperature", "Temperature"),
12 output_port("vent_state", "ControlSignal"),
13 ]
14
15 def solve(self, inputs: dict) -> dict:
16 T = inputs["temperature"]
17 return {"vent_state": max(0.0, min(1.0, (T - 20) / 15))}30+ STDLIB COMPONENTS
Ready-to-use blocks for passive, active, motors, sensors, power, and MCU circuits. Install, wire, and simulate in minutes.
import hardwave.stdlib
from hardwave.stdlib.components.passive import (
VoltageSource, Resistor,
)
from hardwave.simulation import (
SimulationGraph, SimulationEngine,
)
g = SimulationGraph()
g.add_component(VoltageSource(
"vs", param_values={"voltage": 9.0}))
g.add_component(Resistor(
"r1", param_values={"resistance": 1e3}))
g.connect("vs", "voltage_out", "r1", "voltage")
out = SimulationEngine(g).run(inputs={})
print(out.get_output("r1", "current"))SIMULATION ENGINE
Run steady-state parameter sweeps or transient time-domain simulation. Serialise graphs to JSON, reload them, and track telemetry across runs.
from hardwave.simulation import (
SimulationEngine, SimulationConfig,
)
from hardwave.solvers import SimulationDomain
result = SimulationEngine(graph).run(
inputs={"motor": {
"voltage": 12.0, "load_torque": 0.2}},
config=SimulationConfig(
domain=SimulationDomain.TRANSIENT,
t_end=1.0, dt=1e-4,
),
)
t, omega = result.get_time_series(
"motor", "angular_velocity")CALIBRATE FROM BENCH DATA
Swap formula solvers for ones trained on your own telemetry as it arrives, no rewiring the graph. Fidelity compounds with every bring-up instead of resetting each spin.
1import hardwave.premium
2
3hardwave.premium.append_records(model_id, [{
4 "inputs": {"voltage": 12.0, "load_torque": 0.2},
5 "outputs": {"angular_velocity": 180.0},
6}])
7hardwave.premium.train_model(model_id)
8hardwave.premium.attach_model(motor, model_id)PREMIUM CLOUD COMPONENTS
High-fidelity models served server-side with RSA-signed requests. Your private key never leaves your machine.
1import hardwave.premium
2
3hardwave.premium.configure(
4 organization_id="<your-org-uuid>",
5 secret_key=open("hardwave_private.pem").read(),
6)
7hardwave.premium.sync()OPEN SOURCE & EXTENSIBLE
MIT-licensed core library with complete control over your simulation stack. Build custom components, composite assemblies, and simulation graphs.
from hardwave.components import (
CompositeComponent, BuildContext,
ComponentMeta,
)
from hardwave.ports import input_port, output_port
from hardwave.stdlib.components.passive import Resistor
class VoltageDivider(CompositeComponent):
meta = ComponentMeta(
name="VoltageDivider",
display_name="Divider", version="1.0.0",
description="R divider", docs="",
category="Passive",
)
ports = [
input_port("v_in", "DCVoltage"),
output_port("i_r1", "Current"),
]
def build(self, ctx: BuildContext) -> None:
ctx.add(Resistor(
"r1", param_values={"resistance": 1e3}))
ctx.map_input("v_in", "r1", "voltage")
ctx.map_output("i_r1", "r1", "current")UP AND RUNNING IN MINUTES
A code-first simulation framework. Define components in Python, wire them into a graph, and run with no config files or proprietary GUIs.
INSTALL
pip install hardwaveDEFINE
Create components with ports, parameters, and solversSIMULATE
Run steady-state sweeps or transient time-domain runsSCALE
Train solvers on bench telemetry, then share the graph on your org's cloudBUILT FOR PRE-SEED & SEED HARDWARE TEAMS
You're building the whole electromechanical product yourself, not picking parts from a catalog. Hardwave gives you a way to know it works before you order the next board.
ROBOTICS & ACTUATION
Size a motor and tune a control loop without burning out the real thing to find its limits.
MULTI-DOMAIN SYSTEMS
Combine electrical, mechanical, and thermal components in one graph and catch the interactions that only show up once everything's connected.
EMBEDDED PERIPHERALS
Validate sensor and peripheral behaviour at the signal level before you flash a board, not full firmware execution, but enough to catch bad assumptions early.
Also handles power electronics work. We're building deeper fidelity there as our component library grows.
WHO HARDWAVE IS BUILT FOR
We'd rather tell you now than waste your time later.
GOOD FIT
- +Technical founder or founding engineer at a pre-seed or seed hardware or robotics company
- +Building a custom electromechanical product, not just picking parts from a catalog
- +Comfortable writing Python, or has someone on the team who will
- +First hardware is on the bench, or parts are on order
- +Willing to author or own a model of your own system
NOT A FIT YET
- –You want a complete manufacturer / DigiKey parts catalog before trying anything
- –You need cycle-accurate firmware execution or a full HIL replacement today
- –No one on the team will write or maintain any custom components
- –No path yet to a shared product model or a paid plan, the free tier is a fine place to explore
- –You're an enterprise digital-twin program running a long procurement cycle
FREQUENTLY ASKED QUESTIONS
START BEFORE YOUR NEXT RESPIN
Open source and free to start exploring your system in Python. Upgrade to Builder when bench data starts arriving and you want it folded into sharper, cloud-saved models.