- Total volume: 6.9 mL |  | `Cor_12_wellplate_6900ul_Fb` |
-| 'Cor_24_wellplate_3470ul_Fb' Part no.s:
- Total volume: 6.9 mL |  | `Cor_Cos_12_wellplate_6900ul_Fb` |
+| 'Cor_Cos_24_wellplate_3470ul_Fb' Part no.s:
- Total volume: 3.47 mL |  | `Cor_Cos_24_wellplate_3470ul_Fb` |
+| 'Cor_Cos_48_wellplate_1620ul_Fb' Part no.: 3548 [manufacturer website](https://ecatalog.corning.com/life-sciences/b2b/UK/en/Microplates/Assay-Microplates/96-Well-Microplates/Falcon%C2%AE-96-well-Polystyrene-Microplates/p/3548)
- Material: TC-treated polystyrene - Cleanliness: sterile - Total volume: 1.62 mL |  | `Cor_Cos_48_wellplate_1620ul_Fb` |
+| 'Cor_96_wellplate_2mL_Vb' Part no.: 3516 [manufacturer website](https://ecatalog.corning.com/life-sciences/b2b/UK/en/Microplates/Assay-Microplates/96-Well-Microplates/Costar%C2%AE-Multiple-Well-Cell-Culture-Plates/p/3516)
- Material: Polypropylene - Resistant to many common organic solvents (e.g., DMSO, ethanol, methanol) - 3960: Sterile and DNase- and RNase-free - Total volume: 2 mL - Features uniform skirt heights for greater robotic gripping surface |  | `Cor_96_wellplate_2mL_Vb` |
'Cor_96_wellplate_360ul_Fb' Part no.: 353376 [manufacturer website](https://ecatalog.corning.com/life-sciences/b2b/NL/en/Microplates/Assay-Microplates/96-Well-Microplates/Falcon®-96-well-Polystyrene-Microplates/p/353376)
- Material: TC-treated polystyrene - Cleanliness: sterile - Total volume: 392 uL - Working volume: 25-340 uL |  | `Cor_96_wellplate_360ul_Fb` |
## Falcon
@@ -65,16 +65,16 @@ Company page: [Corning - Axygen® Brand Products](https://www.corning.com/emea/e
(falcon-plates)=
### Plates
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| Falcon_96_wellplate_Fl [manufacturer website](https://www.fishersci.com/shop/products/falcon-96-well-cell-culture-treated-flat-bottom-microplate/087722C) |  | `Falcon_96_wellplate_Fl`
-| Falcon_96_wellplate_Rb [manufacturer website](https://ecatalog.corning.com/life-sciences/b2c/US/en/Microplates/Assay-Microplates/96-Well-Microplates/Falcon®-96-well-Polystyrene-Microplates/p/353077) |  | `Falcon_96_wellplate_Rb`
-| Falcon_96_wellplate_Fl_Black [manufacturer website](https://www.fishersci.com/shop/products/falcon-96-well-imaging-plate-lid/08772225) |  | `Falcon_96_wellplate_Fl_Black`
+| Description | Image | PLR definition |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ---------------------------------------- |
+| Cor_Falcon_96_wellplate_250ul_Rb [manufacturer website](https://ecatalog.corning.com/life-sciences/b2c/US/en/Microplates/Assay-Microplates/96-Well-Microplates/Falcon®-96-well-Polystyrene-Microplates/p/353077) |  | `Cor_Falcon_96_wellplate_250ul_Rb` |
+| Part number: 353072 [manufacturer website](https://www.fishersci.com/shop/products/falcon-96-well-cell-culture-treated-flat-bottom-microplate/087722C) |  | `Cor_Falcon_96_wellplate_275ul_Fb` |
+| Part number: 353219 [manufacturer website](https://www.fishersci.com/shop/products/falcon-96-well-imaging-plate-lid/08772225) |  | `Cor_Falcon_96_wellplate_340ul_Fb_Black` |
### Tubes
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| 50mL Falcon Tube [manufacturer website](https://www.fishersci.com/shop/products/falcon-50ml-conical-centrifuge-tubes-2/1495949A) |  | `falcon_tube_50mL`
-| 15mL Falcon Tube [manufacturer website](https://www.fishersci.com/shop/products/falcon-15ml-conical-centrifuge-tubes-5/p-193301) |  | `falcon_tube_15mL`
-| Falcon_tube_14mL_Rb Corning cat. no.: 352059 [manufacturer website](https://ecatalog.corning.com/life-sciences/b2b/UK/en/General-Labware/Tubes/Tubes,-Round-Bottom/Falcon%C2%AE-Round-Bottom-High-clarity-Polypropylene-Tube/p/352059) |  | `Falcon_tube_14mL_Rb`
+| Description | Image | PLR definition |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- | ------------------------- |
+| 50mL Falcon Tube [manufacturer website](https://www.fishersci.com/shop/products/falcon-50ml-conical-centrifuge-tubes-2/1495949A) |  | `Cor_Falcon_tube_50mL_Vb` |
+| 15mL Falcon Tube [manufacturer website](https://www.fishersci.com/shop/products/falcon-15ml-conical-centrifuge-tubes-5/p-193301) |  | `Cor_Falcon_tube_15mL_Vb` |
+| Falcon_tube_14mL_Rb Corning cat. no.: 352059 [manufacturer website](https://ecatalog.corning.com/life-sciences/b2b/UK/en/General-Labware/Tubes/Tubes,-Round-Bottom/Falcon%C2%AE-Round-Bottom-High-clarity-Polypropylene-Tube/p/352059) |  | `Cor_Falcon_tube_14mL_Rb` |
diff --git a/docs/resources/library/diy/davidnedrud.md b/docs/resources/library/diy/davidnedrud.md
index f1d5923327e..78f8c81ffec 100644
--- a/docs/resources/library/diy/davidnedrud.md
+++ b/docs/resources/library/diy/davidnedrud.md
@@ -3,6 +3,6 @@
I created a 3D printed part for the Hamilton MFX carrier that can hold opentrons modules.
## MFX modules
-| Description | Image | PLR definition |
-| - | - | - |
-| 'hamilton_mfx_opentrons_module' This 3D printed module accepts Opentrons hardware. I tested with Opentrons temperature module [OnShape link to part](https://cad.onshape.com/documents/71f70c40910fd15876f75d76/w/81912f5001c1f8dcb28dfd3b/e/da8c964d83d158897c596d21) |  | `hamilton_mfx_opentrons_module` |
+| Description | Image | PLR definition |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
+| 'hamilton_mfx_opentrons_module' This 3D printed module accepts Opentrons hardware. I tested with Opentrons temperature module [OnShape link to part](https://cad.onshape.com/documents/71f70c40910fd15876f75d76/w/81912f5001c1f8dcb28dfd3b/e/da8c964d83d158897c596d21) |   | `hamilton_mfx_opentrons_module` |
diff --git a/docs/resources/library/diy/grindbio.md b/docs/resources/library/diy/grindbio.md
index 2ab0a5bea0e..814f4a3682c 100644
--- a/docs/resources/library/diy/grindbio.md
+++ b/docs/resources/library/diy/grindbio.md
@@ -3,6 +3,6 @@
GrindBio created a 3D printed part for one of the Hamilton modules (cat.-no. 188042). The purpose of the part is to lower the module to better accommodate deepwell plates on top of magnet blocks. The lower height also accommodates taller labware.
## MFX modules
-| Description | Image | PLR definition |
-| - | - | - |
-| 'Hamilton_MFX_plateholder_DWP_metal_tapped_10mm_3dprint' 3D printed supports accept Hamilton MFX DWP Module (cat.-no. 188042 / 188042-00) [OnShape link to part](https://cad.onshape.com/documents/87b79aea22945656e1849b61/w/1d28384d184c23a6551facf8/e/3313021cc0b2fe3c5e005547) Read more about assembly [here](https://labautomation.io/t/adapters-for-hamilton-carrier-188039/6561)|  | `Hamilton_MFX_plateholder_DWP_metal_tapped_10mm_3dprint` |
+| Description | Image | PLR definition |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------------------------- |
+| 'Hamilton_MFX_plateholder_DWP_metal_tapped_10mm_3dprint' 3D printed supports accept Hamilton MFX DWP Module (cat.-no. 188042 / 188042-00) [OnShape link to part](https://cad.onshape.com/documents/87b79aea22945656e1849b61/w/1d28384d184c23a6551facf8/e/3313021cc0b2fe3c5e005547) Read more about assembly [here](https://labautomation.io/t/adapters-for-hamilton-carrier-188039/6561) |  | `Hamilton_MFX_plateholder_DWP_metal_tapped_10mm_3dprint` |
diff --git a/docs/resources/library/eppendorf.md b/docs/resources/library/eppendorf.md
index 5094690a55c..8c2c19b0984 100644
--- a/docs/resources/library/eppendorf.md
+++ b/docs/resources/library/eppendorf.md
@@ -10,16 +10,17 @@ Company page: [Eppendorf Wikipedia](https://en.wikipedia.org/wiki/Eppendorf_(com
## Plates
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| 'Eppendorf_96_wellplate_250ul_Vb' Part no.: 0030133374 [manufacturer website](https://www.eppendorf.com/gb-en/Products/Laboratory-Consumables/Plates/Eppendorf-twintec-PCR-Plates-p-0030133374)
- Material: polycarbonate (frame), polypropylene (wells) - part of the twin.tec(R) product line - WARNING: not ANSI/SLAS 1-2004 footprint dimensions (123x81 mm^2!) ==> requires `PlateAdapter` - 'Can be divided into 4 segments of 24 wells each to prevent waste and save money'. |   | `Eppendorf_96_wellplate_250ul_Vb` |
-| 'eppendorf_96_wellplate_500ul_Vb.avif' Part no.: 951032107 [manufacturer website](https://www.eppendorf.com/us-en/Products/Lab-Consumables/Plates/Protein-LoBind-Plates-p-951032107) |  | `'eppendorf_96_wellplate_500ul_Vb` |
-| 'eppendorf_96_wellplate_1000ul_Vb.avif' Part no.: 951032921 [manufacturer website](https://www.eppendorf.com/ca-en/Products/Lab-Consumables/Plates/Protein-LoBind-Plates-p-951032921) |  | `'eppendorf_96_wellplate_1000ul_Vb` |
-| 'eppendorf_96_wellplate_2000ul_Vb.avif' Part no.: 951033502 [manufacturer website](https://www.eppendorf.com/ca-en/Products/Lab-Consumables/Plates/Protein-LoBind-Plates-p-951033502) |  | `'eppendorf_96_wellplate_2000ul_Vb` |
+| Description | Image | PLR definition |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------- |
+| 'Eppendorf_96_wellplate_250ul_Vb' Part no.: 0030133374 [manufacturer website](https://www.eppendorf.com/gb-en/Products/Laboratory-Consumables/Plates/Eppendorf-twintec-PCR-Plates-p-0030133374)
- Material: polycarbonate (frame), polypropylene (wells) - part of the twin.tec(R) product line - WARNING: not ANSI/SLAS 1-2004 footprint dimensions (123x81 mm^2!) ==> requires `PlateAdapter` - 'Can be divided into 4 segments of 24 wells each to prevent waste and save money'. |   | `Eppendorf_96_wellplate_250ul_Vb` |
+| 'eppendorf_96_wellplate_500ul_Vb.avif' Part no.: 951032107 [manufacturer website](https://www.eppendorf.com/us-en/Products/Lab-Consumables/Plates/Protein-LoBind-Plates-p-951032107) |  | `'eppendorf_96_wellplate_500ul_Vb` |
+| 'eppendorf_96_wellplate_1000ul_Vb.avif' Part no.: 951032921 [manufacturer website](https://www.eppendorf.com/ca-en/Products/Lab-Consumables/Plates/Protein-LoBind-Plates-p-951032921) |  | `'eppendorf_96_wellplate_1000ul_Vb` |
+| 'eppendorf_96_wellplate_2000ul_Vb.avif' Part no.: 951033502 [manufacturer website](https://www.eppendorf.com/ca-en/Products/Lab-Consumables/Plates/Protein-LoBind-Plates-p-951033502) |  | `'eppendorf_96_wellplate_2000ul_Vb` |
## Tubes
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| "Common eppendorf tube" Part no.: 022431021 (DNA), 022431081 (protein) [manufacturer website](https://www.fishersci.com/shop/products/dna-lobind-microcentrifuge-tubes/13698791) |  | `Eppendorf_DNA_LoBind_1_5ml_Vb` `Eppendorf_Protein_LoBind_1_5ml_Vb` |
-| "Common eppendorf tube" Part no.: 022431048 [manufacturer website](https://www.fishersci.com/shop/products/dna-lobind-microcentrifuge-tubes/13698792) |  | `Eppendorf_DNA_LoBind_2ml_Ub` |
+| Description | Image | PLR definition |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | ----------------------------------- |
+| Eppendorf LoBind tube, 1.5 mL (DNA) Part no.: 022431021 [manufacturer website](https://www.fishersci.com/shop/products/dna-lobind-microcentrifuge-tubes/13698791) |  | `Eppendorf_DNA_LoBind_1_5ml_Vb` |
+| Eppendorf LoBind tube, 1.5 mL (protein) Part no.: 022431081 [manufacturer website](https://www.fishersci.com/shop/products/dna-lobind-microcentrifuge-tubes/13698791) |  | `Eppendorf_Protein_LoBind_1_5ml_Vb` |
+| "Common eppendorf tube" Part no.: 022431048 [manufacturer website](https://www.fishersci.com/shop/products/dna-lobind-microcentrifuge-tubes/13698792) |  | `Eppendorf_DNA_LoBind_2ml_Ub` |
diff --git a/docs/resources/library/falcon.md b/docs/resources/library/falcon.md
deleted file mode 100644
index b85a4e929ae..00000000000
--- a/docs/resources/library/falcon.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Falcon
-
-# Plates
-
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| Part number: 353072 [manufacturer website](https://www.fishersci.com/shop/products/falcon-96-well-cell-culture-treated-flat-bottom-microplate/087722C) |  | `Cor_Falcon_96_wellplate_275ul_Fb`
-| Part number: 353077 [manufacturer website](https://ecatalog.corning.com/life-sciences/b2c/US/en/Microplates/Assay-Microplates/96-Well-Microplates/Falcon®-96-well-Polystyrene-Microplates/p/353077) |  | `Cor_Falcon_96_wellplate_250ul_Rb`
-| Part number: 353219 [manufacturer website](https://www.fishersci.com/shop/products/falcon-96-well-imaging-plate-lid/08772225) |  | `Cor_Falcon_96_wellplate_340ul_Fb_Black`
-
-## Tubes
-
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| 50mL Falcon Tube [manufacturer website](https://www.fishersci.com/shop/products/falcon-50ml-conical-centrifuge-tubes-2/1495949A) |  | `Cor_Falcon_tube_50mL_Vb`
-| 15mL Falcon Tube [manufacturer website](https://www.fishersci.com/shop/products/falcon-15ml-conical-centrifuge-tubes-5/p-193301) |  | `Cor_Falcon_tube_15mL_Vb`
-| Falcon_tube_14mL_Rb Corning cat. no.: 352059 [manufacturer website](https://ecatalog.corning.com/life-sciences/b2b/UK/en/General-Labware/Tubes/Tubes,-Round-Bottom/Falcon%C2%AE-Round-Bottom-High-clarity-Polypropylene-Tube/p/352059) |  | `Cor_Falcon_tube_14mL_Rb`
diff --git a/docs/resources/library/greiner.md b/docs/resources/library/greiner.md
index a33411a1717..652151eb934 100644
--- a/docs/resources/library/greiner.md
+++ b/docs/resources/library/greiner.md
@@ -7,7 +7,7 @@ Company page: [Greiner Bio-One](https://www.gbo.com/en-gb/company)
## Plates
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| 'Greiner_384_wellplate_28ul_Fb' Part no.: 784075 (white), 784076 (black), 784101 (transparent) [manufacturer website](https://shop.gbo.com/en/england/products/bioscience/microplates/384-well-microplates/384-well-small-volume-hibase-microplates/784075.html) |  | `Greiner_384_wellplate_28ul_Fb`
-| 'greiner_96_wellplate_200uL_Vb' Part no.: 652260 [manufacturer website](https://shop.gbo.com/en/usa/products/bioscience/molecular-biology/pcr-microplates/652260.html) NOTE: This is a half-skirt plate and requires a plate adapter to use|  | `greiner_96_wellplate_200uL_Vb`
+| Description | Image | PLR definition |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------- |
+| 'Greiner_384_wellplate_28ul_Fb' Part no.: 784075 (white), 784076 (black), 784101 (transparent) [manufacturer website](https://shop.gbo.com/en/england/products/bioscience/microplates/384-well-microplates/384-well-small-volume-hibase-microplates/784075.html) |  | `Greiner_384_wellplate_28ul_Fb` |
+| 'greiner_96_wellplate_200uL_Vb' Part no.: 652260 [manufacturer website](https://shop.gbo.com/en/usa/products/bioscience/molecular-biology/pcr-microplates/652260.html) NOTE: This is a half-skirt plate and requires a plate adapter to use |  | `greiner_96_wellplate_200uL_Vb` |
diff --git a/docs/resources/library/hamilton.md b/docs/resources/library/hamilton.md
index 82a9d43e59f..d66c27b095e 100644
--- a/docs/resources/library/hamilton.md
+++ b/docs/resources/library/hamilton.md
@@ -1,4 +1,4 @@
-# Hamilton STAR "ML_STAR"
+# Hamilton
Company history: [Hamilton Robotics history](https://www.hamiltoncompany.com/history)
@@ -8,92 +8,92 @@ Company history: [Hamilton Robotics history](https://www.hamiltoncompany.com/his
### Tip carriers
-| Description | Image | PLR definition |
-| - | - | - |
+| Description | Image | PLR definition |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------- | ----------------- |
| 'TIP_CAR_480_A00' Part no.: 182085 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/182085) Carrier for 5x 96 tip (10μl, 50μl, 300μl, 1000μl) racks or 5x 24 tip (5ml) racks (6T) |  | `TIP_CAR_480_A00` |
-| 'TIP_CAR_288_C00' Part no.: 182060 [manufacturer website](https://www.hamiltoncompany.com/other-robotics/182060) Carrier for 3x 96 tip (10μl, 50μl, 300μl, 1000μl) racks or 3x 24 tip (5ml) racks (4T) |  | `TIP_CAR_288_C00` |
+| 'TIP_CAR_288_C00' Part no.: 182060 [manufacturer website](https://www.hamiltoncompany.com/other-robotics/182060) Carrier for 3x 96 tip (10μl, 50μl, 300μl, 1000μl) racks or 3x 24 tip (5ml) racks (4T) |  | `TIP_CAR_288_C00` |
### Plate carriers
-| Description | Image | PLR definition |
-| - | - | - |
+| Description | Image | PLR definition |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------- | ------------------ |
| 'PLT_CAR_L5AC_A00' Part no.: 182090 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/182090) Carrier for 5x 96 Deep Well Plates or for 5x 384 tip racks (e.g.384HEAD_384TIPS_50μl) (6T) |  | `PLT_CAR_L5AC_A00` |
-| 'PLT_CAR_L5MD_A00' Part no.: 182365/02 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/182365) Carries five ANSI/SLAS footprint MTPs in landscape orientation. Occupies six tracks.|  | `PLT_CAR_L5MD_A00` |
-| 'PLT_CAR_P3AC' Part no.: 182365/03 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/182365) Hamilton Deepwell Plate Carrier for 3 Plates (Portrait, 6 tracks wide)|  | `PLT_CAR_P3AC` |
-| 'PLT_CAR_L5_DWP' Part no.: 93522-01/03 manufacturer website? Hamilton Plate Carrier for 5 Plates (Landscape, 6 tracks wide). Plastic tabs. |  | `PLT_CAR_L5_DWP` |
+| 'PLT_CAR_L5MD_A00' Part no.: 182365/02 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/182365) Carries five ANSI/SLAS footprint MTPs in landscape orientation. Occupies six tracks. |  | `PLT_CAR_L5MD_A00` |
+| 'PLT_CAR_P3AC_A00' Part no.: 182365/03 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/182365) Hamilton Deepwell Plate Carrier for 3 Plates (Portrait, 6 tracks wide) |  | `PLT_CAR_P3AC_A00` |
+| 'PLT_CAR_L5_DWP' Part no.: 93522-01/03 manufacturer website? Hamilton Plate Carrier for 5 Plates (Landscape, 6 tracks wide). Plastic tabs. |  | `PLT_CAR_L5_DWP` |
### MFX carriers
See [MFX Carrier documentation](/resources/carrier/mfx-carrier/mfx_carrier).
-| Description | Image | PLR definition |
-| - | - | - |
-| 'hamilton_mfx_carrier_L5_base' Part no.: 188039 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/188039) Labware carrier base for up to 5 Multiflex Modules Occupies 6 tracks (6T). |  | `hamilton_mfx_carrier_L5_base` |
-| 'MFX_CAR_L4_SHAKER' Part no.: 187001 [secondary supplier website](https://www.testmart.com/estore/unit.cfm/PIPPET/HAMROB/187001/automated_pippetting_devices_and_systems/8.html) (cannot find information on Hamilton website) Sometimes referred to as "PLT_CAR_L4_SHAKER" by Hamilton. Template carrier with 4 positions for Hamilton Heater Shaker. Occupies 7 tracks (7T). Can be screwed onto the deck. |  | `MFX_CAR_L4_SHAKER` |
+| Description | Image | PLR definition |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------ |
+| 'hamilton_mfx_carrier_L5_base' Part no.: 188039 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/188039) Labware carrier base for up to 5 Multiflex Modules Occupies 6 tracks (6T). |  | `hamilton_mfx_carrier_L5_base` |
+| 'MFX_CAR_L4_SHAKER' Part no.: 187001 [secondary supplier website](https://www.testmart.com/estore/unit.cfm/PIPPET/HAMROB/187001/automated_pippetting_devices_and_systems/8.html) (cannot find information on Hamilton website) Sometimes referred to as "PLT_CAR_L4_SHAKER" by Hamilton. Template carrier with 4 positions for Hamilton Heater Shaker. Occupies 7 tracks (7T). Can be screwed onto the deck. |  | `MFX_CAR_L4_SHAKER` |
### MFX modules
See [MFX Carrier documentation](/resources/carrier/mfx-carrier/mfx_carrier).
-| Description | Image | PLR definition |
-| - | - | - |
-| 'MFX_TIP_module' Part no.: 188160 or 188040 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/188040) Module to position a high-, standard-, low volume or 5ml tip rack (but not a 384 tip rack) |  | `MFX_TIP_module` |
-| 'hamilton_mfx_plateholder_DWP_flat' Part no.: 188229 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/188229) (<-non-functional link?) MFX DWP module rack-based |  | `hamilton_mfx_plateholder_DWP_flat` |
-| 'MFX_DWP_module_flat' Part no.: 6601988-01 manufacturer website unknown |  | `MFX_DWP_module_flat` |
-| 'Hamilton_mfx_plateholder_DWP_metal_tapped' Part no.: 188042 [manufacturer website](https://www.hamiltoncompany.com/other-robotics/188042) Carries a single ANSI/SLAS footprint DWP, a Matrix or Micronics tube rack, or a Nunc reagent reservoir. Occupies one MFX site.|  | `Hamilton_mfx_plateholder_DWP_metal_tapped` |
+| Description | Image | PLR definition |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- | ------------------------------------------- |
+| 'MFX_TIP_module' Part no.: 188160 or 188040 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/188040) Module to position a high-, standard-, low volume or 5ml tip rack (but not a 384 tip rack) |  | `MFX_TIP_module` |
+| 'hamilton_mfx_plateholder_DWP_flat' Part no.: 188229 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/188229) (<-non-functional link?) MFX DWP module rack-based |  | `hamilton_mfx_plateholder_DWP_flat` |
+| 'MFX_DWP_module_flat' Part no.: 6601988-01 manufacturer website unknown |  | `MFX_DWP_module_flat` |
+| 'hamilton_mfx_plateholder_DWP_metal_tapped' Part no.: 188042 [manufacturer website](https://www.hamiltoncompany.com/other-robotics/188042) Carries a single ANSI/SLAS footprint DWP, a Matrix or Micronics tube rack, or a Nunc reagent reservoir. Occupies one MFX site. |  | `hamilton_mfx_plateholder_DWP_metal_tapped` |
### Tube carriers
Sometimes called "sample carriers" in Hamilton jargon.
-| Description | Image | PLR definition |
-| - | - | - |
-| 'Tube_CAR_24_A00' Part no.: 173400 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/173400) Carries 24 "sample" tubes with 14.5–18 mm outer diameter, 60–120 mm high. Occupies one track. |  | `Tube_CAR_24_A00` |
-| 'hamilton_tube_carrier_32_a00_insert_eppendorf_1_5mL' Part no.: 173410 [manufacturer website](https://www.hamiltoncompany.com/other-robotics/173410) Carries 32 `Eppendorf_DNA_LoBind_1_5ml_Vb` or `Eppendorf_Protein_LoBind_1_5ml_Vb` tubes. Occupies one track. |  | `hamilton_tube_carrier_32_a00_insert_eppendorf_1_5mL` |
-| 'hamilton_tube_carrier_12_b00' Part no.: 182045 [manufacturer website](https://www.hamiltoncompany.com/other-robotics/50-ml-falcon-tube-carrier) Carries 12 "sample" tubes with 30 mm outer diameter, 115 mm high. Occupies two tracks. |  | `hamilton_tube_carrier_12_b00` |
+| Description | Image | PLR definition |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ----------------------------------------------------- |
+| 'Tube_CAR_24_A00' Part no.: 173400 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/173400) Carries 24 "sample" tubes with 14.5–18 mm outer diameter, 60–120 mm high. Occupies one track. |  | `Tube_CAR_24_A00` |
+| 'hamilton_tube_carrier_32_a00_insert_eppendorf_1_5mL' Part no.: 173410 [manufacturer website](https://www.hamiltoncompany.com/other-robotics/173410) Carries 32 `Eppendorf_DNA_LoBind_1_5ml_Vb` or `Eppendorf_Protein_LoBind_1_5ml_Vb` tubes. Occupies one track. |  | `hamilton_tube_carrier_32_a00_insert_eppendorf_1_5mL` |
+| 'hamilton_tube_carrier_12_b00' Part no.: 182045 [manufacturer website](https://www.hamiltoncompany.com/other-robotics/50-ml-falcon-tube-carrier) Carries 12 "sample" tubes with 30 mm outer diameter, 115 mm high. Occupies two tracks. |  | `hamilton_tube_carrier_12_b00` |
### Trough carriers
Sometimes called "reagent carriers" in Hamilton jargon.
-| Description | Image | PLR definition |
-| - | - | - |
-| 'Trough_CAR_4R200_A00' Part no.: 185436 (same as 96890-01?) [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/96890-01) Trough carrier for 4x 200ml troughs. 2 tracks(T) wide. |  | `Trough_CAR_4R200_A00` |
-| 'Trough_CAR_5R60_A00' Part no.: 53646-01 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/reagent-reservoir-carrier-5-x-60-ml-2) Trough carrier for 5x 60ml troughs. 1 track(T) wide. |  | `Trough_CAR_5R60_A00` |
+| Description | Image | PLR definition |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | ---------------------- |
+| 'Trough_CAR_4R200_A00' Part no.: 185436 (same as 96890-01?) [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/96890-01) Trough carrier for 4x 200ml troughs. 2 tracks(T) wide. |  | `Trough_CAR_4R200_A00` |
+| 'Trough_CAR_5R60_A00' Part no.: 53646-01 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/reagent-reservoir-carrier-5-x-60-ml-2) Trough carrier for 5x 60ml troughs. 1 track(T) wide. |  | `Trough_CAR_5R60_A00` |
## Plate Adapters
-| Description | Image | PLR definition |
-| - | - | - |
+| Description | Image | PLR definition |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------- |
| 'Hamilton_96_adapter_188182' Part no.: 188182 [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/188182) (<-non-functional link?) Adapter for 96 well PCR plate, plunged. Does not have an ANSI/SLAS footprint -> requires assignment with specified location. |  | `Hamilton_96_adapter_188182` |
## Consumables
### TipRacks
-| Description | Image | PLR definition |
-| - | - | - |
-| Hamilton 96 tip rack 10uL. Hamilton name: `LT`. Part number 235900 (non-sterile), 235935 (sterile). [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/10-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_10uL` |
-| Hamilton 96 tip rack 10uL filter. Hamilton name: `LTF`. Part number: 235936 (sterile), 235901 (non-sterile). [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/10-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_10uL_filter` |
-| Hamilton 96 tip rack 50uL. Hamilton name: `TIP_50ul` Part number: 235966 (non-sterile), 235978 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/50-μl-co-re-ii-tips)|  | `hamilton_96_tiprack_50uL` |
-| Hamilton 96 tip rack 50uL filter. Hamilton name: `TIP_50ul_w_filter` Part number: 235948 (non-sterile), 235979 (sterile), 235829 (clear, non-sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/50-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_50uL_filter` |
-| Hamilton 96 nested tip rack (NTR) 50uL. Hamilton name: ? Part number: 235947 (non-sterile), 235964 (clear, non-sterile), 235987 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/50-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_50uL_NTR` |
-| Hamilton 96 tip rack 300uL. Hamilton name: `ST` Part number: 235834 (clear, non-sterile), 235902 (non-sterile), 235937 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/300-μl-co-re-ii-tips)|  | `hamilton_96_tiprack_300uL` |
-| Hamilton 96 tip rack 300uL filter. Hamilton name: `STF` Part number: 235830 (clear), 235903 (non-sterile), 235938 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/300-μl-co-re-ii-tips)|  | `hamilton_96_tiprack_300uL_filter` |
-| Hamilton 96 tip rack 300uL filter slim. Hamilton name: `STF_Slim` Part number: 235646 [Hamilton website](https://www.hamiltoncompany.com/consumables/300-µl-slim-conductive-tips?part-number=235646)|  | `hamilton_96_tiprack_300uL_filter_slim` |
-| Hamilton 96 tip rack 300uL filter ultra wide bore. Hamilton name: `STF_ULTRAWIDE` Part number: 235449 [Hamilton website](https://www.hamiltoncompany.com/consumables/300-µl-co-re-ii-wide-bore-conductive-tips?part-number=235449)|  | `hamilton_96_tiprack_300uL_filter_ultrawide` |
-| Hamilton 96 tip rack 1000uL. Hamilton name: `HT` Part number: 235822 (clear, non-sterile), 235904 (non-sterile), 235939 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/1000-µl-co-re-ii-disposable-tips)|  | `hamilton_96_tiprack_1000uL` |
-| Hamilton 96 tip rack 1000uL filter. Hamilton name: `HTF` Part number: 235820 (clear), 235905 (non-sterile), 235940 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/1000-µl-co-re-ii-disposable-tips)|  | `hamilton_96_tiprack_1000uL_filter` |
-| Hamilton 96 tip rack 1000uL filter wide (1.2mm orifice Size). Hamilton name: `HTF_WIDE` Part number: 235678 (non-sterile), 235677 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables/1000-µl-co-re-ii-wide-bore-conductive-tips?part-number=235678)|  | `hamilton_96_tiprack_1000uL_filter_wide` |
-| Hamilton 96 tip rack 1000uL filter ultra wide (3.2mm orifice Size). Hamilton name: `HTF_ULTRAWIDE` Part number: 235541 (non-sterile), 235842 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables/1000-µl-co-re-ii-wide-bore-conductive-tips?part-number=235541)|  | `hamilton_96_tiprack_1000uL_filter_ultrawide` |
-| Hamilton 24 tip rack 4000uL filter. Hamilton name: `FourmlTF` Part number: 184021 (non-sterile), 184023 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/4000-μl-5000-μl-co-re-tips)|  | `hamilton_24_tiprack_4000uL_filter` |
-| Hamilton 24 tip rack 5000uL. Hamilton name: `FivemlT` Part number: 184020 (non-sterile), 184022 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/4000-μl-5000-μl-co-re-tips)|  | `hamilton_24_tiprack_5000uL` |
+| Description | Image | PLR definition |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------------------------------------- |
+| Hamilton 96 tip rack 10uL. Hamilton name: `LT`. Part number 235900 (non-sterile), 235935 (sterile). [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/10-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_10uL` |
+| Hamilton 96 tip rack 10uL filter. Hamilton name: `LTF`. Part number: 235936 (sterile), 235901 (non-sterile). [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/10-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_10uL_filter` |
+| Hamilton 96 tip rack 50uL. Hamilton name: `TIP_50ul` Part number: 235966 (non-sterile), 235978 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/50-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_50uL` |
+| Hamilton 96 tip rack 50uL filter. Hamilton name: `TIP_50ul_w_filter` Part number: 235948 (non-sterile), 235979 (sterile), 235829 (clear, non-sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/50-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_50uL_filter` |
+| Hamilton 96 nested tip rack (NTR) 50uL. Hamilton name: ? Part number: 235947 (non-sterile), 235964 (clear, non-sterile), 235987 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/50-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_50uL_NTR` |
+| Hamilton 96 tip rack 300uL. Hamilton name: `ST` Part number: 235834 (clear, non-sterile), 235902 (non-sterile), 235937 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/300-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_300uL` |
+| Hamilton 96 tip rack 300uL filter. Hamilton name: `STF` Part number: 235830 (clear), 235903 (non-sterile), 235938 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/300-μl-co-re-ii-tips) |  | `hamilton_96_tiprack_300uL_filter` |
+| Hamilton 96 tip rack 300uL filter slim. Hamilton name: `STF_Slim` Part number: 235646 [Hamilton website](https://www.hamiltoncompany.com/consumables/300-µl-slim-conductive-tips?part-number=235646) |  | `hamilton_96_tiprack_300uL_filter_slim` |
+| Hamilton 96 tip rack 300uL filter ultra wide bore. Hamilton name: `STF_ULTRAWIDE` Part number: 235449 [Hamilton website](https://www.hamiltoncompany.com/consumables/300-µl-co-re-ii-wide-bore-conductive-tips?part-number=235449) |  | `hamilton_96_tiprack_300uL_filter_ultrawide` |
+| Hamilton 96 tip rack 1000uL. Hamilton name: `HT` Part number: 235822 (clear, non-sterile), 235904 (non-sterile), 235939 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/1000-µl-co-re-ii-disposable-tips) |  | `hamilton_96_tiprack_1000uL` |
+| Hamilton 96 tip rack 1000uL filter. Hamilton name: `HTF` Part number: 235820 (clear), 235905 (non-sterile), 235940 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/1000-µl-co-re-ii-disposable-tips) |  | `hamilton_96_tiprack_1000uL_filter` |
+| Hamilton 96 tip rack 1000uL filter wide (1.2mm orifice Size). Hamilton name: `HTF_WIDE` Part number: 235678 (non-sterile), 235677 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables/1000-µl-co-re-ii-wide-bore-conductive-tips?part-number=235678) |  | `hamilton_96_tiprack_1000uL_filter_wide` |
+| Hamilton 96 tip rack 1000uL filter ultra wide (3.2mm orifice Size). Hamilton name: `HTF_ULTRAWIDE` Part number: 235541 (non-sterile), 235842 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables/1000-µl-co-re-ii-wide-bore-conductive-tips?part-number=235541) |  | `hamilton_96_tiprack_1000uL_filter_ultrawide` |
+| Hamilton 24 tip rack 4000uL filter. Hamilton name: `FourmlTF` Part number: 184021 (non-sterile), 184023 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/4000-μl-5000-μl-co-re-tips) |  | `hamilton_24_tiprack_4000uL_filter` |
+| Hamilton 24 tip rack 5000uL. Hamilton name: `FivemlT` Part number: 184020 (non-sterile), 184022 (sterile) [Hamilton website](https://www.hamiltoncompany.com/consumables-labware-accessories/co-re-and-co-re-ii-tips/4000-μl-5000-μl-co-re-tips) |  | `hamilton_24_tiprack_5000uL` |
### Troughs
-| Description | Image | PLR definition |
-| - | - | - |
-| 'Hamilton_1_trough_60mL_Vb' Part no.: 56694-01 (natural/white), 56694-02 (black), 56694-03 (black, bulk) [manufacturer website](https://www.hamiltoncompany.com/consumables/60-ml-reagent-reservoirs) Trough 60ml, w lid, self-standing. Barcode-compliant. Compatible with Trough_CAR_5R60_A00 (53646-01). |  | `hamilton_1_trough_60mL_Vb` |
-| 'hamilton_1_trough_120ml_Vb' Part no.: 194052 (white/translucent) [manufacturer website](https://www.hamiltoncompany.com/consumables/120-ml-reagent-reservoir-self-standing-with-barcode-label?srsltid=AfmBOoobNQhgF9KPbwURilJLIDO_pJhS3AnUXMRQ5QATOYMemUnU-aUU) Trough 120mL, without lid, self-standing, transparent. Compatible with Trough_CAR_3R120 (194058). |  | `hamilton_1_trough_120mL_Vb` |
-| 'Hamilton_1_trough_200mL_Vb' Part no.: 56695-01 (white/translucent), 56695-02 (black/conductive) [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/56695-02) Trough 200ml, w lid, self-standing, Black. Compatible with Trough_CAR_4R200_A00 (185436). |  | `hamilton_1_trough_200mL_Vb` |
+| Description | Image | PLR definition |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ---------------------------- |
+| 'Hamilton_1_trough_60mL_Vb' Part no.: 56694-01 (natural/white), 56694-02 (black), 56694-03 (black, bulk) [manufacturer website](https://www.hamiltoncompany.com/consumables/60-ml-reagent-reservoirs) Trough 60ml, w lid, self-standing. Barcode-compliant. Compatible with Trough_CAR_5R60_A00 (53646-01). |  | `hamilton_1_trough_60mL_Vb` |
+| 'hamilton_1_trough_120ml_Vb' Part no.: 194052 (white/translucent) [manufacturer website](https://www.hamiltoncompany.com/consumables/120-ml-reagent-reservoir-self-standing-with-barcode-label?srsltid=AfmBOoobNQhgF9KPbwURilJLIDO_pJhS3AnUXMRQ5QATOYMemUnU-aUU) Trough 120mL, without lid, self-standing, transparent. Compatible with Trough_CAR_3R120 (194058). |  | `hamilton_1_trough_120mL_Vb` |
+| 'Hamilton_1_trough_200mL_Vb' Part no.: 56695-01 (white/translucent), 56695-02 (black/conductive) [manufacturer website](https://www.hamiltoncompany.com/automated-liquid-handling/other-robotics/56695-02) Trough 200ml, w lid, self-standing, Black. Compatible with Trough_CAR_4R200_A00 (185436). |  | `hamilton_1_trough_200mL_Vb` |
diff --git a/docs/resources/library/imcs.md b/docs/resources/library/imcs.md
index 91df7cbaaec..1506a49114c 100644
--- a/docs/resources/library/imcs.md
+++ b/docs/resources/library/imcs.md
@@ -8,6 +8,6 @@ Automated high-throughput protein purification
## TipRacks
-| Description | Image | PLR definition |
-| - | - | - |
-|IMCS tips for automated protein purification. 300uL. Part numbers:
04T-H8R80A-1-5-96
04T-H8R80A-1-10-96
04T-H8R80P-1-5-96
04T-H8R80P-1-10-96
04T-H8R72-1-2-96
04T-H8R72-1-5-96
04T-H8R72-1-10-96
04T-H8R72Q-1-10-96
04T-H8R85P-1-5-96
04T-H8R85P-1-10-96
04T-H8R88F-1-2-96
04T-H8R88F-1-5-96
04T-H8R88F-1-10-96
04T-H8R89-1-10-96
04T-H8D20F-1A-3-96
04T-H8CD20F-1A-3-96
04T-H8R68-1-5-96
04T-H8R73-1-10-96
04T-H8R05-1-2-96
04T-H8R05-1-5-96
04T-H8R41-1-2-96
04T-H8R53-1-2-96
04T-H8R52-1-2-96
04T-H8R52-1-5-96
04T-H8R30-1-2-96
04T-H8R30-1-5-96
04T-H8R03R-1-5-96
04T-H8R02R-1-2-96
04T-H8R02R-1-5-96
04T-I3R73-1-10-
[OEM website](https://imcstips.com/) | picture not available | `imcs_96_tiprack_300uL_filter` |
+| Description | Image | PLR definition |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----- | ------------------------------ |
+| IMCS tips for automated protein purification, 300 uL. Part no.: 04T-H8R80A-1-5-96, 04T-H8R80A-1-10-96, 04T-H8R80P-1-5-96, 04T-H8R80P-1-10-96, 04T-H8R72-1-2-96, 04T-H8R72-1-5-96, 04T-H8R72-1-10-96, 04T-H8R72Q-1-10-96, 04T-H8R85P-1-5-96, 04T-H8R85P-1-10-96, 04T-H8R88F-1-2-96, 04T-H8R88F-1-5-96, 04T-H8R88F-1-10-96, 04T-H8R89-1-10-96, 04T-H8D20F-1A-3-96, 04T-H8CD20F-1A-3-96, 04T-H8R68-1-5-96, 04T-H8R73-1-10-96, 04T-H8R05-1-2-96, 04T-H8R05-1-5-96, 04T-H8R41-1-2-96, 04T-H8R53-1-2-96, 04T-H8R52-1-2-96, 04T-H8R52-1-5-96, 04T-H8R30-1-2-96, 04T-H8R30-1-5-96, 04T-H8R03R-1-5-96, 04T-H8R02R-1-2-96, 04T-H8R02R-1-5-96 [OEM website](https://imcstips.com/) | | `imcs_96_tiprack_300uL_filter` |
diff --git a/docs/resources/library/nest.md b/docs/resources/library/nest.md
index 19ee44fdf53..3cb6c0546dc 100644
--- a/docs/resources/library/nest.md
+++ b/docs/resources/library/nest.md
@@ -4,10 +4,10 @@ Wuxi NEST Biotechnology Co., Ltd. a leading life science plastic consumables man
## Plates
-| Description | Image | PLR definition |
-|-|-|-|
-| 'nest_1_troughplate_195000uL_Vb' Part no.: 360101 [manufacturer website](https://www.nest-biotech.com/reagent-reserviors/59178416.html) - Material: polypropylene |  | `nest_1_troughplate_195000uL_Vb` |
-| 'nest_1_troughplate_185000uL_Vb' Part no.: 360101 [manufacturer website](https://www.nest-biotech.com/reagent-reserviors/59178415.html) - Material: polypropylene |  | `nest_1_troughplate_185000uL_Vb` |
-| 'nest_8_troughplate_22000uL_Vb' Part no.: 360101 [manufacturer website](https://www.nestscientificusa.com/product/detail/513006470820794368) - Material: polypropylene |  | `nest_8_troughplate_22000uL_Vb` |
-| 'nest_12_troughplate_15000uL_Vb' Part no.: 360102 [manufacturer website](https://www.nestscientificusa.com/product/detail/513006470820794368) - Material: polypropylene |  | `nest_12_troughplate_15000uL_Vb` |
-| 'NEST_96_wellplate_2200uL_Ub' Part no.: 503062 [manufacturer website](https://www.nest-biotech.com/deep-well-plates/59253727.html) - Material: polypropylene |  | `NEST_96_wellplate_2200uL_Ub` |
\ No newline at end of file
+| Description | Image | PLR definition |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | -------------------------------- |
+| 'nest_1_troughplate_195000uL_Vb' Part no.: 360101 [manufacturer website](https://www.nest-biotech.com/reagent-reserviors/59178416.html) - Material: polypropylene |  | `nest_1_troughplate_195000uL_Vb` |
+| 'nest_1_troughplate_185000uL_Vb' Part no.: 360101 [manufacturer website](https://www.nest-biotech.com/reagent-reserviors/59178415.html) - Material: polypropylene |  | `nest_1_troughplate_185000uL_Vb` |
+| 'nest_8_troughplate_22000uL_Vb' Part no.: 360101 [manufacturer website](https://web.archive.org/web/20240909185532/https://www.nestscientificusa.com/product/detail/513006470820794368) - Material: polypropylene |  | `nest_8_troughplate_22000uL_Vb` |
+| 'nest_12_troughplate_15000uL_Vb' Part no.: 360102 [manufacturer website](https://web.archive.org/web/20240909185532/https://www.nestscientificusa.com/product/detail/513006470820794368) - Material: polypropylene |  | `nest_12_troughplate_15000uL_Vb` |
+| 'NEST_96_wellplate_2200uL_Ub' Part no.: 503062 [manufacturer website](https://www.nest-biotech.com/deep-well-plates/59253727.html) - Material: polypropylene |  | `NEST_96_wellplate_2200uL_Ub` |
\ No newline at end of file
diff --git a/docs/resources/library/opentrons.md b/docs/resources/library/opentrons.md
index fa1f2a39187..992768f311d 100644
--- a/docs/resources/library/opentrons.md
+++ b/docs/resources/library/opentrons.md
@@ -40,8 +40,8 @@ Unfortunately, most of the other labware (plates) is missing information that is
- `opentrons_24_tuberack_nest_1_5ml_screwcap`
- `opentrons_24_tuberack_nest_1_5ml_snapcap`
-| Description | Image | PLR definition |
-|-|-|-|
+| Description | Image | PLR definition |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | ------------------------------------------------------- |
| 'opentrons_24_tuberack_generic_1point5ml_snapcap_short' Part no.: 3405002 [manufacturer website](https://www.thingiverse.com/thing:3405002) |  | `opentrons_24_tuberack_generic_1point5ml_snapcap_short` |
- `opentrons_24_tuberack_nest_2ml_screwcap`
diff --git a/docs/resources/library/perkin_elmer.md b/docs/resources/library/perkin_elmer.md
index 20d8278351b..2303621dbbc 100644
--- a/docs/resources/library/perkin_elmer.md
+++ b/docs/resources/library/perkin_elmer.md
@@ -2,6 +2,6 @@
## Plates
-| Description | Image | PLR definition |
-|-|-|-|
+| Description | Image | PLR definition |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------- |
| 'PerkinElmer_96_wellplate_400ul_Fb' Part no.: 6005680, 6005688 and 6005689 [manufacturer website](https://www.revvity.com/product/culturplate-96-lid-50w-6055680) |  | `PerkinElmer_96_wellplate_400ul_Fb` |
diff --git a/docs/resources/library/porvair.md b/docs/resources/library/porvair.md
index cb3b8d531ab..951b596a93a 100644
--- a/docs/resources/library/porvair.md
+++ b/docs/resources/library/porvair.md
@@ -6,12 +6,12 @@ Company history: [Porvair Filtration Group](https://www.porvairfiltration.com/ab
## Plates
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
+| Description | Image | PLR definition |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | ------------------------- |
| 'Porvair_24_wellplate_Vb' Part no.: 390108 [manufacturer website](https://www.microplates.com/product/78-ml-reservoir-plate-2-rows-of-12-v-bottom/) |  | `Porvair_24_wellplate_Vb` |
## Reservoirs
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| 'Porvair_6_reservoir_47ml_Vb' Part no.: 6008280 [manufacturer website](https://www.microplates.com/product/282-ml-reservoir-plate-6-columns-v-bottom/) - Material: Polypropylene - Sterilization compatibility: Autoclaving (15 minutes at 121°C) or Gamma Irradiation - Chemical resistance: "High chemical resistance" - Temperature resistance: high: -196°C to + 121°C - Cleanliness: 390015: Free of detectable DNase, RNase - ANSI/SLAS-format for compatibility with automated systems - Tolerances: "Uniform external dimensions and tolerances"|  | `Porvair_6_reservoir_47ml_Vb` |
+| Description | Image | PLR definition |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ----------------------------- |
+| 'Porvair_6_reservoir_47ml_Vb' Part no.: 6008280 [manufacturer website](https://www.microplates.com/product/282-ml-reservoir-plate-6-columns-v-bottom/) - Material: Polypropylene - Sterilization compatibility: Autoclaving (15 minutes at 121°C) or Gamma Irradiation - Chemical resistance: "High chemical resistance" - Temperature resistance: high: -196°C to + 121°C - Cleanliness: 390015: Free of detectable DNase, RNase - ANSI/SLAS-format for compatibility with automated systems - Tolerances: "Uniform external dimensions and tolerances" |  | `Porvair_6_reservoir_47ml_Vb` |
diff --git a/docs/resources/library/revvity.md b/docs/resources/library/revvity.md
index fcdacfd40da..a0189140a0d 100644
--- a/docs/resources/library/revvity.md
+++ b/docs/resources/library/revvity.md
@@ -6,6 +6,6 @@ Company wikipedia: [Revvity, Inc. (formerly PerkinElmer, Inc.)](https://en.wikip
## Plates
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| 'Revvity_384_wellplate_28ul_Ub' Part no.: 6008280 [manufacturer website](https://www.revvity.com/product/proxiplate-384-plus-50w-6008280) |  | `Revvity_384_wellplate_28ul_Ub`
+| Description | Image | PLR definition |
+| ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------- |
+| 'Revvity_384_wellplate_28ul_Ub' Part no.: 6008280 [manufacturer website](https://www.revvity.com/product/proxiplate-384-plus-50w-6008280) |  | `Revvity_384_wellplate_28ul_Ub` |
diff --git a/docs/resources/library/sergi.md b/docs/resources/library/sergi.md
index 0b05975b281..48a53085ce9 100644
--- a/docs/resources/library/sergi.md
+++ b/docs/resources/library/sergi.md
@@ -2,8 +2,8 @@
Company page: [Sergi Lab Supplies](https://sergilabsupplies.com/?srsltid=AfmBOoqk2e3QkpWxvWEtSXS4ySJVoly7hvdiji_ehH5-s6tM3gi67SMu)
-## Plate Adapterrs
+## Plate Adapters
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
+| Description | Image | PLR definition |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------- |
| 'SergiLabSupplies_96_MagneticRack_250ul_Vb' Part no.: 1047 [manufacturer website](https://sergilabsupplies.com/collections/magnetic-racks/products/96-wells-magnetic-rack-for-dna-rna-and-other-molecules-purification) A separator for purifying DNA, RNA or other biomolecules with magnetic beads |  | `SergiLabSupplies_96_MagneticRack_250ul_Vb` |
diff --git a/docs/resources/library/thermo_fisher.md b/docs/resources/library/thermo_fisher.md
index 7cb7482834b..52752b1aa79 100644
--- a/docs/resources/library/thermo_fisher.md
+++ b/docs/resources/library/thermo_fisher.md
@@ -26,23 +26,23 @@ Thermo Fisher Scientific Inc. (TFS, aka "Thermo")
## Plates
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| 'Thermo_TS_96_wellplate_1200ul_Rb' Part no.: AB-1127 or 10243223 [manufacturer website](https://www.fishersci.co.uk/shop/products/product/10243223)
- Material: Polypropylene (AB-1068, polystyrene) |  | `Thermo_TS_96_wellplate_1200ul_Rb` |
+| 'Thermo_TS_Nunc_96_wellplate_300uL_Fb' Part no.: 165305 [manufacturer website](https://www.fishersci.com/shop/products/nunc-microwell-96-well-cell-culture-treated-flat-bottom-microplate/1256670#) |  | `Thermo_TS_Nunc_96_wellplate_300uL_Fb` |
| 'Thermo_AB_96_wellplate_300ul_Vb_EnduraPlate' Part no.: 4483354 (TFS) or 15273005 (FS) (= with barcode) Part no.: 16698853 (FS) (= **without** barcode) [manufacturer website](https://www.thermofisher.com/order/catalog/product/4483354)
- Material: Polycarbonate, Polypropylene - plate_type: semi-skirted - product line: "MicroAmp" - (sub)product line: "EnduraPlate" |  | `Thermo_AB_96_wellplate_300ul_Vb_EnduraPlate` |
-| 'Thermo_Nunc_96_well_plate_1300uL_Rb' Part no.: 26025X |  | `Thermo_Nunc_96_well_plate_1300uL_Rb` |
-| 'thermo_AB_96_wellplate_300ul_Vb_MicroAmp' Part no.: N8010560/4316813 (w/o barcode) Part no.: 4306737/4326659 (with barcode) |  | `thermo_AB_96_wellplate_300ul_Vb_MicroAmp` |
-| 'thermo_AB_384_wellplate_40uL_Vb_MicroAmp' Part no.: 4309849, 4326270, 4343814 (with barcode), 4343370 (w/o barcode). |  | `thermo_AB_384_wellplate_40uL_Vb_MicroAmp` |
+| 'Thermo_Nunc_96_well_plate_1300uL_Rb' Part no.: 26025X |  | `Thermo_Nunc_96_well_plate_1300uL_Rb` |
+| 'thermo_AB_96_wellplate_300ul_Vb_MicroAmp' Part no.: N8010560/4316813 (w/o barcode) Part no.: 4306737/4326659 (with barcode) |  | `thermo_AB_96_wellplate_300ul_Vb_MicroAmp` |
+| 'thermo_AB_384_wellplate_40uL_Vb_MicroAmp' Part no.: 4309849, 4326270, 4343814 (with barcode), 4343370 (w/o barcode). |  | `thermo_AB_384_wellplate_40uL_Vb_MicroAmp` |
## Troughs
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| 'thermo_nunc_1_troughplate_90000uL_Fb_omnitray' Part no.: 165218, 140156, 242811, 264728 |  | `thermo_nunc_1_troughplate_90000uL_Fb_omnitray` |
-| 'ThermoFisherMatrixTrough8094' Part no.: 8094 [manufacturer website](https://www.thermofisher.com/order/catalog/product/8094) |  | `ThermoFisherMatrixTrough8094` |
-| 'thermo_TS_nalgene_1_troughplate_300mL_Fb' Part no.: 12001300 (non-sterile), 12001301 (sterile) [manufacturer website](https://www.fishersci.com/shop/products/nalgene-disposable-polypropylene-robotic-reservoirs/12565571)|  | `thermo_TS_nalgene_1_troughplate_300mL_Fb` |
+| Description | Image | PLR definition |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------- | ----------------------------------------------- |
+| 'thermo_nunc_1_troughplate_90000uL_Fb_omnitray' Part no.: 165218, 140156, 242811, 264728 |  | `thermo_nunc_1_troughplate_90000uL_Fb_omnitray` |
+| 'ThermoFisherMatrixTrough8094' Part no.: 8094 [manufacturer website](https://www.thermofisher.com/order/catalog/product/8094) |  | `ThermoFisherMatrixTrough8094` |
+| 'thermo_TS_nalgene_1_troughplate_300mL_Fb' Part no.: 12001300 (non-sterile), 12001301 (sterile) [manufacturer website](https://www.fishersci.com/shop/products/nalgene-disposable-polypropylene-robotic-reservoirs/12565571) |  | `thermo_TS_nalgene_1_troughplate_300mL_Fb` |
## Plate Adapters
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
-| 'thermo_AB_96_plateadapter_MicroAmp' Part no.: 4312063 [manufacturer website](https://www.thermofisher.com/order/catalog/product/4312063)|  | `thermo_AB_96_plateadapter_MicroAmp` |
+| Description | Image | PLR definition |
+| ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------ |
+| 'thermo_AB_96_plateadapter_MicroAmp' Part no.: 4312063 [manufacturer website](https://www.thermofisher.com/order/catalog/product/4312063) |  | `thermo_AB_96_plateadapter_MicroAmp` |
diff --git a/docs/resources/library/vwr.md b/docs/resources/library/vwr.md
index 62cae2f87ce..4b4445edb3d 100644
--- a/docs/resources/library/vwr.md
+++ b/docs/resources/library/vwr.md
@@ -4,13 +4,13 @@ Company page: [Wikipedia](https://en.wikipedia.org/wiki/VWR_International)
## Troughs
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
+| Description | Image | PLR definition |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | -------------------------- |
| 'VWRReagentReservoirs25mL' Part no.: 89094 [manufacturer website](https://us.vwr.com/store/product/4694822/vwr-disposable-pipetting-reservoirs) Polystyrene Reservoirs |  | `VWRReagentReservoirs25mL` |
## Plates
-| Description | Image | PLR definition |
-|--------------------|--------------------|--------------------|
+| Description | Image | PLR definition |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | ------------------------------- |
| 'VWR_1_troughplate_195000uL_Ub' Part no.: 77575-302 [manufacturer website](https://www.avantorsciences.com/us/en/product/47763965/vwr-multi-channel-polypropylene-reagent-reservoirs?isCatNumSearch=true&searchedCatalogNumber=77575-302) Polypropylene multi-channel reagent reservoirs |  | `VWR_1_troughplate_195000uL_Ub` |
-| 'VWR_96_wellplate_2mL_Vb' Part no.: 76329-998 [manufacturer website](https://us-prod2.vwr.com/store/product/26915641/vwr-96-well-deep-well-plates-with-automation-notches) Polypropylene multi-channel reagent reservoirs |  | `VWR_96_wellplate_2mL_Vb` |
+| 'VWR_96_wellplate_2mL_Vb' Part no.: 76329-998 [manufacturer website](https://us.vwr.com/store/product/26915641/vwr-96-well-deep-well-plates-with-automation-notches) Polypropylene multi-channel reagent reservoirs |  | `VWR_96_wellplate_2mL_Vb` |
diff --git a/docs/resources/library_convention.md b/docs/resources/library_convention.md
new file mode 100644
index 00000000000..0a43b74f767
--- /dev/null
+++ b/docs/resources/library_convention.md
@@ -0,0 +1,210 @@
+---
+orphan: true
+---
+
+# Resource Library file convention (PROPOSAL — for review)
+
+Status: **proposal, not yet enforced or wired.** This describes the target
+structure for `docs/resources/library/.md` so that (a) the full
+manufacturer / OEM information is captured deterministically and (b) the
+resources are organised into a consistent, machine-readable hierarchy that the
+Resource Library can render and CI can validate.
+
+It deliberately replaces heuristics in today's library extension ("first link
+in the preamble", "first blockquote", "first fenced code block") with explicit,
+reserved structure.
+
+---
+
+## 1. One file per manufacturer
+
+- Exactly **one H1**, the first heading in the file: the canonical manufacturer
+ name. This is both the displayed name and the de-duplication key.
+ - `# Corning Inc.`
+- The filename is the slug (`corning.md`); it is *not* the source of the name.
+
+## 2. OEM metadata (explicit, labelled — never inferred)
+
+Immediately after the H1, an **optional** bullet list of labelled links. The
+list, any individual key, and the whole block are all optional — many
+manufacturers (smaller OEMs, regional suppliers, the DIY entries) have no
+external page at all, and that is normal, not a violation.
+
+Recognised keys (case-insensitive, value = one absolute URL):
+
+- **`Website:`** — the manufacturer's own page. This is the only key worth
+ treating as the "primary" reference when present.
+- Any number of *additional, optional* labelled links, e.g.
+ **`Wikipedia:`**, **`Catalog:`**, **`Datasheet:`**. **None of these is
+ expected** — `Wikipedia:` in particular must not be assumed, since most
+ manufacturers have no Wikipedia page.
+
+```markdown
+- **Website:** https://www.corning.com
+- **Wikipedia:** https://en.wikipedia.org/wiki/Corning_Inc. (optional extra)
+```
+
+A file with no links is fully conformant. **Fallback:** no metadata → no
+reference link in the panel; only `Website:` → a "Website ↗" link; a
+`Wikipedia:` present → an additional "Wikipedia ↗" link. The panel never
+implies a missing key should exist.
+
+Rationale: today the library grabs "whichever link appears first", so some
+manufacturers surface a Wikipedia link and others a homepage purely by
+ordering accident. Explicit, optional labels remove the ambiguity without
+making any particular source mandatory.
+
+## 3. Reserved info sections (all optional)
+
+These headings are **reserved** and **optional**. When present they hold
+manufacturer information and are **excluded from the resource organisation
+tree**; when absent the panel simply omits that part — never an error. The
+names, *if used*, must be spelled exactly, but **no file is required to have
+them**. The only mandatory content is §1 (one H1) and §5 (at least one
+resource table whose definitions resolve); everything in this section is
+optional enrichment.
+
+### `## About` (optional)
+
+A single descriptive paragraph (plain prose or one blockquote). Replaces the
+"first blockquote in the preamble" heuristic.
+**Fallback:** if absent, no description paragraph is shown — not an error.
+
+```markdown
+## About
+
+Corning Incorporated is an American multinational technology company that
+specialises in specialty glass, ceramics, and related materials.
+```
+
+### `## Brand structure` (optional)
+
+A human-curated overview of the manufacturer's brand hierarchy, as a fenced
+code block (ASCII tree) and/or prose. This is narrative context for humans; it
+is **not** the source of truth for how resources are organised (see §4).
+**Fallback:** if absent, the panel shows only the heading-derived breakdown
+from §4 (which every file has) — not an error.
+
+```markdown
+## Brand structure
+
+```
+Thermo Fisher Scientific Inc.
+├── Applied Biosystems
+│ └── MicroAmp
+└── Thermo Scientific
+ ├── Nalgene
+ └── Nunc
+```
+```
+
+## 4. Resource organisation = heading nesting
+
+The organisational tree the library renders is derived **only** from the
+`##` / `###` / `####` heading nesting of the non-reserved sections — not from
+the `## Brand structure` art (which only a few files have today).
+
+- `##` = top-level grouping. A manufacturer chooses one consistent axis:
+ **brand-first** (`## Costar`, `## Axygen`) **or** **category-first**
+ (`## Plates`, `## Tip Racks`) — not a mix.
+- `###` / `####` = finer grouping under that (e.g. `## Costar` → `### Plates`).
+- A section that directly contains resources must end in a definition table.
+
+## 5. Definition table (fixed shape)
+
+Every leaf section that lists resources contains exactly one table with this
+exact header:
+
+```markdown
+| Description | Image | PLR definition |
+|-|-|-|
+| Part no.: [manufacturer website]() |  | `Exact_PLR_Definition` |
+```
+
+Rules per row:
+
+- **Description**: free text. Optional `Part no.: …` and a
+ `[manufacturer website]()` link, ` `-separated.
+- **Image**: a markdown image whose path resolves to a real file under
+ `docs/resources/library/img//…`, or an absolute URL.
+- **PLR definition**: exactly **one** backticked identifier matching
+ `^[A-Za-z][A-Za-z0-9_]*$`, and it must resolve to a callable in
+ `pylabrobot.resources`. One definition per row.
+
+## 6. Worked example
+
+```markdown
+# Corning Inc.
+
+- **Website:** https://www.corning.com
+- **Wikipedia:** https://en.wikipedia.org/wiki/Corning_Inc.
+
+## About
+
+> Corning Incorporated is an American multinational technology company
+> specialising in specialty glass and ceramics.
+
+## Costar
+
+### Plates
+
+| Description | Image | PLR definition |
+|-|-|-|
+| 96-well, 2 mL, V-bottom Part no.: 3960 [manufacturer website](https://ecatalog.corning.com/3960) |  | `Cor_96_wellplate_2mL_Vb` |
+
+## Axygen
+
+### Plates
+
+| Description | Image | PLR definition |
+|-|-|-|
+| 384-well PCR, V-bottom Part no.: PCR-384 |  | `Axy_384_wellplate_50uL_Vb` |
+```
+
+---
+
+## What CI would enforce (objective)
+
+Mechanically checkable, proposed to **fail** CI on violation. Split into the
+mandatory core and conditional checks that only apply to *optional* content
+when it is present.
+
+**Required (mandatory core — every file):**
+
+1. Exactly one H1.
+2. At least one resource table, and every PLR definition in it is a single
+ regex-valid identifier that resolves to a real `pylabrobot.resources`
+ factory.
+3. Every definition table matches the fixed header.
+4. Every image path resolves to an existing file.
+5. No duplicate PLR definition names across the whole library.
+
+**Conditional (optional content — checked only if present):**
+
+6. OEM metadata list, *if present*, uses only recognised labels with valid
+ absolute URLs.
+7. Reserved sections are **not required**. A section titled exactly
+ `## About` or `## Brand structure` is treated as reserved (excluded from
+ the resource tree); near-miss spellings are flagged so they are not
+ silently parsed as resource categories.
+8. No resource table placed where the parser expects an info section, or
+ vice-versa.
+
+## What is NOT in scope for CI (author / project decision)
+
+These are real consistency issues but are **naming/structure policy**, not
+mechanics, and tie into the open resource library /
+plural-vs-singular discussion. The spec *recommends* a rule but the project
+owner decides; CI should not impose it:
+
+- Heading **naming**: Title Case, singular vs plural ("Tip Rack" vs
+ "TipRacks" vs "Tip racks"), and the typo class ("Plate Adapterrs").
+ *Recommendation:* Title Case, singular category nouns.
+- Whether organisation is **brand-first or category-first** per manufacturer.
+
+## Migration note
+
+Adopting this fully requires: updating the library extension to parse the
+explicit metadata + reserved sections + heading-derived tree, migrating the
+~23 existing vendor files, then enabling the CI. That is a separate,
+author-coordinated effort; this document is the spec to agree on first.
diff --git a/docs/resources/library_convention_example.md b/docs/resources/library_convention_example.md
new file mode 100644
index 00000000000..b425429fb6a
--- /dev/null
+++ b/docs/resources/library_convention_example.md
@@ -0,0 +1,75 @@
+---
+orphan: true
+---
+
+# Example vendor file (reference for library_convention.md)
+
+This is a complete, conformant reference for the proposed
+`docs/resources/library/.md` convention. It is **not** a real vendor
+page; it is shown below as a literal code block so it is not built as a page
+and its placeholder images are not resolved. Copy this skeleton when adding a
+manufacturer.
+
+````markdown
+# Acme Labware Inc.
+
+- **Website:** https://www.acme-labware.example
+- **Wikipedia:** https://en.wikipedia.org/wiki/Example
+
+## About
+
+> Acme Labware Inc. is a fictional manufacturer of plates, tip racks, and
+> reservoirs, used here purely to demonstrate the file convention.
+
+## Brand structure
+
+```
+Acme Labware Inc.
+├── AcmePure (consumables brand)
+│ ├── Plates
+│ └── Reservoirs
+└── AcmeTips (tips brand)
+ └── Tip Racks
+```
+
+## AcmePure
+
+### Plates
+
+| Description | Image | PLR definition |
+|-|-|-|
+| 96-well, 2 mL, V-bottom Part no.: AP-9620 [manufacturer website](https://www.acme-labware.example/p/AP-9620) |  | `Acme_96_wellplate_2mL_Vb` |
+| 384-well, 120 uL, flat bottom Part no.: AP-3841 [manufacturer website](https://www.acme-labware.example/p/AP-3841) |  | `Acme_384_wellplate_120uL_Fb` |
+
+### Reservoirs
+
+| Description | Image | PLR definition |
+|-|-|-|
+| Single-channel reservoir, 290 mL Part no.: AP-RES290 |  | `Acme_1_troughplate_290000uL_Vb` |
+
+## AcmeTips
+
+### Tip Racks
+
+| Description | Image | PLR definition |
+|-|-|-|
+| 96 tips, 1000 uL, filtered Part no.: AT-1000F [manufacturer website](https://www.acme-labware.example/p/AT-1000F) |  | `Acme_96_tiprack_1000uL_filtered` |
+````
+
+## Why this is conformant
+
+- **One H1** (`# Acme Labware Inc.`) — the canonical name + dedup key.
+- **OEM metadata** as a labelled list (`Website:`, optional `Wikipedia:`) —
+ captured unambiguously, no "first link" guessing; all keys optional.
+- **`## About`** (optional) reserved section holds the description (not a
+ scraped blockquote heuristic).
+- **`## Brand structure`** (optional) reserved section holds the human-curated
+ overview; it is *not* used to build the library tree.
+- **Organisation = heading nesting**: brand-first here
+ (`## AcmePure` → `### Plates`/`### Reservoirs`, `## AcmeTips` →
+ `### Tip Racks`), one consistent axis, reserved sections excluded.
+- **Definition tables**: exact `| Description | Image | PLR definition |`
+ header; one backticked, regex-valid PLR definition per row; image paths
+ under `img//…`; optional `Part no.` and `[manufacturer website]`.
+- Headings use Title Case, singular category nouns ("Tip Rack", "Plate") —
+ the *recommended* (not CI-enforced) naming policy.
diff --git a/docs/user_guide/01_material-handling/heating_shaking/hamilton.ipynb b/docs/user_guide/01_material-handling/heating_shaking/hamilton.ipynb
index 8ba4ebe5348..8aaad4aada5 100644
--- a/docs/user_guide/01_material-handling/heating_shaking/hamilton.ipynb
+++ b/docs/user_guide/01_material-handling/heating_shaking/hamilton.ipynb
@@ -212,7 +212,7 @@
"\n",
"Before you can use the Hamilton Heater Shaker in combination with a Hamilton STAR liquid handler, you need to assign it to the deck. This is needed when, for example, you want to use the iSWAP or CoRe grippers to move a plate to or from the heater shaker. This is also required to get the heater shaker to show up in the Visualizer.\n",
"\n",
- "Here's one example of assigning a Hamilton Heater Shaker to the deck using a `MFX_CAR_P3_SHAKER`. Note that you can use any carrier, or even directly place heater shakers on the deck if you like. See the [Hamilton STAR resources page](/resources/library/hamilton) for carriers."
+ "Here's one example of assigning a Hamilton Heater Shaker to the deck using a `MFX_CAR_P3_SHAKER`. Note that you can use any carrier, or even directly place heater shakers on the deck if you like. See the [resource library](../../../resources/library.md) for carriers."
]
},
{
diff --git a/pylabrobot/resources/__init__.py b/pylabrobot/resources/__init__.py
index 4652e9a859b..c94079dcf03 100644
--- a/pylabrobot/resources/__init__.py
+++ b/pylabrobot/resources/__init__.py
@@ -25,6 +25,12 @@
from .diy import *
from .eppendorf import *
from .errors import ResourceNotFoundError
+from .geometry import (
+ generate_geometry_catalog,
+ generate_geometry_library,
+ save_geometry_catalog,
+ save_geometry_library,
+)
from .greiner import *
from .hamilton import *
from .itemized_resource import ItemizedResource
diff --git a/pylabrobot/resources/corning/falcon/tubes.py b/pylabrobot/resources/corning/falcon/tubes.py
index 8929b0d93ff..a637123bcfe 100644
--- a/pylabrobot/resources/corning/falcon/tubes.py
+++ b/pylabrobot/resources/corning/falcon/tubes.py
@@ -84,7 +84,7 @@ def Cor_Falcon_tube_14mL_Rb(name: str) -> Tube:
def falcon_tube_50mL(name: str) -> Tube:
raise NotImplementedError(
- "falcon_tube_50mL definition is deprecated. Use Cor_Falcon_tube_50mL instead."
+ "falcon_tube_50mL definition is deprecated. Use Cor_Falcon_tube_50mL_Vb instead."
)
diff --git a/pylabrobot/resources/geometry.py b/pylabrobot/resources/geometry.py
new file mode 100644
index 00000000000..d98a3578281
--- /dev/null
+++ b/pylabrobot/resources/geometry.py
@@ -0,0 +1,162 @@
+from __future__ import annotations
+
+import hashlib
+import json
+from pathlib import Path
+from typing import Any, Dict, List, Optional, Union
+
+from pylabrobot.resources.container import Container
+from pylabrobot.resources.coordinate import Coordinate
+from pylabrobot.resources.resource import Resource
+from pylabrobot.resources.rotation import Rotation
+from pylabrobot.resources.tip_rack import TipSpot
+from pylabrobot.resources.well import Well
+
+
+def generate_geometry_library(root: Resource) -> Dict[str, Any]:
+ """Generate a renderer-oriented geometry library entry for a resource tree.
+
+ The library entry is intentionally separate from the package data: call this on a deck
+ or labware resource after building a layout, then write the returned dict to JSON
+ if a simulator needs it.
+ """
+
+ prototypes: Dict[str, Dict[str, Any]] = {}
+ instances: Dict[str, Dict[str, Any]] = {}
+
+ for resource in _walk_resources(root):
+ prototype = _resource_geometry_prototype(resource)
+ prototype_id = _geometry_prototype_id(prototype)
+ prototypes.setdefault(prototype_id, prototype)
+
+ instance: Dict[str, Any] = {
+ "prototype": prototype_id,
+ "parent": resource.parent.name if resource.parent is not None else None,
+ "pose": _resource_pose(resource),
+ "rotation": _rotation_values(resource.get_absolute_rotation()),
+ }
+ if len(resource.children) > 0:
+ instance["children"] = [child.name for child in resource.children]
+ instances[resource.name] = instance
+
+ return {
+ "root": root.name,
+ "prototypes": prototypes,
+ "instances": instances,
+ }
+
+
+def save_geometry_library(
+ root: Resource,
+ path: Union[str, Path],
+ indent: Optional[int] = 2,
+) -> None:
+ """Generate a geometry library entry and write it to a JSON file."""
+
+ path = Path(path)
+ path.parent.mkdir(parents=True, exist_ok=True)
+ path.write_text(json.dumps(generate_geometry_library(root), indent=indent), encoding="utf-8")
+
+
+def generate_geometry_catalog(root: Resource) -> Dict[str, Any]:
+ """Deprecated alias for :func:`generate_geometry_library`."""
+
+ return generate_geometry_library(root)
+
+
+def save_geometry_catalog(
+ root: Resource,
+ path: Union[str, Path],
+ indent: Optional[int] = 2,
+) -> None:
+ """Deprecated alias for :func:`save_geometry_library`."""
+
+ save_geometry_library(root, path, indent=indent)
+
+
+def _walk_resources(root: Resource) -> List[Resource]:
+ resources = [root]
+ for child in root.children:
+ resources.extend(_walk_resources(child))
+ return resources
+
+
+def _resource_geometry_prototype(resource: Resource) -> Dict[str, Any]:
+ prototype: Dict[str, Any] = {
+ "type": resource.__class__.__name__,
+ "category": resource.category,
+ "size": _coordinate_values(
+ Coordinate(resource.get_size_x(), resource.get_size_y(), resource.get_size_z())
+ ),
+ "geometry": _resource_geometry_hints(resource),
+ }
+ if resource.model is not None:
+ prototype["model"] = resource.model
+ return prototype
+
+
+def _resource_geometry_hints(resource: Resource) -> Dict[str, Any]:
+ if isinstance(resource, Well):
+ geometry: Dict[str, Any] = {
+ "shape": "well",
+ "cross_section": resource.cross_section_type.value,
+ "bottom": resource.bottom_type.value,
+ }
+ if resource._material_z_thickness is not None:
+ geometry["material_z_thickness"] = resource._material_z_thickness
+ if len(resource.no_go_zones) > 0:
+ geometry["no_go_zones"] = _no_go_zones_to_values(resource.no_go_zones)
+ return geometry
+
+ if isinstance(resource, TipSpot):
+ return {"shape": "tip_spot"}
+
+ if isinstance(resource, Container):
+ geometry = {"shape": "container"}
+ if resource._material_z_thickness is not None:
+ geometry["material_z_thickness"] = resource._material_z_thickness
+ if len(resource.no_go_zones) > 0:
+ geometry["no_go_zones"] = _no_go_zones_to_values(resource.no_go_zones)
+ return geometry
+
+ if resource.category == "deck":
+ return {"shape": "deck"}
+
+ return {"shape": "box"}
+
+
+def _geometry_prototype_id(prototype: Dict[str, Any]) -> str:
+ payload = json.dumps(prototype, sort_keys=True, separators=(",", ":"))
+ digest = hashlib.sha1(payload.encode("utf-8")).hexdigest()[:10]
+ return f"{prototype['type']}_{digest}"
+
+
+def _coordinate_or_none(resource: Resource, x: str, y: str, z: str) -> Optional[List[float]]:
+ try:
+ return _coordinate_values(resource.get_absolute_location(x=x, y=y, z=z))
+ except Exception:
+ return None
+
+
+def _resource_pose(resource: Resource) -> Optional[List[float]]:
+ pose = _coordinate_or_none(resource, x="l", y="f", z="b")
+ if pose is None and resource.parent is None:
+ return [0, 0, 0]
+ return pose
+
+
+def _coordinate_values(coordinate: Coordinate) -> List[float]:
+ return [coordinate.x, coordinate.y, coordinate.z]
+
+
+def _rotation_values(rotation: Rotation) -> List[float]:
+ return [rotation.x, rotation.y, rotation.z]
+
+
+def _no_go_zones_to_values(
+ no_go_zones: List[tuple[Coordinate, Coordinate]],
+) -> List[List[List[float]]]:
+ return [
+ [_coordinate_values(front_left_bottom), _coordinate_values(back_right_top)]
+ for front_left_bottom, back_right_top in no_go_zones
+ ]
diff --git a/pylabrobot/resources/geometry_tests.py b/pylabrobot/resources/geometry_tests.py
new file mode 100644
index 00000000000..89206e64810
--- /dev/null
+++ b/pylabrobot/resources/geometry_tests.py
@@ -0,0 +1,42 @@
+import json
+import unittest
+
+from pylabrobot.resources import (
+ Cor_96_wellplate_360ul_Fb,
+ generate_geometry_library,
+ hamilton_96_tiprack_1000uL_filter,
+)
+from pylabrobot.resources.hamilton import STARLetDeck
+
+
+class GeometryLibraryTests(unittest.TestCase):
+ def setUp(self):
+ self.deck = STARLetDeck()
+ self.tip_rack = hamilton_96_tiprack_1000uL_filter(name="tip_rack")
+ self.plate = Cor_96_wellplate_360ul_Fb(name="plate")
+ self.deck.assign_child_resource(self.tip_rack, rails=3)
+ self.deck.assign_child_resource(self.plate, rails=9)
+
+ def test_generate_geometry_library_for_deck(self):
+ library = generate_geometry_library(self.deck)
+ json.dumps(library)
+
+ self.assertEqual(library["root"], "deck")
+ self.assertIn("plate", library["instances"])
+ self.assertIn("plate_well_A1", library["instances"])
+
+ well_instance = library["instances"]["plate_well_A1"]
+ well_prototype = library["prototypes"][well_instance["prototype"]]
+ self.assertEqual(well_prototype["geometry"]["shape"], "well")
+ self.assertEqual(well_prototype["geometry"]["cross_section"], "circle")
+ self.assertEqual(len(well_instance["pose"]), 3)
+
+ def test_generate_geometry_library_for_single_labware(self):
+ plate = Cor_96_wellplate_360ul_Fb(name="standalone_plate")
+ library = generate_geometry_library(plate)
+
+ self.assertEqual(library["root"], "standalone_plate")
+ self.assertIn("standalone_plate", library["instances"])
+ self.assertIn("standalone_plate_well_A1", library["instances"])
+ self.assertEqual(library["instances"]["standalone_plate"]["pose"], [0, 0, 0])
+ self.assertLess(len(library["prototypes"]), len(library["instances"]))
diff --git a/pylabrobot/resources/opentrons/load.py b/pylabrobot/resources/opentrons/load.py
index 868363a0e7e..84ecfdf8e5f 100644
--- a/pylabrobot/resources/opentrons/load.py
+++ b/pylabrobot/resources/opentrons/load.py
@@ -11,7 +11,7 @@
def _download_file(url: str, local_path: str) -> bytes:
- with urllib.request.urlopen(url) as response, open(local_path, "wb") as out_file:
+ with urllib.request.urlopen(url, timeout=10) as response, open(local_path, "wb") as out_file:
data = response.read()
out_file.write(data)
return data # type: ignore