seems-cms

Managing content across multiple platforms can become complex quickly. When I was working on Blu and Jooni, I realized I needed a centralized way to manage blog posts and content updates without deploying changes to each application separately.

So I built SEEMS CMS, a lightweight content management system designed for my projects.


the problem

Both Blu and Jooni needed regular content updates - blog posts, announcements, and documentation. Initially, I was hardcoding content directly into each application, which meant:

  • Deploying the entire app just to fix a typo
  • Managing content in multiple places
  • No easy way for non-technical collaborators to update content
  • No scheduling or draft functionality

I needed a CMS that was simple, fast, and could serve content to multiple projects through a clean API.

architecture

SEEMS CMS is built with modern web technologies focused on developer experience and performance:

  • React Router 7 for server-side rendering and routing
  • Firebase for authentication and real-time database
  • TanStack Query for efficient data fetching and caching
  • Tailwind CSS with shadcn/ui components for the interface
  • TypeScript for type safety throughout the application

The architecture is straightforward: authenticated users can manage multiple projects, each project contains posts that can be created, edited, and published with scheduled dates.

features

project-based organization

The CMS organizes content into projects, allowing me to manage Blu and Jooni separately while using the same system. Each project can have its own analytics URL and metadata.

post management

Posts support markdown content with a rich editing experience. I integrated:

  • Markdown preview with react-markdown
  • Form validation using Zod and TanStack Form
  • Draft and published states with scheduling
  • Real-time updates across all connected clients

authentication

Google OAuth integration provides secure, frictionless authentication. The AuthContext manages user state throughout the application, with protected routes ensuring only authenticated users can access the CMS.

loading states

One detail I'm proud of is the comprehensive skeleton loading states. Using shadcn's Skeleton component, the entire interface shows placeholder content while data loads, creating a smooth, professional UX.

deployment

The application is built for deployment on any Node.js platform. I initially containerized it with Docker for easy deployment to cloud platforms like Railway or Fly.io, though later simplified to a standard Node deployment.

reflection

Building SEEMS CMS taught me important lessons about state management with TanStack Query, Firebase real-time capabilities, and the importance of good loading states. The system now powers content for multiple projects, making updates as simple as editing a form instead of deploying code.

The name "SEEMS" doesn't stand for anything in particular - it just seemed like a good name for a CMS at the time.