Public-facing React application for the Spectral Emergence Theory (SET) research program. Deployed at set.coreyshepherdofficial.com.
npm install
npm run dev # http://localhost:5173
npm run build # output → dist/
npm run preview # serve the built dist/ locallyRequires Node.js 18+. KaTeX is loaded from the CDN — an internet connection is required for equation rendering in development.
src/
App.jsx # React Router route table
index.jsx # createRoot entry point
styles/
variables.css # Design tokens (exact match to WordPress theme)
global.css # Reset, typography, utility classes
components/
Layout/ # Header (sticky, mobile drawer), Footer
Dashboard/ # Overview page, MetricsDisplay, DriverEquation (KaTeX)
Papers/ # PaperTracker (filter tabs), PaperCard
Derivations/ # DerivationExplorer, ParameterSlider (Recharts),
│ # ObservableChart, ConvergenceMonitor
Scoring/ # ScoringViewer, ScoreDimensionCard
Resources/ # RepoLinks, Glossary
data/
papers.json # 13 papers — auto-updated by CI sync
observables.json # Derived observables — auto-updated by CI sync
scores.json # 16-dimension scoring — auto-updated by CI sync
scripts/
export_data.py # Reads SET-SRE repo (SQLite / JSON) → writes src/data/*.json
requirements.txt # Python deps (stdlib only — no install needed)
.github/workflows/
sync-and-deploy.yml # CI: clone SET-SRE → export → build → deploy
The React components import these files directly at build time. Do not rename fields.
papers.json — array of objects:
{
"id": "P1",
"title": "Benford's Law from Spectral Emergence",
"venue": "Annals of Mathematics Monthly",
"venueShort": "AMM",
"status": "submitted",
"keyResult": "...",
"preprint": null
}Valid status values: submitted · editorial · preparation · published · forthcoming
observables.json — array of objects:
{
"id": "alpha",
"symbol": "\\alpha",
"name": "Fine Structure Constant",
"setDerived": "1/137.036",
"setFormula": "\\text{spectral series expansion at }d=14.01",
"observed": "1/137.036",
"unit": "dimensionless",
"accuracy": "2 ppm",
"notes": "Zero new free parameters"
}scores.json — top-level object:
{
"dimensions": [{"id": "D1", "name": "Mathematical Rigor", "description": "..."}],
"denominator": 48,
"laws": [
{
"id": "L001",
"name": "Fine Structure Constant Derivation",
"scores": {"D1": 3, "D2": 3, "D3": 3, "D4": 3, "D5": 3, "D6": 3, "D7": 3, "D8": 2,
"D9": 3, "D10": 3, "D11": 3, "D12": 3, "D13": 2, "D14": 3, "D15": 2, "D16": 3},
"total": 44,
"notes": "2 ppm precision, zero free parameters"
}
]
}Score keys must be exactly D1–D16. Each value is an integer 0–3.
The GitHub Actions workflow runs on every push to main, daily at 06:00 UTC, and on manual dispatch.
Steps:
- Checkout
set-sre-web - Clone private
Shepherdca-stack/SET-SREusing PAT authentication - Run
scripts/export_data.py— reads SQLite DB or JSON metadata → writessrc/data/*.json npm run build→dist/- Deploy to GitHub Pages or Hostinger FTP
Set these in GitHub → set-sre-web repo → Settings → Secrets and variables → Actions.
| Secret | Purpose | Required for |
|---|---|---|
SET_SRE_REPO_TOKEN |
PAT with Contents: Read on the private SET-SRE repo |
All runs |
HOSTINGER_FTP_HOST |
FTP hostname from Hostinger control panel | FTP deploys only |
HOSTINGER_FTP_USER |
FTP username | FTP deploys only |
HOSTINGER_FTP_PASS |
FTP password | FTP deploys only |
- GitHub → Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token
- Resource owner:
Shepherdca-stack - Repository access: Only select
SET-SRE - Permissions: Contents → Read-only (nothing else needed)
- Copy the token → save as secret
SET_SRE_REPO_TOKENin the set-sre-web repo
GitHub → Actions → Sync Data & Deploy → Run workflow → choose deploy target (ghpages or ftp).
- GitHub Pages (default): Enable Pages in repo Settings → Pages → Source: branch
gh-pages. Every push tomaindeploys automatically. - Hostinger FTP: Trigger manually and select
ftp, or change theif:condition in the workflow. Verify theserver-dirpath matches your Hostinger subdomain folder (e.g./public_html/set/).
export_data.py tries multiple file paths for the SQLite database. If it finds nothing, it falls back to the static JSON already committed in src/data/ and logs a WARNING. The build still succeeds — no broken CI from a missing DB.
npm run build- Upload contents of
dist/to the subdomain root via FTP - Add
.htaccessfor React Router support:Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.html [QSA,L]
- Edit
src/data/papers.json— find the paper byid(P1–P13) - Update
statusto one of:preparation·submitted·editorial·published·forthcoming - Add
"preprint": "https://arxiv.org/abs/..."when available (currently allnull) - Commit to
main— the workflow rebuilds and deploys automatically
All tokens in src/styles/variables.css are identical to the WordPress shepherd-official theme. To change an accent color, update both files.
Key tokens: --color-gold: #c9a84c · --font-display: 'Cinzel', serif · --font-body: 'Lato', sans-serif · breakpoints 768px / 1200px
- Vite 5 — build tool
- React 18 — UI with hooks
- React Router v6 — client-side routing
- Recharts 2 — LineChart, BarChart, RadarChart
- KaTeX 0.16.9 — LaTeX rendering (CDN)
- CSS Modules — scoped component styles
- CSS custom properties — design tokens (no Tailwind)