Grocer Guesser part 2: deployment troubles, blob storage, and actual traffic
This is part two of my Grocer Guesser journey. If you missed part one, I walked through the entire process of building a game where you guess grocery items from their ingredient lists. Now the game is live at https://grocerguesser.com and you can go play it right now.
In this post I cover what happened after the initial build. Spoiler: a lot of things broke, I bought a domain on impulse, and somehow people are actually finding the game through Google. Let me walk through all of it.
Why I needed an admin UI
After launching the first version of Grocer Guesser, I ran into an obvious problem. Every time I wanted to add a new product to the game, I had to manually edit a JSON file, commit it to GitHub, and wait for Vercel to redeploy. This worked fine when I was just testing, but it felt clunky for ongoing maintenance.
I started thinking about what I actually needed. The game shows players an ingredient list and asks them to guess the product. So I need a way to manage those products. Add new ones. Remove old ones. Maybe toggle certain products on or off without deleting them entirely. And I want to do all of this without touching code every single time.
My first instinct was to look for a free database. Firebase, Supabase, PlanetScale. All of these have generous free tiers. But then I asked myself whether I really needed a full database for what is essentially a list of maybe fifty products. The answer was no. I needed something simpler.
That is when I remembered that Vercel offers blob storage. It is basically a place to store files in the cloud. I could store my product data as a JSON file, read it when someone plays the game, and update it when I want to make changes. No database. No complicated setup. Just files.
Building the admin UI to customize products
Once I decided on blob storage, I needed a way to actually use it. I asked Claude to help me build an admin interface. My prompt was something like: "Build me a simple admin page where I can add products with a name, ingredient list, and category. Let me edit existing products and delete ones I do not want. Store everything in Vercel Blob as a JSON file."
Claude generated the components, the API routes, and the logic for reading and writing to the blob. I did not understand every line of code, but I understood the structure. There was a form for adding products. A list showing existing products. Buttons for editing and deleting. An API endpoint that handled the actual blob operations.
The admin UI lets me add new products, edit existing ones, toggle which products are featured in the game, and delete items I no longer want. Nothing fancy. Just a form with some buttons that talks to an API endpoint. The kind of thing that takes a professional developer maybe an hour but takes me an entire evening of back and forth with Claude.
I kept running into small issues. The form would not submit correctly. The list would not refresh after adding a product. The delete button would remove the wrong item. Each time I hit a wall, I copied the error or described the behavior to Claude, and we worked through it together. Slowly the admin panel started working the way I imagined.
Using Vercel Blob storage for free
Vercel offers blob storage that is free up to a certain limit. For a small project like this, free is exactly what I need. The blob storage acts like a simple file system in the cloud. I can upload JSON files, read them back, and update them whenever I want.
The mental model is straightforward. Think of it like Dropbox but for your app. You upload a file, you get a URL, and your app can fetch that file whenever it needs the data. The difference is that you can also update and delete files programmatically through API calls.
I store all the product data as a JSON file in the blob. When someone plays the game, the app fetches that file. When I use the admin UI to make changes, it updates the same file. The whole thing feels almost too simple, which is usually a good sign.
One thing I had to figure out was how the blob token works. Vercel gives you a secret token that authenticates your requests to the blob storage. You cannot just let anyone read and write to your blob. The token proves that the request is coming from your app.
This approach keeps things simple and costs me nothing. If the game ever grows large enough to need a real database, I can migrate later. But for now, blob storage handles everything perfectly.
Adding environment variables
One thing I learned during this process is that API keys and sensitive configuration should never be hardcoded. If I put my blob token directly in my code and pushed it to GitHub, anyone could see it. They could read my data, delete it, or fill my blob with garbage. That would be bad.
Vercel makes this easy with environment variables. Instead of writing the token in my code, I store it in my Vercel dashboard under the Environment Variables section. Then my code references the variable by name, and Vercel fills in the actual value when the app runs.
I added the blob storage token as an environment variable in my Vercel dashboard. The app reads the variable at runtime so the actual token never appears in my code. This felt like a small thing but it prevented me from accidentally exposing credentials when pushing to GitHub.
The tricky part was understanding when environment variables are available. Some variables are only available on the server side. Some are available during the build step. Some need a special prefix to be accessible in the browser. I got confused by this several times and had to ask Claude to explain the differences.
If you are building something similar, take the five minutes to set up environment variables properly. Future you will be grateful.
The deployment troubles
Here is where the real adventure began. Every time I pushed changes to GitHub, Vercel would try to build the project and deploy it. In theory this is automatic and painless. In practice I kept running into errors.
The first error was about a missing dependency. Claude had generated code that used a library I had not installed. Easy fix. I ran npm install, added the package, and pushed again.
The second error was about a file that could not be found. The code was referencing a path that worked on my laptop but did not exist in the deployed environment. Claude helped me fix the import statement.
The third error was about the environment variable not being defined. Turns out I had added the variable to my local .env file but forgot to add it to Vercel. Once I added it in the dashboard, that error went away.
The fourth error was something about the build failing during a specific step. I did not fully understand what was happening, so I copied the entire error message from the Vercel logs and pasted it into Claude. Claude explained the issue and gave me the corrected code.
This cycle repeated more times than I want to admit. Some errors were about missing dependencies. Some were about incorrect file paths. Some were about environment variables not being available during the build step. Each one felt like a small puzzle that Claude helped me solve.
The process looked like this: build fails, copy the logs, paste into Claude, get a fix, apply the fix, push, build fails differently, repeat. Eventually the build would succeed and I would feel like I just won a small victory against the machine.
I want to be honest about this because I think a lot of tutorials make deployment seem effortless. It is not. At least not for me. But the errors are solvable if you are patient and willing to ask for help.
This is not glamorous work. It is tedious and sometimes frustrating. But it is also part of building things. Every deployment error taught me something about how Vercel works, how builds happen, and how to read logs more carefully.
Buying the domain on impulse
At some point during the debugging marathon I decided the game deserved its own domain. I was tired of sharing links that ended in .vercel.app. I wanted something clean and memorable.
I searched for grocerguesser.com and it was available. I bought it immediately without thinking too hard about whether I should. It cost maybe twelve dollars for the year. Not a big commitment.
This is a pattern I have noticed in myself. When a project starts feeling real, I want to give it a real home. The .vercel.app subdomain works fine but there is something satisfying about typing a clean domain into the browser and seeing your thing appear.
Connecting the domain to Vercel was simple. I added the domain in my Vercel dashboard, updated the DNS records with my registrar, and waited a few minutes for everything to propagate. Now https://grocerguesser.com points directly to the game.
There was a brief moment of panic when the domain showed an SSL error. I thought I had broken something. But it turned out I just needed to wait a bit longer for the certificate to be issued. Vercel handles SSL automatically, which is nice.
This week: Trader Joe's products
This week I am focusing on adding Trader Joe's products to the game. If you have ever shopped at Trader Joe's, you know their ingredient lists are interesting. They tend to use simpler ingredients than big national brands. But they also have some wild specialty items with unusual combinations.
I spent an evening at Trader Joe's flipping over packages and photographing ingredient lists. Some products are obviously Trader Joe's when you read the ingredients. Others could be from anywhere. That variety should make for good gameplay.
The thinking here is that themed batches of products might make the game more engaging. Instead of a random assortment of items, players can try a Trader Joe's round or a breakfast foods round or a snacks round. I am still figuring out the best way to organize this, but for now I am just adding products and tagging them by store.
Actual traffic from SEO
Here is the part that surprised me. A few days after the game went live, I started seeing traffic in my analytics. Not a lot. But real people finding the game through Google searches.
I checked what keywords were driving traffic. Things like "guess the food from ingredients" and "ingredient guessing game" and "food trivia game". These were exactly the searches I would expect from someone looking for this kind of thing.
I did not do any intentional SEO work. I just built a thing, gave it a descriptive title, wrote some content around it, and put it on the internet. Apparently that was enough for Google to start showing it to people searching for ingredient related games or food trivia.
This made me think about the value of building things that fill gaps. If you search for something specific and nothing good exists, that is an opportunity. Build the thing, describe it clearly, and search engines will connect you to people who want it.
This tiny bit of organic traffic feels validating. It means the idea resonates with at least a few strangers on the internet. It also means the game might grow slowly over time without me having to do much promotion.
If you are building side projects, do not underestimate the power of just putting things online with clear titles and descriptions. Search engines do the rest.
What I learned this round
This second phase of building taught me a few things.
First, deployment is never as smooth as the tutorials suggest. Things break. Logs get confusing. The solution is to copy everything into Claude and iterate until it works. Do not get discouraged by errors. They are normal.
Second, free tools can take you surprisingly far. Vercel hosting, blob storage, and a cheap domain give you a production ready setup without spending much money. You do not need to pay for infrastructure until you have real traffic that demands it.
Third, traffic can appear from nowhere if your idea fills a gap. I did not market Grocer Guesser. People just found it because they were searching for something like it. Build useful things and the internet will find them.
Fourth, themed content might be more engaging than random content. The Trader Joe's batch feels more cohesive than a random mix of products. I want to experiment more with this idea.
Play the game
If you made it this far, go play the game at https://grocerguesser.com. Try to guess grocery items from their ingredients. See how many you can get right. Let me know if you discover anything surprising about the foods you thought you knew.
More updates coming as I keep building. Thanks for following along.