[{"data":1,"prerenderedAt":1890},["ShallowReactive",2],{"navigation":3,"\u002Fconcepts\u002Fautomate\u002Fworkflow":909,"\u002Fconcepts\u002Fautomate\u002Fworkflow-surround":1886},[4,59,188,271,445,591,760,791],{"title":5,"type":6,"device":6,"path":7,"stem":8,"children":9,"page":41},"Get Started",null,"\u002Fget-started\u002F","01.get-started",[10,15,42,47,51,55],{"title":11,"path":12,"stem":13,"type":14,"device":6},"Welcome to UniteLabs","\u002Fget-started\u002Fwelcome\u002F","01.get-started\u002F00.welcome","landing",{"title":16,"type":6,"device":6,"path":17,"stem":18,"children":19,"page":41},"Setup","\u002Fget-started\u002Fsetup\u002F","01.get-started\u002F01.setup",[20,25,29,33,37],{"title":21,"path":22,"stem":23,"type":24,"device":6},"Get access","\u002Fget-started\u002Fsetup\u002Fget-access\u002F","01.get-started\u002F01.setup\u002F00.get-access","howto",{"title":26,"path":27,"stem":28,"type":24,"device":6},"GroundControl","\u002Fget-started\u002Fsetup\u002Fgroundcontrol\u002F","01.get-started\u002F01.setup\u002F10.groundcontrol",{"title":30,"path":31,"stem":32,"type":24,"device":6},"Connect to Platform","\u002Fget-started\u002Fsetup\u002Fconnect-to-platform\u002F","01.get-started\u002F01.setup\u002F20.connect-to-platform",{"title":34,"path":35,"stem":36,"type":24,"device":6},"Set up your development machine","\u002Fget-started\u002Fsetup\u002Fdeveloper-machine\u002F","01.get-started\u002F01.setup\u002F30.developer-machine",{"title":38,"path":39,"stem":40,"type":24,"device":6},"SDK installation","\u002Fget-started\u002Fsetup\u002Fsdk-installation\u002F","01.get-started\u002F01.setup\u002F40.sdk-installation",false,{"title":43,"path":44,"stem":45,"type":46,"device":6},"Control a device","\u002Fget-started\u002Fcontrol-a-device\u002F","01.get-started\u002F02.control-a-device","tutorial",{"title":48,"path":49,"stem":50,"type":46,"device":6},"Liquid handling as code","\u002Fget-started\u002Fliquid-handling-as-code\u002F","01.get-started\u002F03.liquid-handling-as-code",{"title":52,"path":53,"stem":54,"type":46,"device":6},"Automate your workflows","\u002Fget-started\u002Fautomate-your-workflows\u002F","01.get-started\u002F04.automate-your-workflows",{"title":56,"path":57,"stem":58,"type":6,"device":6},"Self-Paced Setup Guide","\u002Fget-started\u002Fself-onboarding\u002F","01.get-started\u002F90.self-onboarding",{"title":60,"type":6,"device":6,"path":61,"stem":62,"children":63,"page":41},"How-to","\u002Fhow-to\u002F","02.how-to",[64,118,163,180],{"title":65,"type":6,"device":6,"path":66,"stem":67,"children":68,"page":41},"Connectors and devices","\u002Fhow-to\u002Fintegrate\u002F","02.how-to\u002F02.integrate",[69,102],{"title":70,"type":6,"device":6,"path":71,"stem":72,"children":73,"page":41},"Connect a device","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device",[74,78,82,86,90,94,98],{"title":75,"path":76,"stem":77,"type":24,"device":6},"Connector Configuration","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fconnector-configuration\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F10.connector-configuration",{"title":79,"path":80,"stem":81,"type":24,"device":6},"With an executable","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fwith-an-executable\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F20.with-an-executable",{"title":83,"path":84,"stem":85,"type":24,"device":6},"From source","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Ffrom-source\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F30.from-source",{"title":87,"path":88,"stem":89,"type":24,"device":6},"Build your own","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fbuild-yourself\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F40.build-yourself",{"title":91,"path":92,"stem":93,"type":24,"device":6},"Headless install","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fheadless-install\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F50.headless-install",{"title":95,"path":96,"stem":97,"type":24,"device":6},"Raspberry Pi","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fraspberry-pi\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F55.raspberry-pi",{"title":99,"path":100,"stem":101,"type":24,"device":6},"Multi-device Networking","\u002Fhow-to\u002Fintegrate\u002Fconnect-a-device\u002Fmultiple-devices\u002F","02.how-to\u002F02.integrate\u002F20.connect-a-device\u002F60.multiple-devices",{"title":103,"type":6,"device":6,"path":104,"stem":105,"children":106,"page":41},"Use a device","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device",[107,110,114],{"title":26,"path":108,"stem":109,"type":24,"device":6},"\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fgroundcontrol\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F10.groundcontrol",{"title":111,"path":112,"stem":113,"type":24,"device":6},"Platform","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fplatform\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F20.platform",{"title":115,"path":116,"stem":117,"type":24,"device":6},"UniteLabs SDK & REST API","\u002Fhow-to\u002Fintegrate\u002Fuse-a-device\u002Fpython\u002F","02.how-to\u002F02.integrate\u002F30.use-a-device\u002F30.python",{"title":119,"type":6,"device":6,"path":120,"stem":121,"children":122,"page":41},"Workflows","\u002Fhow-to\u002Fautomate\u002F","02.how-to\u002F07.automate",[123,127,131,135,139,143,147,151,155,159],{"title":124,"path":125,"stem":126,"type":24,"device":6},"Deploy a workflow","\u002Fhow-to\u002Fautomate\u002Fdeploy-a-workflow\u002F","02.how-to\u002F07.automate\u002F30.deploy-a-workflow",{"title":128,"path":129,"stem":130,"type":24,"device":6},"Run a workflow","\u002Fhow-to\u002Fautomate\u002Frun-a-workflow\u002F","02.how-to\u002F07.automate\u002F35.run-a-workflow",{"title":132,"path":133,"stem":134,"type":24,"device":6},"CI\u002FCD for workflows","\u002Fhow-to\u002Fautomate\u002Fcicd-for-workflows\u002F","02.how-to\u002F07.automate\u002F40.cicd-for-workflows",{"title":136,"path":137,"stem":138,"type":24,"device":6},"HITL basics","\u002Fhow-to\u002Fautomate\u002Fbasic-hitl\u002F","02.how-to\u002F07.automate\u002F50.basic-hitl",{"title":140,"path":141,"stem":142,"type":24,"device":6},"Slack notifications and operator confirmation","\u002Fhow-to\u002Fautomate\u002Fslack-notifications\u002F","02.how-to\u002F07.automate\u002F52.slack-notifications",{"title":144,"path":145,"stem":146,"type":24,"device":6},"Typed operator inputs","\u002Fhow-to\u002Fautomate\u002Ftyped-operator-inputs\u002F","02.how-to\u002F07.automate\u002F55.typed-operator-inputs",{"title":148,"path":149,"stem":150,"type":24,"device":6},"Pause and resume a run","\u002Fhow-to\u002Fautomate\u002Fpause-and-resume\u002F","02.how-to\u002F07.automate\u002F57.pause-and-resume",{"title":152,"path":153,"stem":154,"type":24,"device":6},"Error recovery","\u002Fhow-to\u002Fautomate\u002Fbasic-error-handling\u002F","02.how-to\u002F07.automate\u002F60.basic-error-handling",{"title":156,"path":157,"stem":158,"type":24,"device":6},"Advanced error handling","\u002Fhow-to\u002Fautomate\u002Fadvanced-error-handling\u002F","02.how-to\u002F07.automate\u002F70.advanced-error-handling",{"title":160,"path":161,"stem":162,"type":24,"device":6},"Emit lineage events","\u002Fhow-to\u002Fautomate\u002Femitting-lineage-events\u002F","02.how-to\u002F07.automate\u002F90.emitting-lineage-events",{"title":164,"type":6,"device":6,"path":165,"stem":166,"children":167,"page":41},"Data","\u002Fhow-to\u002Fobserve\u002F","02.how-to\u002F08.observe",[168,172,176],{"title":169,"path":170,"stem":171,"type":24,"device":6},"File System Connector","\u002Fhow-to\u002Fobserve\u002Ffilesystem-connector\u002F","02.how-to\u002F08.observe\u002F10.filesystem-connector",{"title":173,"path":174,"stem":175,"type":24,"device":6},"Building an ETL","\u002Fhow-to\u002Fobserve\u002Fbuilding-an-etl\u002F","02.how-to\u002F08.observe\u002F20.building-an-etl",{"title":177,"path":178,"stem":179,"type":24,"device":6},"Read lineage events","\u002Fhow-to\u002Fobserve\u002Freading-lineage-events\u002F","02.how-to\u002F08.observe\u002F30.reading-lineage-events",{"title":111,"type":6,"device":6,"path":181,"stem":182,"children":183,"page":41},"\u002Fhow-to\u002Fplatform\u002F","02.how-to\u002F09.platform",[184],{"title":185,"path":186,"stem":187,"type":24,"device":6},"UniteLabs Desktop","\u002Fhow-to\u002Fplatform\u002Funitelabs-desktop\u002F","02.how-to\u002F09.platform\u002F10.unitelabs-desktop",{"title":189,"type":6,"device":6,"path":190,"stem":191,"children":192},"Technical Reference","\u002Ftechnical-reference\u002F","03.technical-reference",[193,196,201,213,226,235,244,253,262],{"title":194,"path":190,"stem":195,"type":14,"device":6},"Overview","03.technical-reference\u002Findex",{"title":197,"path":198,"stem":199,"type":200,"device":6},"REST API","\u002Ftechnical-reference\u002Frest-api\u002F","03.technical-reference\u002F01.rest-api","reference",{"title":119,"type":6,"device":6,"path":202,"stem":203,"children":204,"page":41},"\u002Ftechnical-reference\u002Fautomate\u002F","03.technical-reference\u002F07.automate",[205,209],{"title":206,"path":207,"stem":208,"type":200,"device":6},"Workflow template","\u002Ftechnical-reference\u002Fautomate\u002Fworkflow-template\u002F","03.technical-reference\u002F07.automate\u002F05.workflow-template",{"title":210,"path":211,"stem":212,"type":200,"device":6},"Workflows REST API","\u002Ftechnical-reference\u002Fautomate\u002Fworkflows-api\u002F","03.technical-reference\u002F07.automate\u002F80.workflows-api",{"title":26,"type":6,"device":6,"path":214,"stem":215,"children":216},"\u002Ftechnical-reference\u002Fgroundcontrol\u002F","03.technical-reference\u002F10.groundcontrol\u002Findex",[217,218,222],{"title":194,"path":214,"stem":215,"type":14,"device":6},{"title":219,"path":220,"stem":221,"type":200,"device":6},"Network requirements","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fnetwork-requirements\u002F","03.technical-reference\u002F10.groundcontrol\u002F10.network-requirements",{"title":223,"path":224,"stem":225,"type":200,"device":6},"Changelog","\u002Ftechnical-reference\u002Fgroundcontrol\u002Fchangelog\u002F","03.technical-reference\u002F10.groundcontrol\u002F20.changelog",{"title":227,"type":6,"device":6,"path":228,"stem":229,"children":230},"UniteLabs SDK","\u002Ftechnical-reference\u002Fpython-sdk\u002F","03.technical-reference\u002F20.python-sdk\u002Findex",[231,232],{"title":194,"path":228,"stem":229,"type":14,"device":6},{"title":223,"path":233,"stem":234,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-sdk\u002Fchangelog\u002F","03.technical-reference\u002F20.python-sdk\u002F20.changelog",{"title":236,"type":6,"device":6,"path":237,"stem":238,"children":239},"Liquid Handling SDK","\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002F","03.technical-reference\u002F30.python-liquid-handling-sdk\u002Findex",[240,241],{"title":194,"path":237,"stem":238,"type":14,"device":6},{"title":223,"path":242,"stem":243,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-liquid-handling-sdk\u002Fchangelog\u002F","03.technical-reference\u002F30.python-liquid-handling-sdk\u002F20.changelog",{"title":245,"type":6,"device":6,"path":246,"stem":247,"children":248},"Labware","\u002Ftechnical-reference\u002Flabware\u002F","03.technical-reference\u002F40.labware\u002Findex",[249,250],{"title":194,"path":246,"stem":247,"type":14,"device":6},{"title":223,"path":251,"stem":252,"type":200,"device":6},"\u002Ftechnical-reference\u002Flabware\u002Fchangelog\u002F","03.technical-reference\u002F40.labware\u002F20.changelog",{"title":254,"type":6,"device":6,"path":255,"stem":256,"children":257},"Python Omnibus","\u002Ftechnical-reference\u002Fpython-omnibus\u002F","03.technical-reference\u002F50.python-omnibus\u002Findex",[258,259],{"title":194,"path":255,"stem":256,"type":14,"device":6},{"title":223,"path":260,"stem":261,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-omnibus\u002Fchangelog\u002F","03.technical-reference\u002F50.python-omnibus\u002F20.changelog",{"title":263,"type":6,"device":6,"path":264,"stem":265,"children":266},"Python CDK","\u002Ftechnical-reference\u002Fpython-cdk\u002F","03.technical-reference\u002F60.python-cdk\u002Findex",[267,268],{"title":194,"path":264,"stem":265,"type":14,"device":6},{"title":223,"path":269,"stem":270,"type":200,"device":6},"\u002Ftechnical-reference\u002Fpython-cdk\u002Fchangelog\u002F","03.technical-reference\u002F60.python-cdk\u002F20.changelog",{"title":272,"type":6,"device":6,"path":273,"stem":274,"children":275,"page":41},"Concepts","\u002Fconcepts\u002F","04.concepts",[276,315,339,383,422],{"title":277,"type":6,"device":6,"path":278,"stem":279,"children":280,"page":41},"Labs as code","\u002Fconcepts\u002Flabs-as-code\u002F","04.concepts\u002F01.labs-as-code",[281,286,290],{"title":282,"path":283,"stem":284,"type":285,"device":6},"Lab as Code","\u002Fconcepts\u002Flabs-as-code\u002Fwhy-code\u002F","04.concepts\u002F01.labs-as-code\u002F00.why-code","explanation",{"title":287,"path":288,"stem":289,"type":285,"device":6},"How it works","\u002Fconcepts\u002Flabs-as-code\u002Fhow-it-works\u002F","04.concepts\u002F01.labs-as-code\u002F01.how-it-works",{"title":291,"type":6,"device":6,"path":292,"stem":293,"children":294,"page":41},"Use Cases","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases",[295,299,303,307,311],{"title":296,"path":297,"stem":298,"type":285,"device":6},"Instrument Control","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Flow-level-instrument-control\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F10.low-level-instrument-control",{"title":300,"path":301,"stem":302,"type":285,"device":6},"Multi-device Control","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fmulti-device-control\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F20.multi-device-control",{"title":304,"path":305,"stem":306,"type":285,"device":6},"Workflow Orchestration","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fworkflow-orchestration\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F30.workflow-orchestration",{"title":308,"path":309,"stem":310,"type":285,"device":6},"Custom Apps and LIMS Integration","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fcustom-apps-lims\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F40.custom-apps-lims",{"title":312,"path":313,"stem":314,"type":285,"device":6},"Scale and Fleet Management","\u002Fconcepts\u002Flabs-as-code\u002Fuse-cases\u002Fscale-and-fleet\u002F","04.concepts\u002F01.labs-as-code\u002F02.use-cases\u002F50.scale-and-fleet",{"title":65,"type":6,"device":6,"path":316,"stem":317,"children":318,"page":41},"\u002Fconcepts\u002Fintegrate\u002F","04.concepts\u002F02.integrate",[319,323,327,331,335],{"title":320,"path":321,"stem":322,"type":285,"device":6},"Device","\u002Fconcepts\u002Fintegrate\u002Fdevice\u002F","04.concepts\u002F02.integrate\u002F05.device",{"title":324,"path":325,"stem":326,"type":285,"device":6},"Connector","\u002Fconcepts\u002Fintegrate\u002Fconnector\u002F","04.concepts\u002F02.integrate\u002F10.connector",{"title":328,"path":329,"stem":330,"type":285,"device":6},"Module","\u002Fconcepts\u002Fintegrate\u002Fmodule\u002F","04.concepts\u002F02.integrate\u002F20.module",{"title":332,"path":333,"stem":334,"type":285,"device":6},"Action","\u002Fconcepts\u002Fintegrate\u002Faction\u002F","04.concepts\u002F02.integrate\u002F30.action",{"title":336,"path":337,"stem":338,"type":285,"device":6},"Subscription","\u002Fconcepts\u002Fintegrate\u002Fsubscription\u002F","04.concepts\u002F02.integrate\u002F40.subscription",{"title":340,"type":6,"device":6,"path":341,"stem":342,"children":343,"page":41},"Liquid handling and robots","\u002Fconcepts\u002Foperate\u002F","04.concepts\u002F03.operate",[344,348,352,356,359,363,367,371,375,379],{"title":345,"path":346,"stem":347,"type":285,"device":6},"Liquid Handling","\u002Fconcepts\u002Foperate\u002Fliquid-handling\u002F","04.concepts\u002F03.operate\u002F10.liquid-handling",{"title":349,"path":350,"stem":351,"type":285,"device":6},"Modules","\u002Fconcepts\u002Foperate\u002Fmodules\u002F","04.concepts\u002F03.operate\u002F20.modules",{"title":353,"path":354,"stem":355,"type":285,"device":6},"Deck","\u002Fconcepts\u002Foperate\u002Fdeck\u002F","04.concepts\u002F03.operate\u002F30.deck",{"title":245,"path":357,"stem":358,"type":285,"device":6},"\u002Fconcepts\u002Foperate\u002Flabware\u002F","04.concepts\u002F03.operate\u002F40.labware",{"title":360,"path":361,"stem":362,"type":285,"device":6},"Liquids","\u002Fconcepts\u002Foperate\u002Fliquids\u002F","04.concepts\u002F03.operate\u002F50.liquids",{"title":364,"path":365,"stem":366,"type":285,"device":6},"Liquid Classes","\u002Fconcepts\u002Foperate\u002Fliquid-classes\u002F","04.concepts\u002F03.operate\u002F60.liquid-classes",{"title":368,"path":369,"stem":370,"type":285,"device":6},"Parameter Sets","\u002Fconcepts\u002Foperate\u002Fparameter-sets\u002F","04.concepts\u002F03.operate\u002F65.parameter-sets",{"title":372,"path":373,"stem":374,"type":285,"device":6},"Tips and Tip Tracking","\u002Fconcepts\u002Foperate\u002Ftips\u002F","04.concepts\u002F03.operate\u002F70.tips",{"title":376,"path":377,"stem":378,"type":285,"device":6},"Simulation","\u002Fconcepts\u002Foperate\u002Fsimulation\u002F","04.concepts\u002F03.operate\u002F80.simulation",{"title":380,"path":381,"stem":382,"type":285,"device":6},"Error Handling","\u002Fconcepts\u002Foperate\u002Ferror-handling\u002F","04.concepts\u002F03.operate\u002F90.error-handling",{"title":119,"type":6,"device":6,"path":384,"stem":385,"children":386,"page":41},"\u002Fconcepts\u002Fautomate\u002F","04.concepts\u002F07.automate",[387,391,395,399,403,407,411,415,419],{"title":388,"path":389,"stem":390,"type":285,"device":6},"Workflow","\u002Fconcepts\u002Fautomate\u002Fworkflow\u002F","04.concepts\u002F07.automate\u002F10.workflow",{"title":392,"path":393,"stem":394,"type":285,"device":6},"Phase","\u002Fconcepts\u002Fautomate\u002Fphase\u002F","04.concepts\u002F07.automate\u002F20.phase",{"title":396,"path":397,"stem":398,"type":285,"device":6},"Step","\u002Fconcepts\u002Fautomate\u002Fstep\u002F","04.concepts\u002F07.automate\u002F30.step",{"title":400,"path":401,"stem":402,"type":285,"device":6},"Runs","\u002Fconcepts\u002Fautomate\u002Fruns\u002F","04.concepts\u002F07.automate\u002F40.runs",{"title":404,"path":405,"stem":406,"type":285,"device":6},"Input","\u002Fconcepts\u002Fautomate\u002Finput\u002F","04.concepts\u002F07.automate\u002F50.input",{"title":408,"path":409,"stem":410,"type":285,"device":6},"Artifacts","\u002Fconcepts\u002Fautomate\u002Fartifacts\u002F","04.concepts\u002F07.automate\u002F60.artifacts",{"title":412,"path":413,"stem":414,"type":285,"device":6},"Logs","\u002Fconcepts\u002Fautomate\u002Flogs\u002F","04.concepts\u002F07.automate\u002F70.logs",{"title":416,"path":417,"stem":418,"type":285,"device":6},"Human in the Loop","\u002Fconcepts\u002Fautomate\u002Fhuman-in-the-loop\u002F","04.concepts\u002F07.automate\u002F80.human-in-the-loop",{"title":380,"path":420,"stem":421,"type":285,"device":6},"\u002Fconcepts\u002Fautomate\u002Ferror-handling\u002F","04.concepts\u002F07.automate\u002F90.error-handling",{"title":164,"type":6,"device":6,"path":423,"stem":424,"children":425,"page":41},"\u002Fconcepts\u002Fobserve\u002F","04.concepts\u002F08.observe",[426,429,433,437,441],{"title":194,"path":427,"stem":428,"type":14,"device":6},"\u002Fconcepts\u002Fobserve\u002Foverview\u002F","04.concepts\u002F08.observe\u002F10.overview",{"title":430,"path":431,"stem":432,"type":285,"device":6},"Object Storage","\u002Fconcepts\u002Fobserve\u002Fstorage\u002F","04.concepts\u002F08.observe\u002F10.storage",{"title":434,"path":435,"stem":436,"type":285,"device":6},"Secrets","\u002Fconcepts\u002Fobserve\u002Fsecrets\u002F","04.concepts\u002F08.observe\u002F20.secrets",{"title":438,"path":439,"stem":440,"type":285,"device":6},"Data sources","\u002Fconcepts\u002Fobserve\u002Fdata-sources\u002F","04.concepts\u002F08.observe\u002F30.data-sources",{"title":442,"path":443,"stem":444,"type":285,"device":6},"Data lineage","\u002Fconcepts\u002Fobserve\u002Fdata-lineage\u002F","04.concepts\u002F08.observe\u002F40.data-lineage",{"title":446,"type":6,"device":6,"path":447,"stem":448,"children":449,"page":41},"Devices","\u002Fdevices\u002F","05.devices",[450,453,501,514,530,567],{"title":194,"path":451,"stem":452,"type":14,"device":6},"\u002Fdevices\u002Foverview\u002F","05.devices\u002F00.overview",{"title":454,"path":455,"page":41,"children":456},"Heater-shakers","\u002Fdevices\u002Fheater-shakers\u002F",[457,478,488],{"title":458,"path":459,"stem":460,"type":200,"device":461},"QInstruments BioShake","\u002Fdevices\u002Fqinstruments-bioshake\u002F","05.devices\u002F10.qinstruments-bioshake",{"slug":462,"vendor":463,"category":464,"connector":462,"package":465,"models":466,"communication":473,"vendor_software":6,"os":474},"qinstruments-bioshake","QInstruments","Plate Shakers & Temperature Control","unitelabs-qinstruments-bioshake",[467,468,469,470,471,472],"BioShake 3000 \u002F 3000 elm \u002F 3000 elm DWP","BioShake 3000-T \u002F 3000-T elm","BioShake 5000 elm","BioShake D30 \u002F D30 elm \u002F D30-T \u002F D30-T elm","BioShake Q1 \u002F Q1 (1.2 mm) \u002F Q1 (3.0 mm) \u002F Q2","HeatPlate","serial (RS-232 over USB)",[475,476,477],"windows","linux","macos",{"title":479,"path":480,"stem":481,"type":200,"device":482},"QInstruments ColdPlate","\u002Fdevices\u002Fqinstruments-coldplate\u002F","05.devices\u002F20.qinstruments-coldplate",{"slug":483,"vendor":463,"category":464,"connector":462,"package":465,"models":484,"communication":473,"vendor_software":6,"os":487},"qinstruments-coldplate",[485,486],"ColdPlate","ColdPlate slim",[475,476,477],{"title":489,"path":490,"stem":491,"type":200,"device":492},"Inheco Thermoshake","\u002Fdevices\u002Finheco-thermoshake\u002F","05.devices\u002F30.inheco-thermoshake",{"slug":493,"vendor":494,"category":464,"connector":495,"models":496},"inheco-thermoshake","Inheco","inheco-tec-controller",[497,498,499,500],"Thermoshake AC","Thermoshake AC LC","Thermoshake Classic","Thermoshake RM",{"title":502,"path":503,"page":41,"children":504},"Incubation","\u002Fdevices\u002Fincubation\u002F",[505],{"title":506,"path":507,"stem":508,"type":200,"device":509},"Inheco SCILA","\u002Fdevices\u002Finheco-scila\u002F","05.devices\u002F40.inheco-scila",{"slug":510,"vendor":494,"category":502,"connector":510,"models":511},"inheco-scila",[512,513],"SCILA","SCILA MIX 2-gas mixing device",{"title":515,"path":516,"page":41,"children":517},"Thermal cyclers","\u002Fdevices\u002Fthermal-cyclers\u002F",[518],{"title":519,"path":520,"stem":521,"type":200,"device":522},"Inheco ODTC","\u002Fdevices\u002Finheco-odtc\u002F","05.devices\u002F50.inheco-odtc",{"slug":523,"vendor":494,"category":524,"connector":523,"models":525},"inheco-odtc","Thermal Cycler",[526,527,528,529],"ODTC 96","ODTC 96XL","ODTC 384","ODTC 384XL",{"title":531,"path":532,"page":41,"children":533},"Readers","\u002Fdevices\u002Freaders\u002F",[534,543,552],{"title":535,"path":536,"stem":537,"type":200,"device":538},"Agilent Biotek Gen5","\u002Fdevices\u002Fbiotek-gen5\u002F","05.devices\u002F60.biotek-gen5",{"slug":539,"vendor":540,"category":541,"connector":542},"biotek-gen5","Agilent","Readers & Imagers","gen5",{"title":544,"path":545,"stem":546,"type":200,"device":547},"Biotek Synergy H1","\u002Fdevices\u002Fbiotek-synergy-h1\u002F","05.devices\u002F70.biotek-synergy-h1",{"slug":548,"vendor":540,"category":541,"connector":549,"models":550},"biotek-synergy-h1","agilent-synergy-h1",[551],"BioTek Synergy H1",{"title":553,"path":554,"stem":555,"type":200,"device":556},"Tecan Infinite 200","\u002Fdevices\u002Ftecan-infinite-200\u002F","05.devices\u002F75.tecan-infinite-200",{"slug":557,"vendor":558,"category":541,"connector":557,"package":559,"models":560,"communication":564,"vendor_software":565,"os":566},"tecan-infinite-200","Tecan","unitelabs-tecan-infinite-200",[561,562,563],"Infinite F200","Infinite M200","Infinite M200 Pro","USB","i-control on Windows only, for its USB driver",[475,476,477],{"title":568,"path":569,"page":41,"children":570},"Tilt & turn","\u002Fdevices\u002Ftilt-and-turn\u002F",[571,581],{"title":572,"path":573,"stem":574,"type":200,"device":575},"QInstruments TiltStation","\u002Fdevices\u002Fqinstruments-tiltstation\u002F","05.devices\u002F80.qinstruments-tiltstation",{"slug":576,"vendor":463,"category":577,"connector":462,"package":465,"models":578,"communication":473,"vendor_software":6,"os":580},"qinstruments-tiltstation","Plate Tilting",[579],"TiltStation",[475,476,477],{"title":582,"path":583,"stem":584,"type":200,"device":585},"QInstruments TurnStation","\u002Fdevices\u002Fqinstruments-turnstation\u002F","05.devices\u002F90.qinstruments-turnstation",{"slug":586,"vendor":463,"category":587,"connector":462,"package":465,"models":588,"communication":473,"vendor_software":6,"os":590},"qinstruments-turnstation","Plate Rotating",[589],"TurnStation",[475,476,477],{"title":592,"type":6,"device":6,"path":593,"stem":594,"children":595,"page":41},"Liquid Handling and Robots","\u002Fliquid-handling-and-robots\u002F","06.liquid-handling-and-robots",[596,599,611,635,638,679,704,721,738],{"title":194,"path":597,"stem":598,"type":14,"device":6},"\u002Fliquid-handling-and-robots\u002Foverview\u002F","06.liquid-handling-and-robots\u002F00.overview",{"title":353,"type":6,"device":6,"path":600,"stem":601,"children":602,"page":41},"\u002Fliquid-handling-and-robots\u002Fdeck\u002F","06.liquid-handling-and-robots\u002F10.deck",[603,607],{"title":604,"path":605,"stem":606,"type":24,"device":6},"Building a Deck","\u002Fliquid-handling-and-robots\u002Fdeck\u002Fbuilding-a-deck\u002F","06.liquid-handling-and-robots\u002F10.deck\u002F10.building-a-deck",{"title":608,"path":609,"stem":610,"type":24,"device":6},"Save\u002FLoad a Deck","\u002Fliquid-handling-and-robots\u002Fdeck\u002Fsave-load-deck\u002F","06.liquid-handling-and-robots\u002F10.deck\u002F20.save-load-deck",{"title":612,"type":6,"device":6,"path":613,"stem":614,"children":615,"page":41},"Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting",[616,620,624,628,631],{"title":617,"path":618,"stem":619,"type":24,"device":6},"Basic Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F10.basic-pipetting",{"title":621,"path":622,"stem":623,"type":24,"device":6},"Advanced Pipetting","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fadvanced-pipetting\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F20.advanced-pipetting",{"title":625,"path":626,"stem":627,"type":24,"device":6},"Tip Handling","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F30.tip-handling",{"title":364,"path":629,"stem":630,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fpipetting\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F40.liquid-classes",{"title":632,"path":633,"stem":634,"type":24,"device":6},"Labware Transport","\u002Fliquid-handling-and-robots\u002Fpipetting\u002Flabware-transport\u002F","06.liquid-handling-and-robots\u002F20.pipetting\u002F50.labware-transport",{"title":376,"path":636,"stem":637,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fsimulation\u002F","06.liquid-handling-and-robots\u002F30.simulation",{"title":639,"type":6,"device":6,"path":640,"stem":641,"children":642,"page":41},"Hamilton STAR","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star",[643,647,651,655,659,663,667,671,675],{"title":644,"path":645,"stem":646,"type":24,"device":6},"Positioning & Movement","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fpositioning\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F10.positioning",{"title":648,"path":649,"stem":650,"type":24,"device":6},"Gripper Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcore-gripper\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F20.core-gripper",{"title":652,"path":653,"stem":654,"type":24,"device":6},"iSWAP Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fiswap\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F30.iswap",{"title":656,"path":657,"stem":658,"type":24,"device":6},"Using TADM","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Ftadm\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F40.tadm",{"title":660,"path":661,"stem":662,"type":24,"device":6},"Autoload Module","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fautoload\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F50.autoload",{"title":664,"path":665,"stem":666,"type":24,"device":6},"Waste Block","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fwaste-block\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F60.waste-block",{"title":668,"path":669,"stem":670,"type":24,"device":6},"Complex Mixing","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcomplex-mixing\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F66.complex-mixing",{"title":672,"path":673,"stem":674,"type":24,"device":6},"Teaching Gripper Paddle Positions","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fgripper-positions\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F70.gripper-positions",{"title":676,"path":677,"stem":678,"type":24,"device":6},"Training a Custom Deck Position With the iSWAP","\u002Fliquid-handling-and-robots\u002Fhamilton-star\u002Fcustom-deck-position\u002F","06.liquid-handling-and-robots\u002F41.hamilton-star\u002F75.custom-deck-position",{"title":680,"type":6,"device":6,"path":681,"stem":682,"children":683,"page":41},"Hamilton Vantage","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage",[684,688,692,696,700],{"title":685,"path":686,"stem":687,"type":24,"device":6},"Waste Configuration","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fwaste-configuration\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F05.waste-configuration",{"title":689,"path":690,"stem":691,"type":24,"device":6},"Covers and Lights","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fcovers-and-lights\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F10.covers-and-lights",{"title":693,"path":694,"stem":695,"type":24,"device":6},"IDL Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fidl\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F20.idl",{"title":697,"path":698,"stem":699,"type":24,"device":6},"IPG Module","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fipg\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F30.ipg",{"title":701,"path":702,"stem":703,"type":24,"device":6},"XL Pipettes","\u002Fliquid-handling-and-robots\u002Fhamilton-vantage\u002Fxl-channels\u002F","06.liquid-handling-and-robots\u002F42.hamilton-vantage\u002F40.xl-channels",{"title":705,"type":6,"device":6,"path":706,"stem":707,"children":708,"page":41},"Agilent Bravo","\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo",[709,712,715,718],{"title":625,"path":710,"stem":711,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F10.tip-handling",{"title":617,"path":713,"stem":714,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F20.basic-pipetting",{"title":364,"path":716,"stem":717,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F25.liquid-classes",{"title":648,"path":719,"stem":720,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Fagilent-bravo\u002Fusing-the-gripper\u002F","06.liquid-handling-and-robots\u002F43.agilent-bravo\u002F30.using-the-gripper",{"title":722,"type":6,"device":6,"path":723,"stem":724,"children":725,"page":41},"Tecan FluentControl","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol",[726,730,734],{"title":727,"path":728,"stem":729,"type":24,"device":6},"Connect & Run a Method","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Fconnect-and-run\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F10.connect-and-run",{"title":731,"path":732,"stem":733,"type":24,"device":6},"Sending XML Commands","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Fsending-xml-commands\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F20.sending-xml-commands",{"title":735,"path":736,"stem":737,"type":24,"device":6},"Full Workflow Example","\u002Fliquid-handling-and-robots\u002Ftecan-fluentcontrol\u002Ffull-workflow-example\u002F","06.liquid-handling-and-robots\u002F44.tecan-fluentcontrol\u002F30.full-workflow-example",{"title":739,"type":6,"device":6,"path":740,"stem":741,"children":742,"page":41},"Tecan Freedom EVO","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo",[743,747,750,753,757],{"title":744,"path":745,"stem":746,"type":24,"device":6},"Deck & Carriers","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fdeck-and-carriers\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F10.deck-and-carriers",{"title":625,"path":748,"stem":749,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Ftip-handling\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F20.tip-handling",{"title":617,"path":751,"stem":752,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fbasic-pipetting\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F30.basic-pipetting",{"title":754,"path":755,"stem":756,"type":24,"device":6},"Using the Gripper (RoMa)","\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fusing-the-gripper\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F40.using-the-gripper",{"title":364,"path":758,"stem":759,"type":24,"device":6},"\u002Fliquid-handling-and-robots\u002Ftecan-freedom-evo\u002Fliquid-classes\u002F","06.liquid-handling-and-robots\u002F45.tecan-freedom-evo\u002F50.liquid-classes",{"title":245,"type":6,"device":6,"path":761,"stem":762,"children":763,"page":41},"\u002Flabware\u002F","07.labware",[764,767,771,775,779,783,787],{"title":194,"path":765,"stem":766,"type":14,"device":6},"\u002Flabware\u002Foverview\u002F","07.labware\u002F00.overview",{"title":768,"path":769,"stem":770,"type":200,"device":6},"Standard Labware","\u002Flabware\u002Fstandard-labware\u002F","07.labware\u002F10.standard-labware",{"title":772,"path":773,"stem":774,"type":200,"device":6},"Plates","\u002Flabware\u002Fplates\u002F","07.labware\u002F20.plates",{"title":776,"path":777,"stem":778,"type":200,"device":6},"Tips and Tip Racks","\u002Flabware\u002Ftips-and-racks\u002F","07.labware\u002F30.tips-and-racks",{"title":780,"path":781,"stem":782,"type":200,"device":6},"Tubes and Tube Racks","\u002Flabware\u002Ftubes-and-tube-racks\u002F","07.labware\u002F40.tubes-and-tube-racks",{"title":784,"path":785,"stem":786,"type":200,"device":6},"Troughs","\u002Flabware\u002Ftroughs\u002F","07.labware\u002F50.troughs",{"title":788,"path":789,"stem":790,"type":200,"device":6},"Carriers and Adapters","\u002Flabware\u002Fcarriers-and-adapters\u002F","07.labware\u002F60.carriers-and-adapters",{"title":792,"type":6,"device":6,"path":793,"stem":794,"children":795},"Connector Development (CDK)","\u002Fconnector-development\u002F","20.connector-development",[796,798,822,855,863,903],{"title":194,"path":793,"stem":797,"type":14,"device":6},"20.connector-development\u002Findex",{"title":799,"path":800,"stem":801,"children":802,"page":41},"Getting Started","\u002Fconnector-development\u002Fgetting-started\u002F","20.connector-development\u002F10.getting-started",[803,806,810,814,818],{"title":194,"path":804,"stem":805,"type":285,"device":6},"\u002Fconnector-development\u002Fgetting-started\u002Foverview\u002F","20.connector-development\u002F10.getting-started\u002F10.overview",{"title":807,"path":808,"stem":809,"type":24,"device":6},"What's new","\u002Fconnector-development\u002Fgetting-started\u002Fwhats-new\u002F","20.connector-development\u002F10.getting-started\u002F20.whats-new",{"title":811,"path":812,"stem":813,"type":24,"device":6},"Installation","\u002Fconnector-development\u002Fgetting-started\u002Finstallation\u002F","20.connector-development\u002F10.getting-started\u002F30.installation",{"title":815,"path":816,"stem":817,"type":24,"device":6},"Python Environment and Project Management","\u002Fconnector-development\u002Fgetting-started\u002Fpython-environments\u002F","20.connector-development\u002F10.getting-started\u002F35.python-environments",{"title":819,"path":820,"stem":821,"type":24,"device":6},"Contributing","\u002Fconnector-development\u002Fgetting-started\u002Fcontributing\u002F","20.connector-development\u002F10.getting-started\u002F40.contributing",{"title":823,"path":824,"stem":825,"children":826,"page":41},"Tutorial","\u002Fconnector-development\u002Ftutorial\u002F","20.connector-development\u002F20.tutorial",[827,831,835,839,843,847,851],{"title":828,"path":829,"stem":830,"type":46,"device":6},"Walkthrough","\u002Fconnector-development\u002Ftutorial\u002Fwalkthrough\u002F","20.connector-development\u002F20.tutorial\u002F00.walkthrough",{"title":832,"path":833,"stem":834,"type":46,"device":6},"SiLA Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fsila-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F10.sila-endpoints",{"title":836,"path":837,"stem":838,"type":46,"device":6},"Data Endpoints","\u002Fconnector-development\u002Ftutorial\u002Fdata-endpoints\u002F","20.connector-development\u002F20.tutorial\u002F20.data-endpoints",{"title":840,"path":841,"stem":842,"type":46,"device":6},"Controls","\u002Fconnector-development\u002Ftutorial\u002Fcontrols\u002F","20.connector-development\u002F20.tutorial\u002F30.controls",{"title":844,"path":845,"stem":846,"type":46,"device":6},"SiLA Data Types","\u002Fconnector-development\u002Ftutorial\u002Fdata-types\u002F","20.connector-development\u002F20.tutorial\u002F40.data-types",{"title":848,"path":849,"stem":850,"type":46,"device":6},"Feature","\u002Fconnector-development\u002Ftutorial\u002Fconnector-structure\u002F","20.connector-development\u002F20.tutorial\u002F70.connector-structure",{"title":852,"path":853,"stem":854,"type":46,"device":6},"Hardware Communication","\u002Fconnector-development\u002Ftutorial\u002Fhardware-communication\u002F","20.connector-development\u002F20.tutorial\u002F90.hardware-communication",{"title":272,"type":6,"device":6,"path":856,"stem":857,"children":858,"page":41},"\u002Fconnector-development\u002Fconcepts\u002F","20.connector-development\u002F30.concepts",[859],{"title":860,"path":861,"stem":862,"type":285,"device":6},"SiLA","\u002Fconnector-development\u002Fconcepts\u002Fsila\u002F","20.connector-development\u002F30.concepts\u002Fsila",{"title":864,"path":865,"stem":866,"children":867,"page":41},"Guides","\u002Fconnector-development\u002Fguides\u002F","20.connector-development\u002F40.guides",[868,872,876,880,884,888,892,895,899],{"title":869,"path":870,"stem":871,"type":24,"device":6},"Configuration","\u002Fconnector-development\u002Fguides\u002Fconfiguration\u002F","20.connector-development\u002F40.guides\u002F20.configuration",{"title":873,"path":874,"stem":875,"type":24,"device":6},"Logging","\u002Fconnector-development\u002Fguides\u002Flogging\u002F","20.connector-development\u002F40.guides\u002F21.logging",{"title":877,"path":878,"stem":879,"type":24,"device":6},"Deployment","\u002Fconnector-development\u002Fguides\u002Fdeployment\u002F","20.connector-development\u002F40.guides\u002F30.deployment",{"title":881,"path":882,"stem":883,"type":24,"device":6},"Security","\u002Fconnector-development\u002Fguides\u002Fsecurity\u002F","20.connector-development\u002F40.guides\u002F40.security",{"title":885,"path":886,"stem":887,"type":24,"device":6},"Subscriptions","\u002Fconnector-development\u002Fguides\u002Fsubscriptions\u002F","20.connector-development\u002F40.guides\u002F45.subscriptions",{"title":889,"path":890,"stem":891,"type":24,"device":6},"Execution Modes","\u002Fconnector-development\u002Fguides\u002Fexecution-modes\u002F","20.connector-development\u002F40.guides\u002F46.execution-modes",{"title":380,"path":893,"stem":894,"type":24,"device":6},"\u002Fconnector-development\u002Fguides\u002Ferror-handling\u002F","20.connector-development\u002F40.guides\u002F50.error-handling",{"title":896,"path":897,"stem":898,"type":24,"device":6},"Serial Troubleshooting","\u002Fconnector-development\u002Fguides\u002Fserial-troubleshooting\u002F","20.connector-development\u002F40.guides\u002F70.serial-troubleshooting",{"title":900,"path":901,"stem":902,"type":24,"device":6},"Testing","\u002Fconnector-development\u002Fguides\u002Ftesting\u002F","20.connector-development\u002F40.guides\u002F80.testing",{"title":904,"path":905,"stem":906,"children":907,"type":6,"device":6},"References","\u002Fconnector-development\u002Freference\u002F","20.connector-development\u002F50.reference\u002Findex",[908],{"title":904,"path":905,"stem":906,"type":200,"device":6},{"id":910,"title":388,"body":911,"description":1880,"device":6,"extension":1881,"links":6,"meta":1882,"navigation":1098,"path":1883,"seo":1884,"stem":390,"type":285,"__hash__":1885},"docs\u002F04.concepts\u002F07.automate\u002F10.workflow.md",{"type":912,"value":913,"toc":1869},"minimark",[914,927,934,937,942,945,1024,1041,1045,1260,1266,1270,1396,1410,1414,1447,1451,1454,1536,1540,1543,1628,1632,1639,1754,1763,1800,1804,1811,1828,1834,1838,1865],[915,916,919],"callout",{"color":917,"icon":918,"to":207},"primary","i-lucide-mouse-pointer-click",[920,921,922,926],"p",{},[923,924,925],"strong",{},"Prefer to start from a working example?"," Clone the workflow template: reference workflows (sanity check, liquid handling, HITL) you can run in simulation and deploy as-is.",[920,928,929,930,933],{},"A ",[923,931,932],{},"workflow"," is the top-level executable process you write to achieve a scientific outcome. It coordinates timing, logic, data flow, and physical state across one or more instruments, and it owns the state of all samples and resources for the duration of the run.",[920,935,936],{},"Put another way, a workflow is a lab protocol written in Python. The protocol is the procedure your lab already follows. The workflow is that procedure as code, which the platform runs, records, and lets your team start.",[938,939,941],"h2",{"id":940},"the-automation-hierarchy","The automation hierarchy",[920,943,944],{},"UniteLabs workflows are built from four nested concepts:",[946,947,948,964],"table",{},[949,950,951],"thead",{},[952,953,954,958,961],"tr",{},[955,956,957],"th",{},"Concept",[955,959,960],{},"Role",[955,962,963],{},"Example",[965,966,967,980,995,1009],"tbody",{},[952,968,969,974,977],{},[970,971,972],"td",{},[923,973,388],{},[970,975,976],{},"The top-level process, defined by the scientific result it produces.",[970,978,979],{},"An ELISA assay, from sample preparation to detection",[952,981,982,989,992],{},[970,983,984],{},[985,986,987],"a",{"href":393},[923,988,392],{},[970,990,991],{},"A group of steps that ends in a stable state a run can resume from.",[970,993,994],{},"Sample preparation, washing, detection",[952,996,997,1003,1006],{},[970,998,999],{},[985,1000,1001],{"href":397},[923,1002,396],{},[970,1004,1005],{},"A single action on one device. It completes or fails as a whole.",[970,1007,1008],{},"Shake a plate, seal a plate, aspirate 50 µl",[952,1010,1011,1015,1018],{},[970,1012,1013],{},[923,1014,332],{},[970,1016,1017],{},"A device endpoint, generated from the device interface. Called inside steps, holds no logic.",[970,1019,1020],{},[1021,1022,1023],"code",{},"shaker.shake_controller.set_rpm(300)",[920,1025,1026,1027,1032,1033,1036,1037,1040],{},"Once started, a workflow creates a ",[985,1028,1029],{"href":401},[923,1030,1031],{},"Run",": a single execution of that workflow. Keep workflows, phases, and steps under version control in Git. To reuse phases and steps across workflows, collect them in a shared library inside your workflow repository. The ",[985,1034,1035],{"href":207},"workflow template"," does this in its ",[1021,1038,1039],{},"shared\u002F"," package.",[938,1042,1044],{"id":1043},"a-minimal-example","A minimal example",[1046,1047,1053],"pre",{"className":1048,"code":1049,"filename":1050,"language":1051,"meta":1052,"style":1052},"language-python shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","from unitelabs.sdk import __version__ as sdk_version\nfrom unitelabs.sdk import get_logger, workflow\n\n\n@workflow(name=\"Hello World\")\nasync def hello_world(recipient_name: str = \"world\") -> None:\n    \"\"\"\n    Log a greeting and SDK version info to confirm the environment works.\n\n    Args:\n      recipient_name: Name to greet (default: \"world\").\n    \"\"\"\n\n    logger = get_logger()\n    logger.info(f\"Hello, {recipient_name}!\")\n    logger.info(f\"UniteLabs SDK: {sdk_version}\")\n","w01-hello-world\u002Fsrc\u002Fw01_hello_world\u002Fworkflow.py","python","",[1021,1054,1055,1081,1093,1100,1105,1129,1162,1168,1174,1179,1185,1191,1196,1201,1212,1238],{"__ignoreMap":1052},[1056,1057,1060,1064,1068,1071,1075,1078],"span",{"class":1058,"line":1059},"line",1,[1056,1061,1063],{"class":1062},"sxkbv","from",[1056,1065,1067],{"class":1066},"sc-9e"," unitelabs.sdk ",[1056,1069,1070],{"class":1062},"import",[1056,1072,1074],{"class":1073},"sOiAX"," __version__",[1056,1076,1077],{"class":1062}," as",[1056,1079,1080],{"class":1066}," sdk_version\n",[1056,1082,1084,1086,1088,1090],{"class":1058,"line":1083},2,[1056,1085,1063],{"class":1062},[1056,1087,1067],{"class":1066},[1056,1089,1070],{"class":1062},[1056,1091,1092],{"class":1066}," get_logger, workflow\n",[1056,1094,1096],{"class":1058,"line":1095},3,[1056,1097,1099],{"emptyLinePlaceholder":1098},true,"\n",[1056,1101,1103],{"class":1058,"line":1102},4,[1056,1104,1099],{"emptyLinePlaceholder":1098},[1056,1106,1108,1112,1115,1119,1122,1126],{"class":1058,"line":1107},5,[1056,1109,1111],{"class":1110},"s4qFZ","@workflow",[1056,1113,1114],{"class":1066},"(",[1056,1116,1118],{"class":1117},"sNqAu","name",[1056,1120,1121],{"class":1062},"=",[1056,1123,1125],{"class":1124},"sCx38","\"Hello World\"",[1056,1127,1128],{"class":1066},")\n",[1056,1130,1132,1135,1138,1141,1144,1147,1150,1153,1156,1159],{"class":1058,"line":1131},6,[1056,1133,1134],{"class":1062},"async",[1056,1136,1137],{"class":1062}," def",[1056,1139,1140],{"class":1110}," hello_world",[1056,1142,1143],{"class":1066},"(recipient_name: ",[1056,1145,1146],{"class":1073},"str",[1056,1148,1149],{"class":1062}," =",[1056,1151,1152],{"class":1124}," \"world\"",[1056,1154,1155],{"class":1066},") -> ",[1056,1157,1158],{"class":1073},"None",[1056,1160,1161],{"class":1066},":\n",[1056,1163,1165],{"class":1058,"line":1164},7,[1056,1166,1167],{"class":1124},"    \"\"\"\n",[1056,1169,1171],{"class":1058,"line":1170},8,[1056,1172,1173],{"class":1124},"    Log a greeting and SDK version info to confirm the environment works.\n",[1056,1175,1177],{"class":1058,"line":1176},9,[1056,1178,1099],{"emptyLinePlaceholder":1098},[1056,1180,1182],{"class":1058,"line":1181},10,[1056,1183,1184],{"class":1124},"    Args:\n",[1056,1186,1188],{"class":1058,"line":1187},11,[1056,1189,1190],{"class":1124},"      recipient_name: Name to greet (default: \"world\").\n",[1056,1192,1194],{"class":1058,"line":1193},12,[1056,1195,1167],{"class":1124},[1056,1197,1199],{"class":1058,"line":1198},13,[1056,1200,1099],{"emptyLinePlaceholder":1098},[1056,1202,1204,1207,1209],{"class":1058,"line":1203},14,[1056,1205,1206],{"class":1066},"    logger ",[1056,1208,1121],{"class":1062},[1056,1210,1211],{"class":1066}," get_logger()\n",[1056,1213,1215,1218,1221,1224,1227,1230,1233,1236],{"class":1058,"line":1214},15,[1056,1216,1217],{"class":1066},"    logger.info(",[1056,1219,1220],{"class":1062},"f",[1056,1222,1223],{"class":1124},"\"Hello, ",[1056,1225,1226],{"class":1062},"{",[1056,1228,1229],{"class":1066},"recipient_name",[1056,1231,1232],{"class":1062},"}",[1056,1234,1235],{"class":1124},"!\"",[1056,1237,1128],{"class":1066},[1056,1239,1241,1243,1245,1248,1250,1253,1255,1258],{"class":1058,"line":1240},16,[1056,1242,1217],{"class":1066},[1056,1244,1220],{"class":1062},[1056,1246,1247],{"class":1124},"\"UniteLabs SDK: ",[1056,1249,1226],{"class":1062},[1056,1251,1252],{"class":1066},"sdk_version",[1056,1254,1232],{"class":1062},[1056,1256,1257],{"class":1124},"\"",[1056,1259,1128],{"class":1066},[920,1261,1262,1263,1265],{},"The ",[1021,1264,1111],{}," decorator registers the function with the workflow engine. Phases are called like regular Python functions; the workflow engine handles scheduling, parallelism, and recovery.",[938,1267,1269],{"id":1268},"composing-phases","Composing phases",[1046,1271,1274],{"className":1048,"code":1272,"filename":1273,"language":1051,"meta":1052,"style":1052},"from unitelabs.sdk import workflow\nfrom .phases import sample_preparation, agitation, washing_cycle, detection\n\n@workflow(name=\"ELISA\")\nasync def main_workflow():\n    plate = await sample_preparation()\n    await agitation(plate)\n\n    for _ in range(3):\n        await washing_cycle()\n\n    await detection()\n","workflows\u002Felisa.py",[1021,1275,1276,1287,1299,1303,1318,1330,1343,1351,1355,1377,1385,1389],{"__ignoreMap":1052},[1056,1277,1278,1280,1282,1284],{"class":1058,"line":1059},[1056,1279,1063],{"class":1062},[1056,1281,1067],{"class":1066},[1056,1283,1070],{"class":1062},[1056,1285,1286],{"class":1066}," workflow\n",[1056,1288,1289,1291,1294,1296],{"class":1058,"line":1083},[1056,1290,1063],{"class":1062},[1056,1292,1293],{"class":1066}," .phases ",[1056,1295,1070],{"class":1062},[1056,1297,1298],{"class":1066}," sample_preparation, agitation, washing_cycle, detection\n",[1056,1300,1301],{"class":1058,"line":1095},[1056,1302,1099],{"emptyLinePlaceholder":1098},[1056,1304,1305,1307,1309,1311,1313,1316],{"class":1058,"line":1102},[1056,1306,1111],{"class":1110},[1056,1308,1114],{"class":1066},[1056,1310,1118],{"class":1117},[1056,1312,1121],{"class":1062},[1056,1314,1315],{"class":1124},"\"ELISA\"",[1056,1317,1128],{"class":1066},[1056,1319,1320,1322,1324,1327],{"class":1058,"line":1107},[1056,1321,1134],{"class":1062},[1056,1323,1137],{"class":1062},[1056,1325,1326],{"class":1110}," main_workflow",[1056,1328,1329],{"class":1066},"():\n",[1056,1331,1332,1335,1337,1340],{"class":1058,"line":1131},[1056,1333,1334],{"class":1066},"    plate ",[1056,1336,1121],{"class":1062},[1056,1338,1339],{"class":1062}," await",[1056,1341,1342],{"class":1066}," sample_preparation()\n",[1056,1344,1345,1348],{"class":1058,"line":1164},[1056,1346,1347],{"class":1062},"    await",[1056,1349,1350],{"class":1066}," agitation(plate)\n",[1056,1352,1353],{"class":1058,"line":1170},[1056,1354,1099],{"emptyLinePlaceholder":1098},[1056,1356,1357,1360,1363,1366,1369,1371,1374],{"class":1058,"line":1176},[1056,1358,1359],{"class":1062},"    for",[1056,1361,1362],{"class":1066}," _ ",[1056,1364,1365],{"class":1062},"in",[1056,1367,1368],{"class":1073}," range",[1056,1370,1114],{"class":1066},[1056,1372,1373],{"class":1073},"3",[1056,1375,1376],{"class":1066},"):\n",[1056,1378,1379,1382],{"class":1058,"line":1181},[1056,1380,1381],{"class":1062},"        await",[1056,1383,1384],{"class":1066}," washing_cycle()\n",[1056,1386,1387],{"class":1058,"line":1187},[1056,1388,1099],{"emptyLinePlaceholder":1098},[1056,1390,1391,1393],{"class":1058,"line":1193},[1056,1392,1347],{"class":1062},[1056,1394,1395],{"class":1066}," detection()\n",[920,1397,1398,1399,1402,1403,1402,1406,1409],{},"The workflow drives the scientific narrative. Phases represent the meaningful stages — ",[1021,1400,1401],{},"sample_preparation",", ",[1021,1404,1405],{},"agitation",[1021,1407,1408],{},"detection"," — while the workflow defines the order and control flow between them.",[938,1411,1413],{"id":1412},"key-properties","Key properties",[1415,1416,1417,1429,1435,1441],"ul",{},[1418,1419,1420,1423,1424,1428],"li",{},[923,1421,1422],{},"Scientific goal",": a workflow is defined by ",[1425,1426,1427],"em",{},"what result it produces"," (e.g., \"ELISA\"), not the hardware it uses",[1418,1430,1431,1434],{},[923,1432,1433],{},"Control flow",": supports loops, conditionals, and branching; not limited to a linear sequence",[1418,1436,1437,1440],{},[923,1438,1439],{},"State ownership",": the workflow is the one place that keeps track of sample identity, lineage, and all consumed resources across phases",[1418,1442,1443,1446],{},[923,1444,1445],{},"Versioned",": workflows are deployed and versioned; each run is linked to a specific version",[938,1448,1450],{"id":1449},"non-linear-control-flow","Non-linear control flow",[920,1452,1453],{},"Because a workflow is just a Python function, you can use standard control flow:",[1046,1455,1458],{"className":1048,"code":1456,"filename":1457,"language":1051,"meta":1052,"style":1052},"@workflow(name=\"Repeat Until Clean\")\nasync def repeat_workflow():\n    result = await initial_wash()\n\n    while not result.is_clean:\n        result = await additional_wash()\n\n    await final_rinse()\n","workflows\u002Frepeat_until_clean.py",[1021,1459,1460,1475,1486,1498,1502,1513,1525,1529],{"__ignoreMap":1052},[1056,1461,1462,1464,1466,1468,1470,1473],{"class":1058,"line":1059},[1056,1463,1111],{"class":1110},[1056,1465,1114],{"class":1066},[1056,1467,1118],{"class":1117},[1056,1469,1121],{"class":1062},[1056,1471,1472],{"class":1124},"\"Repeat Until Clean\"",[1056,1474,1128],{"class":1066},[1056,1476,1477,1479,1481,1484],{"class":1058,"line":1083},[1056,1478,1134],{"class":1062},[1056,1480,1137],{"class":1062},[1056,1482,1483],{"class":1110}," repeat_workflow",[1056,1485,1329],{"class":1066},[1056,1487,1488,1491,1493,1495],{"class":1058,"line":1095},[1056,1489,1490],{"class":1066},"    result ",[1056,1492,1121],{"class":1062},[1056,1494,1339],{"class":1062},[1056,1496,1497],{"class":1066}," initial_wash()\n",[1056,1499,1500],{"class":1058,"line":1102},[1056,1501,1099],{"emptyLinePlaceholder":1098},[1056,1503,1504,1507,1510],{"class":1058,"line":1107},[1056,1505,1506],{"class":1062},"    while",[1056,1508,1509],{"class":1062}," not",[1056,1511,1512],{"class":1066}," result.is_clean:\n",[1056,1514,1515,1518,1520,1522],{"class":1058,"line":1131},[1056,1516,1517],{"class":1066},"        result ",[1056,1519,1121],{"class":1062},[1056,1521,1339],{"class":1062},[1056,1523,1524],{"class":1066}," additional_wash()\n",[1056,1526,1527],{"class":1058,"line":1164},[1056,1528,1099],{"emptyLinePlaceholder":1098},[1056,1530,1531,1533],{"class":1058,"line":1170},[1056,1532,1347],{"class":1062},[1056,1534,1535],{"class":1066}," final_rinse()\n",[938,1537,1539],{"id":1538},"parallel-phases","Parallel phases",[920,1541,1542],{},"Phases with no dependency between them can run in parallel. The workflow engine detects independence automatically — you only need to express the data dependency:",[1046,1544,1547],{"className":1048,"code":1545,"filename":1546,"language":1051,"meta":1052,"style":1052},"@workflow(name=\"Parallel Preparation\")\nasync def parallel_workflow():\n    # These three phases have no shared inputs — the workflow engine runs them concurrently\n    reagent_a = await prepare_reagent_a()\n    reagent_b = await prepare_reagent_b()\n    await wash_plate()\n\n    # This phase depends on both reagents, so it waits for both to complete\n    await combine(reagent_a, reagent_b)\n","workflows\u002Fparallel_example.py",[1021,1548,1549,1564,1575,1581,1593,1605,1612,1616,1621],{"__ignoreMap":1052},[1056,1550,1551,1553,1555,1557,1559,1562],{"class":1058,"line":1059},[1056,1552,1111],{"class":1110},[1056,1554,1114],{"class":1066},[1056,1556,1118],{"class":1117},[1056,1558,1121],{"class":1062},[1056,1560,1561],{"class":1124},"\"Parallel Preparation\"",[1056,1563,1128],{"class":1066},[1056,1565,1566,1568,1570,1573],{"class":1058,"line":1083},[1056,1567,1134],{"class":1062},[1056,1569,1137],{"class":1062},[1056,1571,1572],{"class":1110}," parallel_workflow",[1056,1574,1329],{"class":1066},[1056,1576,1577],{"class":1058,"line":1095},[1056,1578,1580],{"class":1579},"sIsDC","    # These three phases have no shared inputs — the workflow engine runs them concurrently\n",[1056,1582,1583,1586,1588,1590],{"class":1058,"line":1102},[1056,1584,1585],{"class":1066},"    reagent_a ",[1056,1587,1121],{"class":1062},[1056,1589,1339],{"class":1062},[1056,1591,1592],{"class":1066}," prepare_reagent_a()\n",[1056,1594,1595,1598,1600,1602],{"class":1058,"line":1107},[1056,1596,1597],{"class":1066},"    reagent_b ",[1056,1599,1121],{"class":1062},[1056,1601,1339],{"class":1062},[1056,1603,1604],{"class":1066}," prepare_reagent_b()\n",[1056,1606,1607,1609],{"class":1058,"line":1131},[1056,1608,1347],{"class":1062},[1056,1610,1611],{"class":1066}," wash_plate()\n",[1056,1613,1614],{"class":1058,"line":1164},[1056,1615,1099],{"emptyLinePlaceholder":1098},[1056,1617,1618],{"class":1058,"line":1170},[1056,1619,1620],{"class":1579},"    # This phase depends on both reagents, so it waits for both to complete\n",[1056,1622,1623,1625],{"class":1058,"line":1176},[1056,1624,1347],{"class":1062},[1056,1626,1627],{"class":1066}," combine(reagent_a, reagent_b)\n",[938,1629,1631],{"id":1630},"run-context","Run context",[920,1633,1634,1635,1638],{},"Every run carries a ",[1021,1636,1637],{},"context"," object: the single place workflow-level state lives for the duration of the run. Rather than passing a run mode, a simulation flag, or a feature flag as an argument through every intermediate phase and step, you declare it once as a workflow input and read it from context wherever it's needed — no matter how deeply nested the phase or step is.",[1046,1640,1642],{"className":1048,"code":1641,"filename":1273,"language":1051,"meta":1052,"style":1052},"from unitelabs.sdk import get_context, phase, workflow\n\n@workflow(name=\"ELISA\")\nasync def main_workflow(simulate: bool = False):\n    await sample_preparation()\n    await detection()\n\n@phase()\nasync def detection():\n    simulate = get_context().workflow_parameters.get(\"simulate\", False)\n    ...\n",[1021,1643,1644,1655,1659,1673,1694,1700,1706,1710,1718,1729,1749],{"__ignoreMap":1052},[1056,1645,1646,1648,1650,1652],{"class":1058,"line":1059},[1056,1647,1063],{"class":1062},[1056,1649,1067],{"class":1066},[1056,1651,1070],{"class":1062},[1056,1653,1654],{"class":1066}," get_context, phase, workflow\n",[1056,1656,1657],{"class":1058,"line":1083},[1056,1658,1099],{"emptyLinePlaceholder":1098},[1056,1660,1661,1663,1665,1667,1669,1671],{"class":1058,"line":1095},[1056,1662,1111],{"class":1110},[1056,1664,1114],{"class":1066},[1056,1666,1118],{"class":1117},[1056,1668,1121],{"class":1062},[1056,1670,1315],{"class":1124},[1056,1672,1128],{"class":1066},[1056,1674,1675,1677,1679,1681,1684,1687,1689,1692],{"class":1058,"line":1102},[1056,1676,1134],{"class":1062},[1056,1678,1137],{"class":1062},[1056,1680,1326],{"class":1110},[1056,1682,1683],{"class":1066},"(simulate: ",[1056,1685,1686],{"class":1073},"bool",[1056,1688,1149],{"class":1062},[1056,1690,1691],{"class":1073}," False",[1056,1693,1376],{"class":1066},[1056,1695,1696,1698],{"class":1058,"line":1107},[1056,1697,1347],{"class":1062},[1056,1699,1342],{"class":1066},[1056,1701,1702,1704],{"class":1058,"line":1131},[1056,1703,1347],{"class":1062},[1056,1705,1395],{"class":1066},[1056,1707,1708],{"class":1058,"line":1164},[1056,1709,1099],{"emptyLinePlaceholder":1098},[1056,1711,1712,1715],{"class":1058,"line":1170},[1056,1713,1714],{"class":1110},"@phase",[1056,1716,1717],{"class":1066},"()\n",[1056,1719,1720,1722,1724,1727],{"class":1058,"line":1176},[1056,1721,1134],{"class":1062},[1056,1723,1137],{"class":1062},[1056,1725,1726],{"class":1110}," detection",[1056,1728,1329],{"class":1066},[1056,1730,1731,1734,1736,1739,1742,1744,1747],{"class":1058,"line":1181},[1056,1732,1733],{"class":1066},"    simulate ",[1056,1735,1121],{"class":1062},[1056,1737,1738],{"class":1066}," get_context().workflow_parameters.get(",[1056,1740,1741],{"class":1124},"\"simulate\"",[1056,1743,1402],{"class":1066},[1056,1745,1746],{"class":1073},"False",[1056,1748,1128],{"class":1066},[1056,1750,1751],{"class":1058,"line":1187},[1056,1752,1753],{"class":1073},"    ...\n",[920,1755,1756,1758,1759,1762],{},[1021,1757,1408],{}," never declares ",[1021,1760,1761],{},"simulate"," in its own signature, and neither does any step it calls in turn — it reads the value straight from context. Adding a new workflow-level parameter later needs no signature changes anywhere downstream.",[1415,1764,1765,1775,1784,1794],{},[1418,1766,1767,1770,1771,1774],{},[1021,1768,1769],{},"get_context()"," returns the ",[1021,1772,1773],{},"RuntimeContext"," active for the currently running workflow, phase, or step.",[1418,1776,1777,1780,1781,1783],{},[1021,1778,1779],{},"context.workflow_parameters"," is a read-only mapping, populated automatically from the arguments the top-level ",[1021,1782,1111],{}," function is called with. Nothing needs to be called to fill it in. This is only available with SDK >= 0.15.0 or liquid handling SDK >= 0.34.0.",[1418,1785,1786,1787,1790,1791,1793],{},"Only workflow-level arguments are published this way. A phase's or step's own arguments remain ordinary function arguments — they are not added to ",[1021,1788,1789],{},"workflow_parameters",". See ",[985,1792,404],{"href":405}," for the full workflow-vs-phase breakdown.",[1418,1795,1796,1797,1799],{},"The context also carries the run across phase boundaries — it's what a resumed run reloads to pick up where it left off (see ",[985,1798,400],{"href":401},").",[938,1801,1803],{"id":1802},"run-locally-or-on-the-platform","Run locally or on the platform",[920,1805,1806,1807,1810],{},"The same workflow file runs on your machine and on the platform, without code changes. During development, run it directly from your IDE or terminal. The ",[1021,1808,1809],{},"pyproject.toml"," defines a script that calls the workflow, so you can run it like this:",[1046,1812,1816],{"className":1813,"code":1814,"language":1815,"meta":1052,"style":1052},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","uv run workflow\n","bash",[1021,1817,1818],{"__ignoreMap":1052},[1056,1819,1820,1823,1826],{"class":1058,"line":1059},[1056,1821,1822],{"class":1117},"uv",[1056,1824,1825],{"class":1124}," run",[1056,1827,1286],{"class":1124},[920,1829,1830,1831,1833],{},"When you're ready for scheduled, tracked, or team-accessible runs, deploy the same file to the platform, with no code changes required. See ",[985,1832,124],{"href":125}," for the deployment steps.",[938,1835,1837],{"id":1836},"next-steps","Next steps",[1415,1839,1840,1845,1850,1855,1860],{},[1418,1841,1842,1844],{},[985,1843,206],{"href":207},": clone the reference workflows and run one in simulation",[1418,1846,1847,1849],{},[985,1848,52],{"href":53},": write and run a workflow end to end",[1418,1851,1852,1854],{},[985,1853,392],{"href":393},": the logical stages a workflow is composed of",[1418,1856,1857,1859],{},[985,1858,400],{"href":401},": what happens when a workflow executes",[1418,1861,1862,1864],{},[985,1863,404],{"href":405},": parameterize a workflow at run time",[1866,1867,1868],"style",{},"html pre.shiki code .sxkbv, html code.shiki .sxkbv{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html pre.shiki code .sc-9e, html code.shiki .sc-9e{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}html pre.shiki code .sOiAX, html code.shiki .sOiAX{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#79C0FF}html pre.shiki code .s4qFZ, html code.shiki .s4qFZ{--shiki-light:#622CBC;--shiki-default:#622CBC;--shiki-dark:#D2A8FF}html pre.shiki code .sNqAu, html code.shiki .sNqAu{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFA657}html pre.shiki code .sCx38, html code.shiki .sCx38{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#A5D6FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sIsDC, html code.shiki .sIsDC{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#8B949E}",{"title":1052,"searchDepth":1059,"depth":1083,"links":1870},[1871,1872,1873,1874,1875,1876,1877,1878,1879],{"id":940,"depth":1083,"text":941},{"id":1043,"depth":1083,"text":1044},{"id":1268,"depth":1083,"text":1269},{"id":1412,"depth":1083,"text":1413},{"id":1449,"depth":1083,"text":1450},{"id":1538,"depth":1083,"text":1539},{"id":1630,"depth":1083,"text":1631},{"id":1802,"depth":1083,"text":1803},{"id":1836,"depth":1083,"text":1837},"The top-level process in UniteLabs, defined by the scientific result it produces. It coordinates phases, data flow, and physical state, and runs the same way locally and on the platform.","md",{},"\u002Fconcepts\u002Fautomate\u002Fworkflow",{"title":388,"description":1880},"1u6eXZl6t7qcxAA3PT4xscns8MvYoRRex6dH46RFeXI",[1887,1889],{"title":380,"description":1888,"path":381},"Handle device failures, timeouts, and unexpected states safely in your lab automation scripts.",{"title":392,"description":991,"path":393},1791294123906]