[{"data":1,"prerenderedAt":2070},["ShallowReactive",2],{"navigation":3,"\u002Ftechnical-reference\u002Fautomate\u002Fworkflow-template":909,"\u002Ftechnical-reference\u002Fautomate\u002Fworkflow-template-surround":2065},[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":206,"body":911,"description":2059,"device":6,"extension":2060,"links":6,"meta":2061,"navigation":1591,"path":2062,"seo":2063,"stem":208,"type":200,"__hash__":2064},"docs\u002F03.technical-reference\u002F07.automate\u002F05.workflow-template.md",{"type":912,"value":913,"toc":2043},"minimark",[914,940,945,969,1067,1084,1088,1105,1115,1126,1144,1148,1151,1156,1189,1207,1211,1222,1238,1325,1340,1344,1351,1415,1428,1432,1435,1438,1458,1461,1474,1478,1481,1499,1509,1521,1525,1528,1551,1564,1636,1642,1645,1649,1656,1659,1672,1675,1693,1696,1714,1741,1757,1761,1785,1792,1871,1892,1896,1905,1975,1981,1985,2039],[915,916,917,918,927,928,931,932,935,936,939],"p",{},"The ",[919,920,926],"a",{"href":921,"rel":922,"target":925},"https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fworkflows\u002Fworkflow-template",[923,924],"nofollow","noopener","_blank","workflow template"," contains four standalone examples organized as ",[919,929,930],{"href":389},"workflows",", ",[919,933,934],{"href":393},"phases",", and ",[919,937,938],{"href":397},"steps",". W01 runs without platform credentials or hardware. Clone the repository to run the examples or use it as the starting point for a workflow project.",[941,942,944],"h2",{"id":943},"four-reference-workflows","Four reference workflows",[915,946,947,948,952,953,931,957,960,961,964,965,968],{},"The template ships four examples of increasing complexity. Each lives in its own top-level directory as a ",[949,950,951],"strong",{},"standalone Python package"," with its own ",[954,955,956],"code",{},"pyproject.toml",[954,958,959],{},"uv.lock",", version, and ",[954,962,963],{},"[tool.unitelabs.workflow]"," metadata. Each workflow declares its own dependencies and releases on its own schedule, while shared code lives in the ",[954,966,967],{},"shared\u002F"," package next to them.",[970,971,972,987],"table",{},[973,974,975],"thead",{},[976,977,978,982,984],"tr",{},[979,980,981],"th",{},"#",[979,983,388],{},[979,985,986],{},"Demonstrates",[988,989,990,1010,1025,1052],"tbody",{},[976,991,992,998,1003],{},[993,994,995],"td",{},[949,996,997],{},"W01",[993,999,1000],{},[954,1001,1002],{},"hello_world",[993,1004,1005,1006,1009],{},"Minimal ",[954,1007,1008],{},"@workflow"," that logs the SDK version. Requires no hardware or platform connection.",[976,1011,1012,1017,1022],{},[993,1013,1014],{},[949,1015,1016],{},"W02",[993,1018,1019],{},[954,1020,1021],{},"liquid_handling",[993,1023,1024],{},"Eight-channel plate-to-plate transfer on a mocked Hamilton Microlab STAR. Demonstrates the workflow, phase, and step layers without hardware.",[976,1026,1027,1032,1037],{},[993,1028,1029],{},[949,1030,1031],{},"W03",[993,1033,1034],{},[954,1035,1036],{},"plateloc_sealer",[993,1038,1039,1040,1043,1044,1047,1048,1051],{},"Operator-guided plate sealing. Shows ",[919,1041,1042],{"href":417},"human in the loop"," with ",[954,1045,1046],{},"operator_confirm()"," inside a ",[919,1049,1050],{"href":393},"phase",".",[976,1053,1054,1059,1064],{},[993,1055,1056],{},[949,1057,1058],{},"W04",[993,1060,1061],{},[954,1062,1063],{},"tecan_fluent_control",[993,1065,1066],{},"Minimal demo for a Tecan Fluent: connects to FluentControl, verifies the channel, and optionally runs a named method. Shows a workflow driving vendor software through a connector.",[915,1068,1069,1070,1072,1073,1076,1077,1080,1081,1051],{},"Each workflow is a self-contained Python package at the repo root. The sibling ",[954,1071,967],{}," library holds the cross-workflow pieces (per-instrument config, custom labware, reusable ",[954,1074,1075],{},"@step"," steps, helpers) and is consumed by each workflow via ",[954,1078,1079],{},"shared = { path = \"..\u002Fshared\", editable = true }"," in its ",[954,1082,1083],{},"[tool.uv.sources]",[941,1085,1087],{"id":1086},"project-structure","Project structure",[915,1089,1090,1091,1093,1094,1097,1098,1101,1102,1051],{},"The directory layout maps directly onto the taxonomy. Reusable ",[954,1092,1075],{}," implementations live in ",[954,1095,1096],{},"shared\u002Fsrc\u002Fshared\u002Fsteps\u002F",", grouped by component. Each workflow lives in its own top-level directory named ",[954,1099,1100],{},"w\u003CNN>-\u003Cname>",": a two-digit number followed by a lowercase name with hyphens, for example ",[954,1103,1104],{},"w02-liquid-handling",[1106,1107,1112],"pre",{"className":1108,"code":1110,"language":1111},[1109],"language-text","workflow-template\u002F                       # uv workspace root (monorepo)\n├── shared\u002F                              # Shared library package. Add as many custom packages.\n│   ├── src\u002Fshared\u002F\n│   │   ├── config\u002F                      # Device configs (plateloc.py, microlab_star.py, …)\n│   │   ├── library\u002F                     # Custom labware definitions\n│   │   │   └── labware\u002F\n│   │   ├── steps\u002F                       # Custom step library: reusable @step functions by component\n│   │   │   ├── plateloc\u002F\n│   │   │   │   ├── _helpers.py          # Plain async SDK wrappers (not tracked)\n│   │   │   │   └── _steps.py            # @step public API\n│   │   │   └── liquid_handler\u002F\n│   │   │       ├── _helpers.py\n│   │   │       └── _steps.py\n│   │   └── utils\u002F                       # operator_input.py, etc.\n│   ├── tests\u002F\n│   ├── pyproject.toml\n│   └── uv.lock\n│\n├── w01-hello-world\u002F                     # Standalone workflow app\n│   ├── src\u002Fw01_hello_world\u002F\n│   │   ├── __main__.py                  # `uv run workflow` entrypoint\n│   │   └── workflow.py\n│   ├── tests\u002F\n│   ├── pyproject.toml                   # workflow specific pyproject.toml\n│   └── uv.lock\n│\n├── w02-liquid-handling\u002F                 # Standalone workflow app\n│   ├── src\u002Fw02_liquid_handling\u002F\n│   │   ├── __main__.py\n│   │   ├── workflow.py\n│   │   ├── phase_01_setup.py\n│   │   └── phase_02_transfer.py\n│   └── ...\n│\n├── w03-plateloc-sealer\u002F                 # Standalone workflow app\n│   └── ...\n│\n├── w04-tecan-fluent-control\u002F            # Standalone workflow app\n│   ├── src\u002Fw04_tecan_fluent_control\u002F\n│   │   ├── __main__.py\n│   │   ├── workflow.py\n│   │   ├── phase_01_connect.py\n│   │   └── phase_02_run_method.py\n│   └── ...\n│\n├── scripts\u002F\n│   └── deploy.py                        # See usage in pyproject.toml [tool.unitelabs.workflow])\n│\n├── .github\u002F                             # CI\n├── .gitlab-ci.yml\n├── .env \u002F .env.example                  # BASE_URL, AUTH_URL, CLIENT_ID, CLIENT_SECRET\n├── AGENTS.md                            # authoring rules: layers, retry policy, naming\n├── pytest.ini\n├── ruff.toml\n├── workflow-template.code-workspace     # VS Code multi-root workspace\n└── README.md\n","text",[954,1113,1110],{"__ignoreMap":1114},"",[915,1116,1117,1118,1125],{},"The repository's ",[919,1119,1122],{"href":1120,"rel":1121,"target":925},"https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fworkflows\u002Fworkflow-template\u002F-\u002Fblob\u002Fmain\u002FAGENTS.md",[923,924],[954,1123,1124],{},"AGENTS.md"," is the authoritative authoring guide for retry policy, naming conventions, and what belongs where.",[1127,1128,1131],"callout",{"color":1129,"icon":1130},"info","i-heroicons-information-circle",[915,1132,1133,1136,1137,1140,1141,1143],{},[949,1134,1135],{},"Why is every workflow its own package?"," Workflows often need different ",[954,1138,1139],{},"unitelabs-*"," SDK versions, for example when they target different tenants or instrument generations. Because each workflow has its own lockfile (",[954,1142,959],{},", where uv records the exact version of every dependency), you can upgrade one workflow without touching the others.",[941,1145,1147],{"id":1146},"clone-and-deploy","Clone and deploy",[915,1149,1150],{},"End-to-end: clone the repo, run the reference workflows in your IDE, then deploy a workflow to the platform.",[1152,1153,1155],"h3",{"id":1154},"_1-clone-the-repository","1. Clone the repository",[1106,1157,1161],{"className":1158,"code":1159,"language":1160,"meta":1114,"style":1114},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-default","git clone https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fworkflows\u002Fworkflow-template.git\ncd workflow-template\n","bash",[954,1162,1163,1179],{"__ignoreMap":1114},[1164,1165,1168,1172,1176],"span",{"class":1166,"line":1167},"line",1,[1164,1169,1171],{"class":1170},"sNqAu","git",[1164,1173,1175],{"class":1174},"sCx38"," clone",[1164,1177,1178],{"class":1174}," https:\u002F\u002Fgitlab.com\u002Funitelabs\u002Fworkflows\u002Fworkflow-template.git\n",[1164,1180,1182,1186],{"class":1166,"line":1181},2,[1164,1183,1185],{"class":1184},"sOiAX","cd",[1164,1187,1188],{"class":1174}," workflow-template\n",[915,1190,1191,1192,1195,1196,1199,1200,1202,1203,1206],{},"In your file explorer, navigate into the cloned ",[954,1193,1194],{},"workflow-template\u002F"," directory and open ",[954,1197,1198],{},"workflow-template.code-workspace"," with VS Code. It opens directly into the pre-configured multi-root workspace, with each workflow and ",[954,1201,967],{}," loaded as a side-by-side root. After you sync dependencies in step 3, the per-folder ",[954,1204,1205],{},".venv"," is recognized natively.",[1152,1208,1210],{"id":1209},"_2-configure-credentials","2. Configure credentials",[915,1212,1213,1214,1217,1218,1221],{},"Copy ",[954,1215,1216],{},".env.example"," to ",[954,1219,1220],{},".env"," and fill in the four values. These credentials are required for the UniteLabs Python client object to establish a connection to the platform API for e.g. connector communication:",[1106,1223,1225],{"className":1158,"code":1224,"language":1160,"meta":1114,"style":1114},"cp .env.example .env\n",[954,1226,1227],{"__ignoreMap":1114},[1164,1228,1229,1232,1235],{"class":1166,"line":1167},[1164,1230,1231],{"class":1170},"cp",[1164,1233,1234],{"class":1174}," .env.example",[1164,1236,1237],{"class":1174}," .env\n",[1106,1239,1241],{"className":1158,"code":1240,"filename":1220,"language":1160,"meta":1114,"style":1114},"BASE_URL=https:\u002F\u002Fapi.\u003Cyour-tenant>.unitelabs.io\u002F\nAUTH_URL=https:\u002F\u002Fauth.\u003Cyour-tenant>.unitelabs.io\u002Frealms\u002F\u003Ctenant-id>\u002Fprotocol\u002Fopenid-connect\u002F\nCLIENT_ID=\u003Cyour-client-id>\nCLIENT_SECRET=\u003Cyour-client-secret>\n",[954,1242,1243,1268,1297,1312],{"__ignoreMap":1114},[1164,1244,1245,1249,1253,1256,1259,1262,1265],{"class":1166,"line":1167},[1164,1246,1248],{"class":1247},"sc-9e","BASE_URL",[1164,1250,1252],{"class":1251},"sxkbv","=",[1164,1254,1255],{"class":1174},"https:\u002F\u002Fapi.",[1164,1257,1258],{"class":1251},"\u003C",[1164,1260,1261],{"class":1174},"your-tenant",[1164,1263,1264],{"class":1251},">",[1164,1266,1267],{"class":1174},".unitelabs.io\u002F\n",[1164,1269,1270,1273,1275,1278,1280,1282,1284,1287,1289,1292,1294],{"class":1166,"line":1181},[1164,1271,1272],{"class":1247},"AUTH_URL",[1164,1274,1252],{"class":1251},[1164,1276,1277],{"class":1174},"https:\u002F\u002Fauth.",[1164,1279,1258],{"class":1251},[1164,1281,1261],{"class":1174},[1164,1283,1264],{"class":1251},[1164,1285,1286],{"class":1174},".unitelabs.io\u002Frealms\u002F",[1164,1288,1258],{"class":1251},[1164,1290,1291],{"class":1174},"tenant-id",[1164,1293,1264],{"class":1251},[1164,1295,1296],{"class":1174},"\u002Fprotocol\u002Fopenid-connect\u002F\n",[1164,1298,1300,1303,1306,1309],{"class":1166,"line":1299},3,[1164,1301,1302],{"class":1247},"CLIENT_ID",[1164,1304,1305],{"class":1251},"=\u003C",[1164,1307,1308],{"class":1174},"your-client-id",[1164,1310,1311],{"class":1251},">\n",[1164,1313,1315,1318,1320,1323],{"class":1166,"line":1314},4,[1164,1316,1317],{"class":1247},"CLIENT_SECRET",[1164,1319,1305],{"class":1251},[1164,1321,1322],{"class":1174},"your-client-secret",[1164,1324,1311],{"class":1251},[1127,1326,1327],{"color":1129,"icon":1130},[915,1328,1329,1330,1332,1333,1336,1337,1339],{},"Need help getting these values? See ",[919,1331,38],{"href":39}," for how to set the credentials. W02 and W03 will also require access to UniteLabs private packages. If you have not set up a ",[954,1334,1335],{},".netrc"," file yet to get access, follow the instructions in the ",[919,1338,38],{"href":39}," section.",[1152,1341,1343],{"id":1342},"_3-install-a-workflows-dependencies","3. Install a workflow's dependencies",[915,1345,1346,1347,1350],{},"Each workflow syncs independently. Sync ",[954,1348,1349],{},"shared"," first, then any workflow you want to run locally:",[1106,1352,1354],{"className":1158,"code":1353,"language":1160,"meta":1114,"style":1114},"uv sync --directory shared\nuv sync --directory w01-hello-world\nuv sync --directory w02-liquid-handling\nuv sync --directory w03-plateloc-sealer\nuv sync --directory w04-tecan-fluent-control\n",[954,1355,1356,1370,1381,1392,1403],{"__ignoreMap":1114},[1164,1357,1358,1361,1364,1367],{"class":1166,"line":1167},[1164,1359,1360],{"class":1170},"uv",[1164,1362,1363],{"class":1174}," sync",[1164,1365,1366],{"class":1184}," --directory",[1164,1368,1369],{"class":1174}," shared\n",[1164,1371,1372,1374,1376,1378],{"class":1166,"line":1181},[1164,1373,1360],{"class":1170},[1164,1375,1363],{"class":1174},[1164,1377,1366],{"class":1184},[1164,1379,1380],{"class":1174}," w01-hello-world\n",[1164,1382,1383,1385,1387,1389],{"class":1166,"line":1299},[1164,1384,1360],{"class":1170},[1164,1386,1363],{"class":1174},[1164,1388,1366],{"class":1184},[1164,1390,1391],{"class":1174}," w02-liquid-handling\n",[1164,1393,1394,1396,1398,1400],{"class":1166,"line":1314},[1164,1395,1360],{"class":1170},[1164,1397,1363],{"class":1174},[1164,1399,1366],{"class":1184},[1164,1401,1402],{"class":1174}," w03-plateloc-sealer\n",[1164,1404,1406,1408,1410,1412],{"class":1166,"line":1405},5,[1164,1407,1360],{"class":1170},[1164,1409,1363],{"class":1174},[1164,1411,1366],{"class":1184},[1164,1413,1414],{"class":1174}," w04-tecan-fluent-control\n",[915,1416,1417,1418,1421,1422,1424,1425,1427],{},"Each command creates the workflow's ",[954,1419,1420],{},".venv\u002F"," with its declared dependencies and the ",[954,1423,1349],{}," library installed editable. Edits to ",[954,1426,967],{}," are picked up without re-sync.",[1152,1429,1431],{"id":1430},"_4-run-w01-hello-world","4. Run W01 Hello World",[915,1433,1434],{},"If you can run this workflow, you have successfully installed the UniteLabs SDK and executed a workflow using the workflow hierarchy. You are one step closer to deploying to the platform!",[915,1436,1437],{},"From the project root, run the following command:",[1106,1439,1441],{"className":1158,"code":1440,"language":1160,"meta":1114,"style":1114},"uv run --directory w01-hello-world workflow\n",[954,1442,1443],{"__ignoreMap":1114},[1164,1444,1445,1447,1450,1452,1455],{"class":1166,"line":1167},[1164,1446,1360],{"class":1170},[1164,1448,1449],{"class":1174}," run",[1164,1451,1366],{"class":1184},[1164,1453,1454],{"class":1174}," w01-hello-world",[1164,1456,1457],{"class":1174}," workflow\n",[915,1459,1460],{},"You can also navigate into the workflow project and run it directly from there using",[1106,1462,1464],{"className":1158,"code":1463,"language":1160,"meta":1114,"style":1114},"uv run workflow\n",[954,1465,1466],{"__ignoreMap":1114},[1164,1467,1468,1470,1472],{"class":1166,"line":1167},[1164,1469,1360],{"class":1170},[1164,1471,1449],{"class":1174},[1164,1473,1457],{"class":1174},[1152,1475,1477],{"id":1476},"_5-run-w02-liquid-handling-locally-against-the-mock","5. Run W02 Liquid Handling locally against the mock",[915,1479,1480],{},"W02 runs end-to-end against the liquid handling mock, with no hardware and no credentials. The mock lives in the LH SDK, is stateless, and only validates that the workflow will run (a compiler-style check that inputs are theoretically valid). It does not simulate a device, so you will not see realistic timing or device state, but it is the fastest way to verify your environment and catch configuration errors.",[1106,1482,1484],{"className":1158,"code":1483,"language":1160,"meta":1114,"style":1114},"uv run --directory w02-liquid-handling workflow\n",[954,1485,1486],{"__ignoreMap":1114},[1164,1487,1488,1490,1492,1494,1497],{"class":1166,"line":1167},[1164,1489,1360],{"class":1170},[1164,1491,1449],{"class":1174},[1164,1493,1366],{"class":1184},[1164,1495,1496],{"class":1174}," w02-liquid-handling",[1164,1498,1457],{"class":1174},[915,1500,917,1501,1504,1505,1508],{},[954,1502,1503],{},"workflow"," console script is declared in each workflow's ",[954,1506,1507],{},"[project.scripts]",". You should see workflow engine logs for the setup phase followed by eight column-by-column transfers in the transfer phase.",[1127,1510,1511],{"color":1129,"icon":1130},[915,1512,1513,1514,1517,1518,1520],{},"Pass extra args via the same command, e.g. ",[954,1515,1516],{},"uv run --directory w02-liquid-handling workflow --hardware"," to run against a real Hamilton Microlab STAR. That path requires ",[954,1519,1220],{}," credentials and a reachable device.",[1152,1522,1524],{"id":1523},"_6-deploy-a-workflow-to-the-platform","6. Deploy a workflow to the platform",[915,1526,1527],{},"Requirements before the first deploy:",[1529,1530,1531],"ul",{},[1532,1533,1534,1535,1537,1538,931,1540,931,1542,931,1544,1546,1547,1550],"li",{},"A populated ",[954,1536,1220],{}," at the repo root (",[954,1539,1248],{},[954,1541,1272],{},[954,1543,1302],{},[954,1545,1317],{},"). This is the same one you set up in step 2. ",[954,1548,1549],{},"scripts\u002Fdeploy.py"," loads it automatically and uses it to authenticate against the platform.",[915,1552,1553,1554,1557,1558,1560,1561,1563],{},"The deploy script does three things. It finds every workflow directory (any ",[954,1555,1556],{},"w\u003CNN>-\u003Cname>\u002F"," folder containing a ",[954,1559,956],{},"), packs the workflow directory together with a copy of the ",[954,1562,967],{}," library into a zip bundle, and uploads that bundle to the platform. If the workflow already exists on the platform, it is updated in place; otherwise a new entry is created.",[1106,1565,1567],{"className":1158,"code":1566,"language":1160,"meta":1114,"style":1114},"# Deploy every workflow\nuv run scripts\u002Fdeploy.py --all\n\n# Deploy a single workflow by slug\nuv run scripts\u002Fdeploy.py w02-liquid-handling\n\n# Deploy as DEV (display name prefixed [DEV] on the platform)\nuv run scripts\u002Fdeploy.py w02-liquid-handling --channel dev\n",[954,1568,1569,1575,1587,1593,1598,1608,1613,1619],{"__ignoreMap":1114},[1164,1570,1571],{"class":1166,"line":1167},[1164,1572,1574],{"class":1573},"sIsDC","# Deploy every workflow\n",[1164,1576,1577,1579,1581,1584],{"class":1166,"line":1181},[1164,1578,1360],{"class":1170},[1164,1580,1449],{"class":1174},[1164,1582,1583],{"class":1174}," scripts\u002Fdeploy.py",[1164,1585,1586],{"class":1184}," --all\n",[1164,1588,1589],{"class":1166,"line":1299},[1164,1590,1592],{"emptyLinePlaceholder":1591},true,"\n",[1164,1594,1595],{"class":1166,"line":1314},[1164,1596,1597],{"class":1573},"# Deploy a single workflow by slug\n",[1164,1599,1600,1602,1604,1606],{"class":1166,"line":1405},[1164,1601,1360],{"class":1170},[1164,1603,1449],{"class":1174},[1164,1605,1583],{"class":1174},[1164,1607,1391],{"class":1174},[1164,1609,1611],{"class":1166,"line":1610},6,[1164,1612,1592],{"emptyLinePlaceholder":1591},[1164,1614,1616],{"class":1166,"line":1615},7,[1164,1617,1618],{"class":1573},"# Deploy as DEV (display name prefixed [DEV] on the platform)\n",[1164,1620,1622,1624,1626,1628,1630,1633],{"class":1166,"line":1621},8,[1164,1623,1360],{"class":1170},[1164,1625,1449],{"class":1174},[1164,1627,1583],{"class":1174},[1164,1629,1496],{"class":1174},[1164,1631,1632],{"class":1184}," --channel",[1164,1634,1635],{"class":1174}," dev\n",[915,1637,1638,1639,1641],{},"See ",[919,1640,124],{"href":125}," for the full CLI reference.",[915,1643,1644],{},"Open the UniteLabs Workflows page to confirm the workflow appears with the correct name and description.",[1152,1646,1648],{"id":1647},"_7-run-w03-plateloc-sealer-against-a-simulated-connector","7. Run W03 PlateLoc Sealer against a simulated connector",[915,1650,1651,1652,1655],{},"W03 drives a real connector instead of an in-SDK mock. From the workflow's perspective the simulation behaves 1:1 like the physical device, including state and transitions, because the simulation lives inside the ",[949,1653,1654],{},"connector"," itself, not inside the SDK.",[915,1657,1658],{},"Requirements before the first run:",[1529,1660,1661,1667],{},[1532,1662,1663,1664,1051],{},"A running connector simulating a PlateLoc connected to the platform. Verify it appears on the Devices page. See how to ",[919,1665,1666],{"href":325},"start a connector",[1532,1668,1669,1671],{},[954,1670,1220],{}," to authenticate against the platform and reach the connector.",[915,1673,1674],{},"Start the workflow:",[1106,1676,1678],{"className":1158,"code":1677,"language":1160,"meta":1114,"style":1114},"uv run --directory w03-plateloc-sealer workflow\n",[954,1679,1680],{"__ignoreMap":1114},[1164,1681,1682,1684,1686,1688,1691],{"class":1166,"line":1167},[1164,1683,1360],{"class":1170},[1164,1685,1449],{"class":1174},[1164,1687,1366],{"class":1184},[1164,1689,1690],{"class":1174}," w03-plateloc-sealer",[1164,1692,1457],{"class":1174},[915,1694,1695],{},"The workflow runs two phases:",[1697,1698,1699,1708],"ol",{},[1532,1700,1701,1704,1705,1707],{},[949,1702,1703],{},"Prepare"," connects to the PlateLoc, moves the stage to the OUT position, and calls ",[954,1706,1046],{}," so the operator can place a plate.",[1532,1709,1710,1713],{},[949,1711,1712],{},"Seal"," resumes after operator confirmation and moves the stage to the IN position to seal the plate.",[915,1715,1716,1717,1720,1721,1725,1726,1729,1730,1733,1734,1737,1738,1740],{},"While the workflow is paused, open the run in the UniteLabs Workflows page. An ",[949,1718,1719],{},"Input required"," banner appears at the top of the run with the message ",[1722,1723,1724],"em",{},"\"This workflow is waiting for user input to continue\"",". Click ",[949,1727,1728],{},"Provide Input",", tick the ",[949,1731,1732],{},"Confirmed"," checkbox in the dialog, and click ",[949,1735,1736],{},"Submit Input"," to resume the run. This is the canonical ",[919,1739,1042],{"href":417}," pattern: a phase parks the run on an explicit operator checkpoint rather than polling or sleeping.",[1127,1742,1743],{"color":1129,"icon":1130},[915,1744,1745,1746,1749,1750,1753,1754,1051],{},"The device name is resolved from ",[954,1747,1748],{},"shared\u002Fsrc\u002Fshared\u002Fconfig\u002Fplateloc.py"," (",[954,1751,1752],{},"INSTRUMENT_NAME","). If your connector is registered under a different name on the platform, override it: ",[954,1755,1756],{},"uv run --directory w03-plateloc-sealer workflow --device-name \"\u003Cyour-name>\"",[941,1758,1760],{"id":1759},"releasing-a-workflow","Releasing a workflow",[915,1762,1763,1764,1767,1768,1771,1772,1774,1775,1777,1778,1781,1782,1051],{},"Each workflow is released on its own, with a git tag that combines two things: the workflow's ",[949,1765,1766],{},"slug"," and its version. The slug is the workflow's unique short name. It is set as ",[954,1769,1770],{},"[project].name"," in the workflow's ",[954,1773,956],{}," and matches the directory name, for example ",[954,1776,1104],{},". The tag ",[954,1779,1780],{},"w02-liquid-handling\u002Fv1.2.0"," therefore releases version 1.2.0 of that workflow. The version in the tag must match ",[954,1783,1784],{},"[project].version",[915,1786,1787,1788,1791],{},"To release ",[954,1789,1790],{},"w02-liquid-handling v1.2.0",":",[1106,1793,1795],{"className":1158,"code":1794,"language":1160,"meta":1114,"style":1114},"# 1. Bump the workflow's version\n$EDITOR w02-liquid-handling\u002Fpyproject.toml\n# (set [project].version = \"1.2.0\")\n\n# 2. Commit\ngit commit -am \"release: w02-liquid-handling v1.2.0\"\n\n# 3. Tag and push\ngit tag w02-liquid-handling\u002Fv1.2.0\ngit push origin main --tags\n",[954,1796,1797,1802,1807,1812,1816,1821,1834,1838,1843,1854],{"__ignoreMap":1114},[1164,1798,1799],{"class":1166,"line":1167},[1164,1800,1801],{"class":1573},"# 1. Bump the workflow's version\n",[1164,1803,1804],{"class":1166,"line":1181},[1164,1805,1806],{"class":1247},"$EDITOR w02-liquid-handling\u002Fpyproject.toml\n",[1164,1808,1809],{"class":1166,"line":1299},[1164,1810,1811],{"class":1573},"# (set [project].version = \"1.2.0\")\n",[1164,1813,1814],{"class":1166,"line":1314},[1164,1815,1592],{"emptyLinePlaceholder":1591},[1164,1817,1818],{"class":1166,"line":1405},[1164,1819,1820],{"class":1573},"# 2. Commit\n",[1164,1822,1823,1825,1828,1831],{"class":1166,"line":1610},[1164,1824,1171],{"class":1170},[1164,1826,1827],{"class":1174}," commit",[1164,1829,1830],{"class":1184}," -am",[1164,1832,1833],{"class":1174}," \"release: w02-liquid-handling v1.2.0\"\n",[1164,1835,1836],{"class":1166,"line":1615},[1164,1837,1592],{"emptyLinePlaceholder":1591},[1164,1839,1840],{"class":1166,"line":1621},[1164,1841,1842],{"class":1573},"# 3. Tag and push\n",[1164,1844,1846,1848,1851],{"class":1166,"line":1845},9,[1164,1847,1171],{"class":1170},[1164,1849,1850],{"class":1174}," tag",[1164,1852,1853],{"class":1174}," w02-liquid-handling\u002Fv1.2.0\n",[1164,1855,1857,1859,1862,1865,1868],{"class":1166,"line":1856},10,[1164,1858,1171],{"class":1170},[1164,1860,1861],{"class":1174}," push",[1164,1863,1864],{"class":1174}," origin",[1164,1866,1867],{"class":1174}," main",[1164,1869,1870],{"class":1184}," --tags\n",[915,1872,1873,1874,1877,1878,1881,1882,1884,1885,1888,1889,1891],{},"CI matches the per-workflow tag pattern and runs ",[954,1875,1876],{},"scripts\u002Fdeploy.py --git-tag w02-liquid-handling\u002Fv1.2.0 --channel prd",". The script parses the tag, verifies the pyproject version matches ",[954,1879,1880],{},"1.2.0"," (refuses otherwise; the version in ",[954,1883,956],{}," is the one that counts), ships the bundle, and adds ",[954,1886,1887],{},"v1.2.0"," to the platform tags. See ",[919,1890,132],{"href":133}," for the three-channel deploy model.",[941,1893,1895],{"id":1894},"adding-a-new-workflow","Adding a new workflow",[915,1897,1898,1899,1904],{},"Mechanical checklist (see ",[919,1900,1902],{"href":1120,"rel":1901,"target":925},[923,924],[954,1903,1124],{}," for the full authoring rules):",[1697,1906,1907,1917,1952,1959,1966],{},[1532,1908,1909,1910,1912,1913,1916],{},"Create a directory ",[954,1911,1556],{}," at the repo root, for example ",[954,1914,1915],{},"w05-dna-extraction\u002F",". Pick the next free two-digit number and a lowercase name with hyphens.",[1532,1918,1919,1920],{},"Inside it, create:\n",[1529,1921,1922,1933,1942],{},[1532,1923,1924,1926,1927,1929,1930,1932],{},[954,1925,956],{}," mirroring an existing workflow (set ",[954,1928,1770],{},", version, description, dependencies, ",[954,1931,963],{},").",[1532,1934,1935,1938,1939,1941],{},[954,1936,1937],{},"src\u002Fw05_dna_extraction\u002Fworkflow.py"," with the ",[954,1940,1008],{}," function. The package directory uses the same name with underscores instead of hyphens.",[1532,1943,1944,1945,1948,1949,1051],{},"One ",[954,1946,1947],{},"phase_\u003CNN>_\u003Cname>.py"," file per phase, next to ",[954,1950,1951],{},"workflow.py",[1532,1953,1954,1955,1958],{},"Add new shared code to ",[954,1956,1957],{},"shared\u002Fsrc\u002Fshared\u002F{config,library,steps,utils}\u002F"," if needed.",[1532,1960,1961,1962,1965],{},"Run ",[954,1963,1964],{},"uv sync --directory w05-dna-extraction"," to generate the workflow's lockfile.",[1532,1967,1968,1969,1972,1973,1051],{},"Add the workflow's path to the ",[954,1970,1971],{},"folders"," array in ",[954,1974,1198],{},[915,1976,1977,1978,1980],{},"No central registry to edit. ",[954,1979,1549],{}," discovers workflows automatically.",[941,1982,1984],{"id":1983},"next-steps","Next steps",[1529,1986,1987,2005,2015,2023,2031],{},[1532,1988,1989,1995,1996,1998,1999,2004],{},[919,1990,1992],{"href":1991},"#adding-a-new-workflow",[949,1993,1994],{},"Author your own workflow",": copy W01 and build your first own workflow. ",[919,1997,52],{"href":53}," explains the workflow, phase and step layers in one file. The repo's ",[919,2000,2002],{"href":1120,"rel":2001,"target":925},[923,924],[954,2003,1124],{}," holds the detailed authoring rules (layers, retry policy, naming).",[1532,2006,2007,2011,2012,2014],{},[919,2008,2009],{"href":125},[949,2010,124],{},": the full ",[954,2013,1549],{}," CLI reference.",[1532,2016,2017,2022],{},[919,2018,2019],{"href":133},[949,2020,2021],{},"Set up CI\u002FCD",": wire deploys to GitHub Actions or GitLab CI with the three-channel (dev\u002Fstg\u002Fprd) model.",[1532,2024,2025,2030],{},[919,2026,2027],{"href":211},[949,2028,2029],{},"Trigger runs via the API",": start a deployed workflow programmatically.",[1532,2032,2033,2038],{},[919,2034,2035],{"href":137},[949,2036,2037],{},"Add human-in-the-loop steps",": use W03 as the reference pattern.",[2040,2041,2042],"style",{},"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 pre.shiki code .sOiAX, html code.shiki .sOiAX{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#79C0FF}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 .sc-9e, html code.shiki .sc-9e{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}html pre.shiki code .sxkbv, html code.shiki .sxkbv{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html pre.shiki code .sIsDC, html code.shiki .sIsDC{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#8B949E}",{"title":1114,"searchDepth":1167,"depth":1181,"links":2044},[2045,2046,2047,2056,2057,2058],{"id":943,"depth":1181,"text":944},{"id":1086,"depth":1181,"text":1087},{"id":1146,"depth":1181,"text":1147,"children":2048},[2049,2050,2051,2052,2053,2054,2055],{"id":1154,"depth":1299,"text":1155},{"id":1209,"depth":1299,"text":1210},{"id":1342,"depth":1299,"text":1343},{"id":1430,"depth":1299,"text":1431},{"id":1476,"depth":1299,"text":1477},{"id":1523,"depth":1299,"text":1524},{"id":1647,"depth":1299,"text":1648},{"id":1759,"depth":1181,"text":1760},{"id":1894,"depth":1181,"text":1895},{"id":1983,"depth":1181,"text":1984},"Clone a production-ready workflow repository, run a workflow in simulation, and deploy any of the reference workflows to the platform.","md",{},"\u002Ftechnical-reference\u002Fautomate\u002Fworkflow-template",{"title":206,"description":2059},"yjSwBBTtWQOzsbqQGb4_6KLe8Yz9f-DtymM7vksofOg",[2066,2068],{"title":197,"description":2067,"path":198},"The reference documentation of the UniteLabs REST API and Swagger UI.",{"title":210,"description":2069,"path":211},"Register, manage, and trigger workflows programmatically using the UniteLabs REST API.",1791294172655]