Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion blog/deciding-well-solved/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<link rel="icon" href="../../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/blog/deciding-well-solved/">

<title>Deciding well is solved. For me. · Robert Blust</title>
Expand Down
2 changes: 1 addition & 1 deletion blog/deciding-well-solved/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bd374b662595438d2a64b876e5b5be50461e7bead089ad51c80660101ab023c8
3274f855772bd4fcf795724a133bd0d12b2b2b4556527921387f8e7605796e79
4 changes: 3 additions & 1 deletion blog/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/blog/">
<title>Robert Blust — blog</title>
<meta id="metadesc" name="description" content="Writing on deciding well: the arguments the talks make in ten minutes, taken slowly, with the facts they rest on linked.">
Expand Down
2 changes: 1 addition & 1 deletion blog/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
159693450fffd0499d27c4771bd1fef9d4fdea78dc8132077fc431dd9e2fe1e0
fce80270adc14503fff77ff3140a56d4424a989109ba53c5629e536a19157a34
4 changes: 3 additions & 1 deletion blog/one-question-answered/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<link rel="icon" href="../../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/blog/one-question-answered/">

<title>One question answered. One still open. · Robert Blust</title>
Expand Down
2 changes: 1 addition & 1 deletion blog/one-question-answered/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
fc05950ec498af33cfe68fe0052ac42617ff4bcb4967ec3071eb751ec45d8b5a
4a6701b8391793f15187417f7bc9ce80cdcf5e222cf1fba5c2ca7b25d24da434
22 changes: 21 additions & 1 deletion deck.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// @robertblust/design — deck.js, assembled from the shared blocks: theme v5 · runtime v10 ·
// @robertblust/design — deck.js, assembled from the shared blocks: theme v6 · runtime v10 ·
// fit v1.
// Editing this file in a site does nothing: the next npm run design overwrites it.

Expand Down Expand Up @@ -58,6 +58,26 @@ function applyTheme(){
}
function setTheme(v){ theme = v; themeRemember(v); applyTheme(); }

/* A page opened from a phone's home screen has Android paint its system bars from the page's
`theme-color`. A page declares that meta with dark's ground, the default, and this keeps it
on the ground of the theme the visitor actually sees. It watches `data-theme` rather than
hooking `applyTheme`, because a page may switch the theme with a copy of its own — blust.ch's
pages do — and the attribute is the one thing every switch sets. The color is read from the
tokens rather than restated here, so a re-picked ground moves the bars with it. A page
without the meta is left as it is. */
function themeColor(){
try {
var tc = document.querySelector('meta[name="theme-color"]');
if (!tc) return;
var g = getComputedStyle(document.documentElement).getPropertyValue("--ground").trim();
if (g) tc.setAttribute("content", g);
} catch (e) {}
}
themeColor();
try {
new MutationObserver(themeColor).observe(document.documentElement, { attributes: true, attributeFilter: ["data-theme"] });
} catch (e) {}

var slides = Array.prototype.slice.call(document.querySelectorAll('.slide'));
// slide numbering is zero-based everywhere the viewer can see it: the kicker on each
// slide, the transport's display window, and the audio filenames all say the same number.
Expand Down
Binary file added icon-192.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added icon-512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added icon-maskable-512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 3 additions & 1 deletion ideas/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/ideas/">

<title>Ideas — Robert Blust</title>
Expand Down
2 changes: 1 addition & 1 deletion ideas/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
efb34d150fee15baedbebc1ae578fd7171fdea4e0357534de1d7c80f90ab93d5
01393f5591b97b8fe31f4d3092560989eca74e4f77b1f307ee2daa1b7a7bcda0
4 changes: 3 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<link rel="icon" href="favicon.svg" type="image/svg+xml">
<link rel="manifest" href="manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/">
<title>Robert Blust — Software Engineer &amp; Architect</title>
<meta id="metadesc" name="description" content="The constraint has moved from building fast to deciding well. Over twenty-five years of platforms, and the talks that argue the point.">
Expand Down
14 changes: 14 additions & 0 deletions manifest.webmanifest
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "Robert Blust",
"short_name": "Robert Blust",
"start_url": "/",
"scope": "/",
"display": "standalone",
"background_color": "#0C0E13",
"theme_color": "#0C0E13",
"icons": [
{ "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" },
{ "src": "/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
]
}
4 changes: 3 additions & 1 deletion model/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Model — Robert Blust</title>
<meta id="metadesc" name="description" content="The company of one, drawn: my own work described in CompanyGraph and rendered as the graph its files form.">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/model/">

<meta property="og:title" content="Model — Robert Blust">
Expand Down
2 changes: 1 addition & 1 deletion model/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
f5d058c57b8eaf551a82868e0f800b4f484bf1605c84eb216c34b46ba7f0292f
70aad435ddd178da2c75362f76faa0bf9d1d434f544194fd9c36f33e47b6ec5a
2 changes: 1 addition & 1 deletion og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
49b0520b27bf571c8eafd5d34fc33f6a0014f6e543df2de49437efdb31b82c0b
65d2597f4e1a5d9e3a3e455b344da59db0e410054728e59858f8db33db1c4b83
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"pin:check": "node pin-check.mjs"
},
"devDependencies": {
"@robertblust/design": "github:robertblust/design#v0.156.0",
"@robertblust/design": "github:robertblust/design#v0.157.0",
"companygraph-mcp-server": "github:companygraph/mcp-server#v0.69.0",
"pdf-lib": "^1.17.1",
"playwright": "^1.63.0"
Expand Down
4 changes: 2 additions & 2 deletions page.css
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* @robertblust/design — page.css, assembled from the shared blocks: reset v3 · link v1 ·
header v18 · title v2 · lines v3 · footer v3 · principles v1 · processes v1 · surfaces v2 ·
header v18 · title v2 · lines v3 · footer v4 · principles v1 · processes v1 · surfaces v2 ·
index v2 · home v1.
Editing this file in a site does nothing: the next npm run design overwrites it. */

Expand Down Expand Up @@ -241,7 +241,7 @@ nav a[aria-current="page"]{color:var(--c-firm)}
.keyline{margin:.6rem 0 1.4rem; max-width:54ch; font-size:1.2rem; font-weight:500;
line-height:1.45; color:var(--c-firm); text-wrap:balance}

footer{padding:0 0 2rem; display:flex; flex-wrap:wrap; gap:.9rem 2.6rem; align-items:center;
footer{padding:0 0 calc(2rem + env(safe-area-inset-bottom)); display:flex; flex-wrap:wrap; gap:.9rem 2.6rem; align-items:center;
font-family:"Plex Mono",monospace; font-size:.76rem; letter-spacing:.08em; color:var(--dim)}
footer a[aria-current="page"]{color:var(--c-firm)}

Expand Down
22 changes: 21 additions & 1 deletion page.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// @robertblust/design — page.js, assembled from the shared blocks: lang v5 · theme v5 ·
// @robertblust/design — page.js, assembled from the shared blocks: lang v5 · theme v6 ·
// navFit v3.
// Editing this file in a site does nothing: the next npm run design overwrites it.

Expand Down Expand Up @@ -136,6 +136,26 @@ function applyTheme(){
}
function setTheme(v){ theme = v; themeRemember(v); applyTheme(); }

/* A page opened from a phone's home screen has Android paint its system bars from the page's
`theme-color`. A page declares that meta with dark's ground, the default, and this keeps it
on the ground of the theme the visitor actually sees. It watches `data-theme` rather than
hooking `applyTheme`, because a page may switch the theme with a copy of its own — blust.ch's
pages do — and the attribute is the one thing every switch sets. The color is read from the
tokens rather than restated here, so a re-picked ground moves the bars with it. A page
without the meta is left as it is. */
function themeColor(){
try {
var tc = document.querySelector('meta[name="theme-color"]');
if (!tc) return;
var g = getComputedStyle(document.documentElement).getPropertyValue("--ground").trim();
if (g) tc.setAttribute("content", g);
} catch (e) {}
}
themeColor();
try {
new MutationObserver(themeColor).observe(document.documentElement, { attributes: true, attributeFilter: ["data-theme"] });
} catch (e) {}

(function(){
var root = document.documentElement, bar = document.querySelector(".bar");
// Loud, because the quiet version cost an afternoon. This fence belongs at the end of the
Expand Down
4 changes: 3 additions & 1 deletion principles/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Principles — Robert Blust</title>
<meta id="metadesc" name="description" content="Where this work is going and what it holds to. Generated from the model it describes, not written twice.">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/principles/">

<meta property="og:title" content="Principles — Robert Blust">
Expand Down
2 changes: 1 addition & 1 deletion principles/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
f45905b861b5f56bb3f0ac6491144203cc73a6e6b237d8c6dfafad7bfd84e0b1
f40876c7addb3c12b0bfa968bc158e23ff76d73830c227b55ce241847e4f81e6
4 changes: 3 additions & 1 deletion privacy/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Privacy — Robert Blust</title>
<meta id="metadesc" name="description" content="This site sets no cookies, runs no analytics and makes no third-party requests. The list of what leaves your browser is short enough to print.">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/privacy/">

<meta property="og:title" content="Privacy — Robert Blust">
Expand Down
2 changes: 1 addition & 1 deletion privacy/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
7fe64499c47835e939288df92bc1f361a7b5a82b1457756966280895300c5b4a
7e299a2a5f93af2981aa4d3955986d0ee0d75a413853dca0cb089a0aec247bf9
4 changes: 3 additions & 1 deletion processes/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Processes — Robert Blust</title>
<meta id="metadesc" name="description" content="The profiles the model holds and the seats between them: who executes each phase of each process, who supports it, and who approves its gate.">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/processes/">

<meta property="og:title" content="Processes — Robert Blust">
Expand Down
2 changes: 1 addition & 1 deletion processes/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2221bcc0b19df3bb7b73174860ea24a8e7861b5b9dffe65abf28cb8d5189b4de
4afce114c4e16545b9b288a7597f85bb60fd08a7e1ff8f08f36b2f91c5f27622
4 changes: 3 additions & 1 deletion surfaces/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Surfaces — Robert Blust</title>
<meta id="metadesc" name="description" content="Every place the model is published, and how each is made from it: written by hand, or built from a pinned commit by a repository's build.">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/surfaces/">

<meta property="og:title" content="Surfaces — Robert Blust">
Expand Down
2 changes: 1 addition & 1 deletion surfaces/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
b592f2a14943bcebe661077b4f365787d797a668f19e444d5e5fb3ab5ba7fc36
c67f6848cca0ce229f405efd5626842b7052fa3f821fe4f0db62861a6d70de05
4 changes: 3 additions & 1 deletion talks/deciding-well/cost/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>What a team would have cost — Robert Blust</title>
<meta id="metadesc" name="description" content="The deciding-well talk’s result priced twice: as a Swiss delivery team and as it happened with agentic AI, with the owner’s hours counted in both.">
<link rel="icon" href="../../../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../../../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/talks/deciding-well/cost/">

<meta property="og:title" content="What a team would have cost — Robert Blust">
Expand Down
2 changes: 1 addition & 1 deletion talks/deciding-well/cost/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3b333865ff23a1a27ef5efa792624358fa0ab9c0638c5f215f6de31c8d962b5c
8bec185abb822e06c7f172a220a6cda8df6d65852a00fa57268b3c3f4ece6b53
4 changes: 3 additions & 1 deletion talks/deciding-well/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<link rel="icon" href="../../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/talks/deciding-well/">

<!-- lang="en" is the truth about this file: the slides are English markup, and German
Expand Down
2 changes: 1 addition & 1 deletion talks/deciding-well/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
05996824a33517ccdc77d13b535262f3e5f7f50eccfc99f733b7adb5d265bc38
8c47b543a1997d461514873ce69558e16e1bab8bb8ed1eba016355eebe6b1f7d
4 changes: 3 additions & 1 deletion talks/essential-complexity/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<link rel="icon" href="../../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/talks/essential-complexity/">

<!-- lang="en" is the truth about this file: the slides are English markup, and German
Expand Down
2 changes: 1 addition & 1 deletion talks/essential-complexity/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3650df75991d160a1d0d12f98849d84f62c269c81157f7b97b11724efe47335a
ec30e7d1398672f08f308967803091e777caca93961b440852e6c6e939ea0e55
4 changes: 3 additions & 1 deletion talks/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/talks/">
<title>Robert Blust — talks</title>
<meta id="metadesc" name="description" content="Talks on deciding well: every project is decided before it is built, in how precisely the problem was described.">
Expand Down
4 changes: 3 additions & 1 deletion talks/mental-model/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<link rel="icon" href="../../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/talks/mental-model/">

<!-- lang="en" is the truth about this file: the slides are English markup, and German
Expand Down
2 changes: 1 addition & 1 deletion talks/mental-model/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
381954a913af45d6bab25c2d59673790b1bf333516f9e4c5f56f6f1fdabad683
ee57c603eb9c1220e6e12aee1e9b5b87529380be6780649ba13f92ad25c3b189
2 changes: 1 addition & 1 deletion talks/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
d2c70077e7dd93d993eadb5488dca245d73cbebb24948da33adb8aad0f663b84
0c93ff931b6948645d00a3b8ec13997b6e974302cd557cad089256756232ac7c
4 changes: 3 additions & 1 deletion timeline/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>Timeline — Robert Blust</title>
<meta id="metadesc" name="description" content="Over twenty-five years in order: every experience in the model as a ledger, each row the file it is read from, at the commit the page names.">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="manifest" href="../manifest.webmanifest">
<meta name="theme-color" content="#0C0E13">
<link rel="canonical" href="https://blust.ch/timeline/">

<meta property="og:title" content="Timeline — Robert Blust">
Expand Down
2 changes: 1 addition & 1 deletion timeline/og.sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
fe462654c1b661965ce15d6cc1e97e1f0ed1c4c8635c24cfb80fd399be8f2f32
d0460d8633131ad03873a655f803808da0606a857e62c1124433fbf7a92afda0
Loading