"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.

So, I built a “Ghost Architecture”.
I had few constraints in mind while building
- $0 Hosting cost: No monthly bill or pay-as-you-go stuff
- Scalable: As we are talking about movies, it should be good for 50 as well thousands of movies
- 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:
- Frontend (Next.js): This is hosted on vercel and treats a separate private Github repo as source of truth.
- 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”:
- Security: Admin panel is air-gapped. There is no live version on the internet.
- Speed: Next.js serves static JSON from a global Edge CDN. There are no database queries slowing down the user.
- 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