hiroleague-website/ at the repo root. It is a standalone project with its own package.json and its own Git repository (rendermagix/hiroleague-website) — entirely separate from the rest of the monorepo. All commands on this page are run from inside that folder.
Prerequisites
- Node.js 22.12 or higher — required by Astro 6. Node 24 LTS works fine. Check your version:
First-time setup
After cloning (or pulling the submodule), install dependencies:Dev server
http://localhost:4321. Changes to .astro files, React components, and CSS hot-reload instantly.
Production build
output: "static"). All pages are pre-rendered to HTML at build time.
Project structure
Only the files below are owned by this project — everything else is inherited from the theme and should not be edited unless you know what you are changing.| File / folder | Purpose |
|---|---|
src/layouts/main.astro | Root HTML shell — <head>, dark-mode init script, Header, Footer |
src/pages/index.astro | Landing page — assembles Hero, Features, Waitlist sections |
src/pages/blog/index.astro | Blog listing page |
src/pages/blog/why-we-are-building-hiroleague.astro | First blog article |
src/components/Header.tsx | Navigation bar — logo, links, theme toggle |
src/components/Hero.tsx | Hero section — animated headline, tagline, CTA |
src/components/Features.tsx | Features grid — four product pillars |
src/components/Waitlist.tsx | Email waitlist section |
src/components/Footer.tsx | Footer — social links, copyright |
src/components/reactbits/BlurText.tsx | Animated text reveal (ReactBits pattern) |
src/styles/global.css | Tailwind v4 imports, CSS tokens, dark-mode variant, custom animations |
astro.config.js | Astro + Vite config — integrations and site URL |
wrangler.jsonc | Cloudflare Workers deployment config |
components.json | shadcn/ui config |
Tech stack
| Layer | Package | Version |
|---|---|---|
| Framework | astro | 6 |
| UI runtime | react + react-dom | 18 |
| Styling | tailwindcss + @tailwindcss/vite | 4 |
| Components | shadcn/ui (@radix-ui/*, lucide-react) | — |
| Animation | framer-motion | 12 |
| Text effects | ReactBits BlurText (local copy) | — |
| Animate utils | tw-animate-css | — |
| Deployment | wrangler | 4 |
tailwind.config.* file. Tailwind configuration lives entirely in src/styles/global.css inside @theme inline.
Deployment
The site is deployed to Cloudflare Workers and served athiroleague.com. The Workers config is in wrangler.jsonc at the repo root:
wrangler is installed as a dev dependency. The deploy script in package.json builds and deploys in one step:
CI/CD via Workers Builds (auto-deploy on push)
Workers Builds is the recommended path — every push tomain triggers a build and deploy automatically.
One-time setup:
- Log in to the Cloudflare dashboard and go to Workers & Pages.
- Click Create, then under Import a repository, connect your GitHub account and select
rendermagix/hiroleague-website. - Set:
- Build command:
npx astro build - Deploy command:
npx wrangler deploy
- Build command:
- Click Save and Deploy.
main deploys automatically. The Worker is reachable at a workers.dev subdomain immediately.
Manual deploy
To deploy from your local machine without CI/CD:Custom domain
- In the Cloudflare dashboard, go to Workers & Pages → hiroleague-website → Custom Domains.
- Add
hiroleague.com. - Because the domain is already on Cloudflare DNS, the routing is set up automatically — no manual DNS changes needed.
- SSL is provisioned automatically.
Troubleshooting
npm install fails with ERESOLVE peer dependency errors
npm install fails with ERESOLVE peer dependency errors
This can happen when upgrading multiple packages simultaneously. Add
--legacy-peer-deps to let npm resolve the conflict:Dark mode flash on page load in dev
Dark mode flash on page load in dev
The dark-mode init script in
src/layouts/main.astro must use is:inline so Astro does not defer or bundle it. If the script is missing or deferred, the .dark class is applied after first paint and causes a white flash. Verify the script tag reads:Tailwind classes not applying after editing global.css
Tailwind classes not applying after editing global.css
Tailwind v4 uses
@theme inline for token mapping — there is no tailwind.config.* file. If you add a new CSS variable token, make sure you also map it in the @theme inline block, otherwise the generated utility class will not be available.Build error after adding a new React component
Build error after adding a new React component
Astro renders React components as islands. Components that use browser APIs (
localStorage, window, etc.) must use a client:* directive in the .astro page, otherwise they fail during server-side pre-rendering. Use client:load for components that need to be interactive immediately, or client:visible for below-the-fold components.