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

Large diffs are not rendered by default.

53 changes: 53 additions & 0 deletions site/src/components/blog/HonestStar.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
---
// The honesty beat (exploration 0241), modeled on HonestMycelium and the pirate
// post's HonestPirate. The serene-eternal-harmonious sun is as oversold as the
// "Wood Wide Web." So we say plainly what the physics supports and what it
// doesn't — we take the mechanism (a self-correcting governor; coherence from a
// shared law; gentleness from size, not intensity), not the fairy tale.
const rows = [
{
isnt: 'We won’t pretend the Sun is serene.',
is: 'Up close it’s violence: a 15-million-kelvin core, a surface that hurls flares and coronal mass ejections. The calm we feel is a gift of scale and ninety-three million miles of distance — not the absence of fury.'
},
{
isnt: 'We won’t pretend the balance is forever.',
is: 'Equilibrium is a phase, not a virtue. In a few billion years the Sun swells into a red giant and may swallow the inner planets; Earth’s surface life likely ends far sooner, as the brightening Sun boils the oceans. Stability is something you maintain, then lose.'
},
{
isnt: 'We won’t say the star “chose” harmony.',
is: 'A star’s coherence isn’t cooperation — it’s a trillion-trillion particles blindly obeying one shared law, with no planner and no stakeholders. That’s the part worth borrowing: order from a shared invariant, not from a boss.'
},
{
isnt: 'We won’t tell you to “shine as bright as you can.”',
is: 'The brightest stars are the shortest-lived: a heavy star burns out in a few million years, while a small, slow one can last for trillions. The gentle, long-lasting kind is the model — not the supergiant.'
}
]
---

<section class="not-prose my-12">
<div class="rounded-2xl border border-border bg-surface/30 p-6 dark:bg-surface/40 lg:p-8">
<h3 class="text-xl font-bold tracking-tight text-gray-900 dark:text-white">
An honest star
</h3>
<p class="mt-2 text-sm text-gray-500 dark:text-gray-400">
A metaphor that flatters itself is just more marketing. Here’s the honest version.
</p>

<ul class="mt-6 space-y-5">
{
rows.map((row) => (
<li class="grid gap-3 sm:grid-cols-[1fr_1.3fr] sm:gap-5">
<div class="flex gap-2.5">
<span class="select-none text-gray-400 dark:text-gray-600">✕</span>
<p class="text-sm leading-relaxed text-gray-500 dark:text-gray-400">{row.isnt}</p>
</div>
<div class="flex gap-2.5">
<span class="select-none text-amber-500">✓</span>
<p class="text-sm leading-relaxed text-gray-700 dark:text-gray-200">{row.is}</p>
</div>
</li>
))
}
</ul>
</div>
</section>
75 changes: 75 additions & 0 deletions site/src/components/blog/HydrostaticBalance.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
---
// The structural heart of post #3 (exploration 0241): a star and an attention
// feed are the same machine wired two opposite ways. A star runs on NEGATIVE
// feedback — a self-correcting governor that pushes back toward balance — so it
// neither explodes nor goes cold. An engagement feed runs on POSITIVE feedback —
// a loop with the governor removed — so it runs hot until it burns out. Mirrors
// the ThreeNervousSystems / ArticlesMap card idiom (not-prose, bordered surface)
// so the three posts read as one publication.
const systems = [
{
name: 'A star',
loop: 'Negative feedback (a thermostat)',
behaviour:
'Squeeze the core and it heats, fusion speeds up, and pressure pushes back out. Let it expand and it cools, fusion slows, and gravity pulls it back in. Any nudge is self-corrected — so it neither explodes nor freezes.',
tone: 'good'
},
{
name: 'An attention feed',
loop: 'Positive feedback (no governor)',
behaviour:
'Engagement is rewarded with more engagement: refresh, alert, streak, repeat. Nothing pushes back toward rest, so the system runs hotter and hotter — the stellar equivalent of a giant that burns blindingly bright and then burns out.',
tone: 'bad'
}
]
---

<section class="not-prose my-12">
<div class="rounded-2xl border border-border bg-surface/30 p-6 dark:bg-surface/40 lg:p-8">
<h3 class="text-xl font-bold tracking-tight text-gray-900 dark:text-white">
Two ways to wire the same machine
</h3>
<p class="mt-2 text-sm text-gray-500 dark:text-gray-400">
A star stays whole because it has a governor. An attention feed stays
profitable because it doesn't.
</p>

<ul class="mt-6 space-y-5">
{
systems.map((s) => (
<li class="grid gap-2 sm:grid-cols-[1fr_1.6fr] sm:gap-6 sm:items-baseline">
<div>
<p
class:list={[
'font-mono font-semibold',
s.tone === 'good'
? 'text-amber-600 dark:text-amber-400'
: 'text-gray-500 dark:text-gray-400'
]}
>
{s.name}
</p>
<p class="mt-0.5 text-sm text-gray-500 dark:text-gray-400">{s.loop}</p>
</div>
<p class="text-sm leading-relaxed text-gray-700 dark:text-gray-200">{s.behaviour}</p>
</li>
))
}
</ul>

<p
class="mt-6 border-t border-border pt-4 text-sm leading-relaxed text-gray-600 dark:text-gray-300"
>
<span class="font-semibold text-gray-900 dark:text-white">The same axis</span>
decides which one you get:
<span class="text-amber-600 dark:text-amber-400">
self-regulating · bounded · long-lived
</span>
on one end,
<span class="text-gray-500 dark:text-gray-400">
runaway · maximal · burns out
</span>
on the other.
</p>
</div>
</section>
151 changes: 151 additions & 0 deletions site/src/components/blog/StarHero.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
---
// Original art for blog post #3 (exploration 0241). The third vantage of the
// trilogy: PirateHero looked UP at a sea of islands, MycelialHero looked DOWN
// into the soil, and StarHero looks UP AND OUT — the cosmic-X as a star in
// hydrostatic balance, gravity pulling IN (slate arrows) against radiation
// pushing OUT (amber arrows), ringed by the orbits it quietly provides for.
// All inline SVG, no external assets, so the page ships nothing third-party
// (Self-Audit parity with posts #1 and #2).
interface Props {
title: string
deck: string
date: string
readingMinutes: number
tags: string[]
}
const { title, deck, date, readingMinutes, tags } = Astro.props

// The star sits a little above centre so the title below doesn't bury it.
const cx = 545
const cy = 150

// Hydrostatic equilibrium drawn literally: two opposing sets of radial arrows.
// Radiation pushes outward; gravity pulls inward. They interleave (offset by
// half a step) and meet in the middle — the balance that keeps a star from
// exploding or collapsing.
const STEP = Math.PI / 4 // eight directions
const radiation = Array.from({ length: 8 }, (_, k) => {
const a = k * STEP
return {
x1: cx + Math.cos(a) * 60,
y1: cy + Math.sin(a) * 60,
x2: cx + Math.cos(a) * 88,
y2: cy + Math.sin(a) * 88
}
})
const gravity = Array.from({ length: 8 }, (_, k) => {
const a = k * STEP + STEP / 2
return {
x1: cx + Math.cos(a) * 124,
y1: cy + Math.sin(a) * 124,
x2: cx + Math.cos(a) * 100,
y2: cy + Math.sin(a) * 100
}
})

// The orbits the star provides for — a few planets riding elliptical paths.
const orbits = [
{ rx: 175, ry: 58 },
{ rx: 250, ry: 84 },
{ rx: 330, ry: 110 }
]
const planets = [
{ rx: 175, ry: 58, t: 0.62, r: 3 },
{ rx: 250, ry: 84, t: 2.3, r: 4 },
{ rx: 330, ry: 110, t: 3.9, r: 2.6 }
]
---

<section class="relative overflow-hidden border-b border-border bg-surface/20 dark:bg-[#060508]">
<svg
class="pointer-events-none absolute inset-0 h-full w-full"
viewBox="0 0 1040 340"
preserveAspectRatio="xMidYMid slice"
aria-hidden="true"
>
<defs>
<linearGradient id="space" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0a0812" />
<stop offset="55%" stop-color="#0d0a16" />
<stop offset="100%" stop-color="#080610" />
</linearGradient>
<radialGradient id="starglow" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#fbbf24" stop-opacity="0.95" />
<stop offset="45%" stop-color="#f59e0b" stop-opacity="0.45" />
<stop offset="100%" stop-color="#f59e0b" stop-opacity="0" />
</radialGradient>
<linearGradient id="starx" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#fde68a" />
<stop offset="100%" stop-color="#fb923c" />
</linearGradient>
<marker id="rad" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto">
<path d="M0 0 L10 5 L0 10 z" fill="#fbbf24" opacity="0.85" />
</marker>
<marker id="grav" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="5" markerHeight="5" orient="auto">
<path d="M0 0 L10 5 L0 10 z" fill="#64748b" opacity="0.85" />
</marker>
</defs>

