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.
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.