~/

Short-term upgrades — preview

Scoped page: Tailwind arbitrary values + <style jsx> only. No global CSS touched.

Brand token swatches (must resolve to #DE1D8D)

bg-brand-500
bg-[#DE1D8D]
text-brand-500
border-brand-500

First, third and fourth boxes use the canonical brand token; the second is the raw hex reference. They must look identical.

Status per area

  • doneBrand token (brand scale) — brand-* added in tailwind.config.js, all #DE1D8D/pink-600 refs migrated
  • doneSitemap (next-sitemap v3) — next-sitemap.config.js added; custom script unwired from build
  • doneRSS feed — generateRss zero-post safe; feed rewrites every build via /blog with canonical domain
  • doneDynamic OG image (/api/og) — dependency-free SVG endpoint; SEO.js falls back to it
  • already-existedMDX pipeline — remark/rehype plugins + reading-time already wired; no changes
  • doneCommand palette posts+tags — /api/palette index; select navigates to /blog/[slug] or /tags/[tag]
  • needs-keysAnalytics / comments / newsletter / views — all code wired; only IDs/keys to fill (see checklist)
  • doneDropMenu avatar (next/image) — raw <img> migrated to next/image (unoptimized remote)

Live endpoints

  • /sitemap.xml (next-sitemap; posts + tags via additionalPaths)
  • /feed.xml (RSS 200 even with zero posts — valid empty channel, canonical self-link; regenerates every build)
  • /api/og?title=Hello (dynamic OG SVG, brand color + “Mere Musings”)
  • /api/palette (command-palette index: 0 posts, 0 tags)

Domain note: canonical domain is https://harsh-shah.is-a.dev everywhere, including project subdomains (syntrak/short) — point DNS at *.harsh-shah.is-a.dev or revert those two links if they don't resolve.

Palette posts + tags demo

Press Ctrl/⌘ + K, then type a post title or tag. Keyboard select navigates to /blog/[slug] or /tags/[tag]. Sample index entries:

    DropMenu avatar before / after

    Before: raw <img src={session.user.image} … /> with an eslint-disable comment. After: <Image … width={24} height={24} unoptimized /> — same 24px rounded-full look, remote avatars (GitHub/Google) bypass the domain allowlist via unoptimized, eslint clean with no disable comment.

    Analytics / comments / newsletter env-key checklist

    • setGoogle Analytics ID (G-F6V2QTJ628 in siteMetadata)
    • emptysiteMetadata.analytics.plausibleDataDomain
    • emptysiteMetadata.analytics.umamiWebsiteId (+ placeholder umami src)
    • set locallyNEXT_PUBLIC_GISCUS_REPO / REPOSITORY_ID / CATEGORY / CATEGORY_ID
    • set locallyEMAILOCTOPUS_API_URL / API_KEY / LIST_ID (provider: emailOctopus)
    • set locallyNEXTAUTH_SECRET (or SECRET) + OAuth client keys
    • set locallyNEXT_PUBLIC_LYKET_API_KEY + DATABASE_URL (views)