Overview
What it is
Zenmora Co. is a content-driven home decor brand that needed a publishing platform purpose-built to its requirements rather than adapted from a generic CMS. The site combines an editorial blog with an integrated shop, giving the brand full control over content presentation, product curation, and reader engagement without relying on third-party platforms.
The admin is a password-protected dashboard that lets editors publish posts with rich media, manage shop items, moderate comments and messages, and customise homepage content, all within the same application. No external CMS is involved. Authentication is session-based, handled entirely within Next.js Server Actions, which also power every form submission on the site.
Platform Features
What was built
Blog & CMS
Editors publish posts through an inline-media editor backed by Supabase Storage. Posts support custom meta tags for SEO, category tagging, and markdown content with HTML sanitization to prevent XSS.
Shop
Product listings with manual sort ordering, a featured item flag for homepage placement, and independent management from the blog. Built to expand into a transactional flow without a structural rewrite.
Reader Engagement
Per-post comments and likes tracked in PostgreSQL. A contact form with an admin inbox for direct messages. All interactions handled through Server Actions, with no separate API routes required.
Newsletter
Subscription management with optional new-post notifications via Resend. Subscribers stored in the same Postgres database, managed through the admin dashboard alongside all other content.
Architecture
How it is built
- Next.js 15 App Router with React 19, with full Server Components and Server Actions throughout
- Prisma ORM over PostgreSQL (Neon) with separate pooled and direct connection strings for serverless
- Supabase Storage for media uploads, accessed directly from the admin editor
- Session-based admin authentication with no external auth service
- HTML sanitization on all user-generated content before persistence
- SEO metadata generated per post with Open Graph and Twitter card support
- Resend integration for transactional email (newsletter notifications)
- GitHub Actions CI running ESLint, TypeScript checks, and Vitest on every push
- Vitest test suite with coverage reporting
- Deployed on Vercel with pre-commit hooks enforcing lint and type correctness
Stack
Tools involved
- Next.js 15 (App Router)
- React 19
- TypeScript
- Prisma ORM
- PostgreSQL (Neon)
- Supabase Storage
- Resend
- Vitest
- GitHub Actions
- Vercel