कॉन्फ़िगरेशन फ़ाइल
blume.config.ts का हर विकल्प — साइट मेटाडेटा और कंटेंट स्रोतों से लेकर उन लिंक्स तक जो हर अलग-अलग फ़ीचर कॉन्फ़िगरेशन गाइड तक ले जाते हैं।
Blume आपके प्रोजेक्ट रूट से blume.config.ts पढ़ता है। ऑटोकम्पलीट और टाइप-चेकिंग के लिए अपने कॉन्फ़िग को defineConfig में लपेटें — हर फ़ील्ड वैकल्पिक है, और उसका एक समझदार डिफ़ॉल्ट होता है।
import { defineConfig } from "blume";
export default defineConfig({
title: "My Docs",
description: "Documentation for my project.",
});
एक सम्पूर्ण उदाहरण
सबसे आम विकल्पों को छूता हुआ एक व्यापक उदाहरण (बाकी के लिए हर फ़ीचर की गाइड देखें):
import partytown from "@astrojs/partytown";
import { defineConfig } from "blume";
import { orama } from "blume/search";
export default defineConfig({
// Site
title: "My Docs",
description: "Documentation for my project.",
logo: "/logo.svg",
// Astro integrations — installed and versioned by this site
integrations: [partytown()],
// Content
content: {
root: "docs",
},
// Theme — see the Theming guide
theme: {
accent: "teal",
radius: "md",
mode: "system",
},
// Search — an adapter from "blume/search"; see the Search guide
search: orama(),
// Markdown features
markdown: {
imageZoom: true,
externalLinks: false, // open https:// links in a new tab
code: {
icons: true, // language icon in the code-block header
wrap: false, // wrap long lines instead of scrolling
theme: {
light: "github-light", // bundled name or custom Shiki theme object
dark: "github-dark",
},
},
},
// Agents — llms.txt, MCP, the AI catalog; see the Discoverability section
agents: {
llmsTxt: true,
// AI Catalog / ARD manifest at /.well-known/ai-catalog.json (needs deployment.site)
catalog: true,
// Your site's agent skill at /skill.md (needs deployment.site)
skillMd: true,
// MCP server (needs server output)
mcp: {
enabled: false,
route: "/mcp",
},
},
// SEO — OG images, feeds, sitemap, structured data; see the Discoverability section
seo: {
og: { enabled: true },
rss: { enabled: true, types: ["blog", "changelog"] },
sitemap: true,
robots: true,
structuredData: true,
},
// Deployment — a static build here; see the Deployment guide for host adapters
deployment: {
site: "https://docs.example.com",
},
});
साइट
| विकल्प | डिफ़ॉल्ट | विवरण |
|---|---|---|
title |
"Documentation" |
साइट का नाम — हेडर, पेज शीर्षकों और OG कार्ड्स में दिखता है। |
description |
— | डिफ़ॉल्ट मेटा विवरण, जो SEO और OG के लिए उपयोग होता है। |
logo |
— | हेडर में दिखने वाला ब्रांड चिह्न और/या वर्डमार्क। |
banner |
— | हेडर के ऊपर साइट-व्यापी घोषणा पट्टी। |
footer |
— | कंटेंट के नीचे एक कॉपीराइट पंक्ति, लिंक्स की एक पंक्ति, और सोशल प्रोफ़ाइल आइकॉन। |
लोगो
logo को किसी SVG की ओर इंगित करें और Blume उसे इनलाइन कर देता है, जिससे currentColor वाला लोगो अपने आप लाइट और डार्क थीम का अनुसरण करता है:
logo: "/logo.svg",
SVG आपके प्रोजेक्ट रूट में या public/ में रह सकता है। ब्रांड एक चिह्न (image) और एक वर्डमार्क (text) से बनता है; ऑब्जेक्ट रूप आपको इन्हें अलग-अलग सेट करने देता है:
logo: {
image: "/logo.svg", // string, or { light, dark, alt } for themed raster art
text: "Acme", // wordmark beside the mark
href: "/", // overrides the brand link (defaults to "/")
},
image वही मान लेता है जो शॉर्टहैंड लेता है — एक अकेला पाथ, या अलग-अलग लाइट/डार्क आर्टवर्क के लिए { light, dark, alt } (रास्टर इमेज public/ में ही होनी चाहिए)।
href किसी टैब पाथ की तरह एक डिफ़ॉल्ट-लोकेल पाथ है: किसी बहु-लोकेल साइट पर, जब भी पाठक की लोकेल उस रूट को सर्व करती है, ब्रांड लिंक उसी लोकेल में चला जाता है (/en/… के अंतर्गत / बन जाता है /en), ताकि लोगो पर क्लिक करने से पाठक उस भाषा से बाहर न निकलें जिसमें वे पढ़ रहे थे। जिस रूट को केवल डिफ़ॉल्ट लोकेल सर्व करती है — कोई कस्टम पेज या जनरेट किया गया चेंजलॉग इंडेक्स — वह किसी ऐसे स्थानीयकृत URL की ओर इंगित करने के बजाय, जो 404 देता, अपना ही पाथ बनाए रखता है। निरपेक्ष URL का उपयोग जस का तस किया जाता है।
text वर्डमार्क को चिह्न से स्वतंत्र रूप से नियंत्रित करता है:
textको छोड़ दें और ब्रांड आपकी साइट केtitleका उपयोग करेगा (डिफ़ॉल्ट)।text: ""सेट करें ताकि केवल चिह्न दिखे — तब उपयोगी जब लोगो इमेज में पहले से ही वर्डमार्क शामिल हो। ऐसे में स्क्रीन रीडर ब्रांड लिंक को इमेज केaltके ज़रिए पढ़कर सुनाते हैं, याaltन होने पर आपकी साइट केtitleके ज़रिए।imageके बिनाtextसेट करें केवल-टेक्स्ट वाले लोगो के लिए।
फ़ेविकॉन
कोई फ़ेविकॉन विकल्प नहीं है — Blume उसे फ़ाइलनाम से अपने आप पहचान लेता है, ठीक वैसे ही जैसे Next.js करता है। अपने प्रोजेक्ट रूट या public/ डायरेक्टरी में एक icon या favicon फ़ाइल (.svg, .png, या .ico) रखें और वह ब्राउज़र टैब का आइकॉन बन जाती है:
my-docs/
├─ blume.config.ts
├─ icon.png ← picked up automatically
└─ docs/
जब कई मौजूद हों, तो SVG की प्राथमिकता PNG से ऊपर और PNG की ICO से ऊपर होती है, और public/ की फ़ाइल को रूट वाली फ़ाइल पर वरीयता मिलती है। अगर Blume को कोई आइकॉन नहीं मिलता, तो वह अपने ही चिह्न पर लौट आता है।
गहरे रंग का चिह्न डार्क ब्राउज़र क्रोम के सामने ग़ायब हो जाता है, इसलिए आप डार्क मोड के लिए एक दूसरी फ़ाइल भेज सकते हैं। अपनी आइकॉन फ़ाइल का एक -dark सहोदर जोड़ें — वही नाम और वही डायरेक्टरी, एक्सटेंशन से पहले -dark के साथ (icon.png → icon-dark.png) — और Blume दोनों आइकॉन एक prefers-color-scheme मीडिया क्वेरी के पीछे उत्सर्जित करता है, साथ ही उन ब्राउज़रों और क्रॉलरों के लिए एक सादा लाइट टैग भी जो आइकॉन पर मीडिया क्वेरीज़ को अनदेखा करते हैं:
my-docs/
├─ blume.config.ts
├─ icon.png ← light mode
├─ icon-dark.png ← dark mode
└─ docs/
केवल उसी आइकॉन के सहोदर का उपयोग होता है जिसे Blume ने चुना है — किसी अलग नाम वाली -dark फ़ाइल अनदेखी ही रहती है, इसलिए कोई असंबंधित फ़ाइल ग़लती से आपके चिह्न के साथ नहीं जुड़ सकती। डार्क फ़ाइल वैकल्पिक है; केवल एक आइकॉन होने पर Blume पहले की तरह एक ही टैग उत्सर्जित करता है। Blume का अपना फ़ॉलबैक चिह्न दोनों वैरिएंट के साथ आता है।
Apple टच आइकॉन
जब कोई आपकी साइट को अपनी होम स्क्रीन पर जोड़ता है तो iOS जिस आइकॉन का उपयोग करता है, उसे भी इसी तरह पहचाना जाता है। अपने प्रोजेक्ट रूट या public/ डायरेक्टरी में एक apple-icon फ़ाइल (.png, .jpg, या .jpeg) — या apple-touch-icon.png, वह नाम जो ज़्यादातर फ़ेविकॉन जेनरेटर बनाते हैं — रखें और Blume आपके लिए <link rel="apple-touch-icon"> जोड़ देता है। कोई डिफ़ॉल्ट नहीं है; अगर कोई फ़ाइल नहीं मिलती, तो कोई टैग नहीं निकाला जाता।
my-docs/
├─ blume.config.ts
├─ apple-icon.png ← picked up automatically
└─ docs/
फ़ाइल को प्रोजेक्ट रूट के बजाय public/ में रखें: रूट-स्तर के आइकॉन के लिए Blume जिस इनलाइन डेटा URI का उपयोग करता है, iOS उसे अनदेखा कर देता है, इसलिए केवल public/ की फ़ाइल (जो /apple-icon.png पर सर्व होती है) ही भरोसेमंद तरीके से होम स्क्रीन तक पहुँचती है। फ़ेविकॉन के विपरीत, यहाँ कोई -dark सहोदर नहीं है — iOS होम-स्क्रीन आइकॉन पर मीडिया क्वेरीज़ को अनदेखा करता है, इसलिए कोई डार्क वैरिएंट कभी सर्व किया ही नहीं जा सकता।
बैनर
हेडर के ऊपर साइट-व्यापी घोषणा पट्टी दिखाएँ। एक स्ट्रिंग पास करें, या एक लिंक और डिसमिस बटन वाला ऑब्जेक्ट:
banner: "Docs are in beta — expect changes.",
banner: {
content: "Version 2.0 is here!",
link: { text: "Read the release notes", href: "/changelog" },
dismissible: true,
id: "v2",
},
जब dismissible चालू होता है, तो पट्टी एक क्लोज़ बटन दिखाती है और उसके बाद उस विज़िटर के लिए छिपी रहती है। डिसमिस की कुंजी डिफ़ॉल्ट रूप से कंटेंट टेक्स्ट होती है, इसलिए संदेश संपादित करने पर बैनर वापस आ जाता है; संपादनों के बाद भी उसे डिसमिस बनाए रखने के लिए एक स्थिर id सेट करें।
किसी बहुभाषी साइट पर, content और लिंक का text लोकेल कोड से टेक्स्ट तक का एक मैप भी स्वीकार करते हैं। हर पेज अपनी लोकेल की प्रविष्टि दिखाता है, और उसके न होने पर डिफ़ॉल्ट लोकेल की प्रविष्टि पर लौट आता है, और जब भी पाठक की लोकेल उस पेज को सर्व करती है, लिंक उसी लोकेल में चला जाता है:
banner: {
content: { en: "Version 2.0 is here!", fr: "La version 2.0 est là !" },
link: {
text: { en: "Read the release notes", fr: "Lire les notes de version" },
href: "/changelog",
},
},
अनूदित बैनर डिसमिस की कुंजी डिफ़ॉल्ट लोकेल के टेक्स्ट पर आधारित रखता है, इसलिए एक बार डिसमिस करने पर वह हर भाषा में छिप जाता है।
फ़ुटर
हर पेज एक फ़ुटर के साथ समाप्त होता है: हेडर जितनी ऊँची एक पंक्ति, जिसके एक ओर आपके लिंक्स, दूसरी ओर सोशल प्रोफ़ाइल आइकॉन, और उनके बीच में केंद्रित एक कॉपीराइट पंक्ति होती है। फ़ुटर ही वह एकमात्र जगह है जहाँ Blume आपकी सोशल प्रोफ़ाइलों और रिपॉज़िटरी से लिंक करता है, इसलिए जब भी github रिपॉज़िटरी सेट हो, वह आइकॉन में सबसे पहले आती है। बाकी footer जोड़ता है:
footer: {
copyright: "© 2026 Acme, Inc.",
links: [
{ label: "Pricing", href: "https://acme.dev/pricing" },
{ label: "Changelog", href: "/changelog" },
{ label: "Blog", href: "https://acme.dev/blog" },
],
socials: {
x: "https://x.com/acme",
discord: "https://discord.gg/acme",
},
},
copyright सादा टेक्स्ट है, इसलिए © के बजाय सीधे © ही लिखें। ऐसे वर्ष के लिए जो अपने आप अद्यतन बना रहे, एक टेम्पलेट लिटरल का उपयोग करें: `© ${new Date().getFullYear()} Acme, Inc.`। links उसी क्रम में दिखते हैं जिसमें आप उन्हें लिखते हैं। आंतरिक लिंक्स ऐसे लिखें मानो साइट रूट पर माउंट हो; बाहरी लिंक नए टैब में खुलता है। किसी बहुभाषी साइट पर, copyright और label में से हर एक लोकेल कोड से टेक्स्ट तक का एक मैप हो सकता है, और जब भी पाठक की लोकेल उस पेज को सर्व करती है, आंतरिक लिंक उसी लोकेल में चला जाता है। socials किसी प्लेटफ़ॉर्म को उसके प्रोफ़ाइल URL से मैप करता है, और आइकॉन उसी क्रम में दिखते हैं जिसमें आप उन्हें लिखते हैं। प्लेटफ़ॉर्म ये हैं: bluesky, discord, facebook, github, hacker-news, instagram, linkedin, medium, podcast, reddit, slack, telegram, threads, website, x, और youtube। github सोशल रिपॉज़िटरी लिंक की जगह ले लेता है; उस लिंक को navigation.repo से छिपाएँ।
जिस साइट में न कॉपीराइट हो, न लिंक्स, न प्रोफ़ाइलें, न रिपॉज़िटरी, उसमें कोई फ़ुटर नहीं होता। PageLayout पर बने कस्टम पेज भी इसे दिखाते हैं, जब तक कि वे लेआउट का अपना footer स्लॉट न भरें। इसे पूरी तरह बदलने के लिए, Footer लेआउट स्लॉट को ओवरराइड करें।
कंटेंट
आपका कंटेंट कहाँ रहता है और Blume उसे कैसे खोजता है। फ़ाइलें रूट्स कैसे बनती हैं, इसके लिए पेज देखें।
content: {
root: "docs",
}
| विकल्प | डिफ़ॉल्ट | विवरण |
|---|---|---|
root |
"docs" |
वह फ़ोल्डर जिसे Blume कंटेंट के लिए स्कैन करता है। एकल filesystem() स्रोत के लिए शॉर्टहैंड; sources के साथ इसकी अनुमति नहीं है। |
include |
["**/*.{md,mdx}"] |
वे ग्लोब्स जो कंटेंट फ़ाइलों से मेल खाते हैं। root की तरह शॉर्टहैंड। |
exclude |
["**/_*", "**/.*"] |
नज़रअंदाज़ करने के लिए ग्लोब्स। आपके ग्लोब्स डिफ़ॉल्ट्स में जुड़ जाते हैं, जो अंडरस्कोर- और डॉट-फ़ाइलों को छोड़ देते हैं; ! वाली प्रविष्टि किसी पैटर्न को हटा देती है, इसलिए "!**/_*" _ से शुरू होने वाली फ़ाइलों को प्रकाशित करता है। root की तरह शॉर्टहैंड। |
sources |
एक filesystem() |
blume/sources से कंटेंट स्रोत अडैप्टर, जो शॉर्टहैंड की जगह लेते हैं। कंटेंट स्रोत देखें। |
pages |
"pages" |
कस्टम .astro पेजों के लिए फ़ोल्डर। |
defaultType |
"doc" |
जब फ़्रंटमैटर में type न हो तो उपयोग किया जाने वाला पेज type। |
types |
{} |
प्रति-प्रकार कंटेंट परिभाषाएँ — कस्टम फ़्रंटमैटर कुंजियाँ जो एक ही type वाले पेजों तक सीमित होती हैं। फ़्रंटमैटर देखें। |
स्टैटिक एसेट्स public/ में रहती हैं — public/logo.png पर मौजूद फ़ाइल /logo.png पर सर्व होती है, इसलिए  जैसा संदर्भ public/images/create.png के सापेक्ष हल होता है। सापेक्ष पाथ से संदर्भित इमेज () इसके बजाय आपके कंटेंट के बगल में रहती हैं, और बिल्ड समय पर ऑप्टिमाइज़ की जाती हैं।
इमेज
सापेक्ष पाथ से संदर्भित लोकल इमेज बिल्ड समय पर अपने आप ऑप्टिमाइज़ हो जाती हैं — कंप्रेस की जाती हैं, WebP में बदली जाती हैं, और उन्हें अंतर्निहित width/height एट्रिब्यूट्स दिए जाते हैं ताकि लोड होते समय लेआउट न खिसके। कॉन्फ़िगर करने को कुछ नहीं है; लेखन संबंधी मार्गदर्शन के लिए लिंक और इमेज देखें।
रिमोट इमेज डिफ़ॉल्ट रूप से बिना छेड़े सर्व की जाती हैं। Blume उन्हें भी बिल्ड समय पर डाउनलोड और ऑप्टिमाइज़ करे, इसके लिए उनके होस्ट्स को अधिकृत करें:
image: {
domains: ["cdn.example.com"],
remotePatterns: [{ protocol: "https", hostname: "**.example.com" }],
}
| विकल्प | डिफ़ॉल्ट | विवरण |
|---|---|---|
domains |
[] |
वे होस्टनेम जिनकी रिमोट इमेज ऑप्टिमाइज़ की जा सकती हैं। |
remotePatterns |
[] |
पैटर्न-आधारित प्राधिकरण (protocol, hostname, port, pathname); होस्टनेम *. (एक स्तर) और **. (किसी भी गहराई) वाइल्डकार्ड स्वीकार करते हैं। |
फ़्रंटमैटर
पेज फ़्रंटमैटर की सख़्ती से जाँच होती है — कोई अनजान कुंजी बिल्ड को विफल कर देती है, इसलिए टाइपो जल्दी पकड़ में आ जाते हैं। प्रोजेक्ट-विशिष्ट मेटाडेटा (एक ओनर, एक समीक्षा तिथि) रखने के लिए, अतिरिक्त कुंजियों को frontmatter.extend के अंतर्गत घोषित करें, हर एक को आपके द्वारा दिए गए स्कीमा से मैप करके:
import { defineConfig } from "blume";
import { z } from "zod";
export default defineConfig({
frontmatter: {
extend: {
owner: z.string(),
reviewedAt: z.coerce.date().optional(),
},
},
});
कोई भी Standard Schema लाइब्रेरी काम करती है — Zod (आपका प्रोजेक्ट जो भी संस्करण इंस्टॉल करे), Valibot, ArkType। एक्सटेंशन से बाहर की कुंजियाँ सख़्ती से जाँची जाती रहती हैं, इसलिए टाइपो पकड़ने में कोई बदलाव नहीं आता। जाँच के अर्थ-नियमों के लिए कस्टम कुंजियाँ देखें।
extend के अंतर्गत दी गई कुंजियाँ साइट-व्यापी लागू होती हैं। कुंजियों को केवल एक कंटेंट प्रकार के पेजों पर आवश्यक बनाने के लिए — किसी RFC का status, किसी रनबुक का service — उन्हें इसके बजाय content.types के अंतर्गत प्रति-प्रकार घोषित करें:
import { defineConfig } from "blume";
import { z } from "zod";
export default defineConfig({
content: {
types: {
rfc: {
facets: ["domain", "status"],
frontmatter: {
domain: z.string(),
status: z.enum(["draft", "review", "enforced"]),
},
},
},
},
});
कोई कुंजी या तो साइट-व्यापी घोषित की जा सकती है या प्रति-प्रकार, दोनों नहीं। स्कोपिंग कैसे हल होती है, इसके लिए प्रति-प्रकार कुंजियाँ देखें।
facets उन कस्टम कुंजियों के नाम देता है जिनके मान फ़िल्टर करने योग्य मेटाडेटा बन जाते हैं: वे खोज दस्तावेज़ों (blume-search.json और MCP इंडेक्स) के साथ चलती हैं, और MCP टूल्स एक filters इनपुट स्वीकार करते हैं जो उनसे मेल खाता है, ताकि कोई एजेंट, मान लीजिए, architecture डोमेन में केवल enforced RFC ही प्राप्त कर सके। हर फ़ैसेट एक घोषित कस्टम कुंजी होनी चाहिए — प्रति-प्रकार या साइट-व्यापी — और केवल स्ट्रिंग (या स्ट्रिंग में बदले गए संख्या/बूलियन) मान ही फ़ैसेट बनते हैं।
GitHub
github के ज़रिए Blume को अपनी रिपॉज़िटरी की ओर इंगित करें। यह फ़ुटर के रिपॉज़िटरी लिंक और Edit on GitHub पेज एक्शन को संचालित करता है:
github: {
owner: "acme",
repo: "docs",
}
| विकल्प | डिफ़ॉल्ट | विवरण |
|---|---|---|
owner |
— | वह GitHub अकाउंट या संगठन जिसके पास रिपॉज़िटरी है। |
repo |
— | रिपॉज़िटरी का नाम। |
branch |
"main" |
वह ब्रांच जिस पर एडिट लिंक इंगित करते हैं। |
dir |
— | रिपो रूट से प्रोजेक्ट रूट तक का पाथ (मोनोरिपो के लिए)। |
host |
"https://github.com" |
Enterprise इंस्टॉलेशनों के लिए, GitHub इंस्टेंस का ऑरिजिन। HTTP(S) होना चाहिए; उसके ऑरिजिन में सामान्यीकृत किया जाता है। |
api |
host से व्युत्पन्न |
REST API बेस, किसी Enterprise इंस्टेंस के विरुद्ध <GithubInfo> के लिए। HTTP(S) होना चाहिए; एक ऑरिजिन और पाथ में सामान्यीकृत किया जाता है। |
GitHub Enterprise
जिन दस्तावेज़ों की रिपॉज़िटरी किसी GitHub Enterprise इंस्टेंस पर रहती है, वे host सेट करते हैं, और रिपो से निकला हर लिंक — हेडर का चिह्न, एडिट लिंक, एजेंट मैनिफ़ेस्ट — सार्वजनिक साइट के बजाय उसी इंस्टेंस की ओर इंगित करता है:
github: {
host: "https://github.acme.com",
owner: "acme",
repo: "docs",
}
<GithubInfo> जिस REST API बेस से क्वेरी करता है, वह host से व्युत्पन्न होता है: डेटा रेज़िडेंसी वाला Enterprise Cloud टेनेंट (acme.ghe.com) अपने api. सबडोमेन से सर्व होता है, और किसी भी अन्य होस्ट को Enterprise Server (/api/v3) माना जाता है। जब आपका इंस्टेंस कहीं और स्थित हो, तो api को स्पष्ट रूप से सेट करें।
अंतिम बार संशोधित
हर पेज के नीचे “Last updated on …” पंक्ति दिखाएँ। डिफ़ॉल्ट रूप से बंद; हर पेज की तिथि उसके git इतिहास से निकालने के लिए lastModified को "git" सेट करें:
lastModified: "git",
| मान | विवरण |
|---|---|
false |
अक्षम (डिफ़ॉल्ट)। |
"git" |
तिथि git इतिहास (कमिट तिथियों) से पढ़ें। |
"frontmatter" |
git कभी न चलाएँ — केवल lastModified फ़्रंटमैटर फ़ील्ड का उपयोग करें। |
git स्रोत हर फ़ाइल को छूने वाला सबसे हालिया कमिट पढ़ता है, इसलिए यह किसी भी git रिपॉज़िटरी में काम करता है — मोनोरिपो सहित — और बिल्ड समय पर रिपो का इतिहास चाहिए। यह git log --follow की तरह नाम-परिवर्तनों का अनुसरण करता है: page.md का नाम बदलकर page.mdx करने पर, या किसी फ़ाइल को उसी कंटेंट रूट के अंतर्गत किसी दूसरे फ़ोल्डर में ले जाने पर, पेज की तिथि तब तक बनी रहती है जब तक वह कमिट उसके कंटेंट को अपरिवर्तित छोड़ता है। जो नाम-परिवर्तन फ़ाइल को संपादित भी करता है, वह पेज की तिथि उसी कमिट की कर देता है, और कंटेंट रूट के बाहर से किसी फ़ाइल को अंदर लाने पर भी ऐसा ही होता है। CI प्लेटफ़ॉर्म आम तौर पर उथला (shallow) क्लोन चेकआउट करते हैं, जो चुपचाप ज़्यादातर तिथियाँ गिरा देता है (ऐसा होने पर बिल्ड BLUME_SHALLOW_GIT_HISTORY के साथ चेतावनी देता है): Vercel पर VERCEL_DEEP_CLONE=true एनवायरनमेंट वेरिएबल सेट करें; actions/checkout के साथ fetch-depth: 0 सेट करें। पेज का अपना lastModified फ़्रंटमैटर हमेशा जीतता है, जो किसी तिथि को पिन करने या अभी तक कमिट न हुई फ़ाइलों के लिए उपयोगी है:
---
title: My page
lastModified: 2026-06-20
---
सक्षम होने पर, तिथि पेज के स्ट्रक्चर्ड डेटा में schema.org dateModified के रूप में भी उत्सर्जित होती है।
तिथि प्रारूप
“Last updated” स्टैम्प और चेंजलॉग टाइमलाइन दोनों अपनी तिथियाँ एक ही dateFormat के ज़रिए रेंडर करते हैं, ताकि वे एक जैसी पढ़ी जाएँ। तिथियाँ हमेशा साइट की लोकेल में रेंडर होती हैं; dateFormat उनका स्वरूप नियंत्रित करता है। यह डिफ़ॉल्ट रूप से लंबे रूप में होता है (July 21, 2026, 2026年7月21日):
dateFormat: { dateStyle: "long" },
dateFormat Intl.DateTimeFormat विकल्पों के लिए एक पास-थ्रू है। किसी लंबाई के लिए dateStyle प्रीसेट का उपयोग करें:
dateFormat: { dateStyle: "medium" },
या 2026/07/21 जैसी संख्यात्मक शैली के लिए अलग-अलग घटक फ़ील्ड्स:
dateFormat: { year: "numeric", month: "2-digit", day: "2-digit" },
| विकल्प | विवरण |
|---|---|
dateStyle |
प्रीसेट लंबाई: "full", "long", "medium", या "short"। घटक फ़ील्ड्स के साथ नहीं जोड़ा जा सकता। |
weekday, era, year, month, day |
अलग-अलग घटक, जैसे year: "numeric", month: "2-digit"। |
timeZone |
IANA टाइम ज़ोन। डिफ़ॉल्ट UTC है, ताकि साइट कहीं भी बिल्ड हो, तिथि एक जैसी पढ़ी जाए। |
calendar, numberingSystem |
कैलेंडर प्रणाली (जैसे "japanese") और अंक प्रणाली (जैसे "arab")। |
timeZone, calendar, और numberingSystem स्वरूप नहीं बदलते: जो dateFormat केवल इन्हें सेट करता है, वह लंबा रूप ही बनाए रखता है।
SEO और एजेंट्स
मेटाडेटा, Open Graph इमेज, RSS फ़ीड्स, JSON-LD, साइटमैप, और robots.txt seo के अंतर्गत रहते हैं; llms.txt, कच्चा Markdown, JSON API, MCP सर्वर, और डिस्कवरी मैनिफ़ेस्ट agents के अंतर्गत रहते हैं। दोनों को खोज-योग्यता सेक्शन में पेज-दर-पेज कवर किया गया है, जो सर्च इंजनों और AI एजेंट्स को एक ही मशीन-पठनीय परत के दो दर्शक वर्गों की तरह देखता है। पाठकों के सामने आने वाले मॉडल फ़ीचर — सहायक और Open in chat एक्शन — ai के अंतर्गत रहते हैं।
seo: {
og: { enabled: true },
rss: { enabled: true, types: ["blog", "changelog"] },
sitemap: true,
robots: true,
structuredData: true,
}
| विकल्प | डिफ़ॉल्ट | विवरण |
|---|---|---|
og.enabled |
ऑटो | प्रति-पेज Open Graph इमेज — साइट URL सेट होने पर चालू। |
rss.enabled |
true |
ब्लॉग और चेंजलॉग कंटेंट के लिए फ़ीड्स बनाएँ (deployment.site चाहिए)। |
rss.types |
["blog", "changelog"] |
वे कंटेंट प्रकार जिन्हें अपनी-अपनी फ़ीड मिलती है। |
rss.limit |
50 |
प्रति फ़ीड अधिकतम आइटम। |
sitemap |
true |
sitemap.xml बनाएँ (deployment.site चाहिए)। |
robots |
true |
Sitemap लिंक के साथ robots.txt बनाएँ। |
structuredData |
true |
हर पेज के हेड में schema.org JSON-LD उत्सर्जित करें। |
ये पूर्ण URL के लिए एक निरपेक्ष deployment.site के साथ सबसे अच्छा काम करते हैं।
विषय-सूची
इस-पेज-पर वाली रूपरेखा डिफ़ॉल्ट रूप से चालू रहती है और H2–H3 शीर्षकों को सूचीबद्ध करती है। toc के साथ इसे बंद करें, या शीर्षक-सीमा बदलें:
export default defineConfig({
toc: false, // hide it everywhere
});
या इसके बजाय शीर्षक-सीमा को संकीर्ण करें:
export default defineConfig({
toc: { minHeadingLevel: 2, maxHeadingLevel: 4 },
});
पेज फ़ीडबैक
हर डॉक्स पेज के अंत में एक “Was this page helpful?” रेटिंग होती है। यह डिफ़ॉल्ट रूप से चालू रहती है; इसे हर जगह छिपाने के लिए feedback को false सेट करें:
export default defineConfig({
feedback: false,
});
पाठक का उत्तर एक feedback कस्टम इवेंट के रूप में — helpful ("yes" या "no"), path, और title के साथ — हर उस कॉन्फ़िगर किए गए एनालिटिक्स अडैप्टर के ज़रिए भेजा जाता है जिसके पास इवेंट API है, और साथ ही window पर एक blume:track इवेंट के रूप में भी। Fathom, Microsoft Clarity, और Hotjar किसी इवेंट का केवल नाम लेते हैं, उसकी प्रॉपर्टीज़ के बिना, इसलिए वे रेटिंग तो गिनते हैं लेकिन हाँ और ना में अंतर नहीं कर सकते। एनालिटिक्स अडैप्टर के बिना, उत्तर कहीं भी दर्ज नहीं होता, और कुकी सहमति चालू होने पर, रेटिंग केवल उन्हीं पाठकों को दिखती है जिन्होंने एनालिटिक्स की अनुमति दी है, क्योंकि किसी और से मिला उत्तर कहीं नहीं पहुँचता। प्रश्न और धन्यवाद वाला टेक्स्ट UI स्ट्रिंग्स हैं, जिनका अनुवाद आप i18n.ui के साथ कर सकते हैं।
लिखित फ़ीडबैक
हाँ या ना से अधिक जानने के लिए, टिप्पणियाँ चालू करें। किसी पेज को रेटिंग देने के बाद, पाठक को एक बॉक्स मिलता है जिसमें वे बता सकते हैं कि क्या अच्छा रहा या क्या कमी रह गई:
export default defineConfig({
feedback: { comments: true },
});
टिप्पणी एक feedback_comment इवेंट के रूप में भेजी जाती है, जिसमें रेटिंग वाले ही helpful, path, और title होते हैं, साथ ही पाठक की comment (अधिकतम 1,000 वर्ण)। यह रेटिंग वाले ही अडैप्टर्स के ज़रिए जाती है, इसलिए टिप्पणियाँ वहीं पढ़ें जहाँ आप इवेंट पढ़ते हैं। प्रोवाइडर किसी प्रॉपर्टी मान की लंबाई सीमित करते हैं, इसलिए लंबी टिप्पणी कटकर पहुँच सकती है: Google Analytics 100 वर्ण रखता है, Mixpanel 255 बाइट (जापानी जैसी किसी लिपि में, जिसमें एक वर्ण कई बाइट लेता है, इससे कम वर्ण), और Vercel Web Analytics 255 वर्णों तक के मान स्वीकार करता है, जबकि PostHog और Segment टिप्पणियों को पूरा भेजते हैं। Fathom, Clarity, और Hotjar तक टिप्पणी का कोई टेक्स्ट पहुँचता ही नहीं। Plausible हर टिप्पणी को सूचीबद्ध करने के बजाय समान मानों को समूहित करता है, इसलिए यह टिप्पणियों की तुलना में रेटिंग के लिए अधिक उपयुक्त है। पाठक बॉक्स में कुछ भी लिख सकते हैं, इसलिए टिप्पणियों को ऐसे बरतें मानो उनमें व्यक्तिगत जानकारी हो सकती है।
बॉक्स का लेबल और बटन भी UI स्ट्रिंग्स हैं (feedback.comment और feedback.send)।
फ़ीचर विकल्प
इनमें से हर एक की अपनी गाइड है। कॉन्फ़िग फ़ील्ड प्रवेश-बिंदु है:
| फ़ील्ड | यह क्या कॉन्फ़िगर करता है | गाइड |
|---|---|---|
theme |
एक्सेंट रंग, कोने की त्रिज्या, फ़ॉन्ट्स, लाइट/डार्क मोड | थीमिंग |
navigation |
स्पष्ट साइडबार और हेडर टैब्स | नेविगेशन |
search |
प्रोवाइडर (Orama, Pagefind, Algolia, और अन्य) और इंडेक्सिंग | खोज |
markdown |
मार्कडाउन रेंडरिंग विकल्प — कोड ब्लॉक्स, हेडिंग एंकर, इमेज ज़ूम | सिंटैक्स |
agents |
कोडिंग एजेंट्स के लिए llms.txt, Markdown मिरर, JSON API, होस्टेड MCP सर्वर, स्किल्स, और डिस्कवरी मैनिफ़ेस्ट |
SEO और GEO |
ai |
पेज के भीतर मौजूद सहायक और Open in chat एक्शन | सहायक |
rateLimit |
एक पाठक कितनी बार सहायक, प्लेग्राउंड प्रॉक्सी, और सर्वर-साइड खोज को कॉल कर सकता है — blume/ratelimit के एक अडैप्टर के साथ (डिफ़ॉल्ट रूप से चालू) |
रेट लिमिटिंग |
narration |
“Listen to this page” प्लेयर, ब्राउज़र की आवाज़ों या बिल्ड के समय जनरेट की गई आवाज़ों के साथ | नैरेशन |
reference |
API संदर्भ: blume/reference से openapi(), asyncapi(), graphql(), और scalar() अडैप्टर |
OpenAPI, AsyncAPI, GraphQL, Scalar |
api |
हाथ से लिखे गए एंडपॉइंट पेजों का सर्वर, ऑथ, और Try it पैनल | हाथ से लिखे गए API पेज |
analytics |
blume/analytics से अडैप्टर — PostHog, Google Analytics, Plausible, Mixpanel, Segment, और अन्य — साथ ही कस्टम स्क्रिप्ट्स |
एनालिटिक्स |
consent |
blume/consent से एक कुकी सहमति अडैप्टर — Blume का अपना बैनर, Osano, या Ethyca — जो पाठक की अनुमति मिलने तक एनालिटिक्स को रोके रखता है |
कुकी सहमति |
seo |
मेटाडेटा, OG इमेज, फ़ीड्स, स्ट्रक्चर्ड डेटा, साइटमैप, robots | SEO और GEO |
deployment |
blume/deploy से एक होस्ट अडैप्टर, या स्टैटिक बिल्ड के लिए { site, base } |
डिप्लॉयमेंट |
redirects |
स्थायी और अस्थायी रीडायरेक्ट्स | डिप्लॉयमेंट |
poweredBy |
X-Powered-By: Blume रिस्पॉन्स हेडर (डिफ़ॉल्ट true) |
डिप्लॉयमेंट |
integrations |
Blume के अंतर्निर्मित इंटीग्रेशन के बाद जोड़े गए Astro इंटीग्रेशन | कस्टमाइज़ेशन |
basePath |
एक पाथ जिसके अंतर्गत हर जनरेट किया गया रूट माउंट होता है (जैसे /docs), और जो साइडबार में दिखाई नहीं देता |
डिप्लॉयमेंट |
i18n |
लोकेल्स, डिफ़ॉल्ट लोकेल, और अनूदित UI स्ट्रिंग्स | अंतर्राष्ट्रीयकरण |
versions |
संस्करण स्विचर के साथ पुराने दस्तावेज़ों के स्थिर स्नैपशॉट | वर्ज़निंग |
export |
पाठकों के लिए PDF और EPUB डाउनलोड | एक्सपोर्ट |
examples |
<Component path> उदाहरण प्रीव्यू कहाँ रहते हैं, और उनके फ़्रेम्स में इंजेक्ट की जाने वाली CSS |
Component |
react |
React आइलैंड का व्यवहार — React Compiler का ऑटो-मेमोइज़ेशन | आइलैंड्स |
variables |
वे मान जिन्हें {{name}} किसी भी पेज में पढ़ता है |
वेरिएबल्स |
feedback |
हर पेज के अंत में “Was this page helpful?” रेटिंग (डिफ़ॉल्ट true), और उसके बाद वैकल्पिक लिखित टिप्पणियाँ |
पेज फ़ीडबैक |
changelog |
जनरेट किए गए /changelog इंडेक्स का शीर्षक और विवरण, हर एक कोई स्ट्रिंग या प्रति-लोकेल मैप |
चेंजलॉग |
प्राथमिकता
सेटिंग्स सबसे कम से सबसे अधिक प्राथमिकता के क्रम में हल होती हैं, इसलिए आपको केवल वही ओवरराइड करना पड़ता है जिसकी ज़रूरत हो:
Blume डिफ़ॉल्ट्स
blume.config.ts
फ़ोल्डर मेटा
किसी सेक्शन के शीर्षक और क्रम के लिए meta.ts।
पेज फ़्रंटमैटर