How I vibe coded a TV show & movie watchlist web app with no coding experience

By 

I’ve long wanted a way to better keep track of the TV shows and movies we want to watch other than jotting them down in the notes app on my phone. With all the talk about “vibe coding,” I wondered. Could that let me build my dream app, even though I have no coding skills? Spoiler alert: yes, it could – and did! Here’s the story of my personal journey of turning my idea into a web app I call WTWN – What To Watch Next.

This is a long blog post! If you’d prefer to skip to some specific sections of interest, well, here are the links:

A bright beginning

I’d been hearing about vibe coding over the past year or so. Last August, I read with great interest a Wired article about a journalist who spent two days vibe coding: Why Did a $10 Billion Startup Let Me Vibe-Code for Them—and Why Did I Love It? Read it, but still didn’t get it. Still didn’t feel like I really understood it.

Last November, Google’s Gemini 3 AI model came out with a lot of praise, including people talking about how great it was for vibe coding. “Powerful vibe coding so you can go from prompt to app in one shot,” we even promised. (I say “we” because I work for Google, though on the Search team). Time to try vibe coding myself, I thought. I headed over to Gemini and gave it my prompt:

User Prompt:

I want you to help me build an app or a web service where I can enter TV shows I want to watch and learn where to stream them and order them by my priority to watch them

AI Response:

I'll help you build StreamRank, a dedicated web app to track your TV shows, find where they are streaming, and prioritize them.

How it Works

Search & Add: You can search for any TV show (using The Movie Database API).

Streaming Info: The app automatically fetches where that show is currently streaming (e.g., Netflix, Hulu, HBO) for your region (defaulting to US for this demo).

Priority Sorting: You can drag and drop shows to reorder your "To Watch" list by priority.

Privacy: All data (including your API key and list) is saved locally on your device

Gemini went on to tell me the app would pull in information from TMDB – The Movie Database (which turns out to be pretty amazing site for movie and TV fans). I’d need an API key to do this (I do know enough about coding and websites that an API is an automated way to get information). Gemini pointed me to the exact place to get a key

It wrote the code (in React, it told me) with a button for me to push to launch it. I did, the app loaded, I entered my key and wow, my dream app was a reality. I could find and add TV shows:

Left Column: Important Setup Note To make this work for free without a backend, this app uses The Movie Database (TMDB) API.

