
Shevon Salmon – Personal Brand Website
Shevon Salmon, a tech content creator known for collaborating with brands like Apple, Samsung, BMW — and the list goes on. I’ve been a fan of Shevon since around 2022, and since then, I’ve watched every video he drops back-to-back.
Earlier in 2025, I needed bread 💰 — so I came up with an idea: build a website for Shevon. His existing one was built with Wix; it worked, but it just didn’t match his overall aesthetics as a creator. Let’s walk through the tech stack I used to build this website.
Next.js
Next.js is a web framework capable of full-stack functionality — it powers the entire website.
TailwindCSS, Shadcn & Motion
I used TailwindCSS and Shadcn for styling and the component system. And I can proudly say this website is living proof that not all Shadcn websites look the same.
Framer Motion handled the animations and micro-interactions.
Sanity CMS
Sanity is “the operating system for content,” as they describe it — and I can testify to that. You can either embed the Studio inside a Next.js app or deploy it separately.
For this project, I embedded the Studio at /studio, so Shevon wouldn’t have to deal with multiple URLs.
The site uses Static Site Generation (SSG) combined with On-Demand Revalidation, fetching new data whenever content updates occur in Sanity — and Sanity makes this ridiculously easy.
All I had to do was add a tag to my sanityFetch function, then set up a webhook in my Next.js app at /api/revalidate.
// /api/revalidate/route.ts
import { revalidateTag } from "next/cache";
import { type NextRequest, NextResponse } from "next/server";
import { parseBody } from "next-sanity/webhook";
export async function POST(req: NextRequest) {
try {
const { body, isValidSignature } = await parseBody<{
_type: string;
slug?: string | undefined;
}>(req, process.env.NEXT_PUBLIC_SANITY_HOOK_SECRET);
if (!isValidSignature) {
return new Response("Invalid Signature", { status: 401 });
}
if (!body?._type) {
return new Response("Bad Request", { status: 400 });
}
revalidateTag(body._type);
return NextResponse.json({
status: 200,
revalidated: true,
now: Date.now(),
body,
});
} catch (error) {
console.error(error);
//@ts-expect-error shows error is of type unknown
return new Response(error.message, { status: 500 });
}
}// /api/revalidate/route.ts
import { revalidateTag } from "next/cache";
import { type NextRequest, NextResponse } from "next/server";
import { parseBody } from "next-sanity/webhook";
export async function POST(req: NextRequest) {
try {
const { body, isValidSignature } = await parseBody<{
_type: string;
slug?: string | undefined;
}>(req, process.env.NEXT_PUBLIC_SANITY_HOOK_SECRET);
if (!isValidSignature) {
return new Response("Invalid Signature", { status: 401 });
}
if (!body?._type) {
return new Response("Bad Request", { status: 400 });
}
revalidateTag(body._type);
return NextResponse.json({
status: 200,
revalidated: true,
now: Date.now(),
body,
});
} catch (error) {
console.error(error);
//@ts-expect-error shows error is of type unknown
return new Response(error.message, { status: 500 });
}
}Then, on the Sanity dashboard, I created a webhook pointing to your-site-domain.com/api/revalidate, secured with a secret key that Next.js uses to verify the request origin.

Vercel
The deployment platform. Vercel’s integration with Next.js makes deployments frictionless and serverless by default.
Did He Accept the Website?
After building the website, I sent Shevon an email explaining what I built (never been so nervous).
His manager replied, saying Shevon wasn’t currently in need of a website — that broke my heart 💔.
I couldn’t help but ask myself why I didn’t send the email before building the site.
Still, Shevon Salmon remains a creator I deeply look up to — and that’s not changing anytime soon.
Love, peace, and tweaks. Signing out.