<rect width="1040" height="340" fill="url(#space)" />

<!-- starfield -->
<g fill="#e9d5ff" opacity="0.65">
<circle cx="80" cy="50" r="1.1" />
<circle cx="200" cy="100" r="0.8" />
<circle cx="330" cy="42" r="1.3" />
<circle cx="160" cy="200" r="0.9" />
<circle cx="900" cy="60" r="1.2" />
<circle cx="820" cy="120" r="0.8" />
<circle cx="980" cy="190" r="1" />
<circle cx="720" cy="40" r="0.9" />
<circle cx="60" cy="280" r="0.8" />
<circle cx="970" cy="300" r="1.1" />
<circle cx="420" cy="300" r="0.7" />
<circle cx="640" cy="280" r="0.8" />
</g>

<!-- the orbits the star provides for -->
<g stroke="#3b3357" stroke-width="1" fill="none" opacity="0.7">
{orbits.map((o) => <ellipse cx={cx} cy={cy} rx={o.rx} ry={o.ry} />)}
</g>
<g fill="#a78bfa">
{planets.map((p) => <circle cx={cx + Math.cos(p.t) * p.rx} cy={cy + Math.sin(p.t) * p.ry} r={p.r} />)}
</g>

<!-- gravity pulling in (slate) vs. radiation pushing out (amber): equilibrium -->
<g stroke="#64748b" stroke-width="1.6" opacity="0.7">
{gravity.map((l) => <line x1={l.x1} y1={l.y1} x2={l.x2} y2={l.y2} marker-end="url(#grav)" />)}
</g>
<g stroke="#fbbf24" stroke-width="1.6" opacity="0.85">
{radiation.map((l) => <line x1={l.x1} y1={l.y1} x2={l.x2} y2={l.y2} marker-end="url(#rad)" />)}
</g>

<!-- the cosmic-X, glowing as the star at the centre of it all -->
<g transform={`translate(${cx} ${cy})`}>
<circle cx="0" cy="0" r="58" fill="url(#starglow)" />
<g stroke="url(#starx)" stroke-width="6" stroke-linecap="round" transform="translate(-13 -15)">
<line x1="0" y1="0" x2="26" y2="30" />
<line x1="26" y1="0" x2="0" y2="30" />
</g>
</g>
</svg>

<div class="relative mx-auto max-w-3xl px-6 pb-14 pt-44 lg:pt-52">
<div class="flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-amber-200/80">
<time datetime={date}>{date}</time>
<span aria-hidden="true">·</span>
<span>{readingMinutes} min read</span>
{
tags.map((tag) => (
<span class="rounded-full border border-amber-400/30 bg-amber-500/10 px-2 py-0.5 font-mono lowercase text-amber-200">
{tag}
</span>
))
}
</div>
<h1 class="mt-4 text-4xl font-bold tracking-tight text-white drop-shadow lg:text-5xl">
{title}
</h1>
<p class="mt-4 max-w-2xl text-lg leading-relaxed text-gray-300">{deck}</p>
</div>
</section>
11 changes: 11 additions & 0 deletions site/src/data/blog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export type BlogTag =
| 'decentralization'
| 'protocol'
| 'nature'
| 'cosmos'

export interface BlogPost {
/** URL slug; matches `site/src/pages/blog/<slug>.astro`. */
Expand All @@ -49,6 +50,16 @@ export interface BlogPost {
}

export const posts: BlogPost[] = [
{
slug: 'the-gentlest-furnace',
title: 'The Gentlest Furnace',
description:
'A star carries the energy of a billion bombs and still feels calm from here. What hydrostatic equilibrium — the thermostat that keeps a star from exploding or going cold — teaches us about information, attention, and building technology that burns long instead of burning out.',
pubDate: '2026-07-11T15:00:00Z',
author: 'xNet',
tags: ['essay', 'philosophy', 'cosmos'],
readingMinutes: 13
},
{
slug: 'data-should-work-like-soil',
title: 'Data Should Work Like Soil',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"id": "2026-06-27-new-essay-the-gentlest-furnace",
"date": "June 27, 2026",
"title": "New essay: The Gentlest Furnace",
"summary": "Our third blog essay is live — what a star's equilibrium teaches us about information, attention, and building technology that burns long instead of burning out. Read it at /blog/the-gentlest-furnace.",
"highlights": [],
"tags": ["platform"]
}
Loading
Loading