⚠️ VISION DOC — This describes where the product is going, not where it is today. For the current implemented API surface, see
blog-service.mdandsdk-reference.md.
The goal: Build a headless blog engine so good that any Vlozi user can have a world-class blog running on their platform in under 10 minutes — with an editor that rivals Notion, management that rivals WordPress, and integration as simple as 3 lines of code.
What We're Building
Vlozi Blog Engine is a fully managed, multi-tenant, headless blog system that ships as a core feature of the Vlozi platform. It consists of three pillars:
┌─────────────────────────────────────────────────────────────────┐
│ Vlozi Blog Engine │
├──────────────────┬──────────────────┬───────────────────────────┤
│ ✏️ Editor │ 📊 Management │ 🔌 Integration │
│ │ │ │
│ Write like │ Manage like │ Integrate like │
│ Notion │ WordPress │ Stripe │
├──────────────────┼──────────────────┼───────────────────────────┤
│ Block editor │ Dashboard │ REST API │
│ Slash commands │ Analytics │ JavaScript SDK │
│ AI writing │ Team workflows │ React components │
│ Media library │ SEO toolkit │ Webhooks │
│ Live preview │ Scheduling │ Pre-built themes │
└──────────────────┴──────────────────┴───────────────────────────┘Pillar 1 — The Editor ✏️
An editor so good that sellers actually enjoy writing content.
Block-Based Rich Editor
| Feature | Description |
|---|---|
| Slash commands | Type / to insert any block — headings, images, code, embeds, tables, callouts, toggles |
| Drag & drop blocks | Reorder any block by dragging its handle |
| Inline formatting | Bold, italic, strike, code, highlight, underline — via toolbar, keyboard shortcut, or markdown syntax |
| Headings (H1–H6) | Style dropdown + keyboard shortcuts (Ctrl+Alt+1 through 6) |
| Nested lists | Bullet, numbered, and checklist — with infinite nesting |
| Code blocks | Syntax highlighting for 20+ languages, language selector, copy button |
| Tables | Resizable columns, add/delete rows/columns, header row toggle, merge cells |
| Blockquotes | Styled pull-quotes with optional attribution |
| Callout blocks | Info / Warning / Tip / Danger blocks with icons |
| Dividers | Horizontal rules with style variants (line, dots, stars) |
| Toggle blocks | Collapsible sections (FAQ-style) |
Media & Embeds
| Feature | Description |
|---|---|
| Image upload | Drag & drop, paste from clipboard, or browse media library |
| Image editing | Resize (S/M/L/Full), alignment (left/center/right), alt text, caption, link |
| Media library | Centralized image management — upload, search, organize, reuse across posts |
| YouTube embed | Paste URL → responsive iframe with lazy loading |
| Twitter/X embed | Paste tweet URL → rendered tweet card |
| CodePen embed | Paste URL → interactive code preview |
| Generic oEmbed | Auto-detect and embed from 200+ providers |
| File attachments | Upload PDFs, docs — renders as download cards |
Writing Experience
| Feature | Description |
|---|---|
| Markdown shortcuts | **bold**, *italic*, # heading, - list, > quote, code — auto-convert as you type |
| Keyboard shortcuts | Full shortcut set (Ctrl+B, Ctrl+I, Ctrl+K for link, etc.) |
| Focus mode | Dims everything except the current paragraph |
| Word/char count | Live count in the status bar |
| Reading time estimate | Auto-calculated based on word count |
| Autosave | Every 30 seconds + on blur — with visual save indicator |
| Unsaved changes guard | Browser beforeunload + in-app navigation prompt |
| Undo/Redo | Unlimited history within the session, toolbar buttons + keyboard shortcuts |
| Live preview | Side-by-side or overlay preview showing exactly how the post will look on the user's site |
| Mobile responsive editor | Full editing on tablet, read-only preview on phone |
AI Assistant (Future)
| Feature | Description |
|---|---|
| AI autocomplete | Tab to accept inline suggestions as you type |
| AI rewrite | Select text → Improve / Shorten / Expand / Change tone |
| AI generate | Generate outline, introduction, or full post from a topic |
| AI SEO suggestions | Auto-suggest meta title, description, and keywords based on content |
| AI image generation | Generate blog header images from text prompts |
Pillar 2 — Blog Management 📊
Everything sellers need to run a professional content operation.
Post Management
| Feature | Description |
|---|---|
| Post list | Filterable table/grid view with search, status filter, category filter, date range |
| Status workflow | Draft → In Review → Published → Archived |
| Bulk actions | Select multiple → publish, unpublish, delete, change category |
| Duplicate post | One-click duplicate with title suffix |
| Post versioning | Every save creates a version — diff view, restore any version |
| Trash & soft delete | Deleted posts go to trash, auto-purge after 30 days |
Scheduling & Publishing
| Feature | Description |
|---|---|
| Immediate publish | One-click publish |
| Scheduled publish | Set future date/time — auto-publishes at that time |
| Expiry date | Auto-unpublish after a date (for time-sensitive content) |
| Publishing calendar | Visual calendar showing scheduled, published, and draft posts |
Organization
| Feature | Description |
|---|---|
| Categories | Hierarchical categories (parent/child) with slug, description, and cover image |
| Tags | Flat tag system — autocomplete from existing tags |
| Post→Category | Each post belongs to one primary category |
| Post→Tags | Each post can have multiple tags |
| Custom slug | Auto-generated from title, manually editable, validated for uniqueness |
| Featured image | Cover/thumbnail image for cards, social sharing, and SEO |
| Author profiles | Author name, avatar, bio — linked to team members |
SEO Toolkit
| Feature | Description |
|---|---|
| SEO title | Custom title tag with character counter (50–60 chars ideal) |
| Meta description | Custom description with character counter (150–160 chars ideal) |
| OG image | Custom Open Graph image for social sharing (falls back to featured image) |
| Canonical URL | Set canonical for syndicated content |
| URL slug | Clean, editable URL slugs |
| SEO score | Real-time checklist: title length, description, keyword density, heading structure, image alt texts, internal links |
| Structured data | Auto-generated Article JSON-LD schema |
| Sitemap | Auto-generated XML sitemap for published posts |
| RSS feed | Auto-generated RSS/Atom feed |
Analytics (Future)
| Feature | Description |
|---|---|
| Page views | Per-post and aggregate view counts |
| Read time | Average time readers spend on each post |
| Referral sources | Where readers come from |
| Popular posts | Ranked by views over configurable time periods |
| Engagement | Scroll depth, click-through rates on CTAs |
Pillar 3 — Integration 🔌
Integration so simple, a developer can go from zero to blog in 10 minutes.
REST API
A complete, well-documented, versioned REST API:
# Public (API Key auth)
GET /blog/public/posts → List published posts (paginated)
GET /blog/public/posts/:slug → Get post by slug (HTML content)
GET /blog/public/posts/:slug/json → Get post by slug (TipTap JSON)
GET /blog/public/categories → List categories
GET /blog/public/categories/:slug → Posts by category
GET /blog/public/tags → List tags
GET /blog/public/tags/:slug → Posts by tag
GET /blog/public/search?q= → Full-text search
GET /blog/public/feed/rss → RSS feed
GET /blog/public/feed/atom → Atom feed
GET /blog/public/sitemap.xml → XML sitemap
# Admin (JWT auth)
POST /blog/admin/posts → Create post
GET /blog/admin/posts → List all posts (any status)
GET /blog/admin/posts/:id → Get post by ID
PUT /blog/admin/posts/:id → Update post
DELETE /blog/admin/posts/:id → Delete post (soft)
POST /blog/admin/posts/:id/publish → Publish
POST /blog/admin/posts/:id/unpublish → Unpublish
POST /blog/admin/posts/:id/schedule → Schedule
POST /blog/admin/posts/:id/duplicate → Duplicate
CRUD /blog/admin/categories → Full CRUD
CRUD /blog/admin/tags → Full CRUD
GET /blog/admin/posts/:id/versions → List versions
POST /blog/admin/posts/:id/restore/:versionId → Restore version
POST /blog/admin/media/upload → Upload image
GET /blog/admin/media → List media
DELETE /blog/admin/media/:id → Delete mediaJavaScript SDK
Current SDK:
@vlozi/blog— seesdk-reference.mdfor the real API. The examples below are the vision-state interface.
// Install
npm install @vlozi/blog
// Initialize
import { VloziClient } from '@vlozi/blog'
const client = new VloziClient({
apiKey: 'your-api-key',
baseUrl: 'https://your-gateway-url.com',
})
// Fetch posts
const { data, meta } = await client.blog.list({ page: 1, limit: 10 })
// Fetch single post
const post = await client.blog.get('my-first-post')
// Categories & Tags
const categories = await client.blog.categories.list()
const tags = await client.blog.tags.list()React Components (Drop-in UI)
// Install
npm install @vlozi/blog
// Components are in @vlozi/blog/react
import { BlogList, BlogPost, VloziProvider } from '@vlozi/blog/react'
// Blog listing page
<BlogLayout>
<BlogList apiKey="your-key" postsPerPage={12} />
</BlogLayout>
// Individual post page
<BlogLayout>
<BlogPost apiKey="your-key" slug={params.slug} />
</BlogLayout>
// With customization
<BlogList
apiKey="your-key"
theme="dark"
layout="grid" // grid | list | magazine
showExcerpt={true}
showAuthor={true}
showDate={true}
showCategory={true}
showReadingTime={true}
showFeaturedImage={true}
categoryFilter="technology"
className="my-custom-class"
/>Pre-Built Themes
Ship 3–5 ready-to-use blog themes:
| Theme | Style |
|---|---|
| Minimal | Clean, typography-focused — like Medium |
| Magazine | Card-based grid layout — like Vercel Blog |
| Documentation | Left sidebar navigation — like Stripe Docs |
| Newsletter | Single-column, email-friendly — like Substack |
| Dev Blog | Code-focused with dark syntax blocks — like Dev.to |
Each theme is:
- Fully responsive
- Dark mode compatible
- Customizable via CSS variables
- Accessible (WCAG 2.1 AA)
Webhooks (Future)
// Events
{
"events": [
"post.created",
"post.updated",
"post.published",
"post.unpublished",
"post.deleted"
],
"url": "https://your-site.com/api/blog-webhook",
"secret": "whsec_..."
}Use cases: trigger static site rebuilds, sync with email lists, push to social media.
Markdown Interoperability (Future)
To cater to power users and developers, the blog engine will aim to support deep Markdown integration over time:
| Feature | Description | Use Case |
|---|---|---|
| Export to MD | API endpoint and UI button to download any post as raw .md with Frontmatter. |
Cross-posting to Dev.to or Hashnode. |
| Bulk MD Import | Drag-and-drop a .zip of markdown files to instantly generate drafted posts. |
Migrating from Hugo, Jekyll, or Astro. |
| Raw MD Mode | A toggle switch in the editor to swap the WYSIWYG block view for a split-pane raw markdown text editor. | For technical writers who prefer raw syntax. |
| GitHub Sync | Link a repo (e.g., user/my-blog). Pushing a .md file to main triggers an auto-publish via webhook. |
Git-backed developer workflows (docs-as-code). |
Model Context Protocol (MCP) Server (Future)
To empower the next generation of automation, LogicSpike will provide a native MCP Server. This allows AI agents (like Claude, Antigravity, or ChatGPT) to securely connect to a workspace and act as autonomous content creators.
Capabilities for AI Agents:
- Context-Aware Drafting: Agents can read existing published posts to learn the workspace's tone and style before writing.
- Autonomous Publishing: Agents can draft, format (with TipTap JSON/Markdown), and publish posts directly to the live site.
- Content Maintenance: Agents can search for outdated articles and autonomously push updates to keep technical or time-sensitive content fresh.
Content Delivery
Dual Response Format
Every public post endpoint returns content in the format requested:
| Format | Use Case | How |
|---|---|---|
| HTML | Server-rendered sites, email, static pages | Default: GET /posts/:slug |
| JSON | Client-side rendering, custom rendering, mobile apps | GET /posts/:slug/json or ?format=json |
HTML Rendering
Server-side TipTap JSON → HTML with:
- Full node support (all block types including tables, task lists, embeds)
- XSS sanitization on all text, URLs, and attributes
- Clean semantic HTML5 (
<article>,<figure>,<figcaption>, etc.) - BEM-style CSS classes on every element for easy styling
- Responsive images with
srcsetandloading="lazy" - Code blocks with
<pre><code class="language-{lang}">for client-side highlighting
Security Model
┌──────────────────────────────────────────────┐
│ Gateway │
│ ┌──────────┐ ┌──────────┐ ┌────────────┐ │
│ │ JWT Auth │ │ API Key │ │ Rate Limit │ │
│ │ (Admin) │ │ (Public) │ │ per tenant │ │
│ └──────────┘ └──────────┘ └────────────┘ │
└──────────────────────────────────────────────┘
│
x-gateway-key (shared secret)
│
┌──────────────────────────────────────────────┐
│ Blog Service │
│ ┌──────────────┐ ┌─────────────────┐ │
│ │ Gateway Guard │ │ Tenant Isolation│ │
│ │ (secret check)│ │ (every query) │ │
│ └──────────────┘ └─────────────────┘ │
│ ┌──────────────┐ ┌─────────────────┐ │
│ │ Permission │ │ Input Validation│ │
│ │ (blog:posts.*)│ │ (Zod schemas) │ │
│ └──────────────┘ └─────────────────┘ │
└──────────────────────────────────────────────┘- Multi-tenant isolation: Every DB query is scoped by
tenant_id— zero data leakage - Admin endpoints: JWT auth →
blog:posts.*permissions required - Public endpoints: API Key auth → scoped to tenant
- Content sanitization: XSS prevention on render (HTML escape + URL protocol whitelisting)
- Rate limiting: Per-tenant, per-endpoint limits at the gateway level
- Direct access blocked: Blog service only accepts requests with valid
x-gateway-key
Data Model (Vision — Aspirational)
⚠️ This ERD is the target schema, not the current one. Columns like
og_image_url,canonical_url,expires_at,deleted_atand tables likeblog_post_versions/blog_mediado not exist yet. The live schema is inapps/blog-service/src/db/schema.tsand documented inblog-service.md.
What "Done" Looks Like
For the Seller (Dashboard User)
"I open my dashboard, click Blog, and I have a Notion-like editor where I can write beautifully formatted posts with images, code blocks, and embeds. I can organize with categories and tags, schedule posts for the future, see a live preview, and manage everything from a clean dashboard. SEO suggestions help me rank. Analytics show me what's working."
For the Developer (SDK Consumer)
"I install one npm package, pass my API key, and I have a fully functional blog on my site. I can use the pre-built React components for instant setup, or use the SDK to build a completely custom experience. The API is clean, well-documented, and returns exactly what I need."
For Vlozi (Platform)
"Blog is a core value-add that makes Vlozi sticky. Free-tier users get basic blogging (5 posts, 100MB media). Paid plans unlock unlimited posts, scheduling, analytics, AI writing, custom domains, and priority rendering. It requires zero infrastructure from users — we own the full stack."
Implementation Priority
Phase 1 — Foundation (Current + Quick Wins)
- TipTap editor with rich formatting
- CRUD + publish/unpublish
- Slug generation
- SEO title/description
- Media library integration
- TipTap → HTML renderer
- Fix autosave (wire
onSaveprop) - Fix dark mode in menus
- Add undo/redo toolbar buttons
- Show word count + reading time
- Add featured image field
- Custom slug editing in UI
Phase 2 — Organization & Management
- Categories CRUD (API + Dashboard UI)
- Tags CRUD (API + Dashboard UI)
- Post→Category assignment
- Post→Tags assignment
- Soft-delete + trash
- Post list filtering (status, category, search)
- Bulk actions
- Post versioning
Phase 3 — Publishing & SEO
- Scheduled publishing
- OG image support
- Canonical URL
- SEO score/checklist
- Structured data (JSON-LD)
- RSS/Atom feed
- XML sitemap
- Live preview mode
- Publishing calendar
Phase 4 — Integration & SDK
-
@vlozi/blogSDK package (shipped, v2.1.6) - React components (
@vlozi/blog/react) - Complete public API (search endpoint, feeds, sitemap)
- Pre-built themes (Minimal, Magazine, Dev Blog)
- Full API documentation with examples
- Interactive API playground
Phase 5 — Advanced (Future)
- TipTap renderer: full node support (tables, tasks, YouTube, callouts, toggle)
- Webhook events
- Analytics dashboard
- AI writing assistant
- AI SEO suggestions
- Content expiry
- Multi-author workflows (In Review status)
- Custom domain for blog
- Full-text search
Competitive Positioning
| Feature | WordPress | Ghost | Hashnode | Vlozi Blog |
|---|---|---|---|---|
| Self-hosted | ✅ | ✅ | ❌ | ❌ (fully managed) |
| Headless API | Plugin | ✅ | ✅ | ✅ (native) |
| Block editor | Gutenberg | Koenig | Basic | TipTap (Notion-grade) |
| Multi-tenant | ❌ | ❌ | ❌ | ✅ (built-in) |
| SDK / Components | ❌ | ❌ | ❌ | ✅ (@vlozi/blog) |
| Pre-built themes | ✅ | ✅ | ✅ | ✅ (headless, planned) |
| Part of platform | ❌ | ❌ | ❌ | ✅ (billing, auth, team) |
| Edge-deployed | ❌ | ❌ | ✅ | ✅ (Cloudflare) |
| AI writing | Plugin | ❌ | ✅ | ✅ (planned) |
| Zero config | ❌ | ❌ | ✅ | ✅ |
Our edge: Blog isn't a standalone product — it's a deeply integrated feature of the Vlozi platform. Users get blog + auth + billing + team + media + analytics in one package, with an integration path that no standalone CMS can match.
This is the north star. Not everything ships at once, but every decision should move us toward this vision. When in doubt, ask: "Would a Notion user feel at home in the editor? Would a Stripe developer love the API? Would a WordPress user find the management complete?"
MCP note: The MCP server section above references "LogicSpike" — that's Vlozi. The capability description is accurate; the name was the old brand.