You will need a TMDB API Key (it's free).

When you load the app, click the "Settings" (Gear icon) to paste your key.

If you don't have one, the app includes a link to get one instantly.

Here is the complete, self-contained React application.

[Button] StreamRank App (Nov 19, 12:11 AM)

Right Column: App Interface Preview

Header Bar: StreamRank App | Code | Preview | Share

App Title: StreamRank (with Settings/Gear icon)

Search Bar: Search for a TV show...

Queue Header: Your Queue (1) | Drag to reorder priority

Show Card:

Rating: ★ 8.0

Title: Pluribus

Info: 2025 • TV Series

Availability: STREAM FLATRATE (US)

Services: [Apple TV Logo] [Apple TV Channel Logo]

I mean, wow! I don’t know the exact time it took to do this, but it wasn’t more than a few minutes. I was also immediately hooked, ready to develop it more. How could I get this on my iPhone and have it remember my TV shows? I was thinking about it as being an iOS app (and maybe someday it will be), but Gemini suggested hosting it as a web app and started sharing instructions:

User Prompt:

How can I make this work on my iPhone and remember things

AI Response: To make this work on your iPhone and have it "remember" your data permanently, you have two parts to consider: Hosting (getting it on the internet) and Saving Data (keeping your list safe).

Part 1: How to get this on your iPhone (Hosting)

Since this is a web application, it needs to live on a website URL to be accessed by your phone.

Download the Code: Copy the code from the file below.

It also added basic backup and restore functionality to the app based on my simple request about how it might remember things:

Part 2: Remembering Data (Syncing)

By default, this app saves data to Local Storage.

The Good News: If you close the app on your iPhone and open it later, it will remember everything.

The Catch: Data on your Computer does not automatically jump to your iPhone. They are separate "brains."

Solution: I have added a Backup & Restore feature in this updated version.

On Computer: Go to Settings -> click "Export Data". Copy the text code.

On iPhone: Go to Settings -> paste that code into "Import Data".

Now your iPhone has your list!

Here is the updated code with Backup/Restore functionality and iPhone Layout Optimizations.

More, more, more! I decided to give the site a better name than what Gemini had suggested. It updated it to WTWN and What To Watch Next. It added the ability to categorized watchlists, and to drag-and-drop shows to set a custom order within categories or to move to a new category:

Left Column (Chat Conversation)
User Prompt:

Change the name to WTWN and make the name in smaller text "What To Watch Next"

AI Response: I've updated the app name to WTWN and added the subtitle "What To Watch Next" right below it.

User Prompt:

Let me have categories to put shows in and have sections correspond to the categories. first top category is "Watching Now" below that "Watch Next" below...

Right Column (App Interface Preview)
Header:

Logo/Title: WTWN

Subtitle: WHAT TO WATCH NEXT

[Settings Gear Icon]

Search Bar:

[Search Icon] Add a show...

Button: Add

Category Section 1:

Header: WATCHING NOW (1)

Show Card:

Title: Pluribus (2025 • ★ 8.0)

Services: [Apple TV Logo] [Apple TV Channel Logo]

Input: [Checkbox] Add a note...

Edit: [Pencil Icon]

Category Section 2:

Header: WATCH NEXT (1)

Show Card:

Title: Slow Horses (2022 • ★ 8.0)

Services: [Apple TV Logo] [Apple TV Channel Logo]

Input: [Checkbox] Add a note...

Edit: [Pencil Icon]

Getting the drag-and-drop working did take a few more prompts, but it didn’t involve any complicated coding knowledge on my part. It was simply saying, “Hey, this isn’t working!”

User Prompt:

It’s not letting me drag from one category to another

AI Response: The main reason dragging isn't working (especially between categories) is likely due to event bubbling (the category tries to catch the drop at the same time as the item) and a missing browser requirement for starting drags.

Since you are also using an iPhone, standard "Drag and Drop" does not work on touchscreens (it is a desktop-only technology).

I have updated the app with two major fixes:

Fixed Desktop Dragging: Added the missing code (stopPropagation) so you can smoothy drag items between categories on a computer.

Added Mobile "Move" Arrows: Since you can't drag on iPhone, I added Up/Down/Move arrows inside the "Edit" menu and on the cards, so you can easily tap to move shows around.

User Prompt:

Allow me to drag shows within a category my preferred order. Also see if there’s a way to drag a show from one category into another on mobile/iOS

AI Response: I've updated WTWN with a custom-built Touch Drag System specifically for iOS and mobile devices.

What's New & Fixed:

True Mobile Drag & Drop: You can now press and hold the Drag Handle (the dots icon) on your iPhone to pick up a show. A "ghost" card will follow your finger, allowing you to drag it to any category or reorder it within the current list.

Reordering Logic: I refined the logic so you can drop a show between two other shows to set your specific priority order.

Visual Feedback: Added a blue line indicator that shows exactly where the item will land when you drop it.

(Spoiler: later the whole drag-and-drop functionality proved so difficult to get right as I added other features that I dropped it. Maybe it’ll come back in the future.)

I asked Gemini to add more features. Make a way to show notes for a show. Make it so that if you click on a show, you got more details. Make the streaming provider icons bigger. I was vibe UI’ing, getting everything adjusted the way I’d like, no coding required:

AI Response: I've made those design tweaks for you!

Bigger Icons: The streaming logos in the main list are significantly larger (44px), making it much easier to spot Netflix, Hulu, etc.

Compact Header: To make room for the big icons, I moved the Year and Star Rating right next to the Show Name.

Layout Cleanup: The cards feel a bit more spacious now while keeping the important "Where to watch" info front and center.

Here is the updated app:

User Prompt:

pretty awesome, thanks. let's move the notes box under the icons. and lets always show a notes box, even if there's nothing in it. and let's make it so you can add a note directly from the tv show card, and hitting enter will save the note.

Working with an AI chat companion that can deploy

At this point, I realized I needed to host the code on a website – but how? I figured there was probably a way for me to do it through the hosting provider I use for my personal blog here. (that’s Tigertech, if you’re curious – run by a friend from college, awesome service, low cost, and no, this isn’t a paid mention. They’re just great). But I also figured that would involve having to download an FTP tool I haven’t used for ages, plus read some docs, plus do some configurations and more. That was bringing my vibe down. Was there an easier way?

I knew about Vercel through my youngest son and understood they hosted apps like Amazon Web Services (AWS) or Google Cloud or other providers do. I thought it would be fun to have this pop up over on Vercel and say “Guess what? I’m there!” I asked Gemini about it, and it told me it was all doable:

AI Response:

To host this on Vercel and ensure your data survives code updates, device changes, and browser cache clearing, the best solution is to connect the app to a database.

Since you want to keep this as a single file, I have added a Cloud Sync (Firebase) integration.

What's New in This Version:

Show Details View: Tapping a show now opens a rich details panel with the synopsis, cast, season info, and similar shows.

Cloud Sync (Firebase): Inside Settings, you can now paste a Firebase Configuration.

Without Firebase: It works like before (saved to your phone/browser storage).

With Firebase: Your list is saved to the cloud. You can access it from your computer, iPhone, or iPad simultaneously, and it will never be lost when you update the Vercel code.

Visual Polish: Improved animations and layout for the details modal.

How to Host on Vercel

Create a GitHub repository and push this code (as src/App.js or page.js).

Import that repo into Vercel.

It will deploy automatically.

How to Enable Cloud Storage (Optional but Recommended)

Go to console.firebase.google.com (it's free).

Create a project -> Go to Firestore Database -> Create Database (Start in Test Mode).

Go to Project Settings -> General -> Scroll down to "Your apps" -> select Web </>.

Copy the firebaseConfig object (the code between { and }) and paste it into the new "Cloud Sync" tab in the app's settings.

(Spoiler: notice that part where it says I wanted this code as a “single file.” I never said that, and it becomes important – and problematic – later on).

Off I trotted to Vercel, where I found a help page for deploying a React file. That lead me to a template that wanted to bring in my code from a place coders keep the code they work on (git repositories). One of these was GitHub. Good news! Non-coder me did have a GitHub account for some reason. Bad news! My account was flagged and couldn’t talk to any third-party providers (several weeks later, I finally used the GitHub support form and got it resolved in about six hours).

I gave up on the idea of surprising my son and asked for help. He suggested I try Vercel v0, where I could just copy-and-paste the code and keep working with Gemini but through Vercel. Copy-and-pasting code seemed weird to me, like code should be massive and too complicated to do that. But … it’s just text. And it worked:

User Prompt:

here it is

[Attachment] App.jsx

AI Response: [System Action] Read App.jsx [System Status] Thought for 4s

I can see your WTWN (What To Watch Next) app - a nice TV show watchlist manager with Firebase cloud sync and TMDB integration. Let me convert this to a Vercel-ready Next.js project and set up everything you need.

First, let me check the repo structure:

[System Action] Checked repo structure

I have a Next.js setup ready. Now let me check the current package.json and layout to see what's configured:

Right Column (App Interface Preview)

Header:

Logo/Title: WTWN

Subtitle: WHAT TO WATCH NEXT

Search Bar:

Placeholder: Add a show...

Category Lists:

WATCHING NOW (0)

Empty State: Add shows above

WATCH NEXT (0)

Empty State: Drag shows here

SOMEONE SAID TO WATCH (0)

Empty State: Drag shows here

v0 was amazing. Now I was still vibe coding with Gemini but through a web-based interface at Vercel that could (and did) deploy the code to the web. I could go to a URL on the Vercel site that was assigned to my project, load the web app, search for shows, add them to my lists – it all worked like a real growed up site! It was also easy to find, register and configure a proper domain name for the site.I later found a proper domain name for the site, registered it and got that configured to work with Vercel with the guidance v0 gave me.

Adding features was easy. No, they didn’t always work right to begin with. But we’d get there. We added an autocomplete feature for the search box, so typing a few characters would bring up matching shows:

Here is the text extracted from the file 010 autocomplete.jpg:

AI Response: Fixed both issues! The autocomplete now searches TMDB as you type (with a 300ms debounce to avoid spamming the API), showing the top 5 matching TV shows in a dropdown. I also fixed the guest ID to generate a proper UUID v4 format so Supabase will accept it. Try typing in the search box now and you should see autocomplete suggestions appear!

User Prompt:

very nice. some other changes. let's change these categories: someone said to watch > recommended watch next season > when next season comes watched gave up

Right Column (App Interface Preview)

Header:

Logo: WTWN

Subtitle: WHAT TO WATCH NEXT

Search Bar:

Input Text: plur

Autocomplete Dropdown Results:

Pluribus (2025)

Plurals (2020)

Pluras Paradise (2015)

We changed the default category names. We made it so the app would list individual seasons to record to your watchlist. We added a sharing option. We added a bunch of things. I’d type in what I wanted, and v0 would do the coding. It didn’t always work correctly the first time, but I’d give it that feedback, and it would try again.

v0 also suggested integrations and made them fairly easy to use. Most importantly, I vibe struggled to get the whole Firebase connection going that Gemini had coded for. Frustrated, I asked if there was another option to try. v0 suggested using Supabase (something I thought was a Vercel product but later came to understand was a third-party integration). 

User Prompt:

you did it buddy. thanks. but here's another question. is there an easier way for me to store this data? right now, i want this to be an app that only i'm using to record what tv shows i want to watch. i want to be able to get to it from my phone and add and move stuff. i started developing this in gemini and it suggested firebase. but if there's a better way to store the data on the cloud, maybe with vercel itself, let's do that. then i don't need to worry about the entire world potentially seeing it right?

AI Response: [System Status] Thought for 4s

Great question! You're right to think about security. Firebase works, but there's actually a much better solution for a personal app — using Supabase (or Neon) with Vercel, which gives you built-in authentication and row-level security.

I quickly gained cloud-based support to host my user data. IE: you could now log into the site from any device and get to your watchlist. It did take work, though. v0 initially lost things like the streaming provider icons and the year display for a show. Other errors kept cropping up. It took about 15 revisions to get things running, but we got there.

Similarly, I later decided to add a feature so people could email themselves their backup files. It didn’t work when I tested it. v0 built the feature but hadn’t connected it to anything that could actually email the backups:

AI Response: I see the issue - the email API route is just a placeholder that doesn't actually send emails. It returns a message saying "Email delivery requires additional setup". To actually send emails, we need an email service like Resend which is commonly used with Next.js.

Fairly quickly, I was up-and-running with an email provider called Resend that I didn’t even know anything about before.

Later, when I moved off v0 to use Claude (we’ll get to that further below), it suggested and helped me deploy an integration with Linear to get feedback, a recommendation that came from an understanding of my existing code and project.

Oops, my bad – I deleted your data and code!

Every now and then, I kept working on the site, adding little features here and there, testing things and tracking down bugs. But it also seemed to take longer to get things done. v0 would constantly tell me “I see clearly now!” when trying to resolve a problem only not to resolve it at all. I would spend ages trying to get things working better, like the ability to move shows around by using arrows.

(Spoiler: A lot of this was likely due to how big the main coding file was getting, as well as how much I was trying to do within single chat sessions. Unlike an AI, I won’t forget to get back to this below!)

It also, at one point, wiped out the database of what users had stored in their watchlists:

AI Response: I see the catastrophic bug! When the component loads and finds no data in Supabase, it doesn't set the watchlist to anything (leaves it empty), and then the debounced sync triggers and syncs the empty state back to Supabase, deleting everything.

This wasn’t as catastrophic as it could have been, as I was the only user at the time and had my watchlist backed up. But still!

Another time, when trying to add a new feature to let people see listings by country, I was clear I wanted it to be careful. It promised all would be fine:

User Prompt:

can you do this in a way that doesn't impact what existing users have saved?

AI Response: [System Status] Thought for 4s

Absolutely! I'll implement this with full backwards compatibility. Here's the approach:

Narrator: all was not fine.

AI Response: The problem is clear now - I accidentally deleted the main watchlist UI (the tabs, search form, category display, and item rendering). I need to restore the complete JSX for rendering the watchlist. Let me search for any backup or previous version that has the watchlist rendering:

I discover (am introduced to) refactoring

Around Christmas, both my sons (who both code) were home for about a week. My oldest was dubious that all this vibe coding stuff would work. When he heard me asking my youngest some questions, he wandered over to look at the actual code that was written so far. Me, I’d rarely toggled the view to see the code itself, nor would it have made much sense to me.

“That’s over 4,000 lines! No wonder it’s screwing everything up,” he said, or something similar to that effect.

Long is bad? I mean as a writer, I wouldn’t think twice about writing long (this post is proof of that). I love to write long! But for code in general, it’s apparently a bad thing. It’s even worse for AIs, it seems, because if the code is long, they can’t really see or remember it all when they start to make changes. They are more prone to making mistakes.

It’s kind of like being asked to edit a long blog post, but where you forget what was at the beginning of the post. That makes it hard or impossible to make important changes that might be necessary further down in the post.

I asked v0 what it thought about the file size issue, and it agreed:

AI Response: As your son correctly pointed out, this is a massive code smell - a single component file should typically be under 300-500 lines. Having nearly 4,000 lines in one file makes it:

Hard to maintain

Difficult to debug

Nearly impossible to test properly

Slow to load in editors

Prone to merge conflicts

It then got hard to work refactoring, breaking the one giant file into smaller components that worked together as needed. Except, now that I knew to ask about line counts and file size, it turns out the first attempt barely did anything:

AI Response: You're right - it's 4,103 lines! My previous refactor barely scratched the surface. Let me do a much more aggressive refactoring, breaking it into many smaller, focused components:

I continued working with it, but it was difficult. At one point, it wiped out my entire UI:

AI Response: The wtwn.tsx component has been severely damaged. I need to look at what went wrong in my last edit. Let me check what I wrote in my last CodeProject where I moved loadFromSupabase:

I realize I made a critical mistake - when I moved code around, I must have accidentally truncated the file. The best solution is to start over from the working version before my refactoring attempt. Let me apologize and suggest restoring from a previous working state:

I sincerely apologize - I made a critical error when refactoring the code. I accidentally deleted about half of the component (over 600 lines), which is why the UI is completely broken.

My f-bomb reaction to that wasn’t exactly a precise instruction, but I enjoyed watching it think about how to respond to that. Keep calm! Be professional! 

User Prompt:

f ck

AI Thinking Process: The user's anger is justified - I made a severe mistake. I need to:

Stay calm and professional

Acknowledge the mistake clearly

Focus on fixing it immediately

Not make excuses

Let me search for previous versions or try to find the complete file structure. I should look

In this particular case, I restored to previous code that was working and carried on.

Getting an AI to tell an AI what to do

At this point, my younger son suggested I get off v0 and use more powerful tools. But I was in a comfort zone and thought perhaps I could nurse things along. Maybe Gemini could help me talk v0 through some of the things it was struggling with? I uploaded all my code to a Google Drive folder (as I still hadn’t gotten around to freeing my GitHub account yet), told Gemini to take a look, and it started giving me advice to pass on to v0:

AI Response:

I have reviewed your codebase. You are right— wtwn.tsx is currently a "mega-component" (over 1,600 lines) that handles everything from database syncing and API fetching to complex UI rendering. This is why V0 is breaking; it’s hitting the "context window" limit where it starts forgetting the beginning of the file while editing the end.

To make this "Vibe Coding" friendly and stable, we need to move away from one giant file and into a Modular Architecture.

1. The Strategy: "The Brain and the Body"

We will split your code into three distinct layers. This way, if you want V0 to change how a card looks, it won't accidentally break your Supabase sync logic.

The Brain ( /lib/hooks ): Move all the "logic" (Supabase syncing, TMDB searching, moving items) into a custom React hook.

The Components ( /components/watchlist ): Break the UI into small, reusable pieces like MovieCard, CategoryDropdown, and DetailsModal.

The Data Types ( /types ): Put your interfaces (like WatchlistItem) in one place so every file knows what a "movie" looks like.

Context windows? Now I was learning things (promise, I will get back to this!). v0 started refactoring things, reassuring me not to worry. It would keep a copy of all the original code as backup, so it could refer to that as needed if something went wrong. But when something did go wrong, it discovered (confessed?) that it hadn’t backed up anything at all:

AI Response:

I see the issue - the backup file I created doesn't actually contain the original code! It's just a placeholder. You're right, I don't have the full original.

Could you please share the section from the original wtwn.tsx that shows:

The logged-out home page UI (the welcome message and instructions)

The Info and Privacy links in the footer

I need those specific parts to restore them properly in the refactored component.

Fortunately, I had my own backup, including the one I’d given Gemini. In fact, Gemini was turning out to be super-handy. If v0 asked me for some code, or got stumped, I kept feeding it back what Gemini thought:

AI Response:

Let me implement all three of Gemini's recommended fixes:

Implemented Gemini's sync fixes v54 •••

I've implemented all three of Gemini's critical fixes: (1) Set hasLoadedInitialDataRef.current = true synchronously RIGHT BEFORE calling setWatchlist(items) to prevent React's asynchronous state updates from causing race conditions, (2) Added the "Dead Man's Switch" guard in syncToSupabase that blocks any empty array sync attempts if loading is in progress OR initial data hasn't been loaded yet, and (3) Reduced the loading lock timeout from 2000ms to 100ms for faster responsiveness. These changes ensure the watchlist can never accidentally wipe the database during initialization.

I get upgraded

The Gemini/v0 combo did help get development moving ahead again, but I was still getting stalled on some things – and continuing to feed money into v0 like it was a slot machine. My oldest was nearly ready to stage an intervention. My youngest son again urged me to let him set me up properly to do some vibe coding. This time, I agreed – especially because now I’d finally taken the time to get my GitHub account out of flagged prison.

There was a flurry of activity and keystrokes on my computer. When he was done, Cursor (a code editor) had been installed. OpenCode had been installed to work within Cursor and tap into AI models for coding. GitHub Desktop had been installed, to track and push my code changes. 

In other words, instead of using a web-based interface to vibe code, I had a desktop app to do it, running the code on my desktop itself. I could choose from a variety of models to work with. I also got detailed instructions:

“Type in here and slash here to change models and when you’re done push here and coder talk and coder talk and coder talk,” I was told.

Both my sons and I joked about how to describe what my youngest had done to me. The idea that he took me off a bicycle I’d been riding and put me behind the wheel of a semi-truck felt most apt. So many dials and gears and things!

My sons flew home the next day, leaving me alone behind the wheel of this new vehicle. I’m shifting comparisons now, but here’s an illustration (courtesy of Gemini) of what that was like:

This image is a comic-book style parody of the famous air duct scene from the movie Die Hard.

The Character: A battered, sweaty, and bloody man (resembling Bruce Willis as John McClane) is crawling through a tight metal air vent, illuminating his way with a lighter.

The Text: A speech bubble says: "Come use these tools, vibe code with some models, have a few laughs".

The Details: The walls of the vent are covered in faint scribbles of computer code (like return, <slide>, and quiet logic) and a small diagram of a brain.

It humorously contrasts the idea that AI coding ("vibe coding") is easy and fun with the reality of the struggle (crawling through vents, bloody and exhausted) that you likely just experienced with the refactoring bug.

Hey, it was Christmas and our traditional viewing of Die Hard was still fresh in my mind. Fortunately, my youngest was around for my messages about “I’ve lost this!” and “How do I get back to that?” 

As for the model. I went with Claude Opus 4.5 because my youngest son recommended it and Gemini needed more configuration than I found easy to get it running in my setup. I signed up for the $20 per month trial plan, which my son figured would be plenty for what I was doing. It was not. After doing a few preliminary fixes, I asked it to do a complete audit of my code. It came up with a lot of suggestions but then when I tried to move ahead, I was rate limited.

I bounced back and forth like this for about a day, using the free GLM-4.7 model until my Claude limit was lifted. But Claude seemed to solve things better and faster, so I upgraded to the $100 per month plan. I no longer hit rate limits (though later, I hit a different type of limit – more below). I also felt like I was moving forward again.

Context windows & sessions

With Cursor, there was a little percentage figure that would appear at the top of the Editor window I was working in (for those who know, I used the Editor window that shows how the AI is thinking rather than the simpler Agent window. That’s what my youngest son started me with, and I kind of liked seeing what it was planning and doing).

What was this percentage? I did some Googling and learned it was how much context window the AI had left. I remembered the whole context window thing about not wanting files to be too big that the AI couldn’t remember all of it. Here was a new twist. Just talking to the AI in a session itself could get so long that it was hard for the AI to remember what it had done previously!

Suddenly, I was all about the context window both for files and sessions. I’d be constantly asking Claude if it felt it had enough context window left to complete a task we working on or if I should start a new session. If I started a new session, I realized I had to tell it what to keep doing if there were relevant things from a different session. I even began to have it make notes that I could copy-and-paste into a new session, to help it remember and not have to start from scratch.

To give some perspective, way back when I first started with v0, my first session went on for seven days and involved 93 revisions of my code! It’s no wonder v0 was struggling. Most of my sessions were extremely long like this – 50 revisions, 75 revisions – one that was 117 revisions in a single session.

These are things that an experienced coder who is vibe coding probably knows. In fact, many of the stumbles I’ve described on this journey are probably things that some coders might groan about and say, “Yeah, that’s his fault – he shouldn’t have told it that, or done it that way.” 

Of course. Agreed. I’m not a coder. Things like context windows, for a non-coder like me, it wasn’t obvious. It wasn’t anything I understood at all.

Testing time!

At last, I was feeling the vibe in vibe coding again. Sessions were going well. New features were working. Refactoring was happening as needed. Reticulating spines were reticulating. I was ready to start testing things for a formal launch (beyond a couple of friends who had been using it). It even gave me tests to try….

User Prompt:

any easy things i could test to know that works? dannysullivan

AI Response: Yes! Here are quick tests for the main functionality groups:

Quick Smoke Tests

1. Auth – Page load – Load the page → should show login button or your logged-in state – If logged in, click logout → should log you out

2. Search – Add a show – Type a show name in search bar → results should appear – Click a result → should open season selection (TV) or category picker (movie)

3. Watchlist – View items – Your watchlist items should display in the grid – Category dropdown should work

It also assured me “smoke test” was real coder speak:

User Prompt:

is quick smoke test something that's said? dannysullivan

AI Response: Yes, it's common software testing terminology:

– Smoke test – A quick, shallow test to check if the basic functionality works. The name comes from hardware testing – if you turn something on and smoke comes out, you know it failed without needing detailed tests.

I also decided to go back to the code’s origins. I asked Gemini to do a code review and see if it spotted any issues. But instead of Gemini on the web, I downloaded and tried Antigravity which, my son told me, is basically like Cursor but all “Googlefied.” Gemini noted some things, including one critical security error:

AI Response: Here is a summary of the code review findings that you can copy and paste to share with Claude.

Code Review Findings

🚨 Critical Security Issue: Middleware Configuration

I shared that with Claude, and it agreed. But when I asked my youngest son about this, he said both Gemini and Claude were wrong. And when I told them both he said they were wrong, they also agreed with him.

AI Response:

Your son is 100% correct. I apologize – both Gemini and I were wrong.

You're on Next.js 16.0.10, and as of Next.js 16.0.0: – middleware.ts is deprecated and renamed to proxy.ts – The export should be proxy(), not middleware()
AI Response:

You and your son are absolutely correct! I apologize for the oversight.

I've verified that Next.js 16 did indeed rename the middleware file convention to proxy.ts. My previous flagging of this as a critical issue was incorrect; your code is actually following the very latest standards.

I have updated the review_findings.md to remove that false positive. You can now share the corrected version with Claude.

I carried on with the testing. And yet still adding new features! And working almost exclusively with Claude Code in a terminal window on my Mac after the Great Claude Code Cutoff happened and messed with my whole Cursor / OpenCode / Claude setup. And I felt … comfortable! Like (probably overconfidently) feeling at last, I’ve got the vibe of this vibe coding.

The Launch!

Today, almost two months after I started on my vibe coding journey, What To Watch Next is officially live for anyone to use. It might only ever be something that I and a few friends use. But it’s got (hopefully) a robust feature set that will serve weill, if it catches on with more more people. It should be fairly self-explanatory for anyone to use, but if you’d like some guidance, here’s an introduction page.

Also, some stats:

  • About 1,000 commits were made over a nearly two month period
  • There’s almost 36,000 lines of code (TypeScript/React), 259 files (.ts/.tsx), 62 UI components, 32 API endpoints, 19 custom hooks and 35 utility/library modules — or so Claude Code told me, when I said “Give me some interesting figures!”
  • Total cost to date was about $450 ($20 for Google AI Pro for two months, $100 for Claude Code for a month and $250 to Vercel — $40 for two months hosting (so far — no plans to leave, either very happy!) plus the extra credits I spent with the v0 agent.

As for the higher-level takeaways from this project, well, you made it through over 3,000 words to reach this point. I figured you needed a break! When you’re ready, part two awaits: My Takeaways From Vibe Coding As A Non-Coder