jsonb
required
Documentation Index
Fetch the complete documentation index at: /llms.txt
Use this file to discover all available pages before exploring further.
Full-featured blog CMS with multi-language support, organization blogs, authors, categories, and comments
blog_posts.schema.ts - Core article structureblog_authors.schema.ts - Author profilesblog_categories.schema.ts - Content categorizationblog_translations.schema.ts - Multi-language contentblog_comments.schema.ts - Community discussionsblog_organization.schema.ts - Organization-level blogssrc/database/schemas/blog_posts.schema.ts:
draft, pending_review, published, archived, rejectedpublishedsrc/database/schemas/blog_translations.schema.ts:
post_id and in_language for efficient multilingual queries.src/database/schemas/blog_authors.schema.ts:
blog_media table for avatar image["https://twitter.com/author", "https://linkedin.com/in/author"]blog_organizations tablesrc/database/schemas/blog_categories.schema.ts:
blog_mediaparentId field, allowing nested category structures.src/database/schemas/blog_comments.schema.ts:
blog, place, event, hike, classifiedpending, approved, rejectedpending status and require moderation approval before being visible.src/database/schemas/blog_organization.schema.ts, organizations can have their own blog channels:
{
"streetAddress": "123 Main St",
"addressLocality": "Paris",
"addressRegion": "Île-de-France",
"postalCode": "75001",
"addressCountry": "FR"
}
blog_posts.schema.ts, posts connect to:
export const blogPostAuthors = pgTable("blog_post_authors", {
postId: text("post_id").notNull(),
authorId: text("author_id").notNull(),
});
export const blogPostCategories = pgTable("blog_post_categories", {
postId: text("post_id").notNull(),
categoryId: text("category_id").notNull(),
});
export const blogPostMedia = pgTable("blog_post_media", {
postId: text("post_id").notNull(),
mediaId: text("media_id").notNull(),
type: text("type").notNull(),
position: text("position"),
});
cover, inline, galleryblog_posts.schema.ts:
CREATE UNIQUE INDEX idx_blog_posts_slug ON blog_posts(slug);
CREATE INDEX idx_blog_posts_status ON blog_posts(status);
CREATE INDEX idx_blog_posts_published_at ON blog_posts(published_at);
CREATE INDEX idx_blog_posts_home ON blog_posts(display_in_home);
CREATE INDEX idx_blog_posts_featured ON blog_posts(is_featured);
CREATE INDEX idx_blog_post_authors_post ON blog_post_authors(post_id);
CREATE INDEX idx_blog_post_authors_author ON blog_post_authors(author_id);
concordia-specs.md (lines 748-757):
inLanguage to match the primary content languageseoTitle, seoDescription, and seoKeywords for each translationtimeRequired and wordCount for Schema.orgworksForIdorganizationId on posts for organization attribution