Why build your own?
The honest answer? None of the existing options fit how I wanted to work.
WordPress is powerful, but the plugin ecosystem can be a minefield. One bad update and your site breaks. Squarespace and Wix are great for non-technical users, but they come with trade-offs—locked-in data, limited customization, monthly costs that add up.
I wanted to:
- Own my data — No platform risk
- Control my workflow — Not fighting someone else's opinion
- Learn by building — What better way to understand than to create?
Some developers adapt to the tools available. Others build their own. I'm in the latter camp.
The Stack: Why Laravel + Livewire?
When I decided to build, I had choices. React, Vue, Alpine, Inertia, Livewire... the JavaScript ecosystem is overwhelming. Here's why I landed on Laravel + Livewire.
Why Not React or Vue?
Modern frontend frameworks are powerful—but they come with complexity. Build pipelines, state management, API layers, hydration mismatches. For a CMS that's primarily about content management, it felt like using a sledgehammer to crack a nut.
I wanted:
- Server-side rendering by default
- Less JavaScript to maintain
- One language (PHP) for the whole stack
- A framework that handles the boring stuff so I can focus on features
Enter Livewire
Livewire hits the sweet spot. It gives you reactive components—think Vue or React—without writing JavaScript. You write PHP, and Livewire handles the AJAX, DOM diffing, and state synchronization.
Pair that with Laravel's:
- Eloquent ORM — Clean database interactions
- Built-in auth — Done in minutes, not hours
- Spatie packages — Media library, permissions, backup—ready to install
- Ecosystem — Everything just works together
And Tailwind for styling—utility-first, no context switching between HTML and styles, easy dark mode support.
What I Built
CloudHerder is a multi-type CMS with features you'd expect—and some you might not:
Post Types
- Standard posts (what you're reading now)
- Video posts (with embed support)
- Audio posts (podcast-friendly)
- Image posts (galleries and photos)
- Newsletters (more on this below)
All powered by Laravel's polymorphic relationships—one posts table, endless content types.
Taxonomy
- Hierarchical categories
- Flat tags
- Works across all post types
User Roles
- Admin, Editor, Author, Viewer
- Permission-based access control
Features
- Comment system with moderation
- Newsletter subscription with double opt-in
- Contact forms with spam protection
- Full-text search
- Sitemap generation
- Media library (Spatie)
The Newsletter System
This deserves a special mention. I wanted to own my email list—no Mailchimp, no Substack. CloudHerder handles:
- Subscriber management
- Double opt-in confirmation
- "View in browser" links
- Unsubscribe handling
- Open/click tracking
All self-hosted. All yours.
Key Technical Decisions
1. Polymorphic Relationships
Instead of separate tables for each post type, we use Laravel's polymorphic relationships. One posts table, with postable_type and postable_id columns that point to the actual content model (StandardPost, VideoPost, etc.).
This keeps the database clean while allowing each post type to have its own structure and behavior.
2. Livewire for Admin
The admin panel is built entirely with Livewire. Why? Because it's an internal tool—we don't need an API for managing posts. Livewire lets us build interactive dashboards with minimal JavaScript, and it integrates seamlessly with Laravel's ecosystem.
3. API-First Mindset
Even though the admin doesn't need an API, we built one anyway. This keeps options open for the future—headless CMS, mobile apps, or third-party integrations become trivial.
4. Tailwind for Styling
Utility-first CSS means no separate stylesheets, no context switching, and easy dark mode support. Tailwind's component-friendly approach also sets us up for the future of web components.
Lessons Learned
1. Livewire is underrated
Coming from a world of SPAs, I was skeptical. But Livewire delivers on the promise of reactive interfaces without the JavaScript burden. For content management systems and internal tools, it's genuinely excellent.
2. Trust the conventions
Laravel's "convention over configuration" approach saves time once you embrace it. Fight the framework less, trust the patterns more.
3. Start simple, add complexity only when needed
I didn't build everything at once. Started with core posts, added categories, then tags, then media, then newsletters. Building iteratively means better decisions with more context.
4. Polymorphic relationships are powerful
For content that varies in structure but shares common behavior, polymorphic is elegant. One table, multiple types, clean queries.
5. Own your infrastructure
Running your own CMS means owning your data, your costs, and your uptime. It's more work, but it means you're not at the mercy of platform changes or price hikes.
The Bottom Line
Building a CMS in 2026 might seem redundant. There are countless options, free and paid. But for those who want control, customization, and ownership—it's worth it.
PHP/Laravel + Livewire made the journey enjoyable. The ecosystem is mature, the community is helpful, and the result is something I actually want to use.
If you've ever thought about building your own tool, I'd say: start now. You'll learn more in a month of building than years of learning by reading.
Dallum Brown
Writer and curator exploring the impact of technology on everyday life.
View All Articles