Carina Collective

Server-rendered lifestyle content platform with CMS-managed blog posts across four categories

Angular 21TypeScriptGCPDockerExpress 5Cloud Run
blog.kevinnorgaard.com
Carina Collective screenshot

01Problem Statement

A lifestyle content creator needed a custom platform to publish multi-category content across fashion, beauty, wellness, and art -- without the limitations of off-the-shelf blogging tools. The site needed strong SEO for content discovery, a smooth reading experience with rich-text rendering and comments, and a CMS workflow that kept the creator in control of content without developer involvement.

02Architecture

Angular 21 with built-in SSR and Express 5 handles server-side rendering, ensuring fully hydrated HTML is sent to the browser on first load -- critical for SEO on content-heavy article pages. The Contentful SDK fetches article content, rich-text, and assets at request time. Disqus is embedded client-side for comments. The app is containerized and deployed to Google Cloud Run via Cloud Build with Kaniko caching.

03Data Model

Contentful CMS

type Image {
  fileName: String!
  url:      String!
}

type Article {
  title:       String!
  slug:        String!
  category:    String   # "fashion" | "beauty" | "wellness" | "art"
  heroImage:   Image!
  body:        RichText!
  publishedAt: DateTime!
  excerpt:     String
  tags:        [String]
  author:      Author
}

type Author {
  name:            String!
  bio:             String
  photo:           Image
  instagramHandle: String
}

type HomepageFeatured {
  heroHeading:      String
  heroSubheading:   String
  featuredArticles: [Article]
}