Source for https://cruxcoach.org — the public landing page for the CruxCoach open-source Android Kilter Board app.
Published via Codeberg Pages. Repo contents are served directly: edit
index.html, push, page is live within minutes.
cruxcoach-pages/
├── index.html single-file landing page (HTML + embedded CSS; local JS only)
├── .domains Codeberg Pages custom-domain config
├── assets/ screenshots, logos, og-image, vendored Leaflet (/boards/ only)
├── boards/ interactive map of climbing-board locations worldwide
│ ├── index.html map page (Leaflet + markercluster, see JS exception #2)
│ └── data/ regenerated by tools/build-boards-data.mjs
├── tools/ scripts that regenerate data committed under boards/data/
└── README.md this file
- English lives at the root; the maintained German mirror lives under
/de/. - No build step. Edit
index.html, commit, push. - Test locally:
python3 -m http.serverin repo root, open http://localhost:8000.
- No external dependencies (no CDN-hosted CSS/fonts/JS). System font stack only.
- No user tracking, cookies, profiles, or third-party analytics. A local script
sends only allowlisted page/click dimensions and one locally combined
same-tab Zapstore→APK fallback to an immediate daily aggregate counter;
Board Map map/list views share one logical page label while language remains
separate. DNT/GPC is honoured. The fallback uses only a 30-minute timestamp
in the tab's
sessionStorage, never an identifier. Direct APK buttons use one closed first-party redirect whose server-side health cache selects Codeberg or the verified Zapstore mirror without any visitor-side availability probe. - Prefer plain semantic HTML over div soup.
- Light + dark mode via
prefers-color-scheme— no JS toggle. - Accessibility: every link has discernible text; phone-mockup is
aria-hidden="true". - JS exception #1:
404.htmlruns inline JavaScript on/c/<naddr>paths to fetch climb metadata from public Nostr relays (relay.damus.io,nos.lol,relay.primal.net) and render an install/landing view. No external scripts — just WebSocket calls plus the same local aggregate counter used on every page. - JS exception #2:
boards/index.htmluses Leaflet + Leaflet.markercluster to render an interactive map of climbing-board locations. Both libraries are vendored locally underassets/vendor/leaflet/(no CDN) and loaded via plain<script>tags. The map's tile layer fetches PNGs fromtile.openstreetmap.org, disclosed on the privacy page. Dataset (boards/data/boards.geojson) is regenerated bytools/build-boards-data.mjs(seetools/README.mdfor the source-adapter pattern; the schema is designed to merge multiple data sources over time).
Codeberg Pages serves the default branch of this repo at:
https://CruxCoach.codeberg.page/cruxcoach-pages/(built-in URL)https://cruxcoach.org/(custom domain, configured via.domains+ DNS)
DNS at Njalla:
- A
cruxcoach.org→217.197.91.145 - AAAA
cruxcoach.org→2a02:6ea0:c813::145 - (TLS handled automatically by Codeberg via Let's Encrypt)
- Real logo (inline SVG from
assets/logo.svg) - Real hero screenshot replacing CSS phone-mockup
- Screenshot gallery with lazy-loading
- Favicon + apple-touch-icon
- OG / Twitter Card meta tags (using app icon)
- German variant at
/de/index.htmlwithhreflangalternates - Dark-mode-only (color-scheme=dark in meta)
- PNG metadata stripped (tIME, tEXt date:create/modify)
-
/imprint.htmland/de/imprint.html -
/privacy.htmland/de/privacy.html -
/support.htmland/de/support.htmlwith Lightning QR -
/404.htmlwith brand-consistent error page -
/.well-known/security.txt(RFC 9116) -
sitemap.xml(includes hreflang alternates) -
robots.txt(sitemap reference, noindex on legal pages) -
humans.txt(FOSS-tradition colophon) - JSON-LD
SoftwareApplicationschema in<head>(both languages) - Real Nostr
npublink via primal.net - OG image SVG asset (
assets/og-image.svg, 1200×630, not yet wired to og:image — needs PNG export)
- Image optimization — gallery screenshots total ~700 KB. Resize to max 800 px wide, convert to WebP. Hero is 184 KB which is OK; gallery is lazy-loaded but heavy on mobile
- Render og-image.svg → og-image.png (1200×630) and switch og:image / twitter:image meta-tags to it. Needs a tool (Inkscape, librsvg, or online converter)
-
/press.htmlpress kit with high-res logo, screenshots, brief & long descriptions, story angles -
/faq.htmlwith anticipated normy questions - Update Mastodon link once
@cruxcoach@mastodon.socialis verified - Once an F-Droid listing lands, add an install card for it. Needs fastlane metadata and a build flavour without the in-app APK updater. IzzyOnDroid is ruled out: its inclusion policy rejects apps "fully or in part created by generative AI tools".
- Set Codeberg-Repo
Websitefield (manual UI step) tohttps://cruxcoach.org
For when tools are available:
# Resize + WebP (need cwebp + ImageMagick)
for f in assets/screenshots/*.png; do
convert "$f" -resize 800x "${f%.png}.tmp.png" \
&& cwebp -q 85 "${f%.png}.tmp.png" -o "${f%.png}.webp" \
&& rm "${f%.png}.tmp.png"
done
# Or with optipng (no resize, no WebP, just lossless squeeze)
optipng -o5 assets/screenshots/*.pngSite content (this repo): CC-BY-4.0. Underlying CruxCoach app: GPL-3.0, separate repo at codeberg.org/CruxCoach/CruxCoach.