Gallery › robotparts › Actuators side by side

Actuators side by side

Four integrated actuators from robotparts.dev's catalog in columns, one line per spec: the better value of each spec marked by its direction, "Differences only", the robotparts photos in a slider, and a column you can drop or add from the six in the file.

robotpartscomparerecordtable5 views of one compare.json

The .base file and its data

Every tab above is one entry of this file; the views read these rows. ⋯ in the toolbar copies the current view as YAML.

# Actuators side by side: robotparts' /search/compare/ page (site/static/site.js compare(), build/site_pages.py
# compare_page) as a .base file. Six integrated actuators from the catalog, each with its robotparts photo; the
# compare view opens on four. Obsidian Bases grammar plus data-ui's keys (docs/CONTRACT.md §5).
data: compare.json
properties:
  name: { displayName: Part }
  peak_torque: { displayName: Peak torque }
  torque_density: { displayName: Peak torque / mass }
views:
  - type: compare
    name: Side by side
    order: [brand, level, drivetrain, buses, peak_torque, rated_torque, torque_density, max_speed, rated_speed, mass, gear_ratio, voltage, backlash, od, length, rated_power, price, sellers, measured, cited, cad, sim]
    compare:
      rows: [aifitlab-8541438771336, aifitlab-8542347853960, aifitlab-8682672160904, aifitlab-8649843966088]
  - type: compare
    name: Differences only
    order: [brand, level, drivetrain, buses, peak_torque, rated_torque, torque_density, max_speed, rated_speed, mass, gear_ratio, voltage, backlash, od, length, rated_power, price, sellers, measured, cited, cad, sim]
    compare:
      rows: [aifitlab-8541438771336, aifitlab-8542347853960, aifitlab-8682672160904, aifitlab-8649843966088]
      better: { price: lower, mass: lower }
      diffOnly: true
  - type: compare
    name: Pick your own
    order: [peak_torque, rated_torque, torque_density, max_speed, mass, gear_ratio, voltage, price]
    compare:
      rows: selection
  - type: record
    name: Part page
    record:
      sections:
        - { name: Torque and speed, properties: [peak_torque, rated_torque, torque_density, max_speed, rated_speed, rated_power] }
        - { name: Size, properties: [mass, od, length, gear_ratio, backlash] }
        - { name: Electrical, properties: [voltage, buses] }
        - { name: In the catalog, properties: [level, cited, cad, sim, measured, price, sellers] }
  - type: table
    name: All six
    order: [name, level, peak_torque, rated_torque, mass, gear_ratio, voltage, price]
    sort:
      - { property: peak_torque, direction: DESC }
