A plug-and-play web interface for flexible SDLs
Building UIs for SDLs is challenging because flexibility and modularity make them unpredictable — yet accessibility is essential for democratisation of AI-driven scientific discovery.
IvoryOS bridges the gap by:
- Dynamically inspecting initialized Python modules (hardware APIs, high-level functions, or workflows)
- Automatically displaying functions and parameters in a web UI
- Allowing users to design, manage, and execute experimental workflows with minimal changes to existing scripts
- Providing natural language support for workflow design and execution, check IvoryOS MCP for more details.
Platforms: Compatible with Linux, macOS, and Windows (developed/tested on Windows).
Python:
- Recommended: Python ≥3.10
- Minimum: Python ≥3.7 (without Ax optimizer support)
Core Dependencies:
Click to expand
- bcrypt~=4.0
- Flask-Login~=0.6
- Flask-Session~=0.8
- Flask-SocketIO~=5.3
- Flask-SQLAlchemy~=3.1
- SQLAlchemy-Utils~=0.41
- Flask-WTF~=1.2
- python-dotenv==1.0.1
Optional:
- ax-platform (≥1.0, Python≥3.10)
- baybe
From PyPI:
pip install ivoryos
From source:
git clone https://gitlab.com/heingroup/ivoryos.git
cd ivoryos
pip install -e .
In your SDL script,
my_robot = Robot()
import ivoryos
ivoryos.run(__name__)
You can now access the web UI at http://127.0.0.1:8000, create an account, login, and start designing workflows!
direct function calling Devices tab
- Design Editor: drag/add function to canvas in Design tab. click
Compile and Run
button to go to the execution configuration page - Execution Config: configure iteration methods and parameters in Compile/Run tab.
- Design Library: manage workflow scripts in Library tab.
- Workflow Data: Execution records are in Data tab.
after one successful connection, a blueprint will be automatically saved and made accessible without hardware connection. In a new Python script in the same directory, use ivoryos.run()
to start offline mode.
Add single or multiple loggers:
ivoryos.run(__name__, logger="logger name")
ivoryos.run(__name__, logger=["logger 1", "logger 2"])
Add single or multiple notification handlers for pause
feature in flow control:
def slack_bot(msg: str = "Hi"):
"""
a function that can be used as a notification handler function("msg")
:param msg: message to send
"""
from slack_sdk import WebClient
slack_token = "your slack token"
client = WebClient(token=slack_token)
my_user_id = "your user id" # replace with your actual Slack user ID
client.chat_postMessage(channel=my_user_id, text=msg)
import ivoryos
ivoryos.run(__name__, notification_handler=slack_bot)
Created automatically on first run:
ivoryos_data/
:ivoryos_data/config_csv/
: Batch configurationcsv
ivoryos_data/pseudo_deck/
: Offline deck.pkl
ivoryos_data/results/
: Execution resultsivoryos_data/scripts/
: Compiled workflows Python scripts
default.log
: Application logsivoryos.db
: Local database
In the abstract_sdl.py
ivoryos.run(__name__)
- Running on all addresses (0.0.0.0)
- Running on http://127.0.0.1:8000
- Running on http://0.0.0.0:8000
- dropdown input
- snapshot version control
- optimizer-agnostic
- prefect compatibility
- check batch-config file compatibility
If you find this project useful, please consider citing the following manuscript:
Zhang, W., Hao, L., Lai, V. et al. IvoryOS: an interoperable web interface for orchestrating Python-based self-driving laboratories. Nat Commun 16, 5182 (2025).
@article{zhang_et_al_2025,
author = {Wenyu Zhang and Lucy Hao and Veronica Lai and Ryan Corkery and Jacob Jessiman and Jiayu Zhang and Junliang Liu and Yusuke Sato and Maria Politi and Matthew E. Reish and Rebekah Greenwood and Noah Depner and Jiyoon Min and Rama El-khawaldeh and Paloma Prieto and Ekaterina Trushina and Jason E. Hein},
title = {{IvoryOS}: an interoperable web interface for orchestrating {Python-based} self-driving laboratories},
journal = {Nature Communications},
year = {2025},
volume = {16},
number = {1},
pages = {5182},
doi = {10.1038/s41467-025-60514-w},
url = {https://doi.org/10.1038/s41467-025-60514-w}
}
For an additional perspective related to the development of the tool, please see:
Zhang, W., Hein, J. Behind IvoryOS: Empowering Scientists to Harness Self-Driving Labs for Accelerated Discovery. Springer Nature Research Communities (2025).
@misc{zhang_hein_2025,
author = {Wenyu Zhang and Jason Hein},
title = {Behind {IvoryOS}: Empowering Scientists to Harness Self-Driving Labs for Accelerated Discovery},
howpublished = {Springer Nature Research Communities},
year = {2025},
month = {Jun},
day = {18},
url = {https://communities.springernature.com/posts/behind-ivoryos-empowering-scientists-to-harness-self-driving-labs-for-accelerated-discovery}
}
Authors acknowledge Telescope Innovations Corp., UBC Hein Lab, and Acceleration Consortium members for their valuable suggestions and contributions.