OpenOT2

Open-source web-controlled liquid handling for OT-2 robots

Python FastAPI OT-2 Compatible
Try Create Task View on GitHub

Features

Everything you need to control your OT-2 from the browser.

Robot Control

Full HTTP API client for the OT-2 robot. Create runs, load pipettes and labware, aspirate, dispense, pick up tips, and more -- all programmable through Python or the web UI.

Vision System

Integrated USB camera support with computer vision for tip detection and liquid analysis. Monitor experiments visually and extract color data from well plates in real time.

Protocol Execution

Define multi-step protocols with built-in step handlers for common operations. Includes error recovery, pause/resume, and real-time progress tracking for complex workflows.

Web Interface

Dark-themed web dashboard with 5-step Create Task wizard, saved task management, real-time run monitor, hardware diagnostics, and protocol-ordered calibration -- all from the browser.

LLM Integration

Describe your experiment in plain English, generate a prompt with full API reference, paste into Claude Opus 4.6, GPT-5.4 Pro, or Gemini 3.1 Pro. Paste back the output, validate, calibrate, and run -- zero coding required.

Architecture

Four modular packages that work together seamlessly.

webapp

FastAPI web layer, templates, API endpoints, deck config

protocol

Protocol executor, error recovery, protocol generator

vision

USB camera, tip analyzer, liquid analyzer

openot2

OT2Client, OT2Operations, task runner, step models

▼   ▼   ▼   ▼
OT-2 Robot — Opentrons HTTP API · USB Camera · Deck Slots 1-11

Quick Start

Get up and running in minutes.

# Clone the repository git clone https://github.com/xthomaswang/OpenOT2.git cd OpenOT2 # Install dependencies pip install -e . # Configure your deck layout # Edit .config/deck.yaml with your labware and pipettes # Launch the web interface python -m webapp --config .config/deck.yaml --robot 192.168.x.x # Open http://localhost:8000 in your browser # Use Create Task wizard to build protocols with any LLM
# Or use OpenOT2 programmatically from openot2 import OT2Client, OT2Operations client = OT2Client("http://192.168.x.x:31950") client.create_run() # Load pipette and labware pipette_id = client.load_pipette("p300_single_gen2", "left") plate_id = client.load_labware("corning_96_wellplate_360ul_flat", "1") tiprack_id = client.load_labware("opentrons_96_tiprack_300ul", "10") # High-level operations ops = OT2Operations(client) ops.transfer(tiprack_id, source_id, plate_id, tip_well="A1", source_well="A1", dest_well="A1", volume=100)

Ready to automate your experiments?

Use the Create Task wizard to describe your experiment, generate a prompt for any LLM, and get a ready-to-run protocol in minutes.

Try Create Task Run Protocol Simulator Star on GitHub