<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>p2pbuilders — peer-to-peer hacker news</title>
<meta name="description" content="Permissionless peer-to-peer Hacker News for anons who build P2P. No servers, no accounts. Posts are proof-of-work gated and reputation-weighted; communities, comments and votes replicate directly between peers. A PearBrowser P2P site.">
<link rel="icon" type="image/svg+xml" href="icon.svg">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="boot">
<div class="boot-mark">Y</div>
<div class="boot-name">p2pbuilders</div>
<div class="boot-sub">connecting to peers…</div>
</div>
<script>
// Boot watchdog (classic script: runs even when module loading is blocked).
// Browsers refuse ES modules on file:// — the app never starts and the
// splash would sit there forever. Explain instead of hanging.
(function () {
var explain = function (html) {
var sub = document.querySelector('.boot .boot-sub')
if (sub) sub.innerHTML = html
}
if (location.protocol === 'file:') {
setTimeout(function () {
if (!document.querySelector('.boot')) return
explain('this app can't run from a file:// URL (browsers block module scripts).<br>' +
'serve it instead:<br><code>cd web && node dev-server.mjs</code><br>' +
'then open <code>http://localhost:8778</code> — or open the hyper:// link in PearBrowser.')
}, 1500)
} else {
setTimeout(function () {
if (!document.querySelector('.boot')) return
explain('still starting… this usually means a script failed to load.<br>' +
'check the browser console (F12) for errors, then hard-refresh.')
}, 10000)
}
})()
</script>
<script type="module" src="js/app.js"></script>
</body>
</html>