Essays, Opinions and Ideas on Philosophy, Leadership, AI, Tech and whatever I am building...
π Live Site β Β Β·Β π Blog Β Β·Β π Changelog Β Β·Β π‘οΈ Security
Tip
Please feel free to reuse the source code to create your own Personal Page / Blog.
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.
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).
π οΈ CLICK HERE: Details on Technical Stack & How to Use the Codebase π½
| 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) |
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 checkThe project includes an extensive Vitest test suite covering unit tests, content validation, build output, reader experience, AI discoverability, and SEO integrity.
# 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:watchtests/
βββ 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) |
- Create a
.test.tsfile in the appropriate directory (tests/unit/ortests/integration/). - Import from
vitest:import { describe, it, expect } from 'vitest'; - Source code lives in
src/β import utilities directly (e.g.,import { slugify } from '../../src/utils/taxonomy';). - Run
npm testto verify.
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/.
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.
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 postFor 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.
Every push to main triggers the CI/CD pipeline:
.github/workflows/deploy.ymlruns on GitHub Actions- Builds via the official
withastro/action - Publishes to GitHub Pages automatically
No local build required.
One-time setup: GitHub β Settings β Pages β Build and deployment β Source β "GitHub Actions"
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