The kapps.io marketing site, served as flat files from GitHub Pages instead of WordPress on AWS.
WordPress remains the authoring tool. It is no longer the thing serving traffic:
the pipeline in tools/ crawls the live WP install, strips the server-dependent
parts, and emits a self-contained static tree into docs/.
| Path | What it is |
|---|---|
docs/ |
The published site. GitHub Pages serves this folder. Generated — don't hand-edit. |
build/ |
Working output of the pipeline. docs/ is an rsync of it. |
build.raw/ |
Untouched mirror snapshot, before transforms. Lets you re-run transforms without re-crawling. |
assets/kapps-forms.js |
Hand-written. The static form handler that replaced Contact Form 7. |
tools/ |
The pipeline (see below). |
./tools/publish.sh # full rebuild from the live WordPress
./tools/publish.sh --no-fetch # re-run transforms against the existing snapshotIt never commits. Review the diff, then commit docs/ yourself.
| Step | Script | Does |
|---|---|---|
| 1 | mirror.py |
Crawls the site. Discovers assets by sweeping raw HTML/CSS with a regex rather than parsing the DOM, so it also catches lazy-load data- attributes and Elementor's JSON data-settings. |
| 2 | coverage.py + fetch_missing.py |
Diffs the Yoast sitemaps against what was crawled and fetches orphan pages — published content no navigation links to. Found 23 on the first run. |
| 3 | transform.py |
Removes CF7/reCAPTCHA/Akismet/rating/view-counter plumbing, strips WP head cruft, rewrites URLs to root-relative, remaps dead links. |
| 4 | repair.py |
Re-fetches assets the crawler missed and converts RSS feeds to .xml. |
| 5 | finalize.py |
CNAME, .nojekyll, 404.html, robots.txt, sitemap.xml, redirect stubs. |
| 6 | validate.py |
Asserts every internal reference resolves to a real file and nothing still points at the WP host. |
| — | compare.py |
Diffs the rendered text of every built page against live. Catches silent content loss a link-checker can't see. |
Forms. Contact Form 7 needed PHP. Replaced by assets/kapps-forms.js, which
POSTs to a hosted form endpoint. reCAPTCHA is gone (it verified server-side); spam
control is now a honeypot plus the provider's filtering. The old CF7 → gtag
conversion event is re-fired on success, so form analytics keep working.
Set the endpoint in assets/kapps-forms.js:
var CONFIG = { provider: "web3forms", key: "<public-access-key>" };Dropped. Post view counters and star ratings (both were WP AJAX). The static results display is kept where it existed; only the interactive vote widget is gone.
Redirects. Pages can't serve 301s. /join is a <meta refresh> + canonical stub.
These were broken on the live WordPress site and are fixed here:
?page_id=28/30/49/51— four service/technology cards linking to 404s/vr-ar,/3d-modeling-services,/game-development-outsourcing— dead footer linksurl(../wp-content/…)backgrounds on/portfolio/<item>/pages — resolved one directory too shallow, so the block backgrounds 404'd on every deep portfolio page- Junk slugs (
cool_timeline/sadasd,2021-2, …) removed from the sitemap
Eight plugin CSS sprites and legacy IE webfont formats referenced by
bdt-uikit.css / gwts-style.css. They 404 on the origin too — the files were
never uploaded. Invisible in practice.
- Pages must serve from
/docson the default branch. - The repo must be public — the StansAssets org is on the free plan.
- Repo is ~60 MB against a 1 GB limit; bandwidth 100 GB/month soft limit.