all projects

case study

parjanya.me

The site you're on. A small static site for my projects, coursework and writing, with a few animations along the way.

Sep 2026 in progress Astro · TypeScript · Tailwind CSS · SVG GitHub Live

The home page of parjanya.me in dark mode, showing the name, a short bio and a small ASCII price chart.

Problem

I wanted one place for my projects, coursework and writing that would be easy to keep up to date. That pointed to something simple: plain static pages, free hosting, and content kept in ordinary files.

I also wanted it to feel a little like me, so it has a charcoal palette, one warm accent colour, and a few small animations.

Approach

  • Mostly static. Astro turns every page into plain HTML when the site is built. JavaScript only handles the interactive bits (the theme switch, page transitions, tabs and filters), and the intro’s code only loads on the visit where it plays.
  • Content in files. Projects, courses, books and posts are Markdown or YAML files with a schema, so a missing field shows up as a build error instead of a broken page.
  • The intro. A small build script turns the letters of “parjanya.” into SVG shapes, so the intro can show up before any fonts have loaded.
  • Page transitions. Astro’s client-side router swaps pages without a full reload, which leaves room for the shutter animation in between.

Results

  • It stays light. Each page loads about 20 KB of bundled JavaScript, gzipped (18 KB with Brotli), plus 3 KB for the intro on the one visit where it plays. That leaves out two short inline scripts in each page’s HTML.
  • On Lighthouse’s desktop preset, the home page, the projects page and a writing post all scored 100 for performance, accessibility, best practices and SEO when I last ran it.
  • Almost everything still works with JavaScript turned off. The ask box, the theme switch, the copy-email button and the home page’s scroll rail need it, so they’re hidden. The animations are layered on top.
  • If your system asks for reduced motion, the intro becomes a short fade and page changes become a simple crossfade.

Pipeline

  1. Content MDX, Markdown and YAML files
  2. Validate Zod schemas and build-time checks
  3. Generate intro glyphs, OG images, RSS, sitemap
  4. Build Astro static output with Shiki and KaTeX
  5. Deploy Vercel, on every push to main

Challenges

  • Timing the page transitions. Getting the shutter to close while the next page loads, and to open only once that page is ready, took a few tries.
  • The zoom. Working out how far to zoom so the whole screen ends up inside the letter took a bit of geometry. There’s a separate write-up on that.
  • Theme flashes. Stopping the page from briefly flashing the wrong theme on load needed a tiny script that runs before anything is drawn.

Limitations

  • Browsers without SVG hit-testing get a rougher estimate for how far to zoom.
  • The “ask” box is a keyword search over this site, not an AI, and it says so.
  • Some of the content is still placeholder while I fill things in.

What’s next

  • Add projects, coursework and experience as they happen.
  • Put course notes up as PDFs.