diff --git a/docs/resources/library/img/opentrons/ot2-1.5mL-tube-rack-24w.png b/docs/resources/library/img/opentrons/ot2-1.5mL-tube-rack-24w.png
new file mode 100644
index 00000000000..5e3208bf87d
Binary files /dev/null and b/docs/resources/library/img/opentrons/ot2-1.5mL-tube-rack-24w.png differ
diff --git a/docs/resources/library/opentrons.md b/docs/resources/library/opentrons.md
index c3ba94216d9..d5b0df51d56 100644
--- a/docs/resources/library/opentrons.md
+++ b/docs/resources/library/opentrons.md
@@ -39,6 +39,11 @@ Unfortunately, most of the other labware (plates) is missing information that is
- `opentrons_24_tuberack_nest_0_5ml_screwcap`
- `opentrons_24_tuberack_nest_1_5ml_screwcap`
- `opentrons_24_tuberack_nest_1_5ml_snapcap`
+
+| Description | Image | PLR definition |
+|-|-|-|
+| 'opentrons_24_tuberack_generic_1point5ml_snapcap_short'
Part no.: 3405002
[manufacturer website](hhttps://www.thingiverse.com/thing:3405002) |  | `opentrons_24_tuberack_generic_1point5ml_snapcap_short` |
+
- `opentrons_24_tuberack_nest_2ml_screwcap`
- `opentrons_24_tuberack_nest_2ml_snapcap`
- `opentrons_6_tuberack_falcon_50ml_conical`
diff --git a/pylabrobot/resources/opentrons/tube_racks.py b/pylabrobot/resources/opentrons/tube_racks.py
index 81aab4c1bb5..b226b051324 100644
--- a/pylabrobot/resources/opentrons/tube_racks.py
+++ b/pylabrobot/resources/opentrons/tube_racks.py
@@ -1,5 +1,51 @@
from pylabrobot.resources.opentrons.load import load_ot_tube_rack
+from pylabrobot.resources.resource_holder import ResourceHolder
from pylabrobot.resources.tube_rack import TubeRack
+from pylabrobot.resources.utils import create_ordered_items_2d
+
+
+def opentrons_24_tuberack_generic_1point5ml_snapcap_short(name: str) -> TubeRack:
+ """
+ OpenTrons 24 well rack with the shorter stand; 30mm shorter than default stand.
+ 3D print available here: https://www.thingiverse.com/thing:3405002
+ Spec sheet (json):
+ https://raw.githubusercontent.com/Opentrons/opentrons/edge/shared-data/labware/definitions/2/opentrons_24_tuberack_nest_1.5ml_screwcap/1.json
+ """
+
+ WELL_DIAMETER = 9.2 # measured (circular -> inscribed square sizing is used elsewhere; see below)
+ WELL_DEPTH = 37.40 # measured
+
+ # PLR's OT loader converts circular diameter to a square footprint using diameter / sqrt(2).
+ # Your earlier code already used inner well width/length of 9.2; if 9.2 is the *square* size,
+ # keep it. If 9.2 is the *diameter*, convert like load_ot_tube_rack does.
+ #
+ # If 9.2 is "inner square width", use:
+ well_size_x = well_size_y = WELL_DIAMETER
+ #
+ # If instead 9.2 is a measured *diameter*, use this:
+ # import math
+ # well_size_x = well_size_y = round(WELL_DIAMETER / math.sqrt(2), 3)
+
+ return TubeRack(
+ name=name,
+ size_x=127.75, # spec
+ size_y=85.50, # spec
+ size_z=48.5, # measured (short stand)
+ model=opentrons_24_tuberack_generic_1point5ml_snapcap_short.__name__,
+ ordered_items=create_ordered_items_2d(
+ ResourceHolder,
+ num_items_x=6,
+ num_items_y=4,
+ dx=13.5, # measured
+ dy=13.5, # measured
+ dz=12, # measured
+ item_dx=19.89, # spec
+ item_dy=19.28, # spec
+ size_x=well_size_x,
+ size_y=well_size_y,
+ size_z=WELL_DEPTH,
+ ),
+ )
def opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical(name: str) -> TubeRack: