Ship before the data exists
Vice Index is a GTA VI hub for a game that isn't out yet. Building it taught me to separate structure from data, and to never fake the numbers.
Vice Index is a fan hub for Grand Theft Auto VI: guides, news, a map, vehicle and property databases. The problem is obvious. The game isn’t out. Most of the data a site like this runs on doesn’t exist.
The usual move is to wait. I think that’s wrong.
Structure is most of the work
When I listed everything the site needed, most of it had nothing to do with game data. Navigation, page templates, the search index, the CMS, SEO, the map viewer, the design system. All of that can be built and tested now.
The data-dependent parts are a thin layer on top. So the site goes out in what I call knowledge mode: what’s known is published, and the tools that need real numbers wait for them.
Placeholders have to be honest
This is the part people get wrong. A fan site that invents car top speeds or property prices to look finished gets found out on launch day, and nobody trusts it after that.
Every data page on Vice Index says plainly that the data isn’t in yet. It still looks finished. It just doesn’t lie.
Make the empty state boot
The last piece was engineering. Content lives in Supabase, but the app falls back to a seed file bundled in the repo whenever Supabase isn’t configured:
export async function getGuides() { if (!process.env.NEXT_PUBLIC_SUPABASE_URL) { return seed.guides; // fresh clone, no .env, still renders } const { data } = await supabase.from('guides').select('*'); return data ?? seed.guides;}A fresh clone runs with no .env at all. That sounds minor, but it’s why I could ship pages the same day I wrote them instead of waiting for the backend.
Launch the skeleton. Label the gaps. Fill them when the truth arrives.
Written by Barclay Ibejiako
Say hello if this was useful.