Showing Posts From

Tutorials

The Complete Guide to Multi-Author Publishing

The Complete Guide to Multi-Author Publishing

The Complete Guide to Multi-Author Publishing Bookworm Light's multi-author system represents a fundamental shift in how we think about content attribution. This comprehensive guide will walk you through everything you need to know to leverage collaborative authorship effectively, from basic configuration to advanced workflows. Why Multi-Author Matters Traditional content management systems were built around a simple assumption: one article equals one author. This worked fine for personal blogs and small publications, but it fails to capture the reality of modern content creation. Consider these common scenarios:Academic Publications: Research papers typically have multiple authors with different contributions News Organizations: Articles often involve reporters, editors, photographers, and fact-checkers Corporate Content: Marketing materials frequently combine input from product, marketing, and legal teams Educational Resources: Course content may be developed by subject matter experts, instructional designers, and reviewers Open Source Documentation: Technical docs evolve through contributions from many community membersIn all these cases, proper attribution matters - both for giving credit where it's due and for helping readers understand the expertise behind the content. The Technical Foundation Schema Definition At the heart of Bookworm Light's multi-author support is a carefully designed schema that treats authors as a first-class array: import { z, defineCollection } from 'astro:content';const blogCollection = defineCollection({ schema: z.object({ title: z.string(), description: z.string().optional(), date: z.coerce.date().optional(), image: z.string().optional(), // The key difference: authors is an ARRAY authors: z.array(z.string()).default(['admin']), categories: z.array(z.string()).default(['others']), tags: z.array(z.string()).default([]), draft: z.boolean().optional(), }), });This schema ensures that:Type Safety: TypeScript knows authors is always an array Default Values: Posts without specified authors default to ['admin'] Validation: Invalid author formats are caught at build timeContent Format In your JSON page definitions, authors are specified as an array: { "id": "my-collaborative-article", "title": "Our Team's Latest Findings", "metadata": { "authors": ["sarah-mitchell", "james-chen", "elena-rodriguez"], "date": "2026-08-10", "categories": ["research"] } }Automatic Conversion The platform adapter intelligently handles legacy single-author formats: Input (single author string): { "metadata": { "author": "John Doe" } }Output (converted to array): authors: - john-doeThis backward compatibility means you can migrate existing content without immediate rewrites. Author Collection Management File Structure Bookworm Light expects author files in the src/content/authors/ directory: src/content/ authors/ sarah-mitchell.md james-chen.md elena-rodriguez.md marcus-johnson.md platform-team.md documentation-team.md posts/ welcome.md multi-author-guide.md category-system.mdEach author file uses this frontmatter structure: --- title: "Sarah Mitchell" meta_title: "Sarah Mitchell - Senior Content Strategist" image: "/images/authors/sarah-mitchell.jpg" description: "Sarah Mitchell is a seasoned content strategist with over 12 years of experience in digital publishing." social: twitter: "https://twitter.com/sarahmitchell" linkedin: "https://linkedin.com/in/sarahmitchell" website: "https://sarahmitchell.com" ---Sarah Mitchell brings deep expertise in editorial workflows and multi-author collaboration systems. Her background includes leading content teams at HarperCollins Digital and Penguin Random House.Automatic Stub Generation When your content references authors that don't have profile files, the platform automatically generates stub files: --- title: "New Author" meta_title: "New Author - Author" image: "/images/authors/new-author.jpg" description: "Articles by New Author" ---These stubs prevent broken links while giving you a foundation to build upon. Rich Author Profiles For established authors, create comprehensive profiles that include:Professional Title: Their role and expertise Profile Image: A professional headshot Biography: Background, experience, and interests Social Links: Connections to their other platforms Content Body: Extended biography or additional contextPlatform Integration How the Adapter Works Our theme adapter performs several transformations:Author Collection: Scans all pages for unique author references Slug Normalization: Converts names to URL-safe slugs (Sarah Mitchell → sarah-mitchell) Profile Generation: Creates or updates author markdown files Frontmatter Formatting: Outputs YAML-compliant author arrays Social Link Mapping: Translates site.json social data to author profilesThe Extraction Process private extractAuthorsArray(page: Page): string[] { const metadata = page.metadata || {}; // Handle array format (preferred) if (Array.isArray(metadata.authors)) { return metadata.authors as string[]; } // Convert single author string to array if (typeof metadata.author === 'string') { return [this.slugify(metadata.author)]; } // Handle legacy array format if (Array.isArray(metadata.author)) { return metadata.author.map((a) => typeof a === 'string' ? this.slugify(a) : 'admin' ); } // Default fallback return ['admin']; }Author Pages and Attribution Automatic Author Pages Bookworm Light automatically generates author pages at /authors/[slug]. These pages include:Profile Header: Image, name, and title Biography: Full author description Social Links: Connected platforms with icons Article List: All posts by this authorIn-Article Attribution Every article displays its authors with:Linked Names: Clicking navigates to the author's profile Avatar Images: Small profile images next to names Multiple Author Support: Proper comma formatting for listsBest Practices Naming Conventions Consistent naming is crucial for multi-author systems:Use Slugs Consistently: If an author is sarah-mitchell in one post, use the same slug everywhere Avoid Variations: Don't mix james-chen, jchen, and james.chen Document Author IDs: Maintain a central list of approved author identifiers Handle Teams: Use team identifiers like platform-team for group authorshipProfile Completeness Invest in complete author profiles:Professional Photos: High-quality, consistent image sizing Detailed Bios: Help readers understand author expertise Active Social Links: Only include links to maintained profiles Regular Updates: Keep profiles current as roles changeAttribution Guidelines Establish clear guidelines for who gets attributed:Primary Authors: Those who wrote significant portions Contributors: Those who provided substantial input Reviewers: Whether to credit editorial review Order: Alphabetical, contribution-based, or role-basedAdvanced Workflows Team Authors For content produced by teams rather than individuals, create team author profiles: { "id": "platform-team", "name": "Platform Team", "title": "Core Development Team", "bio": "The Platform Team is responsible for core infrastructure..." }Guest Contributors For occasional contributors, decide whether to:Create full profiles (if they'll contribute again) Use minimal stubs (for one-time contributions) Attribute to a generic "Guest Contributor" profileMigration from Single-Author When migrating existing content:Inventory: List all current author references Normalize: Create a mapping of names to slugs Batch Convert: Update all posts to array format Verify: Check that all author pages render correctly Enhance: Gradually add rich profile contentTroubleshooting Common Issues Author page shows no posts:Verify the author slug matches exactly in both places Check for typos or case sensitivity issues Ensure posts aren't marked as draftAuthor image not displaying:Confirm the image path is correct Verify the image file exists in the public directory Check image format compatibilitySocial links not working:Ensure URLs include full protocol (https://) Verify the social platform key matches expected format Check for typos in URLsConclusion Multi-author publishing opens up new possibilities for collaborative content creation. By treating authors as first-class entities with proper profiles, attribution, and aggregation, we can better reflect the teamwork that goes into creating great content. Whether you're running a small team blog or a large publication with dozens of contributors, the patterns and practices in this guide will help you implement effective multi-author workflows.

