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.

robotpartscardstable4 views of one photos.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.

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