Posts
Write, organise, and publish posts in the block editor — the workspace's main content type.
Posts are Clog's main content type. Each post has a title, a slug, an author, an optional category and tag list, an array of typed body blocks, an SEO meta group, and (for Schema.org variants like recipes or how-tos) a structured-content payload. This page walks through the Posts list page and the editor.
You need posts:read to view posts and posts:write to create, edit, publish, or delete them. SEO-only members can also touch the SEO fields via seo:write — see Members and permissions.
The Posts list page
Open Posts from the workspace sidebar. Each row shows the title, slug, status, author, category, tags, SEO score, and updated date. From the top of the page you can:
- Search — case-insensitive across
title,excerpt, and the post body. Debounced as you type. - Filter — by status (draft / published / archived), category, tag, author, and a date range.
- Sort — by
publishedAt,updatedAt,createdAt,title,status,seoScore, orreadabilityScore. - Click a row — opens the editor for that post.
- New post — opens a quick wizard that lets you pick a Schema.org type (or skip it for a plain
BlogPosting) before dropping you into the editor.
Status flow
Every post is in exactly one of these states:
| Status | Meaning |
|---|---|
| Draft | Work in progress. Not visible to readers via the external API by default — they'll need to filter status explicitly. |
| Published | Live. Returned to consumers via GET /external/posts and GET /external/posts/:slug. The first time you move a post from draft to published, Clog stamps publishedAt to now — it doesn't get reset on subsequent edits. |
| Archived | Retired. Stays in the dashboard but reads from consumers' filters typically exclude it. |
v1 ships without scheduled publishing — the underlying schema has a scheduled status, but the dashboard rejects it. To time a post's go-live, set it to Draft and switch to Published manually when you're ready.
Writing a post
Click New post. The Schema.org wizard appears first — pick what kind of post this is (Article, How-to, Recipe, Event, Product, Review, etc.) or click Skip for a plain BlogPosting. See SEO for what the type actually changes.
The editor opens in a three-pane layout: the block editor (centre), post details (right sidebar — title, slug, author, etc.), and an SEO sidebar accessed via a button in the top-right.
Title and slug
Type the title at the top. The slug is auto-derived from the title on first save and stays stable on subsequent title edits — change the slug manually if you need to. Slug rules: lowercase letters, digits, dashes; must be unique within this workspace.
When you change a published post's slug, Clog automatically creates a 301 redirect from the old slug to the new one in the Redirects table. Consumer sites that sync the redirects (see Redirects) replay it locally. Slug changes on drafts skip this — no consumer ever saw the old URL.
Body (the block editor)
The body is an array of blocks. Hit / at the start of an empty line to open the block picker. v1 ships 13 block types:
| Block | What it's for |
|---|---|
| Paragraph | Default prose. Supports inline bold, italic, inline code, and links. |
| Heading | H2, H3, or H4. Feeds the table of contents on the rendered page. |
| List | Bullet or ordered. Each item supports inline formatting. |
| Quote | Block quote with an optional attribution line. |
| Divider | A visual section break. |
| Image | An image from the workspace media library — see the image-edit rule. |
| Video embed | A YouTube, Vimeo, or generic video URL. |
| Tweet embed | A tweet/X URL. |
| Callout | A highlighted note (info / warning / success / error). |
| Code | A code block with a language hint. |
| FAQ | A list of question/answer pairs. When present, drives FAQPage JSON-LD downstream. |
| CTA | A call-to-action card with a title, body, and a single link button. |
| Key takeaways | A short bullet list shown at the top of the post — typically 3–7 items. |
Per-post cap: 1,000 blocks.
Inline formatting (**bold**, _italic_, `code`, [link](url)) is stored as Markdown source on the block fields. The dashboard editor renders it as you type; integrators parse the same Markdown at render time.
Image blocks and edits
Insert an image with the Image block, then pick a file from your media library (or upload one inline). When you crop, resize, or re-aspect an image inside the block editor:
- The edited result is uploaded as a new media row in the library.
- The block is repointed at that new media row.
- The original media stays in the library, untouched — you can reuse it elsewhere with a different crop.
This is intentional. Clog never destructively edits the source file, so the same original can ship a square thumbnail, a wide hero, and a portrait avatar — each is its own media row pointing at its own storage object.
Post details (right sidebar)
| Field | Notes |
|---|---|
| Status | Draft / Published / Archived. See above. |
| Slug | Auto-derived; editable. Slug change → auto-redirect. |
| Author | Pick from the workspace authors (see Authors). Required. |
| Category | One optional category (see Categories and tags). |
| Featured media | One optional image used as the post hero / og:image fallback. |
| Tags | Add multiple — type a tag name and pick from the dropdown, or hit Enter to create a new tag inline. |
| Excerpt | Shown in listings on consumer sites. Optional. Used as the default og:description if SEO isn't filled. |
| Summary for AI | A separate short summary for LLM / RAG consumers. Optional. |
| Canonical URL | Tell crawlers a different URL is the canonical version of this post. Optional. |
Type wizard and Post details (structured content)
Posts that aren't a plain BlogPosting carry structured content specific to their Schema.org type — recipe ingredients, how-to steps, event dates, product offers, etc. You'll see a Post details section in the editor with type-specific fields. Filling those gives consumers three things at the same time:
- The typed payload itself (
structuredData). - A derived
structuredBlocksarray — the recipe card or how-to list as blocks, ready to render with the same block renderer the consumer uses forbodyJson. - A pre-assembled
jsonLdpayload for crawlers.
Full walkthrough lives on the SEO page.
SEO sidebar
Click the SEO icon in the top-right to open the three-tab SEO drawer:
- General — meta title, meta description, canonical, focus keyword + secondary keywords, robots controls (index, follow, archive, image-index, snippet caps).
- Social — Open Graph and Twitter Card overrides (title, description, image).
- Analysis — live SEO score (out of 100, ~12 checks) and readability score (Flesch–Kincaid + 11 readability checks). Click a failing check to jump to what to fix.
Members with seo:write can edit these fields without needing posts:write. Members with posts:write only can edit them too. Without either, the sidebar is read-only. See SEO for the full system.
Related posts
The Related posts section pins specific posts to show alongside this one on a consumer site (typically a "You might also like" rail). Drag to reorder. The pins ship out on the post's read response as a lightweight summary array (id, slug, title, excerpt, featured media id).
A pinned post that's later soft-deleted just stops appearing — Clog filters deletes from the list automatically.
Search
The list page's search box matches case-insensitive substrings across title, excerpt, and the post's plain-text body (bodyText, which Clog derives from your block tree on every save). You can combine search with status / author / category / tag / date filters.
Bulk actions
Tick the checkbox on multiple rows in the Posts list and a bulk action bar appears at the bottom. v1 supports:
- Change status — flip all selected posts to draft, published, or archived in one request.
- Change category — reassign all selected posts to a different category (or to "no category").
- Delete selected — soft-delete in one shot. Each post's slug is freed (rewritten internally) so you can reuse the slug for a new post immediately.
Per-row failures don't abort the batch — successful rows commit, failed rows surface in an inline list.
Deleting a post
The Delete action on a single post (and the bulk-delete action) soft-deletes: it stamps deletedAt, frees the slug for reuse, and hides the post from every read path (dashboard list, external API, related-posts pins).
v1 has no Trash view or restore action — soft-deleted posts are inaccessible from the dashboard once gone. They're not purged from the database, but recovering them requires a backend operator. Treat delete as final from the editor's perspective.
Where to next
- Pages — the simpler sibling of posts (no status flow beyond draft/published, no author or category).
- Categories and tags — what you assign to posts.
- Authors — set up before you can create a post.
- Media — where featured images and body images live.
- SEO — the meta group, type wizard, and live scorer.