Skip to content

About

Kunal's Personal Page: Essays, Ideas, Opinions, and Philosophy

Topics

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

πŸš€ Kunal's Personal Page

Essays, Opinions and Ideas on Philosophy, Leadership, AI, Tech and whatever I am building...


Astro Tailwind CSS TypeScript GitHub Pages

🌐 Live Site β†’ Β Β·Β  πŸ“š Blog Β Β·Β  πŸ“œ Changelog Β Β·Β  πŸ›‘οΈ Security



Tip

Please feel free to reuse the source code to create your own Personal Page / Blog.


NOTE: Using the Source Code & Blog Content

The source code is available under the Apache License 2.0. You are free to use, modify, and distribute it β€” see LICENSE for full terms.

Citing Blog Content

The blog content is Kunal Suri's intellectual property, released under Creative Commons Attribution 4.0 International (CC BY 4.0). You are welcome to share and adapt it, but proper attribution is required.


Suggested Citation Format (IF Needed):

Suri, K. "Post Title." Kunal Suri's Blog. Available at: https://kunalsuri.github.io/ DOI: to be assigned via Zenodo

A persistent DOI for the full archive will be made available via Zenodo in the future. Once assigned, please prefer the DOI link for long-term citation stability (if needed).



πŸš€ Tech Stack & Deployment


πŸ› οΈ CLICK HERE: Details on Technical Stack & How to Use the Codebase πŸ”½

✨ Tech Stack

Layer Technology
Framework Astro 7 β€” static output, zero JS by default
Styling Tailwind CSS v4 β€” CSS-first config via src/styles/global.css
Language TypeScript (strict) + astro check
Islands Preact (compat) β€” ready for interactivity when needed
Search Pagefind β€” static search index, built post-build
Feeds & AI RSS (/rss.xml), Sitemap (/sitemap-index.xml), AI discoverability (/llms.txt, /llms-full.txt)
CMS Environment Studio local interactive CMS (/studio dev route via Vite middleware plugin)
Deployment GitHub Actions β†’ GitHub Pages (automatic on push to main)


πŸ› οΈ Local Development

Prerequisites: Node.js 20+ (24 recommended)

# Install dependencies
npm install

# Start dev server β†’ http://localhost:4321
npm run dev

# Production build β†’ dist/
npm run build

# Preview the production build locally
npm run preview

# Type-check with astro check
npm run check


πŸ§ͺ Testing

The project includes an extensive Vitest test suite covering unit tests, content validation, build output, reader experience, AI discoverability, and SEO integrity.

Quick Start

# Run the full test suite (unit + integration)
npm test

# Run only unit tests (fast, no build needed)
npm run test:unit

# Run only integration tests (triggers a build if dist/ is missing)
npm run test:integration

# Run tests in watch mode during development
npm run test:watch

Test Architecture

tests/
β”œβ”€β”€ unit/                       # Fast, pure-function & module tests (no Astro runtime)
β”‚   β”œβ”€β”€ consts.test.ts          # Site constants β€” shape and value guards
β”‚   β”œβ”€β”€ markdown-preview.test.ts# Live markdown preview & asset URL rewrites
β”‚   β”œβ”€β”€ publish-draft.test.ts   # Draft publishing CLI & skill schema conformance
β”‚   β”œβ”€β”€ reading-time.test.ts    # readingTime() β€” word count and edge cases
β”‚   β”œβ”€β”€ series.test.ts          # Series grouping, reading order & in-post context
β”‚   β”œβ”€β”€ studio-fs.test.ts       # Studio local filesystem operations & post file handling
β”‚   β”œβ”€β”€ studio.test.ts          # Studio state & management utilities
β”‚   β”œβ”€β”€ taxonomy.test.ts        # slugify() β€” URL-safe slug generation
β”‚   └── verify-post.test.ts     # The mechanical pre-publish gate
└── integration/                # File-system, reader-experience, and build-output tests
    β”œβ”€β”€ ai-discoverability.test.ts# llms.txt & llms-full.txt feeds validation
    β”œβ”€β”€ blog-posts.test.ts        # Validates actual .md/.mdx files on disk
    β”œβ”€β”€ build.test.ts             # Build output β€” pages, SEO tags, links
    β”œβ”€β”€ content-schema.test.ts    # Zod schema for blog front-matter
    β”œβ”€β”€ ensure-build.ts           # Concurrency-safe build lock helper
    β”œβ”€β”€ reader-experience.test.ts # Layout, reading experience, and theme toggle guards
    β”œβ”€β”€ rss.test.ts               # RSS feed structure and content
    └── series.test.ts            # Series routes, front-matter integrity, publish gate
Layer What it tests Speed
Unit Utility functions, constants, configuration ⚑ < 1 s
Integration (content) Blog post files, Zod schema ⚑ < 1 s
Integration (build) HTML output, SEO, RSS, links 🐒 ~10-20 s (runs astro build)

Adding a New Test

  1. Create a .test.ts file in the appropriate directory (tests/unit/ or tests/integration/).
  2. Import from vitest: import { describe, it, expect } from 'vitest';
  3. Source code lives in src/ β€” import utilities directly (e.g., import { slugify } from '../../src/utils/taxonomy';).
  4. Run npm test to verify.


✍️ Writing a Post

Drop a Markdown (.md) or MDX (.mdx) file into src/content/blog/:

---
title: "Your title"
description: "One-line summary, used for SEO and the post list."
pubDate: 2026-07-09
tags: ["astro"]
draft: false      # true β†’ hidden in production, visible in dev
---

Your content here.

The filename becomes the URL slug β€” my-post.md β†’ /blog/my-post/.

Post series

Add series: "What Is" to the front-matter and the post joins a series: /series and /series/what-is build themselves, and the post gets in-article "Part 2 of 5" navigation. series is the thread; category is still the section β€” a post has both. Add optional seriesOrder: 3 only when reading order must differ from publication order.

Draft β†’ verify β†’ publish

Posts are drafted with draft: true (hidden in production, visible in npm run dev), verified, then published by flipping one boolean. The mechanical gate is a plain Node script:

npm run verify:post -- what-is-an-llm   # one post
npm run verify:posts                    # every post

For the "What Is" series there is one command β€” /what-is <topic-or-slug> β€” which reads the disk to work out whether the post needs drafting, fact-checking, or publishing, so you never have to track the stage yourself. npm run verify:post -- --stage shows the same thing without an agent. See docs/series/what-is-playbook.md.



🚒 Deployment

Every push to main triggers the CI/CD pipeline:

  1. .github/workflows/deploy.yml runs on GitHub Actions
  2. Builds via the official withastro/action
  3. Publishes to GitHub Pages automatically

No local build required.

One-time setup: GitHub β†’ Settings β†’ Pages β†’ Build and deployment β†’ Source β†’ "GitHub Actions"



πŸ“„ License

This project uses a dual-license model:

What License File
Source code β€” templates, components, config, styles, scripts Apache License 2.0 LICENSE
Blog content β€” posts, articles, and essays in src/content/blog/ CC BY 4.0 CONTENT_LICENSE


Built with β˜• and curiosity by Kunal Suri

About

Kunal's Personal Page: Essays, Ideas, Opinions, and Philosophy

Topics

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages