Gallery › robotparts › robotparts photos
robotparts photos
175 of robotparts.dev's actuators and cameras as cards with their real hosted photos and their brands' logos, one
.base file: actuators and cameras grouped by brand, a photo wall, and the table over the same rows. Click a photo
for the lightbox; its caption says where the photo came from and when it was fetched.
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.
# robotparts photos: actuators and cameras as cards with their real hosted photos and their brands' logos, and the
# media grid (cards + lightbox: true) over the same rows. Obsidian Bases grammar plus data-ui's keys
# (docs/CONTRACT.md §5). Check it: node bin/data-ui.mjs check <this file> --data photos.json
data: photos.json
facets:
- category
- brand
properties:
model: { displayName: Model }
logo: { displayName: Logo }
peak_torque: { displayName: Peak torque }
resolution: { displayName: Resolution }
views:
- type: cards
name: Actuators
filters: 'category == "Actuator"'
order: [model, logo, brand, peak_torque, mass]
image: photo
imageFit: contain
imageAspectRatio: 0.8
cardSize: 190
lightbox: true
caption: [brand, peak_torque]
groupBy: { property: brand, direction: ASC }
sort:
- { property: peak_torque, direction: DESC }
- type: cards
name: Cameras
filters: 'category == "Camera"'
order: [model, logo, brand, resolution, fps, shutter]
image: photo
imageFit: contain
imageAspectRatio: 0.8
cardSize: 190
lightbox: true
caption: [brand, sensor]
groupBy: { property: brand, direction: ASC }
sort:
- { property: resolution, direction: DESC }
- type: cards
name: Photo wall
order: [model]
image: photo
imageFit: cover
imageAspectRatio: 1
cardSize: 140
lightbox: true
caption: [brand, category]
sort:
- { property: brand, direction: ASC }
- type: table
name: Table
order: [model, brand, category, peak_torque, mass, resolution, fps, shutter, level, url]
groupBy: { property: category, direction: ASC }
sort:
- { property: brand, direction: ASC }
// photos.json: 175 rows, 84 KB; the first 3
{
"id": "robotparts-photos",
"title": "robotparts photos",
"titleProperty": "model",
"linkProperty": "url",
"imageProperty": "photo",
"properties": {
"model": {
"type": "text",
"label": "Model"
},
"brand": {
"type": "text",
"label": "Brand",
"facet": true
},
"logo": {
"type": "text",
"label": "Logo",
"display": "image"
},
"category": {
"type": "text",
"label": "Category",
"facet": true
},
"photo": {
"type": "text",
"label": "Photo",
"media": "image"
},
"level": {
"type": "number",
"label": "Level",
"note": "robotparts' evidence level, 0-5",
"derived": "robotparts' checks"
},
"peak_torque": {
"type": "number",
"label": "Peak torque",
"unitText": "N·m"
},
"mass": {
"type": "number",
"label": "Mass",
"unitText": "g"
},
"resolution": {
"type": "number",
"label": "Resolution",
"unitText": "MP"
},
"fps": {
"type": "number",
"label": "Max fps",
"unitText": "fps"
},
"shutter": {
"type": "text",
"label": "Shutter"
},
"sensor": {
"type": "text",
"label": "Sensor"
},
"url": {
"type": "text",
"label": "Page",
"display": "link"
}
},
"rows": [
{
"id": "aifitlab-8879013625992",
"model": "4210AIO",
"brand": "Steadywin",
"logo": "media/logo-steadywin.webp",
"category": "Actuator",
"photo": {
"value": "media/p-832aeb03.webp",
"source": "https://aifitlab.com/products/steadywin-4210aio-servo-motor",
"asOf": "2026-10-26"
},
"level": 1,
"peak_torque": null,
"mass": 330,
"resolution": null,
"fps": null,
"shutter": null,
"sensor": null,
"url": "https://aifitlab.com/products/steadywin-4210aio-servo-motor"
},
{
"id": "aifitlab-8627514736776",
"model": "4215AIO",
"brand": "Steadywin",
"logo": "media/logo-steadywin.webp",
"category": "Actuator",
"photo": {
"value": "media/p-8e1a2434.webp",
"source": "https://cdn.shopify.com/s/files/1/0673/6848/5000/files/4215AIO-main-1-new.jpg?v=1756225498&width=640",
"asOf": "2026-10-26"
},
"level": 1,
"peak_torque": null,
"mass": 450,
"resolution": null,
"fps": null,
"shutter": null,
"sensor": null,
"url": "https://aifitlab.com/products/steadywin-4215aio-servo-motor"
},
{
"id": "aifitlab-8627549143176",
"model": "5715AIO",
"brand": "Steadywin",
"logo": "media/logo-steadywin.webp",
"category": "Actuator",
"photo": {
"value": "media/p-cef85771.webp",
"source": "https://cdn.shopify.com/s/files/1/0673/6848/5000/files/5715AIO-main-1-new.jpg?v=1756225371&width=640",
"asOf": "2026-10-26"
},
"level": 1,
"peak_torque": null,
"mass": 380,
"resolution": null,
"fps": null,
"shutter": null,
"sensor": null,
"url": "https://aifitlab.com/products/steadywin-5715aio-servo-motor"
}
]
}README.md
# robotparts photos
175 of robotparts.dev's actuators and cameras as cards with their real hosted photos and their brands' logos, one
`.base` file: actuators and cameras grouped by brand, a photo wall, and the table over the same rows. Click a photo
for the lightbox; its caption says where the photo came from and when it was fetched.
- **App:** robotparts
- **Replaces:** robotparts' hand-rolled picture cards: the round-2 design babble's image-first card grid
(`design/babble-2026-10-22b/w5-gallery/gallery.js`, `cardHtml` / `cardMedia`) and the PCPartPicker variant's
photo cells (`w2-pcpartpicker/app.js`), each its own grid, image well and spec lines.
- **Shows:** `type: cards` with Bases' `image`, `imageFit`, `imageAspectRatio` and `cardSize`; group headings by
brand inside a virtualised grid; a property drawn as an image (`logo` has `display: image`); the media grid
(`lightbox: true`, `caption`) with the photo's source and fetch date from its rich cell `{value, source, asOf}`; the
rail filtering every view.
- **Data:** `photos.json` and the `p-*.webp` / `logo-*` files in `media/`, written by `source/make.py` from robotparts'
v2 catalog (release 2026.10.25.1) and its hosted media index (`media/photos.jsonl`, `media/brands.jsonl`): 175
photos and 17 logos, 2.2 MB. robotparts hosts these under Zach's 2026-10-25 decision (`hosting_basis: owner`),
linked to the source, removed on request.
The original UI it replaces
robotparts' hand-rolled picture cards: the round-2 design babble's image-first card grid (design/babble-2026-10-22b/w5-gallery/gallery.js, cardHtml / cardMedia) and the PCPartPicker variant's photo cells (w2-pcpartpicker/app.js), each its own grid, image well and spec lines.
What it shows
type: cards with Bases' image, imageFit, imageAspectRatio and cardSize; group headings by brand inside a virtualised grid; a property drawn as an image (logo has display: image); the media grid (lightbox: true, caption) with the photo's source and fetch date from its rich cell {value, source, asOf}; the rail filtering every view.
Data
photos.json and the p-*.webp / logo-* files in media/, written by source/make.py from robotparts' v2 catalog (release 2026.10.25.1) and its hosted media index (media/photos.jsonl, media/brands.jsonl): 175 photos and 17 logos, 2.2 MB. robotparts hosts these under Zach's 2026-10-25 decision (hosting_basis: owner), linked to the source, removed on request.