HTML & CSS
Fundamental web markup and styling. Understand semantic HTML, CSS selectors, Flexbox, and CSS Grid. You will be writing templates and styling components regularly.
Welcome, developer! This guide is designed to help you understand the technology stack behind Nadi Kosh, the knowledge repository powering the Nadi Stuti movement. Whether you are looking to contribute code, improve features, or fix bugs, this documentation will equip you with everything you need to get started.
if you are an experienced developer and have worked with static site generators like astro or nextjs before, feel free to skip ahead to our future development plans section.
Skip to Future Development
Before diving into Nadi Kosh development, make sure you have a solid foundation in these core technologies:
HTML & CSS
Fundamental web markup and styling. Understand semantic HTML, CSS selectors, Flexbox, and CSS Grid. You will be writing templates and styling components regularly.
Markdown & Frontmatter
Markdown is the primary language for content in Nadi Kosh. Learn YAML frontmatter syntax for defining metadata (title, date, tags, etc.) in .md and .mdx files.
TypeScript
TypeScript is used for configuration files and component logic. Strong typing helps catch errors early. You do not need to be an expert, but comfort with TypeScript types is essential.
Web Development Fundamentals
Understand HTTP, DOM, async/await, modules, package managers (npm), and version control (Git). These are the foundations of all web development.
Web Standards & SEO
Best practices for performant, accessible, SEO-friendly websites: semantic HTML, alt text for images, proper heading hierarchy, structured data, and meta tags.
Nadi Kosh is built with Astro, a modern static site generator (SSG) framework. But why Astro? And what makes it perfect for our knowledge repository?
Astro is a modern web framework optimized for building fast, content-focused websites. At its core, Astro is an island architecture framework that:
src/pages/, and it automatically becomes a route.At Nadi Kosh, we made a deliberate choice to use Astro for several critical reasons:
Superior Performance
Astro builds pure HTML at build time. Visitors download minimal JavaScript, resulting in faster page loads, better SEO rankings, and lower bandwidth usage. For a knowledge repository serving millions of potential readers, performance is non-negotiable.
Best for Static Site Generation
Nadi Kosh is primarily a static wiki and blog. Astro excels at this use case far more than heavy frameworks like Next.js or Nuxt. We do not need the overhead of server-side rendering for most of our content.
Island Architecture = Broad Contributor Base
Astro’s island architecture means you can add interactive components only where needed, without writing complex full-stack code. A frontend developer can contribute UI improvements. A content writer does not need to touch code. This democratizes contribution.
Simplicity & Developer Experience
Astro’s learning curve is gentle. If you know HTML, CSS, and a bit of JavaScript, you can start contributing to Nadi Kosh quickly. We do not want developers to fight the framework — we want them to focus on the mission.
Excellent Ecosystem
Astro integrates beautifully with Starlight (documentation theme), Markdown processing, and static hosting (Netlify, Vercel). The ecosystem is mature and well-maintained.
Future-Proof Architecture
Astro is actively developed and backed by a strong community. Its architecture is designed to stay relevant as web standards evolve.
Before contributing to Nadi Kosh, we strongly recommend you complete the official Astro tutorial:
👉 Astro Tutorial - Introduction
This tutorial takes about 2-3 hours and covers:
.astro componentsAfter completing the tutorial, read the Astro Documentation to deepen your understanding. Specifically:
.astro syntaxOn top of Astro, we use Starlight — a professional documentation theme designed specifically for knowledge bases, wikis, and educational sites.
Starlight is an official Astro theme that provides:
Starlight handles the heavy lifting of UI, navigation, and styling, letting us focus on content and plugins.
To understand how Starlight works and how to use its features:
Key pages to read:
Here is the complete technology stack powering Nadi Kosh:
┌─────────────────────────────────────┐│ Content Delivery (Netlify) │└──────────────┬──────────────────────┘ │┌──────────────▼──────────────────────┐│ GitHub (Source Control) ││ ├─ master branch (protected) ││ └─ Pull requests (review & merge) │└──────────────┬──────────────────────┘ │┌──────────────▼──────────────────────┐│ Astro (Static Site Generator) ││ ├─ Markdown files ││ ├─ TypeScript config ││ └─ Component-based architecture │└──────────────┬──────────────────────┘ │┌──────────────▼──────────────────────┐│ Starlight (Documentation Theme) ││ ├─ Sidebar/navigation ││ ├─ Components (cards, callouts...) ││ ├─ Plugins (blog, comments, theme) ││ └─ Search & accessibility │└─────────────────────────────────────┘Understanding our file structure is crucial for contributing effectively. Here is how Nadi Kosh is organized:
/src/assets/Contains images, logos, and static media:
src/assets/├── images/│ ├── logo.png│ ├── rivers/│ │ ├── ganga-banner.jpg│ │ └── ...│ └── ...└── docs/ └── diagrams/When to add files here: Whenever you have images or media referenced in documentation. Always optimize images for web (compress, use modern formats).
/src/components/Contains reusable Astro components:
src/components/├── RiverCard.astro├── EventCard.astro├── TeamMember.astro└── ...When to add files here: When you create a component that is used in multiple pages. Single-use components can live inline in pages.
/src/content/docs/This is where all documentation content lives. It is organized into folders that auto-generate sidebar sections:
autogenerate enabled (defined in layout.ts) will automatically create sidebar sections from all .md files inside. Examples: rivers/, books/, tech/, etc.about-nadikosh.md, contribute.md, how-we-work.mdx are manually added to the sidebar in astro.config.mjs./src/content/docs/blog/Special folder for blog posts. Managed by the starlight-blog plugin. All .md files here become blog articles with automatic:
Nadi Kosh is enhanced with several carefully chosen Starlight plugins:
What is it?
A premium color theme for Starlight that gives your documentation a book or newspaper aesthetic. It is minimal, elegant, and optimized for reading without distraction.
Why we chose it:
Configuration (in astro.config.mjs):
starlightThemeFlexoki({ accentColor: "yellow",}),This sets the accent color to yellow throughout the site — buttons, links, highlights, and interactive elements all use this color.
Learn more: Flexoki is a curated, minimal color scheme. To understand the design philosophy, explore the official Starlight theme documentation.
What is it?
A plugin that transforms a folder of Markdown files into a fully-featured blog system with:
Why we use it:
Nadi Stuti’s blog is central to our mission. We publish long-form content — essays, guides, case studies, and announcements. The starlight-blog plugin handles all the plumbing so we can focus on writing.
How we configured it (in astro.config.mjs):
starlightBlog({ title: "Nadi Stuti Blog", metrics: { readingTime: true, // Show estimated reading time words: "rounded", // Round word count (e.g., "5 min read") }, authors: { nulligma: { name: "Shantanu Kulkarni", title: "Nadi Sevak", picture: "https://pbs.twimg.com/profile_images/722045969936703488/bLHK_LbW_400x400.jpg", url: "https://x.com/Nulligma/", }, // Add more authors here as the team grows },}),Key configuration options:
title — The blog section title shown to readers.metrics.readingTime — If true, displays “5 min read” estimates.metrics.words — How to round word counts (“rounded”, “exact”, “per-minute”).authors — A key-value object of author profiles used in blog post frontmatter.How to write a blog post:
Create a new file in src/content/docs/blog/my-post.md with this frontmatter:
---title: "My Blog Post Title"description: "A short description that appears in preview."date: 2026-01-13authors: - nulligmatags: ["rivers", "updates", "conservation"]---
# My Blog Post Title
Your content here...Read the documentation: For in-depth blog configuration, author management, and advanced features:
👉 Starlight Blog Documentation
What is it?
A plugin that integrates Giscus — a GitHub-backed comment system — into Starlight pages. Readers can leave comments, discussions, and feedback directly on documentation pages.
Why we added it:
We want readers to interact with our content. Comments allow:
Unlike traditional comment systems, Giscus uses GitHub Discussions as its backend, so comments are:
How we configured it (in astro.config.mjs):
starlightGiscus({ repo: "nadi-stuti/kosh", // GitHub repo repoId: "R_kgDOQtuzhw", // Repo ID from GitHub category: "General", // Discussion category categoryId: "DIC_kwDOQtuzh84C03D7", // Category ID theme: { light: "gruvbox_light", // Light mode theme dark: "gruvbox_dark", // Dark mode theme auto: "gruvbox", // Auto-detect based on system },}),How it works:
When a reader visits a page with comments enabled, they see:
Where comments appear:
By default, comments are enabled on all pages except:
404.md (not found page)index.mdx (home page)You can customize this in individual page frontmatter:
---title: "My Page"# Disable comments on this page specificallygiscus: false---Moderation:
Since Giscus uses GitHub Discussions, moderation happens through GitHub:
Read the guide: For complete setup and troubleshooting:
What is it?
A plugin that enables click-to-zoom functionality for images in your documentation. Readers can click on images to view them in a larger, fullscreen-like modal, perfect for detailed diagrams, maps, charts, and photos.
Why we use it:
Nadi Kosh contains many visual assets — river maps, pollution data charts, satellite imagery, historical photographs, and detailed diagrams. Static, fixed-size images limit reader experience:
With starlight-image-zoom, we can:
How we configured it (in astro.config.mjs):
starlightImageZoom({ // No special configuration needed — works out of the box}),The plugin is minimal and unopinionated, enabling zoom on all images by default.
How to use it in your content:
To enable zoom on images, wrap them with the .image-preview-wrapper class. This reduces their display size, giving them a preview appearance, while the zoom plugin allows users to expand them when clicked.
<div class="image-preview-wrapper"> <img src="/src/assets/hindi-back.png" alt="Hindi text banner" /></div>Simple and direct. For plain Markdown content, use standard HTML <img> tags wrapped in the preview class.
import { Image } from 'astro:assets';import myImage from '../../assets/prints/flex-card/hindi-back.png';
<div class="not-content image-preview-wrapper"> <Image src={myImage} width={800} alt="Click to zoom" /></div>For MDX, use Astro’s optimized <Image> component (which provides automatic optimization, srcsets, and responsive behavior).
Key points:
<Image> from 'astro:assets' for Astro optimizationnot-content class to prevent Starlight content styling from interferingwidth (e.g., 800) — this is the preview sizealt text for accessibilityCustom CSS for preview styling:
We’ve added custom CSS in src/styles/custom.css to handle the preview appearance:
.image-preview-wrapper { /* Reduce image size to create a "preview" effect */ max-width: 400px; margin: 1rem auto; border-radius: 8px; overflow: hidden;
/* Subtle shadow to indicate interactivity */ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
/* Cursor indicates images are clickable */ cursor: pointer; transition: transform 0.2s ease, box-shadow 0.2s ease;}
.image-preview-wrapper:hover { /* Gentle hover effect to show interactivity */ transform: scale(1.02); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);}
.image-preview-wrapper img { width: 100%; height: auto; display: block;}How it works:
Best practices:
High-Resolution Source
Always provide high-resolution images (1200px+ width). The preview shrinks them, but users see full quality when zoomed.
Descriptive Alt Text
Alt text is crucial for accessibility. Describe what the image shows, not just “image” or “photo”. Example: “Map of Ganga River pollution zones” or “Chart showing water pH levels over time”.
Appropriate Preview Size
Adjust max-width in CSS for different content types. Maps might be 500px, while diagram details might be 300px. Test on mobile and desktop.
Image Optimization
Use modern formats (WebP, AVIF) and compress images. Large unoptimized images slow down the entire page. Tools like TinyPNG or ImageOptim help.
When to use preview + zoom:
When NOT to use preview + zoom:
Read the documentation:
For advanced options and troubleshooting:
👉 Starlight Image Zoom Documentation
Our version control and deployment process is designed to ensure quality, transparency, and safety.
Our master branch is locked — no one can push commits directly to it. All changes must come through pull requests (PRs).
Why?
Here is how to contribute code or content:
Create a feature branch from master:
git checkout mastergit pull origin mastergit checkout -b feature/your-feature-nameMake your changes locally:
npm run dev starts a development server at http://localhost:4321Commit your changes:
git add .git commit -m "Clear description of what you changed"git push origin feature/your-feature-nameOpen a pull request on GitHub:
master, compare to your branchNetlify preview is automatically generated:
Address feedback from reviewers:
Merge when approved:
masterkosh.nadistuti.comWhen a PR is merged to master:
This means every merged PR = instant production deploy. Be careful, be thoughtful, be thorough in review!
Our sidebar (left navigation) is mostly auto-generated but requires some configuration.
Folders like rivers/, books/, tech/, etc. are configured in src/lib/constants/layout.ts:
export const SidebarFolders = [ { label: "Rivers", collapsed: true, autogenerate: { directory: "rivers", collapsed: true, }, }, { label: "Books", collapsed: true, autogenerate: { directory: "books", collapsed: true, }, }, // ... more folders];How it works:
.md file in src/content/docs/rivers/, it automatically appears under “Rivers” in the sidebar.To add a new auto-generated section:
src/content/docs/ (e.g., new-section/)layout.ts:
{ label: "New Section", collapsed: true, autogenerate: { directory: "new-section", collapsed: true, },}.md files to the folder — they appear automaticallyPages like about-nadikosh, contribute, how-we-work are added directly to astro.config.mjs:
sidebar: [ ...SidebarFolders, // Include auto-generated sections { slug: "about-nadikosh" }, // Manual pages { slug: "print" }, { label: "How we work", slug: "how-we-work" }, { label: "Contribute", slug: "contribute" }, { slug: "layout" }, { slug: "updates" },],Why manual?
These pages are often:
When you add a new .md file to src/content/docs/:
---title: "Page Title"description: "Short description for search and preview"---
# Page Title (same as frontmatter title)
Your content here...---title: "My River Guide"description: "Everything you need to know about the Ganga"# Optional: Featured image# image:# src: /src/assets/ganga-river.jpg# alt: "The Ganga River at sunrise"
# Optional: Custom sidebar label# sidebar:# label: "Ganga (Complete Guide)"---
# My River Guide
Content...---title: "We Started Cleaning the Mahanadi"description: "Our first major on-ground initiative"date: 2026-01-13authors: - nulligmatags: ["events", "mahanadi", "ground-work"]# Optional: featured image# image:# src: /src/assets/mahanadi-cleanup.jpg# alt: "Volunteers cleaning the Mahanadi"---
# We Started Cleaning the Mahanadi
Blog post content...Right now, writers have two paths to contribute:
Both have friction. We are planning to solve this with a Git-based CMS like Keystatic.
Our thinking-grounds and blog sections need to attract many writers — experts, educators, community members, activists. But requiring:
…creates barriers to entry.
Writers just want to write freely, hit publish, and move on. They should not have to become developers.
Keystatic is a Git-based CMS that bridges this gap perfectly.
Keystatic is a headless CMS that:
kosh.nadistuti.com/adminZero Technical Setup
Writers visit a URL, sign in, and start writing. No Git, no terminal, no config files.
Automatic Frontmatter
Keystatic generates proper YAML metadata (title, date, author, tags) through a form. Writers never touch YAML.
Visual Editor
Write in a rich text editor, see a live preview, and publish with one click. All markdown is generated correctly.
Git Workflow Preserved
Behind the scenes, Keystatic still uses Git branches and PRs. Your code review process is intact.
Permission Control
Configure who can write, edit, publish, and delete. Maintain editorial control even with open contributions.
Current flow (manual + friction):
Writer → Writes in Obsidian/Typora → Sends .md file to Content Creator group → Maintainer manually creates frontmatter, adds to repo + creates PR → Reviewer approves → Merged to master → DeployedKeystatic flow (streamlined + delightful):
Writer → Opens kosh.nadistuti.com/admin → Clicks "New Note in Thinking Grounds" → Fills form: Title, Content, Tags, Author → Clicks "Save as Draft" → Clicks "Publish" → Keystatic creates branch + PR automatically → Reviewer approves PR on GitHub → Merged to master → DeployedThe difference?
┌─────────────────────────────────────┐│ Writer (Browser) ││ Visit: /admin │└──────────────┬──────────────────────┘ │┌──────────────▼──────────────────────┐│ Keystatic CMS ││ ├─ Visual editor ││ ├─ Form-based metadata ││ └─ Preview │└──────────────┬──────────────────────┘ │ (Creates branch + commits)┌──────────────▼──────────────────────┐│ GitHub ││ ├─ Creates feature branch ││ ├─ Writes .md file with frontmatter ││ └─ Opens PR │└──────────────┬──────────────────────┘ │ (Reviewer approves)┌──────────────▼──────────────────────┐│ master branch ││ ├─ PR merged ││ └─ Webhook triggered │└──────────────┬──────────────────────┘ │┌──────────────▼──────────────────────┐│ Netlify ││ ├─ Build & Deploy ││ └─ Site goes live │└─────────────────────────────────────┘To implement Keystatic for Nadi Kosh:
Install Keystatic in the Astro project:
npm install @keystatic/core @keystatic/nextCreate a Keystatic config file (keystatic.config.ts) that defines:
Set up GitHub OAuth so writers can sign in securely via GitHub.
Deploy the admin panel at a route like /admin on Netlify.
Configure Keystatic to create PRs:
Test thoroughly before rolling out to non-technical contributors.
This is on our roadmap but not yet implemented. When you see the Keystatic admin panel go live, it will be a major milestone for Nadi Kosh. Suddenly, contributing will feel as easy as tweeting — and that is exactly what we want.
You also don’t have to wait for us to implement this alone.
If you are a developer who enjoys working on content tooling, DX, or CMS integrations, this is a beautiful area to contribute:
If this excites you, please:
We are very open to ideas. Whether you want to lead the Keystatic integration, review our current stack, or suggest alternative approaches, your insight can shape how hundreds of future writers interact with Nadi Kosh.
Here is the complete journey from idea to published content:
You have an idea (article, code fix, design improvement)
Discuss it (optional but recommended):
Set up locally:
git clone https://github.com/nadi-stuti/kosh.gitcd koshnpm installnpm run devCreate a feature branch:
git checkout -b feature/your-feature-nameMake your changes:
http://localhost:4321)Commit and push:
git add .git commit -m "Clear, descriptive commit message"git push origin feature/your-feature-nameOpen a pull request on GitHub:
Respond to feedback:
Get merged:
As you start contributing, you might have questions:
GitHub Issues
Found a bug or have a feature request? Open an issue on GitHub with clear description and steps to reproduce.
Pull Request Discussions
During your PR review, ask clarifying questions. Maintainers are here to help.
WhatsApp Community
Join our Tech Group for real-time chat, debugging help, and discussion with other developers.
Documentation
This guide, Astro docs, Starlight docs, and plugin docs are comprehensive. Search first!
Welcome to the Nadi Kosh developer community.
We are building something meaningful — a knowledge repository that will serve millions of people, help clean our rivers, and preserve India’s sacred legacy for generations to come.
Your contribution, no matter how small, matters.
Whether you fix a typo, write a component, improve performance, or answer a fellow developer’s question — you are part of this movement.
We are grateful for you. Thank you for being here.
Happy coding, and may your contributions flow like a river. 🌊