ramenlog
NextJS FastAPI BuildInPublic Architecture SOL

"Ghost" architectures - Building Colorchef Cinema feature

I built a movie discovery engine with a $0 infrastructure. No database, no live server, I call it 'Ghost Architecture.

#

Sun Jan 04 - Written by: Siddhesh Naik

In my previous log, I talked about why I started Ramenlog. Today, we’re diving into the first major engineering challenge I’ve documented here: Colorchef cinema.

To give better context, Colorchef is a product which combines multiple color-based utilities. It helps indie developers, solopreneuers, UI/UX designers to get started with their products efficiently without wasting time on thinking about colors.

The other day I was thinking about movies and realized that I watch some niche kind of movies. While deciding what to watch next in the same niche I realized that I can build something around this niche and thus went ahead with cinema feature of Colorchef. ColorChef — a cinema discovery engine that extracts aesthetic color palettes from films. Now, just like a bowl of ramen where everyy ingredient has a purpose and there are no extras, I wanted to develop something with same philosophy. Keeping everything with database is possible but comes with additional maintenance and “extras” that I might not require for my feature.

Colorchef - cinema color palettes

So, I built a “Ghost Architecture”.

I had few constraints in mind while building

  1. $0 Hosting cost: No monthly bill or pay-as-you-go stuff
  2. Scalable: As we are talking about movies, it should be good for 50 as well thousands of movies
  3. Secure: Even though the “DB” is open-source it has to be secure

The “Ghost” architecture

Instead of using traditional database, I have used Git. So, my stack now includes Git for Git-as-a-Database as well as version control. Colorchef can be divided into simple two halves:

  1. Frontend (Next.js): This is hosted on vercel and treats a separate private Github repo as source of truth.
  2. Backend (FastAPI): Local only server endpoints which handle the heavy lifting - TMDB API calls, color palette extraction, and image processing.

When I want to add movies, I run the server on this specific branch having the required endpoints. These endpoints process data and update the JSON in local version of data repo. Once, I am satisfied with required changes, I commit and push the changes. Though, the process and commit and pushing can be automated and kept as part of processing, I have deliberately kept it manual. This allows me to “draft” the content to be published, allowing only safe changes to be published.

Why I chose Git over DB

By choosing this path, I traded convenience for engineering efficiency”:

  1. Security: Admin panel is air-gapped. There is no live version on the internet.
  2. Speed: Next.js serves static JSON from a global Edge CDN. There are no database queries slowing down the user.
  3. Durability: Every change is version-controlled. If I mess up a “Soft Delete,” I just git revert.

The “Aesthetic” Extract

The soul of the app is the color extraction. Using Python’s image processing libraries, I map the dominant moods of a film - from the haunting greens of religious horror to the cozy pastel shades Tokyo.

I realized that movies, like good Ramen, are all about balance. The palette is the broth; the characters are the toppings.

Check out the live project: ColorChef - cinema

Explore the “Open Data”: Colorchef data