Mastering the Category and Tag System

Mastering the Category and Tag System

Mastering the Category and Tag System Effective content organization is the foundation of a great reader experience. Bookworm Light provides a sophisticated taxonomy system that helps readers discover content while boosting your SEO performance. This guide explores every aspect of categories and tags, from basic implementation to advanced organizational strategies. The Philosophy of Content Organization Before diving into technical details, it's worth understanding why content organization matters. In an era of information overload, readers need clear pathways to find what they're looking for. A well-organized site:Reduces Bounce Rate: Readers find relevant content quickly Increases Time on Site: Easy navigation encourages exploration Improves SEO: Search engines reward logical site structure Builds Authority: Organized expertise signals credibility Supports Scaling: New content fits into established patternsCategories: Your Primary Taxonomy What Categories Are For Categories represent the primary classification of your content. Think of them as the main sections of a newspaper - broad enough to contain multiple articles, but specific enough to set clear expectations. { "metadata": { "categories": ["tutorials", "features"] } }Category Archive Pages Bookworm Light automatically generates archive pages for each category you use:URL Pattern Purpose/categories/ Index of all categories/categories/tutorials/ All posts in "tutorials"/categories/features/ All posts in "features"/categories/announcements/ All posts in "announcements"These pages are generated automatically - you don't need to create them manually. Category Best Practices Keep the Number Manageable Aim for 5-10 categories maximum. More than that dilutes their meaning and makes navigation confusing. If you find yourself needing more categories, consider whether some could be combined or represented as tags instead. Use Clear, Descriptive Names Categories should be immediately understandable:Good Categories Poor CategoriesTutorials StuffNews MiscCase Studies ThingsProduct Updates Category 1Plan for the Future Choose categories that can accommodate growth. "Web Development" is better than "React Tutorials" if you might cover other frameworks later. Consider Your Audience What terms do your readers use? Technical audiences might understand "API Documentation" while general audiences might prefer "How-To Guides." Tags: Secondary Classification The Role of Tags While categories provide primary organization, tags offer secondary classification for discovery and filtering. Tags are more specific and granular than categories. { "metadata": { "categories": ["tutorials"], "tags": ["astro", "javascript", "static-sites", "performance"] } }Tag Archive Pages Like categories, tags get their own archive pages:URL Pattern Purpose/tags/ Index of all tags/tags/astro/ All posts tagged "astro"/tags/javascript/ All posts tagged "javascript"Tags vs. Categories: Key DifferencesAspect Categories TagsQuantity 5-10 total UnlimitedPer Post 1-2 recommended 3-7 recommendedPurpose Primary classification Secondary descriptionHierarchy Top-level sections Flat structureNavigation Main menu, sidebar Tag clouds, filtersSEO Weight High MediumReader Expectation Major topic Related conceptsImplementation Details Platform Adapter Processing The Bookworm Light adapter handles category and tag extraction: private extractCategories(page: Page): string[] { const metadata = page.metadata || {}; // Array format (preferred) if (Array.isArray(metadata.categories)) { return metadata.categories as string[]; } // Single category string (legacy) if (typeof metadata.category === 'string') { return [metadata.category]; } // Default fallback return ['others']; }private extractTags(page: Page): string[] { const metadata = page.metadata || {}; if (Array.isArray(metadata.tags)) { return metadata.tags as string[]; } if (typeof metadata.tag === 'string') { return [metadata.tag]; } return ['others']; }Generated Frontmatter The adapter produces clean YAML frontmatter: --- title: "Mastering the Category System" date: 2026-08-09 authors: - elena-rodriguez - james-chen categories: - tutorials - features tags: - categories - organization - navigation - seo ---Default Values If no category or tag is specified, posts receive defaults:Default Category: others Default Tags: othersThis ensures every post has valid taxonomy data for filtering and organization. SEO Implications Category Pages as Landing Pages Category archive pages can rank for broad search terms. Optimize them by:Writing Category Descriptions: Add introductory text explaining the category Choosing SEO-Friendly Names: Use terms people actually search for Building Internal Links: Link to category pages from related content Maintaining Freshness: Regular new posts signal active contentTag Pages for Long-Tail Keywords Tags can capture specific, long-tail searches:/tags/astro-static-site-generation/ targets specific framework searches /tags/performance-optimization/ captures optimization-focused queries /tags/multi-author-publishing/ attracts collaborative content seekersAvoiding Thin Content Be cautious about creating too many tags with only one or two posts. Search engines may view these as thin content. Options:Consolidate similar tags Use noindex on low-content tag pages Focus on building depth in existing tagsOrganization Strategies The Hub-and-Spoke Model Organize content around category "hubs" with tagged "spokes": Category: Tutorials (Hub) ├── Tag: Getting Started ├── Tag: Advanced Techniques ├── Tag: Best Practices └── Tag: TroubleshootingContent Matrix Approach Map categories and tags to create comprehensive coverage:Category Core TagsTutorials getting-started, step-by-step, examplesFeatures capabilities, integrations, updatesCase Studies success-stories, implementationsEditorial Calendar Integration Plan content that fills taxonomy gaps:Identify underserved categories Find popular tags without recent posts Discover cross-category opportunities Balance evergreen and timely contentNavigation Integration Category Links in Main Navigation Site navigation should reflect your category structure: { "navigation": [ { "label": "Home", "url": "/" }, { "label": "Tutorials", "url": "/categories/tutorials" }, { "label": "Features", "url": "/categories/features" }, { "label": "About", "url": "/about" } ] }Sidebar Tag Clouds Display popular tags in sidebar widgets:Size reflects popularity (more posts = larger text) Limit to top 15-20 tags Update dynamically as content growsRelated Content Sections Use categories and tags to power "Related Posts" features:Same category posts appear in sidebars Shared tags suggest similar content Cross-category recommendations expand discoveryMeasuring Success Key Metrics to TrackCategory Page Views: Which categories attract traffic? Tag Click-Through: Which tags drive engagement? Bounce Rate by Category: Which sections retain readers? Time on Category Pages: Are archive pages useful? Internal Navigation Paths: How do readers explore?Optimization OpportunitiesHigh-traffic, high-bounce categories need better content Popular tags warrant more frequent posts Underperforming categories may need repositioning Cross-linking opportunities between related categoriesCommon Mistakes to Avoid Over-Categorization Don't create a new category for every topic. Consolidate related subjects: Instead of:React Tutorials Vue Tutorials Angular Tutorials Svelte TutorialsUse:Frontend Tutorials (with framework tags)Tag Inconsistency Maintain consistent tag naming: Inconsistent:javascript, JavaScript, JS, jsConsistent:javascript (always lowercase, always full word)Ignoring Analytics Regularly review category and tag performance. Unused taxonomies waste potential and confuse readers. Conclusion A well-designed category and tag system transforms a collection of articles into a navigable knowledge base. By thinking strategically about organization, maintaining consistency, and measuring results, you can create a site structure that serves both readers and search engines. Remember: the goal isn't to categorize everything - it's to help readers find what they need. Start simple, measure results, and refine over time.

