मेरा पहला ब्लॉग

समस्या विवरण:
प्लेटफ़ॉर्म के पास अभी कोई कंटेंट मार्केटिंग चैनल नहीं है। एक ब्लॉग प्रत्येक टेनेंट को यह सक्षम करेगा कि वे Strapi CMS में लिखे गए, SEO‑अनुकूलित, बहुभाषी लेख प्रकाशित कर सकें, जिन्हें SvelteKit ऐप में रेंडर किया जाए — जिससे ऑर्गेनिक ट्रैफ़िक बढ़े, प्राधिकरण स्थापित हो, और मौजूदा 13‑लोकैल i18n पाइपलाइन को मज़बूती मिले।
सफलता के मापदंड
- Strapi में लिखी गई ब्लॉग पोस्टें फ्रंटएंड पर टेनेंट की ब्रांडिंग के साथ रेंडर हों
- पोस्टें मौजूदा webhook पाइपलाइन के ज़रिए बिना किसी अनुवाद इंफ्रा बदलाव के सभी 13 लोकैल्स में अपने‑आप अनूदित हो जाएँ
- ब्लॉग पेज सर्च इंजनों में रैंक करें (structured data, sitemap, hreflang, og:article लागू हों)
- जिन टेनेंट्स के पास
blogफीचर फ़्लैग नहीं है, उन्हें कोई ब्लॉग रूट न दिखे (404)
User Stories
- एक content author के रूप में, मैं Strapi में रिच मार्कडाउन, इमेज और वीडियो एम्बेड्स के साथ ब्लॉग पोस्ट लिखना चाहता/चाहती हूँ ताकि मैं बिना कोड छुए कंटेंट पब्लिश कर सकूँ।
- एक site visitor के रूप में, मैं ब्लॉग पोस्ट्स को कैटेगरी के हिसाब से फ़िल्टर करके ब्राउज़ करना चाहता/चाहती हूँ ताकि मुझे अपने लिए प्रासंगिक कंटेंट मिल सके।
- एक site visitor के रूप में, मैं लंबी पोस्ट्स पर एक टेबल ऑफ़ कंटेंट्स चाहता/चाहती हूँ ताकि मैं जल्दी‑से नेविगेट कर सकूँ।
- एक site visitor के रूप में, मैं पोस्ट्स को अपनी भाषा में पढ़ना चाहता/चाहती हूँ, जहाँ अंग्रेज़ी से ऑटोमैटिक ट्रांसलेशन हो।
- एक site visitor के रूप में, मैं पोस्ट्स को सोशल मीडिया पर शेयर करना चाहता/चाहती हूँ।
- एक site visitor के रूप में, मैं संबंधित पोस्ट्स खोज पाना और लेखक के बारे में जानना चाहता/चाहती हूँ।
- एक SEO manager के रूप में, मैं चाहता/चाहती हूँ कि हर पोस्ट में सही मेटा टैग्स, स्ट्रक्चर्ड डेटा और साइटमैप एंट्रीज़ हों।
Functional Requirements
Must Have (MVP)
- Strapi कंटेंट टाइप्स:
blog-posts,blog-authors,blog-categories— इन सभी में tenant, locale, inherit फ़ील्ड हों - ब्लॉग लिस्टिंग पेज (
/blog) — पोस्ट्स की पेजिनेटेड ग्रिड, क्वेरी पैराम के ज़रिए कैटेगरी फ़िल्टर - पोस्ट डिटेल पेज (
/blog/[slug]) — पूरा markdown रेंडरिंग, ToC, ऑथर कार्ड, रिलेटेड पोस्ट्स, सोशल शेयर के साथ - कैटेगरी पेज (
/blog/category/[slug]) — वही लिस्टिंग कॉम्पोनेंट्स री–यूज़ करके फ़िल्टर्ड लिस्टिंग - ऑथर पेज (
/blog/author/[slug]) — ऑथर बायो + उनकी पोस्ट्स - टेबल ऑफ़ कंटेंट्स — h2/h3 हैडिंग्स से ऑटो–जेनरेटेड, डेस्कटॉप पर स्टिकी साइडबार, मोबाइल पर कोलैप्सिबल, Intersection Observer के ज़रिए ऐक्टिव हैडिंग हाइलाइट
- YouTube/Vimeo एम्बेड्स — markdown में दी गई बेयर URLs अपने–आप responsive iframes में कन्वर्ट हों (प्राइवेसी के लिए youtube-nocookie.com)
- रीड टाइम — वर्ड काउंट से server-side कैलकुलेटेड (Math.ceil(words / 200))
- सोशल शेयर बटन — X, Facebook, LinkedIn, ईमेल, कॉपी–लिंक (जहाँ उपलब्ध हो वहाँ Web Share API का इस्तेमाल)
- रिलेटेड पोस्ट्स — वही कैटेगरी, करंट पोस्ट को exclude करें, लिमिट 3, publishedAt desc के हिसाब से sort
- RSS फ़ीड (
/blog/rss.xml) — RSS 2.0, locale क्वेरी पैराम के ज़रिए - SEO — हर पोस्ट के लिए SeoComponent, og:article टैग्स, BlogPosting JSON-LD स्कीमा, canonical URLs
- Sitemap — मौजूदा sitemap में dynamic ब्लॉग पोस्ट/कैटेगरी/ऑथर URLs add हों, hreflang के साथ
- फ़ीचर फ्लैग — TenantConfig.features में
blog: boolean, फ़ीचर डिसेबल होने पर layout guard 404 रिटर्न करे - i18n — सभी UI स्ट्रिंग्स (nav, लेबल्स, पेजिनेशन) के लिए Paraglide मैसेज कीज़, Strapi कंटेंट मौजूदा webhook के ज़रिए ऑटो–ट्रांसलेटेड
- पेजिनेशन — Strapi की native पेजिनेशन के साथ page-based (प्रति पेज 9 पोस्ट्स)
- फ़ीचर्ड पोस्ट — blog-posts पर boolean
featuredफ़्लैग;/blogलिस्टिंग पेज के टॉप पर फ़ीचर्ड पोस्ट एक hero कार्ड के रूप में दिखे (बड़ा कार्ड, फुल–विड्थ, ग्रिड के ऊपर)
Nice to Have (Post-MVP)
- ब्लॉग पोस्ट्स पर फुल–टेक्स्ट सर्च
- पोस्ट सीरीज़ / मल्टी–पार्ट आर्टिकल्स
- रीडिंग प्रोग्रेस बार
- कमेंट्स (संभावित रूप से थर्ड–पार्टी एम्बेड के ज़रिए)
- पोस्ट्स के अंदर न्यूज़लेटर signup CTA
- व्यू काउंट / एनालिटिक्स इंटीग्रेशन
Technical Requirements
Data Model (Strapi Content Types)
blog-posts (api::blog-post.blog-post):
| Field | Type | Localized | Notes |
|---|---|---|---|
| title | Text (required) | Yes | अनुवाद कॉन्फ़िग द्वारा मिलान किया गया |
| slug | UID (from title) | No | अनुवाद से बाहर रखा गया |
| excerpt | Text | Yes | कार्ड्स + मेटा डिस्क्रिप्शन के लिए |
| body | Rich Text (Markdown) | Yes | marked के ज़रिए रेंडर किया गया |
| featuredImage | Media (single) | No | URL + alternativeText |
| category | Relation (manyToOne -> blog-category) | No | |
| author | Relation (manyToOne -> blog-author) | No | |
| featured | Boolean (default false) | No | फ़ीचर्ड पोस्ट लिस्टिंग पर हीरो कार्ड के रूप में दिखाई जाएगी |
| seo | Component (shared.seo) | Yes | मौजूदा SeoComponent का पुन: उपयोग |
| tenant | Text | No | मानक tenant फ़िल्टर |
| inherit | Boolean (default true) | No | ऑटो‑ट्रांसलेशन फ़्लैग |
blog-authors (api::blog-author.blog-author):
| Field | Type | Localized | Notes |
|---|---|---|---|
| name | Text (required) | Yes | |
| slug | UID (from name) | No | |
| bio | Rich Text (Markdown) | Yes | |
| avatar | Media (single) | No | |
| socialLinks | JSON | No | { twitter?, linkedin?, website? } |
| tenant | Text | No | |
| inherit | Boolean (default true) | No |
blog-categories (api::blog-category.blog-category):
| Field | Type | Localized | Notes |
|---|---|---|---|
| name | Text (required) | Yes | |
| slug | UID (from name) | No | |
| description | Text | Yes | |
| color | Text | No | UI बैज के लिए हेक्स रंग |
| tenant | Text | No | |
| inherit | Boolean (default true) | No |
TypeScript Interfaces
BlogPost, BlogAuthor, BlogCategory के लिए src/lib/services/strapi-types.ts देखें।
Routes
सभी src/routes/(marketing)/blog/ के अंतर्गत:
| Route | Server Load | Purpose |
|---|---|---|
blog/+layout.server.ts |
फ़ीचर गार्ड + कैटेगरीज़ लोड | गेट + नेव डेटा |
blog/+page.server.ts |
पेजिनेटेड पोस्ट्स, वैकल्पिक ?category= फ़िल्टर |
लिस्टिंग |
blog/[slug]/+page.server.ts |
स्लग से पोस्ट + संबंधित पोस्ट्स + रीड टाइम कैलकुलेशन | डिटेल |
blog/category/[slug]/+page.server.ts |
कैटेगरी के आधार पर फ़िल्टर की गई पोस्ट्स | कैटेगरी लिस्टिंग |
blog/author/[slug]/+page.server.ts |
लेखक + उनकी पोस्ट्स | लेखक पेज |
blog/rss.xml/+server.ts |
RSS 2.0 XML, ?locale= पैरामीटर |
फ़ीड |
UI Components
सभी src/lib/components/blog/ में:
| Component | Props | Notes |
|---|---|---|
BlogPostCard.svelte |
post: BlogPost |
इमेज, कैटेगरी बैज, शीर्षक, एक्सरप्ट, लेखक, तारीख, रीड टाइम वाला कार्ड |
BlogPostContent.svelte |
body: string |
marked के ज़रिए Markdown से HTML, वीडियो एंबेड एक्सटेंशन + हेडिंग IDs के साथ |
TableOfContents.svelte |
entries: TocEntry[] |
स्टिकी साइडबार, एक्टिव स्टेट के लिए Intersection Observer, मोबाइल पर कोलेप्सिबल |
AuthorCard.svelte |
author: BlogAuthor |
अवतार, नाम, बायो, सोशल लिंक्स |
SocialShare.svelte |
url: string, title: string |
Web Share API फ़ॉलबैक के साथ शेयर बटन |
RelatedPosts.svelte |
posts: BlogPost[] |
BlogPostCard की ग्रिड |
BlogPagination.svelte |
pagination: StrapiPagination, basePath: string |
प्रीव/नेक्स्ट + पेज नंबर |
सुरक्षा और ऑथ
- ब्लॉग पब्लिक है (कोई ऑथ ज़रूरी नहीं) — मार्केटिंग कंटेंट
- Strapi API रीड एक्सेस मौजूदा
STRAPI_JWTटोकन के ज़रिए - वीडियो एम्बेड्स GDPR अनुपालन के लिए
youtube-nocookie.comका उपयोग करते हैं
किनारे के मामले (Edge Cases) और त्रुटि प्रबंधन (Error Handling)
- पोस्ट नहीं मिली: SvelteKit के जरिए 404
error() - श्रेणी में कोई पोस्ट नहीं: खाली स्थिति,
blog_no_postsसंदेश के साथ - फ़ीचर्ड इमेज गायब: कार्ड इमेज के बिना रेंडर होता है
- अनुवाद उपलब्ध नहीं:
loadContentWithFallback()इंग्लिश पर फॉल्बैक करता है - RTL भाषाएँ: लेआउट
dir="rtl"(ar, he, ur) का सम्मान करता है
E2E टेस्ट प्लान
टेस्ट फाइलें tests/blog/ में हैं। मौजूदा पैटर्न का पालन करें: सभी viewports पर पैरामीटराइज़्ड, a11y के लिए Axe, networkidle Strapi कंटेंट के लिए वेट करता है।
Critical Path टेस्ट
- Blog listing लोड होती है —
/blogएक ग्रिड रेंडर करता है जिसमें पोस्ट कार्ड्स पर शीर्षक, अंश (excerpt), कैटेगरी बैज, लेखक, तारीख और पढ़ने का समय दिखता है। - Pagination काम करती है —
/blog?page=2रिज़ल्ट की दूसरी पेज दिखाता है; prev/next बटन सही तरह से नेविगेट करते हैं; पेज 1 पर "Previous" बटन नहीं होता। - Category फ़िल्टर — किसी कैटेगरी चिप पर क्लिक करने से पोस्ट फ़िल्टर होते हैं; URL
?category=<slug>पर अपडेट होता है; "All" चिप फ़िल्टर साफ कर देता है। - Post detail रेंडर होता है —
/blog/[slug]में शीर्षक, फीचर्ड इमेज, फ़ॉर्मैटेड बॉडी, ऑथर कार्ड, पढ़ने का समय और पब्लिश्ड डेट दिखाई देती है। - Table of Contents — पोस्ट डिटेल पेज h2/h3 headings से ToC जेनरेट करता है; ToC एंट्री पर क्लिक करने से उस heading तक स्क्रॉल होता है।
- Related posts — पोस्ट डिटेल में उसी कैटेगरी के अधिकतम 3 related posts दिखते हैं (current पोस्ट को छोड़कर)।
- Category पेज —
/blog/category/[slug]कैटेगरी का नाम, विवरण, और केवल उसी कैटेगरी की पोस्ट्स दिखाता है। - Author पेज —
/blog/author/[slug]में लेखक की बायो, अवतार, सोशल लिंक, और उनकी पोस्ट्स दिखती हैं। - Social share बटन — पोस्ट डिटेल पर share बटन विज़िबल हैं; "Copy link" URL कॉपी करता है और कन्फर्मेशन टेक्स्ट दिखाता है।
- RSS feed —
GET /blog/rss.xmlवैध XML लौटाता है जिसमेंContent-Type: application/rss+xmlहोता है और पोस्ट एंट्रीज़ शामिल होती हैं। - Navigation — साइट मेन्यू में blog लिंक
/blogपर नेविगेट करता है; breadcrumbs सही hierarchy दिखाते हैं। - Featured post —
/blogफीचर्ड पोस्ट को रेगुलर ग्रिड के ऊपर एक बड़े hero कार्ड के रूप में दिखाता है।
Edge Case और Error टेस्ट
- Post not found —
/blog/nonexistent-slugएक 404 पेज लौटाता है। - खाली category — जिस कैटेगरी में कोई पोस्ट नहीं है, वहाँ
blog_no_postsवाला empty state मैसेज दिखता है। - Missing featured image — पोस्ट कार्ड बिना इमेज के भी ग्रेसफुली रेंडर होता है (कोई टूटा हुआ
<img>नहीं दिखता)। - Missing author/category — बिना लेखक या कैटेगरी वाली पोस्ट उन एलिमेंट्स के बिना रेंडर होती है (क्रैश नहीं होना चाहिए)।
- Feature flag disabled — जब
blog: false,/blog404 लौटाता है।
Cross-Cutting टेस्ट
- i18n: locale स्विच —
/fr/blogपर नेविगेट करें, वेरिफ़ाई करें कि UI strings (पेज टाइटल, "Read more", pagination लेबल्स) फ़्रेंच में हैं; अगर पोस्ट कंटेंट अनुवादित नहीं है तो वह English में फॉल बैक होता है। - i18n: RTL layout —
/ar/blogऔर/ar/blog/[slug]पर नेविगेट करें, वेरिफ़ाई करें किdir="rtl"सेट है और layout सही तरह रेंडर होता है (ToC सही साइड पर है)। - SEO: meta tags — पोस्ट डिटेल पेज में
og:type=article,og:title,og:description,article:published_timeऔर canonical link मौजूद हैं। - SEO: JSON-LD — पोस्ट डिटेल पेज में
@type: BlogPosting, headline, author, datePublished के साथ एक<script type="application/ld+json">मौजूद है। - SEO: sitemap —
/sitemap.xmlमें blog पोस्ट URLs शामिल हैं, जिन पर hreflang alternates सेट हैं। - Accessibility —
/blog,/blog/[slug],/blog/author/[slug]पर मोबाइल और डेस्कटॉप दोनों viewports में Axe audits चलाएँ (मौजूदा a11y टेस्ट पैटर्न का पालन करें)। - Keyboard navigation — ToC एंट्रीज़ और pagination बटन कीबोर्ड से focusable और activatable हैं; focus indicators विज़िबल हैं।
दायरे से बाहर
- ब्लॉग पोस्ट टिप्पणियाँ
- फुल-टेक्स्ट सर्च
- पोस्ट के भीतर न्यूज़लेटर इंटीग्रेशन
- एनालिटिक्स/व्यू काउंट्स
- प्रति टेनेंट कस्टम पोस्ट टेम्पलेट्स
Ludo टेक्नोलॉजी क्षेत्र के एक शिक्षक और उद्यमी हैं, जिन्हें एक सरल विश्वास प्रेरित करता है: गुणवत्तापूर्ण शिक्षा सबके लिए सुलभ होनी चाहिए।