Make it your own

Everything personal about this site lives in three places: one config file, a handful of images, and the content folders. Here's the whole tour.

1. Edit site.config.ts

The root of the repo has a single typed config file that drives identity, SEO, navigation, socials, and the work history card:

FieldWhat it controls
name, shortNameFooter copyright and page titles (Articles - karn)
urlCanonical origin - used by RSS, sitemap, OG tags, llms.txt
title, descriptionDefault <title> and meta description everywhere
email, socialContact card, social icons on home and about
navHeader and footer navigation (external links supported)
resumeToggle the /resume redirect and point it at a PDF in public/
workCompanies and roles shown on the home page
analytics.plausibleOpt-in privacy-friendly analytics

TypeScript checks every edit, so a typo fails the build instead of silently shipping.

2. Swap the images

src/assets/avatar.png      # header avatar
src/assets/portrait.jpg    # about page portrait
src/assets/photos/         # the draggable photo strip on the home page
public/logos/              # company logos referenced from site.config.ts

3. Edit the prose

Page copy stays in the route files - look for the ✏️ markers in src/routes/index.tsx (hero), src/routes/about/index.tsx (bio), src/routes/uses/index.tsx, and src/routes/projects/index.tsx.

4. Write a post

mkdir src/content/articles/my-first-post
$EDITOR src/content/articles/my-first-post/page.mdx

Export an article object with title, description, date, and author, then write Markdown (or JSX) below it. See Writing in MDX for what the pipeline can do.

5. Ship it

pnpm run deploy   # build + wrangler deploy to Cloudflare Workers

That's it. The README covers custom domains and the GitHub Actions auto-deploy.