Files
website/README.md
T

7.6 KiB

Prad Nukala

prad.nu

The personal CV & portfolio site of Prad Nukala — engineer and founder.

What this is

This repo is my personal website at prad.nu. It's a static Astro site (originally forked from the Astro Cactus theme) reworked into a portfolio organised around four sections:

Section Route Purpose
Projects /projects Things I've built, with links to live sites and source.
Experience /experience Resume-style roles, which also act as a taxonomy (see below).
Writing /writing Essays, notes, and articles.
Speaking /speaking Talks, with an embedded Cloudflare Stream player and a link to the original recording.

Experience as a taxonomy

Experience entries are the connective tissue of the site. Projects, writing, and talks each declare an experiences array in their frontmatter that references experience entries by id. Each experience page then renders its own write-up plus every project, post, and talk filed under it — so the content cross-links automatically.

Tech

Commands

Command Action
pnpm install Install dependencies
pnpm dev Start the local dev server
pnpm build Build the production site to ./dist/
pnpm postbuild Build the Pagefind static search index
pnpm preview Preview the production build locally
pnpm sync Generate types from the content config

Content

Content lives in src/content/<collection> as .md/.mdx files; the filename becomes the slug. The schema for each collection is defined in src/content.config.ts.

Projects (src/content/projects)

Property Required Notes
title Max 60 chars.
publishDate ISO 8601 (offsets allowed).
description Used for meta description.
link URL to the live project.
repo URL to the source repository.
tags String array.
experiences Array of experience ids this project is filed under.

Experience (src/content/experience)

Property Required Notes
title Display name of the experience (also its id via filename).
organization Company / org.
startDate Date.
endDate Omit for current/ongoing.
role Job title.
location e.g. "Remote".
url Org website.
description Short summary.

Writing (src/content/writing)

Property Required Notes
title Max 60 chars.
description Meta description.
publishDate Date.
updatedDate Date.
coverImage { src, alt }.
ogImage Skip Satori generation with a custom OG image.
tags String array.
experiences Array of experience ids.
draft true excludes the post from production builds.
pinned Pin to the top of /writing.

Speaking (src/content/speaking)

Property Required Notes
title Max 60 chars.
description Meta description.
publishDate Date.
videoId Cloudflare Stream video UID.
originalSource Link to the original (e.g. YouTube) recording.
event Conference / event name.
tags String array.
experiences Array of experience ids.
draft true excludes the talk from production builds.

Configure

Most site-wide settings live in src/site.config.ts:

  • siteConfig — title, author, description, url (used for canonical URLs and OG tags), locale.
  • socialLinks — GitHub / X / LinkedIn / email, shown in the footer and homepage intro.
  • streamOrigin — the Cloudflare Stream origin (your customer-<code>.cloudflarestream.com subdomain or a Worker/custom domain). The speaking player loads ${streamOrigin}/<videoId>/iframe.
  • menuLinks — header/footer navigation.

Replace public/avatar.png (header logo) and public/social-card.png (default OG image) with your own.

Deploy

Static output, so it builds to ./dist/ with no adapter. See the Astro deploy guides. For Cloudflare Workers, point the assets directory at ./dist with a static Wrangler config.

Acknowledgment

Built on the Astro Cactus theme by Chris Williams.

License

MIT