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
8 changes: 8 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down
50 changes: 44 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -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.

Expand Down Expand Up @@ -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
Expand Down
34 changes: 30 additions & 4 deletions assets/css/main.css
Original file line number Diff line number Diff line change
@@ -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.
════════════════════════════════════════════════════════════════════════ */
Expand Down Expand Up @@ -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; }
Expand Down Expand Up @@ -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; }

Expand Down Expand Up @@ -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; }
Expand Down Expand Up @@ -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; }
Expand Down
2 changes: 1 addition & 1 deletion assets/js/main.js
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
47 changes: 47 additions & 0 deletions assets/og/og-card.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion content/_index.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
---
title: "Hardrock — Self-hosted Monero + Tari mining, the whole operation"
title: "P2Pool Starter Stack — Private, self-hosted Monero + Tari mining"
---
Loading