Design Tokens: Customizing Your Visual Identity

Design Tokens: Customizing Your Visual Identity

Design Tokens: Customizing Your Visual Identity Design tokens are the foundation of consistent, maintainable visual design. In the Bookworm Light theme adapter, design tokens allow you to completely transform the look and feel of your site through simple JSON configuration - no CSS editing required. What Are Design Tokens? Design tokens are named entities that store visual design attributes. Instead of scattering color codes, font names, and spacing values throughout your codebase, you define them once in a central location and reference them everywhere. Traditional approach: .button { background-color: #8b5cf6; font-family: 'Playfair Display', serif; padding: 12px 24px; }.header { background-color: #8b5cf6; font-family: 'Playfair Display', serif; }Design token approach: .button { background-color: var(--color-primary); font-family: var(--font-heading); padding: var(--spacing-3) var(--spacing-6); }.header { background-color: var(--color-primary); font-family: var(--font-heading); }With tokens, changing your primary brand color updates every button, link, and accent across your entire site. Token Configuration in site.json Your design tokens are defined in the designTokens section of your site.json file: { "designTokens": { "colors": { "brand": { "primary": "#8b5cf6", "secondary": "#7c3aed", "accent": "#f472b6" }, "background": { "page": "#faf5ff", "surface": "#ffffff", "muted": "#ede9fe" }, "text": { "primary": "#1e1b4b", "secondary": "#6b7280", "link": "#8b5cf6" } }, "typography": { "fonts": { "heading": "'Playfair Display', serif", "body": "'Lora', serif" } }, "themeMode": { "default": "light", "allowToggle": true } } }Color System Deep Dive Brand Colors Your brand colors define the personality of your site:Token Purpose Examplebrand.primary Main accent color, buttons, links #8b5cf6 (purple)brand.secondary Hover states, gradients #7c3aed (darker purple)brand.accent Highlights, tags, badges #f472b6 (pink)Choosing a Primary Color Your primary color should:Reflect your brand identity Have sufficient contrast for accessibility Work well in both light and dark contextsColor Relationship GuidelinesSecondary: Typically 10-20% darker than primary Accent: A complementary or analogous color that popsBackground Colors Background colors create visual hierarchy and depth:Token Purpose Examplebackground.page Main page background #faf5ff (light purple)background.surface Cards, panels, elevated elements #ffffff (white)background.muted Subtle backgrounds, code blocks #ede9fe (lavender)Creating Depth Use background colors to create visual layers:Page - The base layer, slightly tinted Surface - Elevated cards and panels Muted - Recessed areas, sidebarsText Colors Text colors ensure readability across all contexts:Token Purpose Exampletext.primary Headings, important text #1e1b4b (dark blue)text.secondary Body text, descriptions #6b7280 (gray)text.link Hyperlinks #8b5cf6 (matches primary)Contrast Requirements For WCAG AA accessibility:Normal text: 4.5:1 contrast ratio minimum Large text (18px+): 3:1 contrast ratio minimumTypography Configuration Font Stack Definition { "typography": { "fonts": { "heading": "'Playfair Display', serif", "body": "'Lora', serif" } } }How Fonts Are Applied The adapter transforms your font configuration into Bookworm Light's theme.json format: { "fonts": { "font_family": { "primary": "Lora:wght@400;500;600;700", "primary_type": "serif", "secondary": "Playfair+Display:wght@400;500;600;700;800", "secondary_type": "serif" } } }Font Pairing Best Practices Classic CombinationsHeading Body StylePlayfair Display Lora Elegant editorialMontserrat Open Sans Modern cleanMerriweather Source Sans Pro Traditional readableRoboto Slab Roboto Contemporary technicalPairing PrinciplesContrast: Choose fonts with different personalities Compatibility: Ensure similar x-heights and proportions Hierarchy: Headings should be visually distinct from body Readability: Body fonts must be highly legible at small sizesGoogle Fonts Integration The adapter automatically formats fonts for Google Fonts loading: <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;500;600;700;800&family=Lora:wght@400;500;600;700&display=swap" rel="stylesheet">Theme Mode Configuration Light and Dark Mode { "themeMode": { "default": "light", "allowToggle": true } }Options:default: "light" - Site loads in light mode default: "dark" - Site loads in dark mode default: "system" - Respects user's OS preference allowToggle: true - Shows a toggle switch in the headerDark Mode Token Overrides For advanced dark mode customization, define dark mode specific colors: { "themeMode": { "default": "light", "allowToggle": true, "darkMode": { "background": { "page": "#111827", "surface": "#1f2937" }, "text": { "primary": "#f9fafb", "secondary": "#9ca3af" } } } }Generated Configuration Files theme.json Output The adapter generates a complete theme.json file: { "colors": { "default": { "theme_color": { "primary": "#8b5cf6", "body": "#faf5ff", "border": "#ede9fe", "light": "#ede9fe", "dark": "#1e1b4b" }, "text_color": { "text": "#6b7280", "text-dark": "#1e1b4b", "text-light": "#6b7280" } } }, "fonts": { "font_family": { "primary": "Lora:wght@400;500;600;700", "primary_type": "serif", "secondary": "Playfair+Display:wght@400;500;600;700;800", "secondary_type": "serif" }, "font_size": { "base": "16", "scale": "1.2" } } }CSS Custom Properties The adapter also generates CSS overrides: :root { --color-primary: #8b5cf6; --color-body: #faf5ff; --color-border: #ede9fe; --color-light: #ede9fe; --color-dark: #1e1b4b; --color-text: #6b7280; --color-text-dark: #1e1b4b; --color-accent: #f472b6; --color-secondary: #7c3aed; --color-link: #8b5cf6; }Real-World Examples Corporate Blue Theme { "designTokens": { "colors": { "brand": { "primary": "#2563eb", "secondary": "#1d4ed8", "accent": "#fbbf24" }, "background": { "page": "#f8fafc", "surface": "#ffffff", "muted": "#e2e8f0" }, "text": { "primary": "#1e293b", "secondary": "#64748b", "link": "#2563eb" } }, "typography": { "fonts": { "heading": "'Inter', sans-serif", "body": "'Inter', sans-serif" } } } }Warm Magazine Theme { "designTokens": { "colors": { "brand": { "primary": "#dc2626", "secondary": "#b91c1c", "accent": "#f97316" }, "background": { "page": "#fffbeb", "surface": "#ffffff", "muted": "#fef3c7" }, "text": { "primary": "#451a03", "secondary": "#78350f", "link": "#dc2626" } }, "typography": { "fonts": { "heading": "'Libre Baskerville', serif", "body": "'Source Serif Pro', serif" } } } }Dark Tech Theme { "designTokens": { "colors": { "brand": { "primary": "#22c55e", "secondary": "#16a34a", "accent": "#06b6d4" }, "background": { "page": "#0f172a", "surface": "#1e293b", "muted": "#334155" }, "text": { "primary": "#f1f5f9", "secondary": "#94a3b8", "link": "#22c55e" } }, "typography": { "fonts": { "heading": "'JetBrains Mono', monospace", "body": "'IBM Plex Sans', sans-serif" } }, "themeMode": { "default": "dark", "allowToggle": false } } }Troubleshooting Colors Not ApplyingVerify JSON syntax is valid Check that token paths match expected structure Clear browser cache and rebuild Inspect generated theme.json for correct valuesFonts Not LoadingEnsure font names exactly match Google Fonts catalog Check for typos in font family strings Verify quotes around multi-word font names Test with simpler fallback fonts firstDark Mode IssuesVerify allowToggle is true if toggle expected Check dark mode color contrast ratios Test in system dark mode to verify detection Inspect CSS custom properties in browser dev toolsConclusion Design tokens transform theme customization from a tedious CSS editing task into a simple configuration exercise. By defining your visual identity in site.json, you can:Maintain consistent branding across all pages Quickly experiment with different color schemes Support accessibility requirements systematically Enable dark mode with minimal effortStart with the examples in this guide, then iterate until your design tokens perfectly capture your brand identity.

Getting Started with Bookworm Light

Getting Started with Bookworm Light

Getting Started with Bookworm Light This guide will walk you through setting up your first site using the Bookworm Light theme adapter. By the end of this tutorial, you'll have a fully functional blog with multi-author support, category organization, and custom branding. Prerequisites Before you begin, ensure you have:Node.js 18 or later installed npm or yarn package manager A text editor (VS Code recommended) Basic familiarity with JSON configuration filesStep 1: Create Your Project Structure Start by creating a new directory for your project: mkdir my-bookworm-site cd my-bookworm-site mkdir pagesYour project will have this structure: my-bookworm-site/ site.json # Site configuration pages/ # Content files home.json about.json first-post.jsonStep 2: Configure site.json Create your site configuration file. This is the heart of your site's identity: { "id": "my-site-id", "name": "My Awesome Blog", "domain": "myblog.example.com", "baseUrl": "/", "theme": "bookworm-light", "defaultTemplate": "article", "navigation": [ { "label": "Home", "url": "/" }, { "label": "Authors", "url": "/authors" }, { "label": "Categories", "url": "/categories" }, { "label": "About", "url": "/about" } ], "designTokens": { "colors": { "brand": { "primary": "#3b82f6", "secondary": "#1d4ed8", "accent": "#f59e0b" } } } }Key Configuration OptionsField Purposename Your site title (appears in header, SEO)navigation Defines your menu structuredesignTokens Customizes colors and typographytheme Must be bookworm-lightStep 3: Create Your First Page Create pages/home.json for your homepage: { "id": "home", "site": "my-site-id", "url": "/", "title": "Welcome to My Blog", "description": "A personal blog about technology and creativity.", "template": "article", "metadata": { "authors": ["your-name"], "date": "2026-08-05", "categories": ["announcements"], "tags": ["welcome", "introduction"] }, "content": { "type": "inline", "content": "# Welcome!\n\nThis is my first blog post..." } }Step 4: Define Your Authors Add author profiles to your site.json: { "authors": [ { "id": "your-name", "name": "Your Name", "title": "Founder & Writer", "image": "/images/authors/your-name.jpg", "bio": "I write about technology, creativity, and building things.", "social": { "twitter": "https://twitter.com/yourhandle", "github": "https://github.com/yourhandle" } } ] }Step 5: Add Design Customization Customize your site's appearance with design tokens: { "designTokens": { "colors": { "brand": { "primary": "#3b82f6", "secondary": "#1d4ed8", "accent": "#f59e0b" }, "background": { "page": "#f8fafc", "surface": "#ffffff", "muted": "#e2e8f0" }, "text": { "primary": "#1e293b", "secondary": "#64748b", "link": "#3b82f6" } }, "typography": { "fonts": { "heading": "'Inter', sans-serif", "body": "'Inter', sans-serif" } } } }Step 6: Build Your Site Run the platform's build command to generate your site: npm run build -- --project ./my-bookworm-siteThe build process will:Read your site.json configuration Process all pages in the pages/ directory Generate author profile pages Create category and tag archive pages Output a static site ready for deploymentStep 7: Preview Locally Start a local development server: npm run devOpen http://localhost:4321 to see your site. Common Configuration Patterns Adding Navigation Dropdowns { "navigation": [ { "label": "Home", "url": "/" }, { "label": "Topics", "children": [ { "label": "Technology", "url": "/categories/technology" }, { "label": "Design", "url": "/categories/design" }, { "label": "Business", "url": "/categories/business" } ] }, { "label": "About", "url": "/about" } ] }Multiple Authors per Post { "metadata": { "authors": ["alice-smith", "bob-johnson", "carol-williams"] } }Full SEO Configuration { "seo": { "title": "Custom Page Title for Search Engines", "description": "A detailed description for search results.", "openGraph": { "title": "Title for Social Sharing", "description": "Description when shared on social media.", "image": "/images/social-preview.jpg", "type": "article" }, "twitter": { "card": "summary_large_image" }, "canonical": "https://myblog.example.com/my-post" } }Troubleshooting Navigation Not Updating Ensure your site.json navigation array exactly matches the pages you want to display. The adapter uses ONLY this array - no theme defaults. Author Pages Empty Verify that author slugs in your pages match the author IDs in site.authors[]. Styles Not Applying Check that your designTokens follow the correct structure. The adapter maps these to theme.json. Next Steps Now that you have a working site, explore:Multi-Author Publishing Guide - Learn collaborative workflows Category System - Organize your content effectively Design Tokens Guide - Customize every visual aspect Technical Architecture - Understand how it all worksHappy publishing!