We help businesses automate and systemize their operations for a living. We build custom software, integrate APIs, and deploy AI solutions. But when it came to our own website? We had exactly zero blog posts.
Not because we had nothing to say. The opposite. We experiment constantly — building autonomous dev agents, real-time messaging platforms, SaaS tools, and client automation pipelines. We just never had time to write about it.
That had to change.
The VisionContent that practically writes itself
We didn't just need a blog. We needed a system that would make publishing as frictionless as possible. Here's what we wanted:
- A real CMS built into our existing website — not WordPress, not a third-party service
- Multiple content types — articles, case studies, guides, and announcements, each with their own structure
- SEO baked in — not just for Google, but for AI search engines too (ChatGPT, Perplexity, Google AI Overviews)
- An MCP server so AI agents can create, edit, and publish content directly from Claude Code
- An admin portal where human writers can collaborate, with role-based permissions
A custom CMS with admin portal, SEO optimization, and an MCP server sounds like a month of work. We did it in one session.
— David Coleman, Founder
Design PhaseDesigning the system with AI
We sat down with Claude (the AI, not a person named Claude) and started brainstorming. The entire design session was collaborative — we'd state what we wanted, Claude would propose approaches with tradeoffs, and we'd decide together.
Within 30 minutes we had locked in:
- Architecture: CMS built into our existing Express + React + PostgreSQL stack. No new servers, no new databases.
- Four content types with distinct templates: articles, case studies (with client/challenge/solution/results fields), guides, and announcements.
- TipTap rich text editor with Notion-style slash commands for fast writing.
- Google OAuth with invite-only access and two-tier permissions (admin + writer, with granular overrides).
- Server-side rendering for blog pages so search engines see full content immediately.
- Schema.org structured data on every page, plus an
llms.txtfile for AI crawlers.
We even used a visual companion tool to review mockups of the admin dashboard and article editor in real time.
Build PhaseBuilding 25 tasks in parallel
After the design was approved, Claude generated a detailed implementation plan — 26 tasks across 6 phases. Then something interesting happened.
Instead of building one file at a time, Claude dispatched specialized subagents to implement independent tasks in parallel. Each subagent received exactly the context it needed, built its piece, ran self-review, and committed.
Backend (Express)
- Database schema with Drizzle ORM — users, articles, and media tables
- Google OAuth with Passport.js — invite-only, with JWT tokens for API access
- Permission system — role-based defaults with per-user granular overrides
- Full CRUD API for content management
- File upload handler with image validation
- SEO analyzer that scores content 0-100
- Schema.org JSON-LD generators for Article, HowTo, and FAQ types
Frontend (React)
- Admin portal with sidebar navigation
- Dashboard with stats, quick actions, and recent activity
- TipTap article editor with formatting toolbar and slash commands
- Publish sidebar with status management, tags, SEO panel, and image uploads
- Media library, user management, and settings pages
Public Blog (SSR)
- Server-rendered blog listing and article pages
- Full meta tags, Open Graph, and Twitter Cards
- Auto-generated
sitemap.xmland RSS feed llms.txt— a machine-readable content index for AI crawlers
MCP Server (Standalone)
| Category | Tools | Count |
|---|---|---|
| Auth | Authenticate, view profile | 2 |
| Content | Create, edit, publish, unpublish, list, get, delete articles | 7 |
| Media | Upload and list media files | 2 |
| SEO | Analyze content for search optimization | 1 |
Browser-based Google OAuth — click authenticate, sign in, done. Works from any Claude Code session globally.
The Meta MomentThis article was published by AI
Here's where it gets fun. This very article was written and published using the system we just built.
From inside Claude Code, we ran:
# Step 1 — Authenticate with Google OAuth authenticate # Step 2 — Upload the hero image upload_media "hero-cms-article.png" # Step 3 — Create the article with full HTML + SEO metadata create_article \ --title "How We Used AI to Build Our CMS" \ --content "<h2>The Cobbler's Children...</h2>" \ --tags "AI, CMS, automation" # Step 4 — Publish it live on dovito.com publish_article --id 1
No copy-pasting. No switching between tools. The AI wrote the content and published it through the same system it helped build.
TakeawayWhat this means for our clients
This isn't just about Dovito's blog. The same approach works for any business:
Next StepsWant to see it in action?
The CMS admin panel is live at dovito.com/cms. The MCP server is available to our team via Claude Code. And this blog — the one you're reading right now — is the first of many.
If you want to explore how AI-powered automation can transform your business operations, let's talk.