diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 90c57e7..325acad 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -3,6 +3,10 @@ name: Deploy Hugo site to Pages
on:
push:
branches: [main]
+ # Daily rebuild so the project version badges track the latest pithead /
+ # rigforge releases without waiting for a manual push.
+ schedule:
+ - cron: "17 6 * * *"
workflow_dispatch:
permissions:
@@ -40,6 +44,10 @@ jobs:
uses: actions/configure-pages@v6
with:
enablement: true
+ - name: Refresh release versions (best-effort)
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: python3 scripts/refresh-releases.py
- name: Build with Hugo
env:
HUGO_ENVIRONMENT: production
diff --git a/README.md b/README.md
index e88e93f..487a6e8 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-# Hardrock — organization website
+# P2Pool Starter Stack — organization website
-The marketing / showcase site for the **Hardrock** collective — an orchestrator
+The marketing / showcase site for the **P2Pool Starter Stack** — an orchestrator
([Pithead](https://github.com/p2pool-starter-stack/pithead)) and the miners that feed it
([RigForge](https://github.com/p2pool-starter-stack/rigforge)) — plus the node-starter stacks to come.
@@ -43,18 +43,56 @@ All landing-page copy is in **[`data/content.yaml`](data/content.yaml)** — edi
templates. The page is assembled by [`layouts/index.html`](layouts/index.html) from that data.
```
-data/content.yaml ← all copy (hero, stats, projects, roadmap, ethos, CTA)
+data/content.yaml ← all copy (hero, stats, projects, roadmap, ethos, FAQ, CTA)
+data/releases.json ← latest pithead / rigforge release tags (version badges)
layouts/index.html ← single-page assembly
-layouts/partials/ ← head / header / footer / icon set
+layouts/partials/ ← head / header / footer / icon set / schema (JSON-LD)
assets/css/main.css ← the entire visual system
assets/js/main.js ← reveal-on-scroll, header state, copy-to-clipboard
-static/img/ ← marks + dashboard screenshot
-static/favicon.svg ← Hardrock crystal mark
+scripts/refresh-releases.py ← refreshes data/releases.json from the GitHub API
+static/img/ ← marks + dashboard screenshot + og-card
+static/favicon.svg ← P2Pool Starter Stack layered mark
+static/robots.txt ← crawl rules (search + AI assistants explicitly welcome)
```
The icon/mark set is inline SVG in [`layouts/partials/icon.html`](layouts/partials/icon.html)
(`{{ partial "icon.html" "pithead" }}`), so every mark inherits color from CSS via `currentColor`.
+## Discoverability (SEO / GEO)
+
+The site is tuned to be found — and cited — when people (or their AI assistants) ask how to mine
+Monero privately. The copy is keyword-aware without being spammy, and three machine-readable layers
+back it up:
+
+- **[`layouts/partials/schema.html`](layouts/partials/schema.html)** emits one `application/ld+json`
+ graph: an `Organization`, a `WebSite`, a `SoftwareApplication` for each of Pithead and RigForge
+ (free, MIT, OS-tagged), and a `FAQPage`. The FAQ entries are generated from the same
+ `data/content.yaml → faq` block the page renders, so the visible Q&A and the structured data never
+ drift. Built through `jsonify | safeJS`, so escaping is always valid.
+- **[`layouts/partials/head.html`](layouts/partials/head.html)** carries the title/description,
+ canonical, Open Graph + Twitter card (`static/img/og-card.png`), and `robots: max-image-preview:large`.
+- **[`static/robots.txt`](static/robots.txt)** allows everything and explicitly welcomes answer-engine
+ crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, …) plus the auto-generated `sitemap.xml`.
+
+After editing the FAQ or any project copy, paste the built page into Google's
+[Rich Results Test](https://search.google.com/test/rich-results) to confirm the JSON-LD still validates.
+
+## Version badges (kept current automatically)
+
+Each project card shows the latest release tag of its repo (e.g. `v1.0.2`). To keep the site's
+**zero third-party requests** promise, the version is **baked in at build time** — the page never
+calls out at runtime, and CI stays deterministic (no network):
+
+- The Hugo build only reads **[`data/releases.json`](data/releases.json)** — a committed fallback
+ that the page renders from.
+- **[`scripts/refresh-releases.py`](scripts/refresh-releases.py)** updates that file from the GitHub
+ Releases API. It's **best-effort**: on any API/network/rate-limit error it keeps the committed value,
+ so it can never fail a build. Set `GH_TOKEN` to dodge the unauthenticated rate limit.
+- The **deploy** workflow runs that script before each Hugo build (with the built-in `GITHUB_TOKEN`)
+ and on a **daily `schedule`**, so the live badges track new releases without a manual push.
+
+Refresh the committed fallback locally with `python3 scripts/refresh-releases.py`.
+
## Deploy
This repo is the org's GitHub Pages site (`p2pool-starter-stack.github.io`), served at
diff --git a/assets/css/main.css b/assets/css/main.css
index 2c64ef5..bea360d 100644
--- a/assets/css/main.css
+++ b/assets/css/main.css
@@ -1,5 +1,5 @@
/* ════════════════════════════════════════════════════════════════════════
- HARDROCK — industrial-cypherpunk landing
+ P2POOL STARTER STACK — industrial-cypherpunk landing
Dark + orange #F26822 · headframe/blueprint motifs · mono data accents
Zero third-party requests: system font stacks only.
════════════════════════════════════════════════════════════════════════ */
@@ -100,7 +100,7 @@ html.js .reveal.in { opacity: 1; transform: none; }
.brand-mark { display: inline-flex; width: 26px; height: 26px; color: var(--orange);
filter: drop-shadow(0 0 8px var(--orange-glow)); }
.brand-mark .ico { width: 100%; height: 100%; }
-.brand-word { font-weight: 800; letter-spacing: 2px; font-size: 18px; }
+.brand-word { font-weight: 800; letter-spacing: 1.5px; font-size: 15px; white-space: nowrap; }
.brand-accent { color: var(--orange); }
.nav { display: flex; align-items: center; gap: 28px; }
@@ -265,7 +265,13 @@ html.js .reveal.in { opacity: 1; transform: none; }
.project-id { display: flex; flex-direction: column; }
.project-name { font-size: 27px; font-weight: 800; margin: 0; letter-spacing: -.4px; }
.project-role { font-size: 13px; color: var(--ac); letter-spacing: .5px; }
-.project-flag { margin-left: auto; font-size: 12px; color: var(--orange); border: 1px solid rgba(242,104,34,.4); background: var(--orange-soft); padding: 5px 11px; border-radius: 20px; }
+.project-tags { margin-left: auto; display: flex; align-items: center; gap: 10px; flex: 0 0 auto; }
+.project-ver { font-size: 12px; color: var(--ac); letter-spacing: .5px; white-space: nowrap;
+ border: 1px solid color-mix(in srgb, var(--ac) 35%, transparent);
+ background: color-mix(in srgb, var(--ac) 10%, transparent);
+ padding: 5px 11px; border-radius: 20px; transition: border-color .2s, transform .2s var(--ease); }
+.project-ver:hover { border-color: var(--ac); transform: translateY(-1px); }
+.project-flag { font-size: 12px; color: var(--orange); border: 1px solid rgba(242,104,34,.4); background: var(--orange-soft); padding: 5px 11px; border-radius: 20px; white-space: nowrap; }
.project-tagline { font-size: 20px; font-weight: 650; color: var(--text); margin: 0 0 10px; max-width: 56ch; }
.project-blurb { color: var(--muted); margin: 0 0 26px; max-width: 70ch; }
@@ -344,6 +350,22 @@ html.js .reveal.in { opacity: 1; transform: none; }
.ethos-num { position: absolute; top: 16px; right: 18px; font-size: 13px; color: var(--orange); opacity: .55; }
.ethos-card .card-title { padding-right: 40px; }
+/* ───────── FAQ ───────── */
+.faq-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 18px 22px; }
+.faq-item {
+ position: relative; padding: 26px 28px; border-radius: var(--radius);
+ border: 1px solid var(--border-2); background: var(--surface);
+ border-left: 3px solid rgba(242,104,34,.55);
+ transition: border-color .3s, transform .3s var(--ease), box-shadow .3s;
+}
+.faq-item:hover { border-color: rgba(242,104,34,.45); border-left-color: var(--orange);
+ transform: translateY(-3px); box-shadow: 0 24px 60px -40px var(--orange-glow); }
+.faq-q { font-size: 16.5px; font-weight: 700; margin: 0 0 9px; letter-spacing: -.2px; line-height: 1.3; }
+.faq-a { color: var(--muted); font-size: 14.5px; line-height: 1.6; margin: 0; }
+.faq-link { display: inline-flex; align-items: center; gap: 5px; margin-top: 13px;
+ font-size: 12.5px; color: var(--orange); letter-spacing: .3px; transition: gap .2s; }
+.faq-link:hover { gap: 9px; }
+
/* ───────── CTA ───────── */
.cta-section { text-align: center; overflow: hidden; border-bottom: 1px solid var(--border); }
.cta-bg { position: absolute; inset: 0; pointer-events: none; }
@@ -392,10 +414,14 @@ html.js .reveal.in { opacity: 1; transform: none; }
}
@media (max-width: 620px) {
body { font-size: 16px; }
+ .brand { gap: 8px; }
+ .brand-word { font-size: 12.5px; letter-spacing: 1px; }
+ .brand-mark { width: 22px; height: 22px; }
.section { padding: 72px 0; }
.hero { padding: 80px 0 64px; }
- .feat-grid, .project-featured .feat-grid, .cards-3, .cards-2 { grid-template-columns: 1fr; }
+ .feat-grid, .project-featured .feat-grid, .cards-3, .cards-2, .faq-grid { grid-template-columns: 1fr; }
.project { padding: 26px 22px; }
+ .project-head { flex-wrap: wrap; } /* version chip + ★ flag drop to their own line */
.wave-body { padding: 14px 18px; }
.donate-band { padding: 32px 20px; }
.footer-grid { grid-template-columns: 1fr; gap: 30px; }
diff --git a/assets/js/main.js b/assets/js/main.js
index 7e6ec15..5bda9d4 100644
--- a/assets/js/main.js
+++ b/assets/js/main.js
@@ -1,4 +1,4 @@
-// Hardrock — tiny, no-dependency progressive enhancement.
+// P2Pool Starter Stack — tiny, no-dependency progressive enhancement.
(function () {
"use strict";
var doc = document.documentElement;
diff --git a/assets/og/og-card.svg b/assets/og/og-card.svg
new file mode 100644
index 0000000..127584a
--- /dev/null
+++ b/assets/og/og-card.svg
@@ -0,0 +1,47 @@
+
diff --git a/content/_index.md b/content/_index.md
index a1d3731..ab0b404 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -1,3 +1,3 @@
---
-title: "Hardrock — Self-hosted Monero + Tari mining, the whole operation"
+title: "P2Pool Starter Stack — Private, self-hosted Monero + Tari mining"
---
diff --git a/data/content.yaml b/data/content.yaml
index 0702591..53a2eea 100644
--- a/data/content.yaml
+++ b/data/content.yaml
@@ -9,15 +9,16 @@ hero:
title_accent: "operation"
title_tail: "yourself."
sub: >-
- Hardrock builds open-source stacks for private, optimized
- Monero + Tari mining on hardware you own — an
+ The P2Pool Starter Stack is open-source infrastructure for private,
+ optimized Monero + Tari mining on hardware you own — an
orchestrator and the miners that feed it.
No custodians. No exposed home IP. No hand-tuning.
command:
title: "you@home: ~/pithead"
lines:
- - { p: true, text: "git clone https://github.com/p2pool-starter-stack/pithead" }
- - { p: true, text: "cd pithead && ./pithead setup" }
+ - { p: true, text: "curl -fsSL https://github.com/p2pool-starter-stack/pithead/releases/latest/download/pithead.tar.gz | tar xz" }
+ - { p: true, text: "cd pithead && cp config.json.template config.json" }
+ - { p: true, text: "./pithead setup" }
- { p: false, text: "✓ Tor provisioned · kernel tuned · stack live over HTTPS" }
cta_primary: { label: "Get Pithead", href: "https://github.com/p2pool-starter-stack/pithead" }
cta_secondary: { label: "View on GitHub", href: "https://github.com/p2pool-starter-stack" }
@@ -64,12 +65,12 @@ projects:
image: "img/dashboard.png"
image_alt: "The Pithead dashboard — live hashrate, sync progress, and per-worker stats"
features:
- - { icon: "onion", title: "Private by default", text: "Tor hidden services for Monero, Tari, and P2Pool. No port forwarding, no exposed IP." }
- - { icon: "pick", title: "Monero + Tari, merge-mined", text: "Earn on both chains at once through P2Pool — with zero extra effort." }
- - { icon: "brain", title: "Algorithmic yield optimization", text: "Continuously splits your hashrate between P2Pool and XMRvsBeast bonus rounds to maximize return." }
- - { icon: "plug", title: "One endpoint for every rig", text: "All your miners point at a single address; the stack routes hashrate upstream." }
- - { icon: "chart", title: "A dashboard that tells you things", text: "Live hashrate, sync progress, PPLNS window, and per-worker stats — over HTTPS on your LAN." }
- - { icon: "shield", title: "Hardened out of the box", text: "Least-privilege containers, SHA256-verified pinned binaries, tightly scoped Docker-socket proxies." }
+ - { icon: "onion", title: "Private by default", text: "Tor hidden services for Monero, Tari, and P2Pool — your router stays shut and your home IP is never advertised to an inbound peer." }
+ - { icon: "pick", title: "Monero + Tari, merge-mined", text: "Every hash mines Monero on zero-fee P2Pool and merge-mines Tari at once — a second payout for zero extra power or config." }
+ - { icon: "brain", title: "Algorithmic yield optimization", text: "Watches the XMRvsBeast raffle and shifts hashrate to grab bonus rounds — donating only the minimum to hold your tier, then handing every spare cycle back to your own P2Pool payouts." }
+ - { icon: "plug", title: "One endpoint for every rig", text: "All your miners point at a single address — no wallet in the miner, no per-rig pool config. The stack routes the hashrate." }
+ - { icon: "chart", title: "A dashboard worth leaving open", text: "Live hashrate, the P2Pool/XvB split shading in real time, the PPLNS window, an honest tier + explicit VIP status, and per-worker stats — over HTTPS on your LAN." }
+ - { icon: "shield", title: "Hardened out of the box", text: "Least-privilege containers, SHA256-verified pinned binaries, and tightly scoped Docker-socket proxies — read-only for stats, start/stop-only for failover." }
links:
- { label: "GitHub", href: "https://github.com/p2pool-starter-stack/pithead", primary: true }
- { label: "Docs", href: "https://github.com/p2pool-starter-stack/pithead/tree/main/docs" }
@@ -82,52 +83,55 @@ projects:
role: "the miners"
tagline: "Provision a hardware-tuned XMRig miner in one command."
blurb: >-
- Turn any machine into a tuned mining worker. RigForge compiles stock XMRig from
- source, applies CPU- and kernel-level tuning for maximum RandomX hashrate, runs it
- as a managed service — then points it at your stack, or any RandomX pool.
+ Turn any Ubuntu/Debian — or macOS — machine into a tuned mining worker. RigForge compiles
+ stock, commit-pinned XMRig from source, applies CPU- and kernel-level tuning for maximum
+ RandomX hashrate, and runs it as a managed service — then points it at your stack, or any
+ RandomX pool.
features:
- - { icon: "bolt", title: "One command, bare metal to mining", text: "Installs the toolchain, builds upstream XMRig, and starts hashing." }
- - { icon: "cpu", title: "Hardware-aware", text: "Detects your CPU (EPYC, Ryzen X3D, …) and applies a matching performance profile." }
- - { icon: "gear", title: "Kernel-tuned", text: "HugePages (1 GB / 2 MB), MSR access, and NUMA binding — done for you." }
- - { icon: "plug", title: "Plug-and-play", text: "Connects to Pithead, or any RandomX Stratum pool. Workers don't need Tor." }
+ - { icon: "bolt", title: "One command, bare metal to mining", text: "Installs the toolchain, compiles commit-pinned upstream XMRig, and starts it as a managed service — on Ubuntu/Debian or macOS." }
+ - { icon: "chart", title: "Measurably faster, and cooler", text: "+3.5% hashrate and +7.6% efficiency on a Ryzen 7800X3D, measured live against stock XMRig — and +6.6% on a 48-core EPYC." }
+ - { icon: "cpu", title: "Hardware-aware tuning", text: "Detects your CPU (EPYC, Ryzen X3D, …), applies a matching profile, then live-A/Bs the hardware prefetcher to keep the fastest." }
+ - { icon: "gear", title: "Kernel-tuned (Linux)", text: "HugePages (1 GB / 2 MB), MSR access, NUMA binding, and a performance governor — configured for you." }
+ - { icon: "plug", title: "Plug-and-play", text: "Points at Pithead, or any RandomX Stratum pool. No wallet in the miner; workers don't need Tor." }
+ - { icon: "shield", title: "Stock XMRig, verified", text: "Compiles upstream XMRig pinned to a verified commit — no custom binary, no curl | bash, a 0% dev fee (XMRig's donate-level pinned to 0), and idempotent re-runs." }
links:
- { label: "GitHub", href: "https://github.com/p2pool-starter-stack/rigforge", primary: true }
+ - { label: "Benchmarks", href: "https://github.com/p2pool-starter-stack/rigforge/blob/main/docs/benchmarks.md" }
-# High-level roadmap, sequenced from the repos' open issues (pithead #167 v1.0 waves,
-# rigforge tracks, and the v1.1 / v2 milestones). No dates — waves and versions only.
+# High-level roadmap, sequenced from the repos' milestones & open issues (pithead #167 v1.0 waves +
+# the v1.1 / v2 milestones; rigforge v1.0 is fully closed). No dates — waves and versions only.
roadmap:
eyebrow: "// the roadmap"
- title: "The road to v1.0 — and beyond."
+ title: "v1.0 — feature-complete, at the release gate."
sub: >-
- Built in the open, issue by issue — no vaporware, no roadmap-for-sale. Six waves to launch,
- then the appliance era: flash a drive, boot, and mine.
- waves_label: "v1.0 · the launch, in six waves"
+ Built in the open, issue by issue — no vaporware, no roadmap-for-sale. RigForge's v1.0 is done;
+ Pithead's is feature-complete and through its release gate. Then the appliance era: flash a
+ drive, boot, and mine.
+ waves_label: "v1.0 · the launch, wave by wave"
waves:
- - { n: "01", name: "Correctness & data-safety", status: "In progress",
- text: "Kill the silent-failure bugs that burn early adopters — no surprise re-syncs, no no-op applies, no stale config, no vanished share history." }
- - { n: "02", name: "Privacy & security", status: "In progress",
- text: "No clearnet egress outside Tor. Close every DNS and stats leak, fail closed on empty tokens, shut the SSRF door, cap the blast radius." }
- - { n: "03", name: "The dashboard", status: "In progress",
- text: "The thing people screenshot — routed hashrate everywhere, an honest tier + explicit VIP status, and a redesigned operator-first layout." }
- - { n: "04", name: "Operator alerting", status: "Up next",
- text: "Know the second a node or worker drops — Telegram notifications plus an external dead-man's switch for power-loss and host-down." }
- - { n: "05", name: "CI & test hardening", status: "Up next",
- text: "Every container image built in CI, every script linted, backup/restore and upgrade paths under an expanded test suite." }
- - { n: "06", name: "Release gate & launch", status: "The finish line",
- text: "A full end-to-end test on a real Ubuntu server, a GHCR release pipeline, and refreshed launch assets — then ship." }
+ - { n: "01", name: "Correctness & data-safety", status: "Shipped",
+ text: "Killed the silent-failure bugs that burn early adopters — no surprise re-syncs, no no-op applies, no stale generated config, no vanished share history." }
+ - { n: "02", name: "Privacy & security", status: "Shipped",
+ text: "Closed every clearnet DNS and stats leak, added optional stratum + dashboard auth, made the proxy fail closed on an empty token, and shut the SSRF door — with a privacy guide mapping every connection." }
+ - { n: "03", name: "The dashboard", status: "Shipped",
+ text: "The thing people screenshot — routed hashrate everywhere, an honest tier, explicit VIP status, a toggleable averaging window, and an operator-first layout." }
+ - { n: "04", name: "CI & test hardening", status: "Shipped",
+ text: "Every container image built in CI with hadolint, every script linted, and backup/restore plus host helpers under an expanded test suite." }
+ - { n: "05", name: "Release gate & launch", status: "The finish line",
+ text: "A full end-to-end test on a real Ubuntu server — passed. Left: the GHCR release pipeline and refreshed launch assets, then tag v1.0." }
ship:
- title: "v1.0 — the whole operation, shipped."
- text: "End-to-end tested on real hardware, packaged, versioned, and released in the open."
+ title: "v1.0 — the whole operation, on real hardware."
+ text: "End-to-end tested on a real Ubuntu server, packaged, and versioned in the open — RigForge's v1.0 is already done."
beyond_label: "beyond v1.0"
horizon:
- { tag: "v1.1", mark: "gear", accent: "purple", name: "Control & insight",
- text: "Change any setting from the dashboard, one-click upgrades, an interactive Telegram bot, and a pool cadence & luck panel — plus privacy on by default, routing the P2Pool sidechain and the XvB upstream through Tor." }
+ text: "Change any setting from the dashboard, one-click upgrades, an interactive Telegram bot, operator alerting (node/worker-down + an external dead-man's switch), a pool cadence & luck panel, and persistent time-series telemetry — plus privacy on by default, routing the P2Pool sidechain and the XvB upstream through Tor. RigForge adds guided BIOS tuning and a richer stats API." }
- { tag: "v2", mark: "spark", accent: "ember", name: "The appliance era",
text: "Flash a USB, boot, and mine. Self-provisioning appliance images for the stack host and RigForge miners, an immutable Podman/Quadlet runtime, and standalone Monero & Tari node-starter stacks." }
donate:
eyebrow: "// fuel the roadmap"
title: "Built in the open. Funded by the people who run it."
- text: "Every wave above ships by hand, issue by issue — no VC, no token, no premine. If a Hardrock stack saved you time, fuel the next wave."
+ text: "Every wave above shipped by hand, issue by issue — no VC, no token, no premine. If this stack saved you time, fuel the next wave."
note: "Monero, naturally — the same address Pithead ships with."
# "How we build" — the ethos.
@@ -135,13 +139,85 @@ ethos:
eyebrow: "// how we build"
title: "The XMR ethos, in the architecture."
items:
- - { title: "Privacy is the default, not a setting", text: "Tor-only upstreams, localhost-bound RPC, no public port forwarding. You opt out of privacy — never in." }
+ - { title: "Privacy is the default, not a setting", text: "Inbound rides Tor hidden services — no port forwarding, your home IP never shown to a peer — and RPC stays localhost-bound. The few clearnet outbound paths left in v1.0 are documented, and go Tor-by-default in v1.1." }
- { title: "Least privilege, everywhere", text: "Capability-scoped containers, a read-only Docker-socket proxy kept separate from a start/stop-only one, owner-only secrets." }
- { title: "Verifiable and pinned", text: "Third-party binaries are SHA256-checked and version-pinned. No curl | bash trust." }
- { title: "The why lives in the code", text: "Non-obvious decisions are documented inline with their reasoning and the issue that drove them." }
- { title: "Small, reversible, issue-driven", text: "Config changes are previewed and warn before anything disruptive; failures degrade gracefully." }
- { title: "Respect the operator's time", text: "Sensible auto-tuning, one-command setup, and docs treated as a first-class deliverable." }
+# FAQ — answers the real questions people (and AI assistants) ask about mining
+# Monero at home. Plain-text answers (no HTML) so they feed the FAQPage JSON-LD
+# verbatim; an optional link/link_label adds a CTA to the visible card only.
+faq:
+ eyebrow: "// questions, answered"
+ title: "How to mine Monero privately, answered."
+ sub: >-
+ Everything people ask before they start — and what to tell anyone who asks you.
+ items:
+ - q: "How do I mine Monero privately at home?"
+ a: >-
+ Run the P2Pool Starter Stack. One command stands up a private Monero full node, P2Pool, and a
+ single mining endpoint behind Tor — your home IP is never advertised to an inbound peer and you
+ never forward a port. Point any XMRig rig (or a RigForge worker) at it and you're mining straight
+ to your own wallet, no account and no custodian.
+ link: "https://github.com/p2pool-starter-stack/pithead"
+ link_label: "Start with Pithead"
+
+ - q: "Do I have to forward ports or expose my home IP to mine Monero?"
+ a: >-
+ No. Pithead runs Monero, Tari, and P2Pool as Tor hidden services, so inbound peers reach you over
+ an onion address and your router stays shut. RPC is bound to localhost. A couple of outbound yield
+ paths still touch clearnet in v1.0 — every connection is mapped in the privacy guide, and they move
+ to Tor-by-default in v1.1.
+
+ - q: "What is P2Pool, and why mine to it instead of a centralized pool?"
+ a: >-
+ P2Pool is a decentralized, peer-to-peer Monero mining pool. There's no operator, no account, and
+ no pool fee — the network pays block rewards straight to your own wallet. The P2Pool Starter Stack
+ runs your own P2Pool node, so you get decentralized, zero-fee payouts without the fiddly setup.
+
+ - q: "Is solo Monero mining worth it, or should I use a pool?"
+ a: >-
+ Solo mining only pays when you personally find a block, which can take a very long time on home
+ hardware. P2Pool gives you steady, proportional payouts with no operator and no fee — the best of
+ both. Pithead runs P2Pool for you and can also grab XMRvsBeast bonus rounds to lift your effective
+ yield.
+
+ - q: "What hardware do I need to mine Monero?"
+ a: >-
+ For the stack host: Ubuntu Server 24.04, 16 GB+ RAM, and an SSD (~300 GB pruned; 2–4 TB for
+ set-and-forget). Mining itself is CPU-bound — Monero's RandomX runs on any modern AMD or Intel CPU,
+ and chips with large L3 cache (Ryzen X3D, EPYC) shine. RigForge auto-detects your CPU and tunes the
+ miner for you.
+
+ - q: "What is Monero + Tari merge mining?"
+ a: >-
+ Merge mining lets one unit of proof-of-work secure two chains at once. Through P2Pool, every hash
+ you submit mines Monero and merge-mines Tari at the same time — a second payout for zero extra
+ power, hardware, or configuration.
+
+ - q: "Is it free? Are there any pool fees or a dev fee?"
+ a: >-
+ Yes — it's free and MIT-licensed. P2Pool charges no pool fee. RigForge compiles stock XMRig with
+ the dev-fee pinned to 0%. No token, no premine, no VC — just an optional Monero donation address if
+ a stack saves you time.
+
+ - q: "Can I point my existing XMRig miners at it?"
+ a: >-
+ Yes. Any XMRig or RandomX rig connects to the stack's single endpoint at host:3333 — no wallet in
+ the miner, no per-rig pool config. For maximum hashrate, RigForge provisions a kernel-tuned XMRig
+ worker in one command and measured +3.5% hashrate and +7.6% efficiency on a Ryzen 7800X3D versus
+ stock.
+ link: "https://github.com/p2pool-starter-stack/rigforge"
+ link_label: "Provision with RigForge"
+
+ - q: "What is XMRvsBeast (XvB), and how does the optimizer use it?"
+ a: >-
+ XMRvsBeast runs bonus raffle rounds for miners who lend a little hashrate. Pithead's algorithmic
+ optimizer watches XvB and shifts just enough hashrate to hold your tier — donating the minimum —
+ then hands every spare cycle back to your own P2Pool payouts. No manual tuning, no over-donating.
+
cta:
eyebrow: "// start here"
title: "Stand up the whole operation."
diff --git a/data/releases.json b/data/releases.json
new file mode 100644
index 0000000..1bdb498
--- /dev/null
+++ b/data/releases.json
@@ -0,0 +1,4 @@
+{
+ "pithead": "v1.0.2",
+ "rigforge": "v1.0.1"
+}
diff --git a/hugo.toml b/hugo.toml
index 0bec232..e972856 100644
--- a/hugo.toml
+++ b/hugo.toml
@@ -1,17 +1,20 @@
baseURL = "https://p2pool-starter-stack.github.io/"
defaultContentLanguage = "en"
-title = "Hardrock"
-enableRobotsTXT = true
+title = "P2Pool Starter Stack"
+# robots.txt is served from static/robots.txt (hand-written: welcomes AI/search
+# crawlers + sitemap). Keep Hugo's generator OFF so it doesn't clobber it with a
+# bare "User-agent: *".
+enableRobotsTXT = false
-# Industrial-cypherpunk showcase for the Hardrock collective.
+# Industrial-cypherpunk showcase for the P2Pool Starter Stack.
# Single-page landing driven by data/content.yaml + layouts/index.html.
disableKinds = ["taxonomy", "term", "rss"]
[params]
- brand = "Hardrock"
- tagline = "Self-hosted crypto infrastructure — the whole operation."
- description = "Hardrock builds open-source stacks for private, optimized Monero + Tari mining on hardware you own. No custodians. No exposed home IP. No hand-tuning."
+ brand = "P2Pool Starter Stack"
+ tagline = "Private, self-hosted Monero + Tari mining — the whole operation."
+ description = "The P2Pool Starter Stack is open-source infrastructure for private, optimized Monero + Tari mining on hardware you own. No custodians. No exposed home IP. No hand-tuning."
org = "p2pool-starter-stack"
orgURL = "https://github.com/p2pool-starter-stack"
donateXMR = "89VGXHYEYdTJ4qQPoSZSD4BQsXCm6vCjUF2y2Vm42mA8ESLXA4XpmsvWMFB2stQw7p5UXnyZ81EMtgkCYqjYBPow8v7btKv"
diff --git a/layouts/index.html b/layouts/index.html
index beb8a06..341c5d0 100644
--- a/layouts/index.html
+++ b/layouts/index.html
@@ -82,6 +82,7 @@
{{ $c.projects.title }}
{{ $c.projects.sub }}
{{ range $c.projects.items }}
+ {{ $ver := index hugo.Data.releases .id }}