How We Built a Dynamic Blog with Astro and RequestDesk (And Why Your Schema Markup Shouldn't Be an Afterthought)
Most static site generators treat structured data as an afterthought. You either hardcode it into templates or bolt on a plugin that generates basic schema. Neither approach scales well when your content lives in a CMS.
We had a different problem to solve. Our blog content lives in RequestDesk. Our marketing site runs on Astro. We needed the two to talk to each other in a way that gave us full control over the structured data output.
The Setup
Our architecture is straightforward:
- RequestDesk stores blog posts (title, content, excerpt, categories, tags, publish date, word count)
- Astro runs in hybrid mode with SSR enabled for the blog routes
- When someone visits
/blog/post-slug, Astro fetches the post from our API and renders it server-side - The JSON-LD schema is generated dynamically from the post data
This means every blog post gets fresh, accurate structured data without us touching a template every time we publish.
What the Schema Includes
We built a BlogStructuredData component that generates a full @graph structure:
- WebSite - Site context and publisher info
- Organization - Company details, logo, social profiles
- WebPage - The page itself with breadcrumb references
- ImageObject - Featured image with proper attribution
- BreadcrumbList - Navigation path (Home > Blog > Post Title)
- Article/BlogPosting - The actual content with all the metadata
Each entity links to the others through @id references. Google and LLMs can traverse the graph to understand relationships.
Why This Matters for AEO
Search is changing. Google still matters, but AI assistants (ChatGPT, Perplexity, Claude) are increasingly how people find information. They consume structured data differently than traditional crawlers.
When an AI assistant encounters a page with comprehensive JSON-LD, it can:
- Extract facts with confidence (publish date, author, reading time)
- Understand content hierarchy (what's the main topic, what are subsections)
- Cite sources accurately (proper URLs, attribution)
- Surface content in conversational responses
Our schema includes wordCount, timeRequired (reading time in ISO 8601 format), keywords, and articleSection. These aren't required for Google rich snippets, but they help AI systems understand the content better.
The Technical Details
For anyone building something similar, here's what we learned:
Dates need timezones. Google's Rich Results Test will flag 2026-01-24T17:18:50 as missing timezone info. Append Z for UTC or include the offset. We wrote a helper function that checks if the date already has timezone info before appending.
Use @graph structure. Instead of a flat BlogPosting object, wrap everything in a @graph array. This lets you define entities once and reference them by @id elsewhere. Cleaner, more maintainable, better for complex pages.
SSR is worth it for blogs. We could have built this as a static site with pre-rendered pages, but SSR means our schema is always current. Edit a post in RequestDesk, the live page reflects it immediately. No rebuild required.
Component-based schema generation. Our BlogStructuredData.astro component takes a post object and page URL as props. All the schema logic lives in one place. When Google changes their requirements (and they will), we update one file.
What We Skipped
We could have added more schema types:
FAQPagefor posts with Q&A sectionsHowTofor tutorial postsReviewfor product content
We built the foundation to support these. The component already handles optional FAQ data if present on the post. But we're not forcing schema types where they don't belong. A thought leadership piece doesn't need HowTo markup just because we can add it.
The Result
After deploying, we ran the post through Google's Rich Results Test:
- Article schema: Valid
- Breadcrumb schema: Valid
- Zero errors, zero warnings
The blog is now eligible for rich snippets and properly structured for AI discovery. Every new post gets the same treatment automatically.
Try It Yourself
View source on any post at requestdesk.ai/blog and search for application/ld+json. You'll see the full graph structure.
If you're building content systems and want this level of control over your structured data, that's exactly what RequestDesk is for. Your content, your schema, your rules.