Marketing site for Pantheon Capital (POD) — a proprietary trading firm operating in sports betting markets and listed options.
npm install
npm run dev # http://localhost:3000
npm run build # production build
npm start # serve the production build| I want to change… | Edit |
|---|---|
| Any copy, numbers, roles, contact details | src/lib/content.ts — everything is there |
| Colours, fonts, motion curves, type scale | src/app/globals.css (Tailwind v4 @theme block) |
| The logo geometry | src/components/brand/Mark.tsx — one source of truth, also used by the intro |
| Favicon | public/icon.svg |
| Social share card | public/og.png (1200×630) |
| Section order on the home page | src/app/page.tsx |
⚠️ The four figures in themetricsarray are framed on the site as operating targets for a desk still in build, not as a trading record (seemetricsCaption/metricsNoteinsrc/lib/content.ts). Keep that framing honest as the firm matures.
The site is a single page. careers.roles in content.ts is written and unused — it is there for when you want a dedicated /careers route; today the hiring band links to mailto:.
src/
app/
layout.tsx fonts, metadata, global chrome
page.tsx home page assembly
globals.css the entire design system
robots.ts / sitemap.ts static metadata files
components/
brand/Mark.tsx pediment + TP monogram, plus <Lockup />
intro/IntroSequence.tsx cinematic once-per-session title sequence
canvas/MarketCanvas.tsx drifting live-market field behind the hero
canvas/CandleField.tsx candlestick band used as a section backdrop
layout/ Nav, Footer
sections/ Hero, Manifesto, Markets, Edge, Method, Metrics, CareersCta
system/SmoothScroll.tsx Lenis inertial scrolling
ui/Ticker.tsx marquee
lib/
content.ts ALL copy and data
useReveal.ts one IntersectionObserver for every scroll entrance
See DESIGN.md. Short version: near-black ground, warm bone text, gold used as a spice (≤10% of any viewport). Instrument Serif for statements, Inter for body, JetBrains Mono for anything numeric. Everything honours prefers-reduced-motion.
The site is fully static: no server, no API routes, no runtime data fetching. next.config.ts sets output: "export", so npm run build writes a plain folder of files to out/ (~1.7 MB).
⚠️ Nothing may introduce API routes, server actions, ISR,next/imageoptimisation, orheaders()innext.config.ts— each of those breaks the static export.
netlify.toml is committed, so there is nothing to configure in the UI:
- build command
npm run build, publish directoryout, Node 22 - security headers (Netlify can serve them; a static export cannot emit them itself)
- immutable caching on
/_next/static/*
Connect the repo in Netlify and it builds on every push to main. Then point pantheonofducks.com at the site under Domain management, and let Netlify provision the certificate.
Porkbun's upload cap is 40 MB, so the 1.7 MB build fits comfortably.
npm run build # -> ./out
npm run deploy:zip # -> ./pantheon-site.zip (out/ zipped, for the web uploader)In Porkbun: Domain Management → your domain → the house icon under "Website" → Static Hosting. Three ways to get the files up:
| Method | Use when |
|---|---|
| Web uploader | One-off. Upload the contents of out/ (or pantheon-site.zip). |
| FTP | Repeatable. Porkbun gives you FTP credentials; point any client at out/. |
| GitHub | Best long term — push the repo, Porkbun redeploys on commit. |
Upload the contents of out/, not the folder itself — index.html must land at the web root.
Notes:
out/404.htmlis the not-found page.public/.nojekyllships in the build. It matters only for hosts that run Jekyll (GitHub Pages) — without it, Jekyll strips_next/and the site 404s on all of its JS and CSS.- Whichever host: make sure
pantheonofducks.comandwww.both resolve, over HTTPS.
- The intro sequence plays once per browser session (
sessionStoragekeypod:intro). Clear it or open a new session to see it again. - The market canvas is decorative and generates simulated values. It is not wired to live data.