Examples › design work › Brand lineage
Brand lineage
Every logo and brand proposal from Brandbook's four brands as one table of rows, drawn as a tree of life: x is the round, each proposal hangs off the one it came from, a splice's extra parents curve in dashed, robotparts' shipped logo (R16-02) and its ancestors are the bold trunk, and the lines Zach never picked or liked thin out or fold into "+N". Click a mark for its record, its round's reply and where its report lives; the rail's brand, status and score filters thin the tree like any view.
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.
# Every brand proposal Zach has been shown, as rows, and the lineage view's tree of life over them: x is the round,
# each proposal hangs off the one it was derived from, a splice draws its extra parents dashed, the shipped pick's
# ancestry is the bold trunk and the lines nobody kept fold into "+N".
# Obsidian Bases grammar plus data-ui's keys (docs/CONTRACT.md §5, §21 for lineage:).
# Check it: node bin/data-ui.mjs check <this file> --data proposals.json
data: proposals.json
facets:
- brand
- status
- round_kind
- { property: score, as: range }
- { property: name, as: search }
views:
- type: lineage
name: robotparts
filters: 'brand == "robotparts"'
order: [name, round, status, score, note]
lineage:
parents: parents
x: round_n
xLabel: round
image: thumb
label: name
focus: robotparts/r16-02
kept: { status: [picked, liked] }
extinct: collapse
layout: rectangular
- type: lineage
name: robotparts radial
filters: 'brand == "robotparts"'
order: [name, round, status, score, note]
lineage:
parents: parents
x: round_n
xLabel: round
image: thumb
label: name
focus: robotparts/r16-02
kept: { status: [picked, liked] }
extinct: show
layout: radial
- type: lineage
name: BAM
filters: 'brand == "BAM"'
order: [name, round, status, note]
lineage:
parents: parents
x: round_n
xLabel: round
image: thumb
label: name
focus: bam/final-01
kept: { status: [picked, liked] }
extinct: collapse
- type: lineage
name: Every brand
order: [name, brand, round, status, score, note]
lineage:
parents: parents
x: round_n
image: thumb
label: name
focus: robotparts/r16-02
kept: { status: [picked, liked] }
extinct: show
- type: table
name: Table
order: [thumb, name, brand, round, status, score, parents, note, report_path]
display: { thumb: image }
sort:
- { property: brand, direction: ASC }
- { property: round_n, direction: ASC }
// proposals.json: 319 rows, 286 KB; the first 3
{
"id": "brand-lineage",
"title": "Brand proposals and where each came from",
"titleProperty": "name",
"imageProperty": "thumb",
"source": "brandbook src/data/brands.json, generated 2026-10-27T06:51:12+00:00 (tools/extract_lineage.py; evidence in tools/lineage-notes.md)",
"properties": {
"name": {
"type": "text",
"width": 220
},
"brand": {
"type": "text",
"width": 100
},
"round": {
"type": "text",
"width": 70,
"note": "R<n> in the brand's own round order; Final = the shipped files"
},
"round_n": {
"type": "number",
"width": 70,
"note": "the round's position in its brand, 1 = the first"
},
"round_title": {
"type": "text",
"width": 220
},
"round_kind": {
"type": "text",
"width": 80,
"display": "badge",
"note": "explore = fresh directions; vary = variants of one parent; splice = parts of two or more; polish = steps on the pick; final = the shipped files"
},
"proposal": {
"type": "text",
"width": 70,
"note": "the id Zach used in that round's report"
},
"status": {
"type": "text",
"width": 80,
"display": "badge",
"colors": {
"picked": 1,
"liked": 2,
"rejected": 0,
"neutral": 0
},
"note": "from Zach's replies; rejected only when he said so"
},
"score": {
"type": "number",
"width": 70
},
"score_max": {
"type": "number",
"width": 70
},
"parents": {
"type": "list",
"width": 220,
"relation": true,
"note": "the proposals this one was derived from (Brandbook's lineage rule); two or more = a splice"
},
"splice": {
"type": "boolean",
"width": 60
},
"thumb": {
"type": "text",
"width": 80,
"display": "image",
"media": true
},
"note": {
"type": "text",
"width": 320
},
"reply": {
"type": "text",
"width": 320,
"note": "Zach's reply to the round, verbatim"
},
"report_path": {
"type": "text",
"width": 260,
"note": "where the round's HTML report lives on Zach's machine (plain text: a file path is not a link on the published site)"
},
"date": {
"type": "date",
"width": 100
},
"final_pick": {
"type": "boolean",
"width": 60
}
},
"rows": [
{
"id": "robotparts/r1-01",
"name": "Exploded black box",
"brand": "robotparts",
"round": "R1",
"round_n": 1,
"round_title": "Round 1 · 20 directions",
"round_kind": "explore",
"proposal": "01",
"status": "neutral",
"score": {
"value": null,
"why": "this round was not scored"
},
"score_max": null,
"parents": [],
"splice": false,
"thumb": "thumbs/robotparts/r1-01.png",
"note": "A box with its lid lifted on dashed guide lines: the part is a black box you can still look into (specs, CAD, sim, prices).",
"reply": "Go the logo I kinda like this idea of modularity... as its all about building big robots from small parts... \n\nKinda similar to like BAM robtics actually... please check thoose logos for a bit on isnpiration...\n\nFeels a bit like ceelurar automata\n\nTHe pixel grid is cool for that reason...\n\nBut look at BAM as we where kinda expressing similar things...\n\nThis is c a cool idea as well maybne parts is like in a tool box: \n\nOr like Parts looks like a lego block",
"report_path": "~/robotparts/reports/media/robotparts-logos-2026-10-25.html",
"date": "2026-10-25",
"final_pick": false
},
{
"id": "robotparts/r1-02",
"name": "Isometric cube with a port",
"brand": "robotparts",
"round": "R1",
"round_n": 1,
"round_title": "Round 1 · 20 directions",
"round_kind": "explore",
"proposal": "02",
"status": "liked",
"score": {
"value": null,
"why": "this round was not scored"
},
"score_max": null,
"parents": [],
"splice": false,
"thumb": "thumbs/robotparts/r1-02.png",
"note": "One solid isometric block with a single connector port cut into its face; the catalog's unit of thought is the part-as-box.",
"reply": "Go the logo I kinda like this idea of modularity... as its all about building big robots from small parts... \n\nKinda similar to like BAM robtics actually... please check thoose logos for a bit on isnpiration...\n\nFeels a bit like ceelurar automata\n\nTHe pixel grid is cool for that reason...\n\nBut look at BAM as we where kinda expressing similar things...\n\nThis is c a cool idea as well maybne parts is like in a tool box: \n\nOr like Parts looks like a lego block",
"report_path": "~/robotparts/reports/media/robotparts-logos-2026-10-25.html",
"date": "2026-10-25",
"final_pick": false
},
{
"id": "robotparts/r1-03",
"name": "Gear inside a box",
"brand": "robotparts",
"round": "R1",
"round_n": 1,
"round_title": "Round 1 · 20 directions",
"round_kind": "explore",
"proposal": "03",
"status": "neutral",
"score": {
"value": null,
"why": "this round was not scored"
},
"score_max": null,
"parents": [],
"splice": false,
"thumb": "thumbs/robotparts/r1-03.png",
"note": "A gear sealed inside a square outline: mechanism visible, packaging opaque. The literal reading of 'black box'.",
"reply": "Go the logo I kinda like this idea of modularity... as its all about building big robots from small parts... \n\nKinda similar to like BAM robtics actually... please check thoose logos for a bit on isnpiration...\n\nFeels a bit like ceelurar automata\n\nTHe pixel grid is cool for that reason...\n\nBut look at BAM as we where kinda expressing similar things...\n\nThis is c a cool idea as well maybne parts is like in a tool box: \n\nOr like Parts looks like a lego block",
"report_path": "~/robotparts/reports/media/robotparts-logos-2026-10-25.html",
"date": "2026-10-25",
"final_pick": false
}
]
}skin.css, README.md
/* The marks are one dark ink drawn for paper (Brandbook's thumbs: the light mark on transparent), so a node's image
well stays paper-white in both themes, as the logo-rounds case keeps its wells; in a dark theme a dark well would
make the marks vanish. */
.data-ui-skin .dv-lineage-well { fill: #ffffff; }
.data-ui-skin .dv-lineage-step img { background: #ffffff; }
# Brand lineage
Every logo and brand proposal from Brandbook's four brands as one table of rows, drawn as a tree of life: x is the
round, each proposal hangs off the one it came from, a splice's extra parents curve in dashed, robotparts' shipped
logo (R16-02) and its ancestors are the bold trunk, and the lines Zach never picked or liked thin out or fold into
"+N". Click a mark for its record, its round's reply and where its report lives; the rail's brand, status and score filters thin
the tree like any view.
- **App:** design work
- **Replaces:** Brandbook's hand-built phylogeny prototype (`~/brandbook/src/variants/v3-phylogeny/`, React +
d3-hierarchy over one brand at a time) and the per-round logo galleries it links to.
- **Shows:** `type: lineage` (docs/CONTRACT.md §21): `lineage.parents` as the only source of edges, `x: round_n` as
the ordinal axis with `xLabel`, image nodes from `thumb`, `focus` and its trunk, `kept: {status: [picked, liked]}`
with `extinct: collapse` (the robotparts tab) and `extinct: show`, the rectangular and radial layouts, the path panel
(resizable, remembered, folds), and the relation links in the peek (`parents` is `relation: true`).
- **Data:** `proposals.json` and `thumbs/`, written by `source/make.py` from Brandbook's `src/data/brands.json`
(read-only; parents per its `src/lib/lineage.ts` rule, every claim's evidence in `tools/lineage-notes.md`). 319
proposals: robotparts 205 over 18 rounds, ObjectDB 51 over 3, BAM 53 over 4, Jidoka 10. Gaps, as the extraction
records them: robotparts round 1 and BAM's rounds are unscored ("—" with the reason); the two finals have no HTML
report; `report_path` is the report's path on Zach's machine as plain text (never a link on the published site).
The original UI it replaces
Brandbook's hand-built phylogeny prototype (~/brandbook/src/variants/v3-phylogeny/, React + d3-hierarchy over one brand at a time) and the per-round logo galleries it links to.
What it shows
type: lineage (docs/CONTRACT.md §21): lineage.parents as the only source of edges, x: round_n as the ordinal axis with xLabel, image nodes from thumb, focus and its trunk, kept: {status: [picked, liked]} with extinct: collapse (the robotparts tab) and extinct: show, the rectangular and radial layouts, the path panel (resizable, remembered, folds), and the relation links in the peek (parents is relation: true).
Data
proposals.json and thumbs/, written by source/make.py from Brandbook's src/data/brands.json (read-only; parents per its src/lib/lineage.ts rule, every claim's evidence in tools/lineage-notes.md). 319 proposals: robotparts 205 over 18 rounds, ObjectDB 51 over 3, BAM 53 over 4, Jidoka 10. Gaps, as the extraction records them: robotparts round 1 and BAM's rounds are unscored ("—" with the reason); the two finals have no HTML report; report_path is the report's path on Zach's machine as plain text (never a link on the published site).