Make hardware interactive by drawing a flow. No code needed.
Wire buttons, sensors, LEDs and motors together on a visual canvas, and watch your Arduino respond right away. Microflow runs in your browser and as a desktop app.
- Build with blocks. About 40 nodes, grouped into Sense, Generate, Shape, Decide and Express. Use them for buttons, potentiometers, motion and distance sensors, LEDs, addressable LED strips, LED matrices, servos, steppers, relays, piezo tones, I²C devices and NFC readers.
- Edit while it runs. Changes go to the board immediately. You do not compile, upload or restart.
- Use it anywhere. Open microflow.tech in Chrome or Edge (it uses Web Serial), or install the desktop app for macOS, Windows or Linux. Microflow puts the firmware on your board for you.
- Take it off the computer. Export a flow as a standalone Arduino sketch for an Uno, Nano or ESP32.
- Connect your designs. Link Figma or Penpot prototypes to real hardware through MQTT. A real button can change a screen, and a tap in a prototype can turn on a real LED.
- Go beyond the board. Nodes for MQTT, MIDI, LLMs, keyboard hotkeys and custom JavaScript functions.
- Ask AI. Describe what you want, and Ask AI adds and wires the nodes for you. Use any OpenAI-compatible provider (OpenAI, OpenRouter, Ollama, LM Studio). In the desktop app, you can also use Claude Code.
- Build together. Edit a flow with other people in real time, see their cursors, and share by invitation. You can also publish flows to the community and fork flows that other people made.
- Open microflow.tech or download the desktop app.
- Connect an Arduino (Uno, Nano, Mega, Leonardo or Micro) with a USB cable. Microflow detects the board and flashes StandardFirmata onto it.
- Put a Button node and an LED node on the canvas and connect them. Press the button, and the LED turns on.
Next, follow the first-flow tutorial or start from one of the built-in templates.
| What it is | |
|---|---|
| Microflow Studio | The flow editor, as a web app and a desktop app (Tauri). Start here. |
| Hardware Bridge for Figma | Links Figma variables to your flows through MQTT. Available in the Figma Community. |
| Microflow for Penpot | The same bridge for Penpot, the open-source design tool. Experimental. |
| Docs | Tutorials, how-to guides, a reference for each node and troubleshooting, at docs.microflow.tech. |
The flow runtime is written once, in Rust, and it does no I/O itself (it is "sans-IO"). The desktop app runs it natively. The browser runs the same code compiled to WebAssembly. Each host only does the I/O (serial port, timers, network), so a flow behaves the same on both platforms.
flowchart LR
canvas["Canvas<br/>(React Flow + Yjs)"] -->|flow updates| core
subgraph core["microflow-core (Rust, sans-IO)"]
direction TB
nodes[Nodes] --> router[FlowRouter] --> effects[Effects]
end
core --> desktop["Desktop host<br/>Tauri · native serial"]
core --> browser["Browser host<br/>WebAssembly · Web Serial"]
desktop & browser -->|Firmata| board[(Arduino)]
core -.->|codegen| sketch["Standalone<br/>.ino sketch"]
To learn more, read ARCHITECTURE.md (a five-minute map),
CONTEXT.md (the domain language) and docs/adr/
(the reason behind each design decision).
Built with Rust · WebAssembly · Tauri 2 · React · React Flow · TanStack Router/Query · Tailwind CSS v4 · Yjs · tRPC · Hono · Better Auth · Drizzle (PostgreSQL) · MQTT · Bun · Turborepo.
- Bun ≥ 1.3.5
- Rust (stable) and the Tauri prerequisites for your OS
- Docker, for the local PostgreSQL database
git clone https://github.com/xiduzo/microflow.git
cd microflow
bun install
bun db:start # start PostgreSQL in Docker
bun db:push # apply the schema
bun dev # run all appsTo run one app only, use bun dev:web (Studio in the browser), bun dev:native
(the desktop shell) or bun dev:server (the API and collaboration server).
To work on the Figma plugin, run bun dev in apps/figma-plugin. Then, in Figma, go to
Plugins → Development → Import plugin from manifest and select
apps/figma-plugin/manifest.json.
apps/
├── web/ Studio: React UI (src/) + Tauri desktop shell (src-tauri/)
├── server/ Hono + tRPC API and the Yjs collaboration server
├── figma-plugin/ Microflow Hardware Bridge for Figma
├── penpot-plugin/ Microflow for Penpot
└── fumadocs/ Documentation site (Next.js + Fumadocs)
crates/
├── microflow-core/ The flow runtime and Arduino code generation
├── microflow-runtime-wasm/ The runtime compiled to WebAssembly
├── microflow-firmata-wasm/ Firmata for the browser
└── microflow-codegen-wasm/ Sketch generation for the browser
packages/
└── api · auth · collab · db · env · mqtt · config
All scripts
| Script | Description |
|---|---|
bun dev |
Start all apps in dev mode |
bun dev:web |
Start Studio in the browser |
bun dev:native |
Start the Tauri desktop shell |
bun dev:server |
Start the API and collaboration server |
bun build |
Build all apps |
bun check-types |
Type-check the whole monorepo |
bun check |
Lint and format with Oxlint and Oxfmt |
bun bench |
Run the benchmarks (docs/benchmarks.md) |
bun db:start / db:stop |
Start or stop PostgreSQL in Docker |
bun db:push |
Push schema changes |
bun db:generate / db:migrate |
Generate or run migrations |
bun db:studio |
Open Drizzle Studio |
Tests: bun test in apps/web for TypeScript, and cargo test for Rust.
Contributions are welcome. You can report a bug, improve the docs or add a new node.
For security issues, see SECURITY.md.
Microflow is free and open source. If it helps you, you can support its development through GitHub Sponsors or Polar.