// compare.json: 6 rows, 14 KB; the first 3
{
 "id": "robotparts-compare",
 "title": "Actuators side by side",
 "titleProperty": "name",
 "linkProperty": "url",
 "imageProperty": "photo",
 "source": "robotparts dist/site/v2/catalog.json, release 2026.10.25.1; photos from dist/site/v2/files/",
 "properties": {
  "name": {
   "type": "text",
   "label": "Part"
  },
  "brand": {
   "type": "text",
   "label": "Brand"
  },
  "model": {
   "type": "text",
   "label": "Model"
  },
  "photo": {
   "type": "text",
   "label": "Photo",
   "display": "image",
   "media": "image",
   "hidden": true
  },
  "url": {
   "type": "text",
   "label": "Page",
   "hidden": true
  },
  "level": {
   "type": "number",
   "label": "Level",
   "better": "higher",
   "note": "robotparts' level: listed, cited, CAD, sim, measured (0-5)"
  },
  "drivetrain": {
   "type": "text",
   "label": "Drivetrain",
   "display": "badge"
  },
  "buses": {
   "type": "list",
   "label": "Bus"
  },
  "peak_torque": {
   "type": "number",
   "label": "Peak torque",
   "unitText": "N·m",
   "better": "higher"
  },
  "rated_torque": {
   "type": "number",
   "label": "Rated torque",
   "unitText": "N·m",
   "better": "higher"
  },
  "max_speed": {
   "type": "number",
   "label": "Max speed",
   "unitText": "rpm",
   "better": "higher"
  },
  "rated_speed": {
   "type": "number",
   "label": "Rated speed",
   "unitText": "rpm",
   "better": "higher"
  },
  "mass": {
   "type": "number",
   "label": "Mass",
   "unitText": "g",
   "better": "lower"
  },
  "gear_ratio": {
   "type": "number",
   "label": "Gear ratio",
   "unitText": ":1"
  },
  "voltage": {
   "type": "number",
   "label": "Voltage",
   "unitText": "V"
  },
  "backlash": {
   "type": "number",
   "label": "Backlash",
   "unitText": "arcmin",
   "better": "lower"
  },
  "od": {
   "type": "number",
   "label": "Outer diameter",
   "unitText": "mm",
   "better": "lower"
  },
  "length": {
   "type": "number",
   "label": "Length",
   "unitText": "mm",
   "better": "lower"
  },
  "rated_power": {
   "type": "number",
   "label": "Rated power",
   "unitText": "W",
   "better": "higher"
  },
  "torque_density": {
   "type": "number",
   "label": "Peak torque / mass",
   "unitText": "N·m/kg",
   "better": "higher",
   "derived": "peak torque / mass, by robotparts"
  },
  "price": {
   "type": "number",
   "label": "Price from",
   "unitText": "USD",
   "decimals": 0,
   "better": "lower",
   "note": "the lowest price of a listing selling the part alone"
  },
  "sellers": {
   "type": "number",
   "label": "Sellers"
  },
  "measured": {
   "type": "number",
   "label": "Measured records",
   "better": "higher"
  },
  "cited": {
   "type": "boolean",
   "label": "Datasheet cited"
  },
  "cad": {
   "type": "boolean",
   "label": "CAD model"
  },
  "sim": {
   "type": "boolean",
   "label": "Sim model"
  }
 },
 "rows": [
  {
   "id": "aifitlab-8541438771336",
   "name": "Steadywin GIM4305-10",
   "brand": "Steadywin",
   "model": "GIM4305-10",
   "photo": "photos/aifitlab-8541438771336.webp",
   "url": "https://robotparts.dev/actuator/aifitlab-8541438771336/",
   "level": 4,
   "drivetrain": "geared",
   "buses": [
    "can",
    "rs485"
   ],
   "peak_torque": {
    "value": 3.82,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Stall Torque'"
   },
   "rated_torque": {
    "value": 1.05,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Nominal Torque'"
   },
   "max_speed": {
    "value": 402,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Max Speed after Reduction'"
   },
   "rated_speed": {
    "value": 312,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Nominal Speed after Reduction'"
   },
   "mass": {
    "value": 150,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Motor Weight (with Driver)'"
   },
   "gear_ratio": {
    "value": 10,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Gear Ratio'"
   },
   "voltage": {
    "value": 24,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Nominal Voltage'"
   },
   "backlash": {
    "value": 15,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Reducer Gear Backlash'"
   },
   "od": {
    "value": 53,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Size (with Driver)'; diameter marked in string"
   },
   "length": {
    "value": 26,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Size (with Driver)'; diameter marked in string; manufacturer says 32.0 mm"
   },
   "rated_power": {
    "value": 34.3,
    "basis": "derived",
    "source": "aifitlab.com",
    "note": "rated torque × rated speed"
   },
   "torque_density": 25.467,
   "price": 70,
   "sellers": 1,
   "measured": 5,
   "cited": true,
   "cad": true,
   "sim": true
  },
  {
   "id": "aifitlab-8542347853960",
   "name": "Steadywin GIM6010-8",
   "brand": "Steadywin",
   "model": "GIM6010-8",
   "photo": "photos/aifitlab-8542347853960.webp",
   "url": "https://robotparts.dev/actuator/aifitlab-8542347853960/",
   "level": 1,
   "drivetrain": "geared",
   "buses": [
    "can",
    "rs485"
   ],
   "peak_torque": {
    "value": 11,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Stall Torque'"
   },
   "rated_torque": {
    "value": 5,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Nominal Torque'"
   },
   "max_speed": {
    "value": 420,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Max Speed after Reduction'"
   },
   "rated_speed": {
    "value": 120,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Nominal Speed after Reduction'"
   },
   "mass": {
    "value": 388,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Motor Weight (with Driver)'"
   },
   "gear_ratio": {
    "value": 8,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Gear Ratio'"
   },
   "voltage": {
    "value": 24,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Nominal Voltage'"
   },
   "backlash": {
    "value": 15,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Reducer Gear Backlash'"
   },
   "od": {
    "value": 80,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Size (with Driver)'; diameter marked in string"
   },
   "length": {
    "value": 40,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Size (with Driver)'; diameter marked in string"
   },
   "rated_power": {
    "value": 62.8,
    "basis": "derived",
    "source": "aifitlab.com",
    "note": "rated torque × rated speed"
   },
   "torque_density": 28.351,
   "price": 70,
   "sellers": 1,
   "measured": null,
   "cited": false,
   "cad": false,
   "sim": false
  },
  {
   "id": "aifitlab-8682672160904",
   "name": "CubeMars AK60-6 V3.0",
   "brand": "CubeMars",
   "model": "AK60-6 V3.0",
   "photo": "photos/aifitlab-8682672160904.webp",
   "url": "https://robotparts.dev/actuator/aifitlab-8682672160904/",
   "level": 1,
   "drivetrain": "geared",
   "buses": [],
   "peak_torque": {
    "value": 9,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Peak Torque'"
   },
   "rated_torque": {
    "value": 3,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Rated Torque'"
   },
   "max_speed": {
    "value": 640,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'No-load speed'"
   },
   "rated_speed": {
    "value": 490,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Rated Speed'"
   },
   "mass": {
    "value": 380,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Motor Weight'"
   },
   "gear_ratio": {
    "value": 6,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Reduction ratio'"
   },
   "voltage": {
    "value": 48,
    "basis": "seller",
    "source": "aifitlab.com",
    "note": "row 'Rated Voltage'"
   },
   "backlash": null,
   "od": {
    "value": 79,
    "basis": "datasheet",
    "source": "cubemars.com",
    "note": null
   },
   "length": {
    "value": 43,
    "basis": "datasheet",
    "source": "cubemars.com",
    "note": null
   },
   "rated_power": {
    "value": 153.9,
    "basis": "derived",
    "source": "aifitlab.com",
    "note": "rated torque × rated speed"
   },
   "torque_density": 23.684,
   "price": 229.9,
   "sellers": 1,
   "measured": null,
   "cited": false,
   "cad": false,
   "sim": false
  }
 ]
}
skin.css, README.md
/* robotparts' skin: its own tokens (site/static/site.css, release 2026.10.25), then the one block that maps them onto
   data-ui's --data-* (docs/SPEC.md §10). The gallery scopes a skin to .data-ui-skin; on robotparts.dev the same
   mapping sits at :root. */
