|
1301 | 1301 | transition: width 1.5s cubic-bezier(0.22, 1, 0.36, 1); |
1302 | 1302 | } |
1303 | 1303 |
|
| 1304 | + /* --- Landscape / Why Section --- */ |
| 1305 | + .landscape { |
| 1306 | + max-width: 48rem; |
| 1307 | + margin: 0 auto; |
| 1308 | + padding: 5rem 2rem; |
| 1309 | + } |
| 1310 | + |
| 1311 | + .landscape .section-label, |
| 1312 | + .landscape h2 { |
| 1313 | + text-align: center; |
| 1314 | + } |
| 1315 | + |
| 1316 | + .landscape h2 { |
| 1317 | + margin-bottom: 0.75rem; |
| 1318 | + } |
| 1319 | + |
| 1320 | + .landscape .land-subtitle { |
| 1321 | + text-align: center; |
| 1322 | + font-size: 0.9rem; |
| 1323 | + color: var(--text-tertiary); |
| 1324 | + font-weight: 300; |
| 1325 | + max-width: 36rem; |
| 1326 | + margin: 0 auto 3rem; |
| 1327 | + line-height: 1.7; |
| 1328 | + } |
| 1329 | + |
| 1330 | + .landscape .land-lede { |
| 1331 | + font-size: 1.05rem; |
| 1332 | + color: var(--text-secondary); |
| 1333 | + font-weight: 300; |
| 1334 | + line-height: 1.8; |
| 1335 | + margin-bottom: 1.5rem; |
| 1336 | + } |
| 1337 | + |
| 1338 | + .landscape .land-lede strong { |
| 1339 | + color: var(--text-primary); |
| 1340 | + font-weight: 500; |
| 1341 | + } |
| 1342 | + |
| 1343 | + .landscape .land-lede em { |
| 1344 | + font-style: normal; |
| 1345 | + color: var(--accent); |
| 1346 | + font-weight: 400; |
| 1347 | + } |
| 1348 | + |
| 1349 | + .gap-grid { |
| 1350 | + display: grid; |
| 1351 | + grid-template-columns: 1fr 1fr; |
| 1352 | + gap: 1px; |
| 1353 | + background: var(--border); |
| 1354 | + border: 1px solid var(--border); |
| 1355 | + border-radius: 0.5rem; |
| 1356 | + overflow: hidden; |
| 1357 | + margin: 2.5rem 0; |
| 1358 | + } |
| 1359 | + |
| 1360 | + .gap-cell { |
| 1361 | + background: white; |
| 1362 | + padding: 1.25rem; |
| 1363 | + transition: background 0.3s; |
| 1364 | + } |
| 1365 | + |
| 1366 | + .gap-cell:hover { background: #fafaf9; } |
| 1367 | + |
| 1368 | + .gap-cell .gap-label { |
| 1369 | + font-size: 0.6rem; |
| 1370 | + letter-spacing: 0.2em; |
| 1371 | + text-transform: uppercase; |
| 1372 | + font-weight: 500; |
| 1373 | + margin-bottom: 0.35rem; |
| 1374 | + } |
| 1375 | + |
| 1376 | + .gap-cell .gap-label.empty { color: #e11d48; } |
| 1377 | + .gap-cell .gap-label.filled { color: #16a34a; } |
| 1378 | + |
| 1379 | + .gap-cell h4 { |
| 1380 | + font-size: 0.85rem; |
| 1381 | + font-weight: 500; |
| 1382 | + color: var(--text-primary); |
| 1383 | + margin-bottom: 0.25rem; |
| 1384 | + } |
| 1385 | + |
| 1386 | + .gap-cell p { |
| 1387 | + font-size: 0.72rem; |
| 1388 | + color: var(--text-tertiary); |
| 1389 | + font-weight: 300; |
| 1390 | + line-height: 1.5; |
| 1391 | + margin: 0; |
| 1392 | + } |
| 1393 | + |
| 1394 | + .comp-strip { |
| 1395 | + display: flex; |
| 1396 | + justify-content: center; |
| 1397 | + flex-wrap: wrap; |
| 1398 | + gap: 0.35rem; |
| 1399 | + margin: 2rem 0; |
| 1400 | + } |
| 1401 | + |
| 1402 | + .comp-chip { |
| 1403 | + font-family: var(--font-mono); |
| 1404 | + font-size: 0.6rem; |
| 1405 | + padding: 0.25rem 0.6rem; |
| 1406 | + border-radius: 2rem; |
| 1407 | + border: 1px solid var(--border); |
| 1408 | + color: var(--text-tertiary); |
| 1409 | + font-weight: 400; |
| 1410 | + transition: all 0.2s; |
| 1411 | + } |
| 1412 | + |
| 1413 | + .comp-chip:hover { |
| 1414 | + border-color: var(--accent); |
| 1415 | + color: var(--accent); |
| 1416 | + } |
| 1417 | + |
| 1418 | + .origin-story { |
| 1419 | + background: var(--code-bg); |
| 1420 | + border-radius: 0.5rem; |
| 1421 | + padding: 2rem 2.5rem; |
| 1422 | + margin: 2.5rem 0; |
| 1423 | + } |
| 1424 | + |
| 1425 | + .origin-story .os-quote { |
| 1426 | + font-size: 1rem; |
| 1427 | + color: #e2e8f0; |
| 1428 | + font-weight: 300; |
| 1429 | + line-height: 1.8; |
| 1430 | + font-style: italic; |
| 1431 | + } |
| 1432 | + |
| 1433 | + .origin-story .os-quote em { |
| 1434 | + font-style: normal; |
| 1435 | + color: #818cf8; |
| 1436 | + font-weight: 400; |
| 1437 | + } |
| 1438 | + |
| 1439 | + .origin-story .os-attr { |
| 1440 | + font-size: 0.65rem; |
| 1441 | + color: #64748b; |
| 1442 | + margin-top: 1rem; |
| 1443 | + letter-spacing: 0.1em; |
| 1444 | + text-transform: uppercase; |
| 1445 | + font-weight: 500; |
| 1446 | + } |
| 1447 | + |
1304 | 1448 | /* --- Responsive --- */ |
1305 | 1449 | @media (max-width: 640px) { |
1306 | 1450 | .hero h1 { font-size: 1.75rem; } |
|
1309 | 1453 | section { padding: 3rem 1.5rem; } |
1310 | 1454 | .perf-layout { grid-template-columns: 1fr; } |
1311 | 1455 | .latency-grid { grid-template-columns: repeat(2, 1fr); } |
| 1456 | + .gap-grid { grid-template-columns: 1fr; } |
1312 | 1457 | } |
1313 | 1458 | </style> |
1314 | 1459 | </head> |
|
1326 | 1471 |
|
1327 | 1472 | <!-- ─── HERO ─── --> |
1328 | 1473 | <div class="hero"> |
1329 | | - <div class="label">A Claude Code Build Journal</div> |
1330 | | - <h1>How We Built a <em>Deterministic Crawl Kernel</em> in One Session</h1> |
| 1474 | + <div class="label">Built with Claude Code — One Session, Zero Compromise</div> |
| 1475 | + <h1>The Web's Memory Layer <em>Should Be Provable</em></h1> |
1331 | 1476 | <p class="subtitle"> |
1332 | | - An expert-level tutorial on setting up your machine for Claude Code, |
1333 | | - establishing invariant-driven development practices, and shipping |
1334 | | - a production-grade Rust system from zero to CI-green in a single conversation. |
| 1477 | + Palimpsest is a deterministic crawl kernel that produces identical output |
| 1478 | + for identical input — every time, on any machine, under any load. |
| 1479 | + Not a crawler. Not a Wayback clone. The auditable, replayable, |
| 1480 | + cryptographically verifiable foundation for web archiving, |
| 1481 | + AI training data, and compliance. |
1335 | 1482 | </p> |
1336 | 1483 | <div class="stack-bar"> |
1337 | 1484 | <!-- Rust — gear/cog --> |
@@ -1433,6 +1580,91 @@ <h3>The Six Laws</h3> |
1433 | 1580 |
|
1434 | 1581 | <div class="divider"></div> |
1435 | 1582 |
|
| 1583 | +<!-- ─── WHY THIS EXISTS ─── --> |
| 1584 | +<div class="landscape"> |
| 1585 | + <div class="section-label">The Gap</div> |
| 1586 | + <h2>Nothing Else Does This</h2> |
| 1587 | + <p class="land-subtitle"> |
| 1588 | + We looked at every tool in the space. No one combines these properties. |
| 1589 | + </p> |
| 1590 | + |
| 1591 | + <p class="land-lede"> |
| 1592 | + The web archiving world has <strong>Heritrix</strong> and <strong>Webrecorder</strong> — institutional tools that produce WARC files but can't get past a Cloudflare challenge page. The scraping world has <strong>Scrapy</strong>, <strong>Crawlee</strong>, and <strong>Firecrawl</strong> — fast tools with anti-detection but no archival integrity, no WARC output, no replay fidelity. The AI world has <strong>Crawl4AI</strong> and <strong>Unstructured</strong> — great at extraction but with zero provenance, zero reproducibility, and no way to prove when content was captured or by whom. |
| 1593 | + </p> |
| 1594 | + <p class="land-lede"> |
| 1595 | + <em>These three worlds have never been combined.</em> Archivists can't reach the modern web. Scrapers can't prove what they captured. AI pipelines can't trace their training data. Palimpsest exists because the web's memory layer shouldn't require choosing between <strong>access</strong>, <strong>integrity</strong>, and <strong>provenance</strong>. |
| 1596 | + </p> |
| 1597 | + |
| 1598 | + <div class="origin-story"> |
| 1599 | + <div class="os-quote"> |
| 1600 | + "This started as a vibe coding session — one conversation with Claude Code, |
| 1601 | + one afternoon, see what happens. Twelve hours later we had 15 crates, 288 tests, |
| 1602 | + a deterministic simulation framework proving correctness at 10,000 pages, |
| 1603 | + BoringSSL TLS impersonation passing Rebrowser 10/10, and a temporal index that |
| 1604 | + treats web history as a <em>graph, not a lookup table</em>. It stopped being a |
| 1605 | + vibe somewhere around hour three." |
| 1606 | + </div> |
| 1607 | + <div class="os-attr">— Built in one session with Claude Code</div> |
| 1608 | + </div> |
| 1609 | + |
| 1610 | + <div class="gap-grid"> |
| 1611 | + <div class="gap-cell"> |
| 1612 | + <div class="gap-label empty">No one else</div> |
| 1613 | + <h4>Deterministic Crawling</h4> |
| 1614 | + <p>Same seed = identical frontier ordering, identical artifacts, identical replay. No existing crawler guarantees this.</p> |
| 1615 | + </div> |
| 1616 | + <div class="gap-cell"> |
| 1617 | + <div class="gap-label empty">No one else</div> |
| 1618 | + <h4>Stealth + Archival</h4> |
| 1619 | + <p>WARC-producing tools have zero anti-detection. Anti-detection tools produce zero WARCs. These worlds have never met.</p> |
| 1620 | + </div> |
| 1621 | + <div class="gap-cell"> |
| 1622 | + <div class="gap-label empty">No one else</div> |
| 1623 | + <h4>Execution Envelope</h4> |
| 1624 | + <p>Every fetch seals DNS, TLS chain, headers, browser config, and seed into an immutable context. No other tool does this.</p> |
| 1625 | + </div> |
| 1626 | + <div class="gap-cell"> |
| 1627 | + <div class="gap-label empty">No one else</div> |
| 1628 | + <h4>Temporal Graph Index</h4> |
| 1629 | + <p>URL × time × content hash × crawl context. CDX is a flat lookup. This is a queryable history of the web.</p> |
| 1630 | + </div> |
| 1631 | + <div class="gap-cell"> |
| 1632 | + <div class="gap-label filled">Palimpsest</div> |
| 1633 | + <h4>Provable AI Training Data</h4> |
| 1634 | + <p>Every RAG chunk traces to a content hash, timestamp, crawl context, and execution envelope. Audit-ready provenance.</p> |
| 1635 | + </div> |
| 1636 | + <div class="gap-cell"> |
| 1637 | + <div class="gap-label filled">Palimpsest</div> |
| 1638 | + <h4>Unified Capture</h4> |
| 1639 | + <p>Raw HTTP and headless Chrome produce the same artifact types through the same envelope model. Not bolted on — native.</p> |
| 1640 | + </div> |
| 1641 | + </div> |
| 1642 | + |
| 1643 | + <div class="comp-strip"> |
| 1644 | + <span class="comp-chip">Heritrix</span> |
| 1645 | + <span class="comp-chip">Scrapy</span> |
| 1646 | + <span class="comp-chip">Crawlee</span> |
| 1647 | + <span class="comp-chip">Firecrawl</span> |
| 1648 | + <span class="comp-chip">Crawl4AI</span> |
| 1649 | + <span class="comp-chip">spider-rs</span> |
| 1650 | + <span class="comp-chip">curl-impersonate</span> |
| 1651 | + <span class="comp-chip">Webrecorder</span> |
| 1652 | + <span class="comp-chip">ArchiveBox</span> |
| 1653 | + <span class="comp-chip">camoufox</span> |
| 1654 | + <span class="comp-chip">puppeteer-stealth</span> |
| 1655 | + <span class="comp-chip">Colly</span> |
| 1656 | + <span class="comp-chip">katana</span> |
| 1657 | + </div> |
| 1658 | + |
| 1659 | + <p class="land-lede" style="text-align:center; font-size:0.85rem; color:var(--text-tertiary);"> |
| 1660 | + We studied all of them. None of them combine determinism, content addressability, |
| 1661 | + TLS stealth, browser capture, WARC output, temporal indexing, and RAG extraction |
| 1662 | + in a single system. Palimpsest is the first. |
| 1663 | + </p> |
| 1664 | +</div> |
| 1665 | + |
| 1666 | +<div class="divider"></div> |
| 1667 | + |
1436 | 1668 | <!-- ─── MACHINE SETUP ─── --> |
1437 | 1669 | <section> |
1438 | 1670 | <div class="section-label">Part One</div> |
|
0 commit comments