Run npm install, then npm run dev to work on the site and npm run build to produce it in dist/. Start in src/config/site.ts: the site’s name, URL, owner, contact details, social links, menu and footer columns are all set there. The docs/ folder has the longer version of everything on this page.
The theme presents its owner in one of three ways, each with its own home, about and contact page:
The ventures, thesis, podcast and blog pages, the legal pages and the header and footer are shared by all three. The personas’ names, firm and city are PERSONAS in src/config/site.ts; the menu lists them as Home, About and Contact A, B and C (MENU). Keep the persona that fits you, put your own name in, then delete the other two’s folders in src/pages and their entries inMENU. The Investor home is /; to make another persona the home page, move its page to src/pages/index.astro and update ROUTES.
Repeated content is read from collections defined in src/content.config.ts, never pasted into the pages. Ventures and blog posts are Markdown files in src/content/ventures and src/content/posts; everything else is a JSON file in src/content/data:
Add a file and its page appears: a venture at /ventures/its-name/, a post at /blog/its-name/, and a category page for every category that has an entry. Images are referenced from src/assets/images by path, so replacing a file keeps the layout intact.
The newsletter signup in the footer and the three contact forms post to the endpoints in src/config/forms.ts, which are empty when the theme ships. Until you set one, a form checks its fields, sends nothing and says so; it shows its success message only after your endpoint answers. Any service that accepts a form post will do. The protected page (/401/) is a design only: it is not connected to a password check, and its form sends nothing.
Reveals, counters and scrubbed sections use GSAP with ScrollTrigger and SplitText, and Lenis smooths scrolling on devices with a mouse. Pages ask for an effect with a data-anim attribute; every effect, with its timing, is in EFFECTS in src/scripts/motion.ts. With reduced motion turned on in the visitor’s system settings, everything is shown at once, nothing moves and smooth scrolling is off. Strips that scroll on their own have a pause button. Videos play only when pressed, and a recorded talk on the podcast page loads YouTube’s player only when someone presses play (set its videoUrl in src/content/data/videos.json).
Colors, type sizes and spacing are design tokens in src/styles/theme.css; the style guide shows them in use. The two font families are served from public/fonts and declared in src/styles/fonts.css. Hand-written corrections belong in src/styles/additions.css.