.data-ui-skin {
  --bg: #ffffff; --bg2: #f6f7f8; --hover: #f1f5fb; --ink: #15181c; --ink2: #545c66;
  --rule: #d9dde2; --rule2: #e9ebee; --accent: #0a5bb5; --on-accent: #ffffff; --warn: #9a3412;
  --sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Liberation Sans", sans-serif;
  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", "DejaVu Sans Mono", monospace;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .data-ui-skin {
    --bg: #111317; --bg2: #181b20; --hover: #1a2433; --ink: #e6e8eb; --ink2: #a4abb4;
    --rule: #30353c; --rule2: #252930; --accent: #6ea8ec; --on-accent: #0b1220; --warn: #f0a070;
  }
}
:root[data-theme="dark"] .data-ui-skin {
  --bg: #111317; --bg2: #181b20; --hover: #1a2433; --ink: #e6e8eb; --ink2: #a4abb4;
  --rule: #30353c; --rule2: #252930; --accent: #6ea8ec; --on-accent: #0b1220; --warn: #f0a070;
}
/* the mapping: this is all a vanilla app writes */
.data-ui-skin {
  --data-bg: var(--bg); --data-fg: var(--ink); --data-muted: var(--ink2); --data-subtle: var(--bg2);
  --data-border: var(--rule); --data-rule: var(--rule2); --data-hover: var(--hover); --data-accent: var(--accent);
  --data-on-accent: var(--on-accent); --data-warn: var(--warn); --data-font: var(--sans); --data-mono: var(--mono);
  --data-radius: 6px;
}
# Actuators side by side

Four integrated actuators from robotparts.dev's catalog in columns, one line per spec: the better value of each spec
marked by its direction, "Differences only", the robotparts photos in a slider, and a column you can drop or add from
the six in the file.

- **App:** robotparts
- **Replaces:** robotparts' hand-rolled compare page, `/search/compare/` (`site/static/site.js` in `~/robotparts`,
  `compare()`, about 150 lines, and `build/site_pages.py`, `compare_page()`): a fetch per part, a table built by
  hand, a "(remove)" link that rewrites the query string. Here the same side by side is a `compare` view in a
  `.base` file, and a pick is a view you can save.
- **Shows:** `type: compare` (best values by `better`, differences only, the photo slider, add and remove), `type:
  record` with sections (the part page), a table of the same six rows.
- **Data:** `compare.json`, six rows written by `source/make.py` from robotparts' `dist/site/v2/catalog.json`
  (release 2026.10.25.1) through robotparts' own build helpers; each value keeps its basis and source. The photos
  (`photos/*.webp`, relative to `compare.json`) are robotparts' hosted copies, copied here so nothing loads from another
  site.
- **Skin:** `skin.css` is robotparts' token mapping (the actuators case's), light and dark.

The original UI it replaces

robotparts' hand-rolled compare page, /search/compare/ (site/static/site.js in ~/robotparts, compare(), about 150 lines, and build/site_pages.py, compare_page()): a fetch per part, a table built by hand, a "(remove)" link that rewrites the query string. Here the same side by side is a compare view in a .base file, and a pick is a view you can save.

What it shows

type: compare (best values by better, differences only, the photo slider, add and remove), type: record with sections (the part page), a table of the same six rows.

Data

compare.json, six rows written by source/make.py from robotparts' dist/site/v2/catalog.json (release 2026.10.25.1) through robotparts' own build helpers; each value keeps its basis and source. The photos (photos/*.webp, relative to compare.json) are robotparts' hosted copies, copied here so nothing loads from another site.

Skin

skin.css is robotparts' token mapping (the actuators case's), light and dark.