Last active
April 10, 2026 03:22
-
-
Save jimmysong/7e5c180d5fd6198ac8b7c8faf2d361a1 to your computer and use it in GitHub Desktop.
Bitcoin presentation v8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>The Third Way — productionready.org</title> | |
| <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=DM+Sans:ital,wght@0,300;0,400;0,500;0,700;1,300&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet"> | |
| <style> | |
| *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } | |
| /* ── DESIGN TOKENS ─────────────────────────────────── */ | |
| :root { | |
| --bg: #080C18; /* deep navy — premium dark */ | |
| --bg2: #0D1225; /* slightly lighter panels */ | |
| --bg3: #111830; /* card surfaces */ | |
| --border: rgba(255,255,255,0.07); | |
| --border2: rgba(255,255,255,0.14); | |
| /* ONE warm accent: bitcoin orange */ | |
| --gold: #F7931A; | |
| --gold-dim: rgba(247,147,26,0.15); | |
| --gold-border: rgba(247,147,26,0.35); | |
| /* ONE cool accent: electric cyan — for 3+ column / "good" state */ | |
| --cyan: #00D4FF; | |
| --cyan-dim: rgba(0,212,255,0.1); | |
| --cyan-border: rgba(0,212,255,0.3); | |
| /* neutral accent: slate for 2 col */ | |
| --slate: #94A3B8; | |
| --slate-dim: rgba(148,163,184,0.08); | |
| --slate-border: rgba(148,163,184,0.25); | |
| /* text hierarchy — all white, opacity levels */ | |
| --t1: rgba(255,255,255,0.95); /* primary */ | |
| --t2: rgba(255,255,255,0.60); /* secondary */ | |
| --t3: rgba(255,255,255,0.28); /* tertiary / labels */ | |
| --t4: rgba(255,255,255,0.12); /* ghost */ | |
| /* display font */ | |
| --ff-display: 'Bebas Neue', sans-serif; | |
| --ff-body: 'DM Sans', sans-serif; | |
| --ff-mono: 'DM Mono', monospace; | |
| } | |
| html, body { | |
| width: 100%; height: 100%; overflow: hidden; | |
| background: var(--bg); | |
| font-family: var(--ff-body); | |
| color: var(--t1); | |
| -webkit-font-smoothing: antialiased; | |
| } | |
| /* ── CHROME ────────────────────────────────────────── */ | |
| #hint { | |
| position: fixed; bottom: 14px; right: 28px; | |
| font: 400 11px/1 var(--ff-mono); | |
| letter-spacing: .07em; color: var(--t4); | |
| z-index: 100; pointer-events: none; | |
| } | |
| #snum { | |
| position: fixed; top: 22px; right: 28px; | |
| font: 400 11px/1 var(--ff-mono); | |
| letter-spacing: .07em; color: var(--t3); | |
| z-index: 100; | |
| } | |
| #nav { | |
| position: fixed; bottom: 28px; left: 50%; | |
| transform: translateX(-50%); | |
| display: flex; gap: 7px; z-index: 100; | |
| } | |
| .nd { | |
| width: 6px; height: 6px; border-radius: 50%; | |
| background: var(--t4); cursor: pointer; | |
| transition: background .2s, transform .2s; | |
| } | |
| .nd.on { background: var(--gold); transform: scale(1.5); } | |
| /* ── SLIDE SYSTEM ──────────────────────────────────── */ | |
| #deck { position: fixed; inset: 0; } | |
| .slide { | |
| position: absolute; inset: 0; | |
| display: flex; flex-direction: column; | |
| justify-content: center; align-items: flex-start; | |
| padding: 64px 88px; | |
| opacity: 0; pointer-events: none; | |
| transition: opacity .55s cubic-bezier(.4,0,.2,1); | |
| } | |
| .slide.active { opacity: 1; pointer-events: all; } | |
| /* subtle grid lines — feel of a technical document */ | |
| .slide::after { | |
| content: ''; | |
| position: absolute; inset: 0; | |
| background-image: | |
| linear-gradient(var(--border) 1px, transparent 1px), | |
| linear-gradient(90deg, var(--border) 1px, transparent 1px); | |
| background-size: 80px 80px; | |
| pointer-events: none; | |
| opacity: .4; | |
| } | |
| /* top accent bar */ | |
| .slide::before { | |
| content: ''; z-index: 2; | |
| position: absolute; top: 0; left: 0; right: 0; height: 3px; | |
| background: linear-gradient(90deg, var(--gold) 0%, var(--gold) 30%, transparent 100%); | |
| } | |
| /* ── REVEAL SYSTEM ─────────────────────────────────── */ | |
| .rv { | |
| opacity: 0; transform: translateY(16px); | |
| transition: opacity .4s ease, transform .4s ease; | |
| } | |
| .rv.in { opacity: 1; transform: none; } | |
| /* ── KICKER / EYEBROW ──────────────────────────────── */ | |
| .kicker { | |
| font: 500 12px/1 var(--ff-mono); | |
| letter-spacing: .18em; text-transform: uppercase; | |
| color: var(--gold); margin-bottom: 24px; | |
| } | |
| /* ═══════════════════════════════════════════════════ | |
| S0 — TITLE | |
| ═══════════════════════════════════════════════════ */ | |
| #s0 { justify-content: flex-end; padding-bottom: 80px; } | |
| #s0::before { background: var(--gold); width: 6px; height: 100%; top: 0; right: auto; left: 0; } | |
| #s0::after { opacity: .2; } | |
| #s0 .eyebrow { | |
| font: 400 13px/1 var(--ff-mono); | |
| letter-spacing: .2em; text-transform: uppercase; | |
| color: var(--gold); margin-bottom: 28px; | |
| } | |
| #s0 .t-title { | |
| font: 400 clamp(78px,11vw,152px)/.88 var(--ff-display); | |
| letter-spacing: .02em; color: var(--t1); | |
| margin-bottom: 40px; | |
| } | |
| #s0 .t-title .hl { color: var(--gold); } | |
| #s0 .tagline { | |
| font: 400 15px/1 var(--ff-mono); | |
| letter-spacing: .09em; color: var(--t3); | |
| margin-bottom: 18px; display: flex; gap: 20px; align-items: center; | |
| } | |
| #s0 .tagline .sep { color: var(--t4); } | |
| #s0 .tagline .c1 { color: var(--slate); } | |
| #s0 .tagline .c2 { color: var(--slate); } | |
| #s0 .tagline .c3 { color: var(--cyan); } | |
| #s0 .org { | |
| font: 500 17px/1 var(--ff-mono); | |
| letter-spacing: .08em; color: var(--gold); | |
| } | |
| /* ═══════════════════════════════════════════════════ | |
| S1 — FRAMEWORK | |
| ═══════════════════════════════════════════════════ */ | |
| #s1 { | |
| justify-content: flex-start; align-items: stretch; | |
| padding: 52px 64px 56px; | |
| } | |
| #s1 .st { margin-bottom: 18px; } | |
| #s1 .cols { | |
| display: grid; grid-template-columns: 1fr 1fr 1fr; | |
| gap: 14px; flex: 1; min-height: 0; | |
| } | |
| .fc { | |
| display: flex; flex-direction: column; | |
| background: var(--bg2); | |
| border: 1px solid var(--border); | |
| overflow: hidden; position: relative; | |
| } | |
| /* accent line under head number */ | |
| .fc-head::after { | |
| content: ''; | |
| position: absolute; bottom: -1px; left: 20px; | |
| width: 40px; height: 2px; | |
| } | |
| .fc.c1 .fc-head::after { background: var(--slate); } | |
| .fc.c2 .fc-head::after { background: var(--slate); opacity: .7; } | |
| .fc.c3 .fc-head::after { background: var(--cyan); } | |
| .fc.c1 .fc-num { color: var(--slate); } | |
| .fc.c2 .fc-num { color: var(--slate); opacity: .65; } | |
| .fc.c3 .fc-num { color: var(--cyan); } | |
| .fc-head { | |
| padding: 14px 20px 10px; | |
| border-bottom: 1px solid var(--border); | |
| position: relative; | |
| } | |
| .fc-num { | |
| font: 400 clamp(40px,5vw,62px)/1 var(--ff-display); | |
| letter-spacing: .02em; | |
| } | |
| .fc-sub { | |
| font: 400 10px/1 var(--ff-mono); | |
| letter-spacing: .16em; text-transform: uppercase; | |
| color: var(--t3); margin-top: 3px; | |
| } | |
| .fc-body { | |
| flex: 1; padding: 6px 20px 8px; | |
| display: flex; flex-direction: column; | |
| min-height: 0; | |
| } | |
| .dr { | |
| padding: 7px 0; | |
| border-bottom: 1px solid var(--border); | |
| display: flex; align-items: baseline; gap: 0; | |
| white-space: nowrap; overflow: hidden; | |
| } | |
| .dr:last-child { border-bottom: none; } | |
| .dl { | |
| font: 500 10px/1.3 var(--ff-mono); | |
| letter-spacing: .05em; text-transform: uppercase; | |
| color: var(--t3); flex-shrink: 0; | |
| } | |
| .dl::after { | |
| content: ' —'; | |
| color: var(--t4); | |
| margin-right: 9px; | |
| } | |
| .dv { | |
| font: 600 clamp(13px,1.4vw,18px)/1.3 var(--ff-body); | |
| color: var(--t1); | |
| overflow: hidden; text-overflow: ellipsis; | |
| } | |
| /* 3+ column: values in cyan */ | |
| .fc.c3 .dv { color: var(--cyan); } | |
| /* 1 col: slightly dimmer */ | |
| .fc.c1 .dv { color: var(--t2); } | |
| .fc-foot { | |
| padding: 10px 20px; | |
| border-top: 1px solid var(--border); | |
| flex-shrink: 0; | |
| } | |
| .verdict { | |
| font: 400 clamp(18px,2.5vw,32px)/1 var(--ff-display); | |
| letter-spacing: .08em; | |
| } | |
| .fc.c1 .verdict { color: var(--slate); } | |
| .fc.c2 .verdict { color: var(--slate); opacity: .6; } | |
| .fc.c3 .verdict { color: var(--cyan); } | |
| /* ═══════════════════════════════════════════════════ | |
| S2 — INCENTIVES | |
| ═══════════════════════════════════════════════════ */ | |
| #s2 .headline { | |
| font: 400 clamp(44px,6vw,82px)/.92 var(--ff-display); | |
| color: var(--t1); margin-bottom: 32px; | |
| letter-spacing: .02em; | |
| } | |
| #s2 .headline em { color: var(--gold); font-style: normal; } | |
| #s2 .blist { display: flex; flex-direction: column; gap: 18px; max-width: 980px; } | |
| #s2 .bi { display: flex; gap: 24px; align-items: flex-start; } | |
| #s2 .bi .dash { | |
| font: 400 36px/1.2 var(--ff-display); | |
| color: var(--gold); flex-shrink: 0; | |
| } | |
| #s2 .bi .bt { | |
| font: 300 clamp(26px,3.2vw,40px)/1.35 var(--ff-body); | |
| color: var(--t1); | |
| } | |
| #s2 .bi .bt.dim { color: var(--t2); font-size: clamp(24px,2.8vw,36px); } | |
| #s2 .bi .bt.cap { | |
| font-weight: 700; color: var(--gold); | |
| font-size: clamp(26px,3.2vw,40px); | |
| } | |
| /* ═══════════════════════════════════════════════════ | |
| S3 — USER WILL | |
| ═══════════════════════════════════════════════════ */ | |
| #s3 { justify-content: flex-start; padding-top: 72px; } | |
| #s3 .headline { | |
| font: 400 clamp(38px,5vw,70px)/.92 var(--ff-display); | |
| color: var(--t1); margin-bottom: 28px; | |
| letter-spacing: .02em; | |
| } | |
| #s3 .wrows { display: flex; flex-direction: column; gap: 12px; width: 100%; max-width: 920px; } | |
| .wrow { | |
| display: flex; align-items: center; gap: 24px; | |
| padding: 18px 26px; | |
| border: 1px solid var(--border); | |
| background: var(--bg2); | |
| border-left-width: 4px; | |
| } | |
| .wrow .wnum { | |
| font: 400 clamp(32px,5vw,62px)/1 var(--ff-display); | |
| flex-shrink: 0; width: 70px; letter-spacing: .02em; | |
| } | |
| .wrow .wtxt { | |
| font: 500 clamp(16px,2.2vw,26px)/1.3 var(--ff-body); | |
| } | |
| /* 1 = slate (fragile state — muted) */ | |
| .wrow.w1 { border-left-color: var(--slate); } | |
| .wrow.w1 .wnum { color: var(--slate); } | |
| .wrow.w1 .wtxt { color: var(--t2); } | |
| /* 2 = slightly dimmer slate */ | |
| .wrow.w2 { border-left-color: rgba(148,163,184,.4); } | |
| .wrow.w2 .wnum { color: rgba(148,163,184,.5); } | |
| .wrow.w2 .wtxt { color: var(--t2); } | |
| /* 3+ = cyan (good state) */ | |
| .wrow.w3 { border-left-color: var(--cyan); background: var(--cyan-dim); } | |
| .wrow.w3 .wnum { color: var(--cyan); } | |
| .wrow.w3 .wtxt { color: var(--t1); } | |
| #s3 .punch { | |
| margin-top: 20px; padding: 18px 24px; | |
| background: var(--gold-dim); | |
| border: 1px solid var(--gold-border); | |
| border-left-width: 4px; border-left-color: var(--gold); | |
| } | |
| #s3 .punch p { | |
| font: 600 clamp(18px,2.4vw,30px)/1.2 var(--ff-body); | |
| color: var(--gold); | |
| } | |
| /* ═══════════════════════════════════════════════════ | |
| S4 — VIABILITY | |
| ═══════════════════════════════════════════════════ */ | |
| #s4 .headline { | |
| font: 400 clamp(48px,7vw,96px)/.9 var(--ff-display); | |
| color: var(--t1); margin-bottom: 36px; | |
| letter-spacing: .02em; | |
| } | |
| #s4 .headline em { font-style: normal; color: var(--gold); } | |
| #s4 .vlist { display: flex; flex-direction: column; gap: 13px; max-width: 780px; margin-bottom: 36px; } | |
| #s4 .vi { display: flex; gap: 14px; align-items: flex-start; } | |
| #s4 .vi .vd { | |
| font: 400 15px/1.6 var(--ff-mono); | |
| color: var(--t4); flex-shrink: 0; | |
| } | |
| #s4 .vi .vt { | |
| font: 300 clamp(16px,2.1vw,24px)/1.4 var(--ff-body); | |
| color: var(--t2); | |
| } | |
| #s4 .vi .vt.hi { | |
| font-weight: 700; color: var(--t1); | |
| font-size: clamp(17px,2.2vw,26px); | |
| } | |
| /* loop svg wrapper */ | |
| #loop { width: 100%; max-width: 820px; height: 210px; } | |
| #loop svg { width: 100%; height: 100%; } | |
| /* ═══════════════════════════════════════════════════ | |
| S5 — THE EXIT | |
| ═══════════════════════════════════════════════════ */ | |
| #s5 { justify-content: flex-start; padding-top: 56px; } | |
| #s5 .headline { | |
| font: 400 clamp(44px,6vw,82px)/.92 var(--ff-display); | |
| color: var(--cyan); margin-bottom: 24px; | |
| letter-spacing: .02em; | |
| } | |
| #s5 .elist { display: flex; flex-direction: column; gap: 7px; max-width: 900px; } | |
| .erow { | |
| display: flex; gap: 14px; align-items: center; | |
| padding: 10px 18px; | |
| border: 1px solid var(--border); | |
| border-left-width: 4px; | |
| } | |
| .erow .ea { | |
| font: 700 18px/1 var(--ff-body); | |
| flex-shrink: 0; width: 22px; text-align: center; | |
| } | |
| .erow .et { | |
| font: 400 clamp(14px,1.8vw,21px)/1.35 var(--ff-body); | |
| } | |
| .erow.ek { | |
| background: var(--gold-dim); | |
| border-left-color: var(--gold); | |
| border-color: var(--gold-border); | |
| } | |
| .erow.ek .ea { color: var(--gold); } | |
| .erow.ek .et { color: var(--t1); font-weight: 500; } | |
| .erow.ew { | |
| border-left-color: rgba(148,163,184,.5); | |
| border-color: var(--border); | |
| } | |
| .erow.ew .ea { color: var(--t3); } | |
| .erow.ew .et { color: var(--t2); } | |
| #s5 .finale { | |
| margin-top: 14px; padding: 14px 22px; | |
| border: 1px solid var(--gold-border); | |
| background: var(--gold-dim); | |
| display: inline-flex; flex-direction: column; gap: 4px; | |
| } | |
| #s5 .finale .fl { | |
| font: 400 10px/1 var(--ff-mono); | |
| letter-spacing: .18em; text-transform: uppercase; | |
| color: var(--gold); opacity: .7; | |
| } | |
| #s5 .finale .fn { | |
| font: 400 clamp(28px,3.8vw,48px)/1 var(--ff-display); | |
| color: var(--gold); letter-spacing: .04em; | |
| } | |
| /* ═══════════════════════════════════════════════════ | |
| S6 — CLOSE | |
| ═══════════════════════════════════════════════════ */ | |
| #s6 { | |
| justify-content: center; align-items: center; | |
| text-align: center; | |
| } | |
| #s6::before { | |
| background: linear-gradient(90deg, transparent, var(--gold), transparent); | |
| left: 20%; right: 20%; width: auto; | |
| } | |
| #s6 .big { | |
| font: 400 clamp(68px,11vw,148px)/.88 var(--ff-display); | |
| color: var(--t1); margin-bottom: 44px; | |
| letter-spacing: .02em; | |
| } | |
| #s6 .big em { font-style: normal; color: var(--gold); } | |
| #s6 .rule { | |
| width: 56px; height: 3px; | |
| background: var(--gold); margin: 0 auto 32px; | |
| } | |
| #s6 .org { | |
| font: 400 clamp(28px,4vw,52px)/1 var(--ff-display); | |
| color: var(--gold); letter-spacing: .05em; | |
| margin-bottom: 18px; | |
| } | |
| #s6 .sub { | |
| font: 400 13px/1 var(--ff-mono); | |
| letter-spacing: .08em; color: var(--t3); | |
| display: flex; gap: 18px; align-items: center; | |
| justify-content: center; | |
| } | |
| #s6 .sub .sep { color: var(--t4); } | |
| #s6 .sub .c3 { color: var(--cyan); } | |
| </style> | |
| </head> | |
| <body> | |
| <div id="hint">space / → · ← back · 0–6 jump</div> | |
| <div id="snum">1 / 7</div> | |
| <div id="nav"></div> | |
| <div id="deck"> | |
| <!-- ══ S0 TITLE ══════════════════════════════════════ --> | |
| <div class="slide" id="s0"> | |
| <div class="eyebrow">productionready.org</div> | |
| <div class="t-title"> | |
| The<br> | |
| <span class="hl">Third</span><br> | |
| Way | |
| </div> | |
| <div class="tagline"> | |
| <span class="c1">1 = fragility</span> | |
| <span class="sep">·</span> | |
| <span class="c2">2 = conflict</span> | |
| <span class="sep">·</span> | |
| <span class="c3">3 = resilience</span> | |
| </div> | |
| </div> | |
| <!-- ══ S1 FRAMEWORK ══════════════════════════════════ --> | |
| <div class="slide" id="s1"> | |
| <div class="kicker st">The framework</div> | |
| <div class="cols"> | |
| <div class="fc c1 rv"> | |
| <div class="fc-head"> | |
| <div class="fc-num">1</div> | |
| <div class="fc-sub">Implementation</div> | |
| </div> | |
| <div class="fc-body"> | |
| <div class="dr"><div class="dl">Power</div><div class="dv">Monopoly</div></div> | |
| <div class="dr"><div class="dl">Process</div><div class="dv">Single process</div></div> | |
| <div class="dr"><div class="dl">Goals</div><div class="dv">Unclear / captured</div></div> | |
| <div class="dr"><div class="dl">Onramps</div><div class="dv">One</div></div> | |
| <div class="dr"><div class="dl">Resilience</div><div class="dv">Single point of failure</div></div> | |
| <div class="dr"><div class="dl">Gov / Fund / Reg</div><div class="dv">Concentrated</div></div> | |
| <div class="dr"><div class="dl">User will</div><div class="dv">One channel</div></div> | |
| <div class="dr"><div class="dl">Incentives</div><div class="dv">Visibility-seeking</div></div> | |
| </div> | |
| <div class="fc-foot"><div class="verdict">FRAGILE</div></div> | |
| </div> | |
| <div class="fc c2 rv"> | |
| <div class="fc-head"> | |
| <div class="fc-num">2</div> | |
| <div class="fc-sub">Implementations</div> | |
| </div> | |
| <div class="fc-body"> | |
| <div class="dr"><div class="dl">Power</div><div class="dv">Majority / Minority</div></div> | |
| <div class="dr"><div class="dl">Process</div><div class="dv">Contrasting processes</div></div> | |
| <div class="dr"><div class="dl">Goals</div><div class="dv">Goals defined by opposition</div></div> | |
| <div class="dr"><div class="dl">Onramps</div><div class="dv">Two</div></div> | |
| <div class="dr"><div class="dl">Resilience</div><div class="dv">One step from monopoly</div></div> | |
| <div class="dr"><div class="dl">Gov / Fund / Reg</div><div class="dv">Limited diversity</div></div> | |
| <div class="dr"><div class="dl">User will</div><div class="dv">Pick a side</div></div> | |
| <div class="dr"><div class="dl">Incentives</div><div class="dv">Team rivalry</div></div> | |
| </div> | |
| <div class="fc-foot"><div class="verdict">VOLATILE</div></div> | |
| </div> | |
| <div class="fc c3 rv"> | |
| <div class="fc-head"> | |
| <div class="fc-num">3+</div> | |
| <div class="fc-sub">Implementations</div> | |
| </div> | |
| <div class="fc-body"> | |
| <div class="dr"><div class="dl">Power</div><div class="dv">Coalition</div></div> | |
| <div class="dr"><div class="dl">Process</div><div class="dv">Marketplace of processes</div></div> | |
| <div class="dr"><div class="dl">Goals</div><div class="dv">Explicit, competing</div></div> | |
| <div class="dr"><div class="dl">Onramps</div><div class="dv">Many paths in</div></div> | |
| <div class="dr"><div class="dl">Resilience</div><div class="dv">Survives multiple failures</div></div> | |
| <div class="dr"><div class="dl">Gov / Fund / Reg</div><div class="dv">Genuine diversity</div></div> | |
| <div class="dr"><div class="dl">User will</div><div class="dv">Expressed by software</div></div> | |
| <div class="dr"><div class="dl">Incentives</div><div class="dv">Accountable competition</div></div> | |
| </div> | |
| <div class="fc-foot"><div class="verdict">RESILIENT</div></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- ══ S2 INCENTIVES ═════════════════════════════════ --> | |
| <div class="slide" id="s2"> | |
| <div class="kicker">Development incentives</div> | |
| <div class="headline">In the absence of<br><em>explicit goals...</em></div> | |
| <div class="blist"> | |
| <div class="bi rv"><div class="dash">—</div><div class="bt">Visibility becomes the goal</div></div> | |
| <div class="bi rv"><div class="dash">—</div><div class="bt">Individual Incentive diverges from network needs</div></div> | |
| <div class="bi rv"><div class="dash">—</div><div class="bt dim">Structural Deficiency</div></div> | |
| <div class="bi rv"><div class="dash">—</div><div class="bt dim">Two implementations define themselves by opposition</div></div> | |
| <div class="bi rv"><div class="dash">—</div><div class="bt cap">Three+ forces goals to be explicit and accountable</div></div> | |
| </div> | |
| </div> | |
| <!-- ══ S3 USER WILL ══════════════════════════════════ --> | |
| <div class="slide" id="s3"> | |
| <div class="headline">How do Bitcoin users<br>express what they want?</div> | |
| <div class="wrows"> | |
| <div class="wrow w1 rv"> | |
| <div class="wnum">1</div> | |
| <div class="wtxt">Will must be shown in the development process</div> | |
| </div> | |
| <div class="wrow w2 rv"> | |
| <div class="wnum">2</div> | |
| <div class="wtxt">Choice is binary — pick a side</div> | |
| </div> | |
| <div class="wrow w3 rv"> | |
| <div class="wnum">3+</div> | |
| <div class="wtxt">Users and miners vote with what they run</div> | |
| </div> | |
| <div class="punch rv"> | |
| <p>Software choice is the most honest signal in the system</p> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- ══ S4 VIABILITY ══════════════════════════════════ --> | |
| <div class="slide" id="s4"> | |
| <div class="headline">Why a descendent of <em>the original Satoshi client?</em></div> | |
| <div class="vlist"> | |
| <div class="vi rv"><div class="vd">·</div><div class="vt">btcd · libbitcoin · bcoin — all 10+ years old, no meaningful traction</div></div> | |
| <div class="vi rv"><div class="vd">→</div><div class="vt hi">Software hardening problem.</div></div> | |
| <div class="vi rv"><div class="vd">·</div><div class="vt">Core has 16+ years of heavy usage and hardening</div></div> | |
| <div class="vi rv"><div class="vd">·</div><div class="vt">Economically significant operators can't justify the risk</div></div> | |
| </div> | |
| <div id="loop" class="rv"> | |
| <svg viewBox="0 0 820 210" xmlns="http://www.w3.org/2000/svg"> | |
| <defs> | |
| <marker id="ah" markerWidth="7" markerHeight="7" refX="6" refY="3" orient="auto"> | |
| <path d="M0,0 L0,6 L7,3 z" fill="rgba(255,255,255,0.25)"/> | |
| </marker> | |
| </defs> | |
| <!-- left box --> | |
| <rect x="16" y="55" width="210" height="90" rx="3" | |
| fill="rgba(255,255,255,0.04)" stroke="rgba(255,255,255,0.12)" stroke-width="1"/> | |
| <text x="121" y="96" font-family="Bebas Neue,sans-serif" font-size="28" | |
| fill="rgba(255,255,255,0.7)" text-anchor="middle" letter-spacing="2">HARDENING</text> | |
| <text x="121" y="118" font-family="DM Mono,monospace" font-size="10" | |
| fill="rgba(255,255,255,0.25)" text-anchor="middle">requires adoption</text> | |
| <!-- right box --> | |
| <rect x="594" y="55" width="210" height="90" rx="3" | |
| fill="rgba(255,255,255,0.04)" stroke="rgba(255,255,255,0.12)" stroke-width="1"/> | |
| <text x="699" y="96" font-family="Bebas Neue,sans-serif" font-size="28" | |
| fill="rgba(255,255,255,0.7)" text-anchor="middle" letter-spacing="2">ADOPTION</text> | |
| <text x="699" y="118" font-family="DM Mono,monospace" font-size="10" | |
| fill="rgba(255,255,255,0.25)" text-anchor="middle">requires hardening</text> | |
| <!-- top arc --> | |
| <path d="M 226 78 Q 410 12 594 78" | |
| fill="none" stroke="rgba(255,255,255,0.22)" stroke-width="1.5" | |
| stroke-dasharray="6 4" marker-end="url(#ah)"/> | |
| <!-- bottom arc --> | |
| <path d="M 594 122 Q 410 188 226 122" | |
| fill="none" stroke="rgba(255,255,255,0.22)" stroke-width="1.5" | |
| stroke-dasharray="6 4" marker-end="url(#ah)"/> | |
| <!-- center --> | |
| <text x="410" y="102" font-family="Bebas Neue,sans-serif" font-size="22" | |
| fill="rgba(247,147,26,0.6)" text-anchor="middle" letter-spacing="4">TRAPPED</text> | |
| <text x="410" y="120" font-family="DM Mono,monospace" font-size="9" | |
| fill="rgba(255,255,255,0.18)" text-anchor="middle">new implementations start outside this loop</text> | |
| </svg> | |
| </div> | |
| </div> | |
| <!-- ══ S5 THE DIFFERENTIATION ════════════════════════════════════ --> | |
| <div class="slide" id="s5"> | |
| <div class="headline">Bootstrapping</div> | |
| <div class="elist"> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Start with Core's battle-tested code base</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Different team</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Different training</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Different funding</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Different culture</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Different governance</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Different goals</div></div> | |
| </div> | |
| </div> | |
| <!-- ══ S6 THE CLOSE ════════════════════════════════════ --> | |
| <div class="slide" id="s5"> | |
| <div class="headline">Why?</div> | |
| <div class="elist"> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Give users choice</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Change the dynamic</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Benefit the entire community</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Add resilience</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Conservative</div></div> | |
| <div class="erow ek rv"><div class="ea">→</div><div class="et">Sound Money</div></div> | |
| </div> | |
| </div> | |
| <!-- ══ S7 CONTACT ════════════════════════════════════════ --> | |
| <div class="slide" id="s6"> | |
| <div class="big">Join Us</div> | |
| <div class="rule"></div> | |
| <div class="org">productionready.org</div> | |
| <div class="sub"> | |
| <span>1 = fragility</span> | |
| <span class="sep">·</span> | |
| <span>2 = conflict</span> | |
| <span class="sep">·</span> | |
| <span class="c3">3 = resilience</span> | |
| </div> | |
| </div> | |
| </div> | |
| <script> | |
| const slides = Array.from(document.querySelectorAll('.slide')); | |
| const nav = document.getElementById('nav'); | |
| const snum = document.getElementById('snum'); | |
| let cur = 0; | |
| // Index reveal items per slide | |
| slides.forEach(s => { | |
| s.querySelectorAll('.rv').forEach((el, i) => { | |
| el.dataset.step = i; | |
| }); | |
| }); | |
| slides.forEach((_, i) => { | |
| const d = document.createElement('div'); | |
| d.className = 'nd'; | |
| d.onclick = () => goSlide(i); | |
| nav.appendChild(d); | |
| }); | |
| function revealedCount(slide) { | |
| return slide.querySelectorAll('.rv.in').length; | |
| } | |
| function totalItems(slide) { | |
| return slide.querySelectorAll('.rv').length; | |
| } | |
| function showSlide(n, instant) { | |
| slides[cur].classList.remove('active'); | |
| cur = n; | |
| const s = slides[cur]; | |
| s.classList.add('active'); | |
| // Only title and close auto-reveal everything | |
| const autoReveal = ['s0','s6'].includes(s.id); | |
| if (autoReveal) { | |
| s.querySelectorAll('.rv').forEach(el => requestAnimationFrame(() => el.classList.add('in'))); | |
| } | |
| document.querySelectorAll('.nd').forEach((d, i) => d.classList.toggle('on', i === cur)); | |
| snum.textContent = `${cur + 1} / ${slides.length}`; | |
| } | |
| function goSlide(n) { | |
| if (n < 0 || n >= slides.length) return; | |
| showSlide(n); | |
| } | |
| function advance() { | |
| const s = slides[cur]; | |
| const autoReveal = ['s0','s6'].includes(s.id); | |
| if (autoReveal) { | |
| if (cur < slides.length - 1) showSlide(cur + 1); | |
| return; | |
| } | |
| const items = Array.from(s.querySelectorAll('.rv')); | |
| const nextHidden = items.find(el => !el.classList.contains('in')); | |
| if (nextHidden) { | |
| nextHidden.classList.add('in'); | |
| } else { | |
| if (cur < slides.length - 1) showSlide(cur + 1); | |
| } | |
| } | |
| function retreat() { | |
| const s = slides[cur]; | |
| const autoReveal = ['s0','s6'].includes(s.id); | |
| if (autoReveal) { | |
| if (cur > 0) showSlide(cur - 1); | |
| return; | |
| } | |
| const items = Array.from(s.querySelectorAll('.rv.in')); | |
| if (items.length > 0) { | |
| items[items.length - 1].classList.remove('in'); | |
| } else { | |
| if (cur > 0) showSlide(cur - 1); | |
| } | |
| } | |
| document.addEventListener('keydown', e => { | |
| if (e.key === 'ArrowRight' || e.key === ' ' || e.key === 'ArrowDown') { e.preventDefault(); advance(); } | |
| else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.preventDefault(); retreat(); } | |
| else if (e.key >= '0' && e.key <= '9') goSlide(parseInt(e.key)); | |
| }); | |
| let tx = null; | |
| document.addEventListener('touchstart', e => { tx = e.touches[0].clientX; }); | |
| document.addEventListener('touchend', e => { | |
| if (tx === null) return; | |
| const dx = e.changedTouches[0].clientX - tx; | |
| if (Math.abs(dx) > 40) { dx < 0 ? advance() : retreat(); } | |
| tx = null; | |
| }); | |
| showSlide(0); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment