The key factors to vibe coding success

Why planning is crucial when building an app.

The promise of vibe coding

Ahh, the joys of vibe coding.

You just ask an AI chatbot to build a web page or app for you, describing the details in natural language and ‘voila!’. Your vision has come to life!

In minutes!

No expensive developers.
No spending months trying to “figure it out” on your own.
No need for years of education.

Even experienced software engineers and UX designers have seen this shift from being a craftsman to an orchestrator.

Some skeptical (a.k.a. terrified). Some excited.

I belong to the second category.

Vibe coding: before and after

Back in 2021, I started building the Lyric Boost app, a workspace for songwriters and music artists to overcome writer’s block to finish more songs. I even planned to incorporate AI music generation capabilities (a seemingly impossible ambition at the time).

I had two options:

  1. Manually build the app myself
  2. Hire designers and engineers to help me build it

Luckily, as a skilled frontend engineer and UX designer, option 1 was accessible to me. In fact, I even leaned on option 2, hiring fellow engineers to help me solve tricky React programming issues.

But even then…I had to greatly limit the scope of the app.

Lyric Boost in 2021 was essentially a freestyle word generator, showing a random word on a screen for several seconds at a time while an instrumental plays. Users freestyle lyrics on the spot based on the current word and then move onto the next.

A small slice of the full concept I had in mind.

Due to a combination of factors (relocated for a new job, difficulty building app functionality, limited budget to hire developers) I shelved the project.

Fast forward to 2025, after hearing about people building apps within days thanks to AI, I decided to bring Lyric Boost back. Partially motivated by seeing AI music apps spring up (and not wanting stand at the sidelines saying “hey, that was my idea!”), I returned to my project with new found vigor.

But this time, things were different.

What used to take weeks to build can now be done in an hour.
Things far beyond my domain of expertise were doable in minutes.
I can sketch a layout, take a picture, and have it built in seconds.

I was able to get significantly more progress with building the app this time around. Since then, Lyric Boost has been used by hundreds of artists and songwriters.

But as I’ve observed through my own experience, as well as watching others build with AI, the process isn’t all rainbows and unicorns.

Why is the vibe off?

Well aesthetically, it kind of is ‘rainbows and unicorns’.

Have you ever seen a website or app and thought “yeah…this is 100% AI-generated”?

Like someone got the assignment to “make the coolest, shiniest app ever! Yay!” and went to work. Perhaps borrowing design cliches from 10 years ago, making everything colorful, magical, and trying to “wow” users.

The app sort of looks good and functions well (kind of), but just feels…off.

The paradox of being overly helpful

A common issue with using AI to make just about anything is that it tries way too hard…to do way too much.

Whether it’s graphic design or web design, article writing or lyric writing (believe me, I know), AI tends to trip over itself to be helpful.

This is especially visible with app development:

  • Every button is big, shiny, rounded and bright
  • Every element ‘fades in’
  • Large text that looks bad in mobile
  • Gradients everywhere! (why??)
  • Over explanatory micro copy

The challenge is, in isolation, some of these “AI decisions” can make sense.

The downside is, without making informed decisions on what your users expect when using your app, a bunch of reasonable decisions that make sense on their own can lead to terrible results when put together.

Good UX design = trust

And this isn’t even just a design snob thing. Sure, when I see AI slop, I throw up in my mouth a little. But that’s not the point.

As an artist at heart, I’ve learned to let go of my subjective opinions on what “good” looks like.

Getting people to buy what you sell matters way more than how tight your branding and web design is. I’d rather an ugly product that sells than a beautiful one that doesn’t.

But let’s be real: small things add up.

Sure, you may forgive weird oversized text or an odd button placement in an app you encounter.

But after seeing 20 of these minor infractions, you might feel that it’s just more trouble than it’s worth. At worse, you may be hesitant to even enter your credit card information.

The site or app could be 100% legit, but it just doesn’t feel that way.

Hidden complexity and debt

And this isn’t an engineering snob thing either.

Look, I’m all for “clean code” and craftsmanship, but vibe coding is here to stay. Some of those rules we engineering nerds hold so dearly are not as “essential” as they used to be.

So I’m not going to scold you (or myself) for flouting the rules in regards to some obscure code principle that doesn’t matter to your app’s users.

But fundamentals do still matter. AI has made it much quicker to build, but there are real pitfalls to just letting the vibes take over.

Some of those issues include:

  • Security and permission gaps
  • Data stored in ways that cause problems later
  • Different parts of the app getting out of sync
  • Small changes unexpectedly breaking other features
  • Simple features becoming harder and harder to add

Sure you can use AI to solve these problems later, but if you’re not aware of them early on, you can end up playing whack-a-mole trying to fix issues in your app.

Importance of preperation

This is the part that I feel get’s glossed over in most discussions about vibe coding.

Not just preparing your business in the macro sense, but creating a plan specifically for your app.

Think it through

Define who your app serves and what it does.

Steal like a designer

Gather references for the design and user experience.

How to get started

Choose the platform and tools to build with.

Build the prototype

Build the core flow to see your app in action.

Think it through

If you don’t have a background in programming or design, my earlier caution can feel out-of-touch at best, discouraging at worse.

But don’t fret. There’s a way to approach vibe coding that will get you great results even if you don’t have prior experience building apps.

Question everything

As Dale Carnegie once said, “An hour of planning can save you 10 hours of doing.” This is true even in the fast paced world of AI-assisted software engineering (a.k.a. vibe coding).

“But why waste time planning when you can just build?”

Thanks for asking :). Planning your app is essential to ensure you know what you’re building and why.

And not just “I’m building a booking app for hair stylists to manage clients” but defining how this process will go.

Some useful things to consider are:

Define the target demographic

What are their interests, life stage and habits?

Identify issues in other apps

What’s lacking in similar apps?

The main goal

What are users trying to accomplish?

Devices and interfaces

Mobile app, web browser, desktop app, etc.

Marketing and distribution

Platforms and methods to spread the word.

You don’t need to address all of these things in minute detail before you start. But the act of putting these things in writing helps guide your decision making as you build.

To work through this, use the prompts below. Replace the bracketed text with your details.

Clarify your idea
I’m planning an app and want help clarifying the problem it should solve. Here’s my starting point: **The idea** [Explain what you want to build, what someone would use it to do, and what prompted the idea. Include any examples or situations that help explain it.] **The people** [Describe who would use it and the circumstances in which they would need it. Be as specific as you can about their activities, responsibilities, or goals.] **What I know so far** [Share how they currently handle this task, any frustrations you’ve observed or heard about, and what you think could work better. Distinguish what you know from what you’re assuming. It’s fine to have gaps.] Using this context, ask me up to 3 focused questions that would help clarify the problem. Build on what I’ve already shared, especially where the current process, difficulties, or desired outcome remain unclear. Wait for my answers before suggesting anything. Then help me write a short description of the app’s purpose: who it helps, the specific problem it addresses, and the outcome it should make possible. Flag any assumptions I should check with potential users.
Map the Journey
Using the app purpose and context we’ve established, help me map a typical user journey. **The task** [Describe the specific task you want to map and what counts as successfully completing it.] **The situation** [Explain what prompts someone to begin this task, where they’re likely to be, and whether they’ll use a phone, computer, or both. Include any constraints you already know about.] Before mapping the journey, ask me up to 3 questions about missing details that would materially change the flow. Wait for my answers. Then map the journey from the user’s starting point to their completed outcome. For each step, identify: - What the user is trying to do. - What information they need to see or provide. - How the app responds and makes the next action clear. - How the user knows the step succeeded. Include any necessary decisions or handoffs, such as choosing an option or waiting for someone’s approval. Flag unresolved assumptions, and keep the journey focused on completing this task.

Organize your planning

After gathering information in the planning phase, it’s important to actually organize this information.

Don’t just ask ChatGPT or Claude for answers, nod your head and move on.

Here are some steps to organize your planning:

  • Create a dedicated folder in your AI chat platform (ex. Projects in ChatGPT)
  • Create a folder in Google Drive. This folder will contain documents, spreadsheets and other planning artifacts.
  • Create a general planning document in Google Docs. Organize the document into different tabs, containing:
    • Chat responses right from your AI chat messages
    • Brainstorming from your own ideas and reflections
    • Roadmap for app features
    • List of objectives to carry out
  • Sign up for a dedicated project management tool. I personally use Asana, but any tool that helps you organize your roadmap, objectives and tasks is fine.

You will need to refer to your planning artifacts on a regular basis.

Planning stack

ChatGPT
ChatGPT

Brainstorm and research

Google Drive
Google Drive

Store and organize files

Google Docs
Google Docs

Document your plan

Asana
Asana

Track and prioritize tasks

Sign up to Camara Lens

Expert guidance on building with AI — without the jargon.

No spam. Unsubscribe anytime.

Steal like a designer

Before you start building, give yourself a design compass. Find a few apps whose layout, navigation, or visual style would suit what you’re making.

Don’t worry. This isn’t literally “stealing”. As long as you’re not replicating intellectual property (logos, brand symbols, photos, taglines, etc.) you’re not going to get into legal trouble.

With that being said, you don’t want to create a literal clone of the apps you’re referencing either (especially if you’re in the same industry).

Save screenshots or URLs and write down exactly what you want to borrow: the sidebar from one app, the booking flow from another, or the typography and spacing from a third. These notes will help you give AI clear direction when you start building.

You don’t need to design every screen upfront. Gather enough reference material to guide your first version. You’ll return to it once you have something you can actually use.

Gather target references

I’d gather three types of references:

  1. Similar or competitor app: See how another product solves the same problem.
  2. Great UX reference: Study an app with navigation and flows that work well.
  3. UI or branding reference: Find a visual style you like for colors, typography, spacing, and overall feel.

Be specific about what you’re referencing. “Use this app’s compact sidebar and this other app’s form layout” gives AI more direction than “make it modern.”

Some sites to gather design inspiration for references include:

Some of these sites require logging in and some have paid plans.

Steal like a designer
Dribbble.com search results for "Dashboard"

Sketch wireframes

In addition to collecting design references, you should also sketch out what your app screens will look like. With pencil and paper (or if you want to be fancy-shmancy, on a tablet).

You don’t need to be an artist (like me) to do this. If you can draw a rectangle, square, circle and squiggly lines, you’re good.

Usually what I’d do is pull up my design references and start drawing screens like the listings screen (ex. songs, products, projects, etc.), individual editor page, and dashboard.

Then, I’d indicate actions and draw arrows showing what happens when, say, the user clicks the ‘Create’ button and what modals / panels appear.

Peep the wireframes below that I drew up for Lyric Boost:

Song listing screen

Song editor screen

User onboarding screen

The cool thing is now with AI, you can take a screenshot of what you drew, upload it to your AI chat tool with a prompt to build based on the drawing.

And that brings me to the next point.

Mockup before coding

I recommend you ask your AI chat app to generate design mockups based on the references and sketches before you start actually vibe coding.

This may seem like a needless extra step, but this can help you visualize how things will look ahead of time. In the “old days”, UX designers would build designs using tools like Figma. Now, tools like UX Pilot and Uizard act as a dedicated AI designer.

You can use prompts like the following:

Turn references into mockups
Create a visual mockup of [screen name] for [app description], aimed at [target user] on [desktop/mobile]. This screen helps the user [main task]. It needs to include [essential content and actions]. Use my attached screenshots, wireframes and/or notes: - [Reference 1]: borrow [specific layout, navigation or visual treatment]. - [Reference 2]: borrow [specific element]. - [Wireframe or description]: follow [screen structure]. If the references conflict, prioritize [reference or instruction]. Adapt them to my app’s purpose and use realistic sample content so I can evaluate the layout. Generate the mockup first, then briefly explain the key design choices. Once we settle on this direction, we’ll extend it to the other screens.
Compare design directions
Create two visual mockups of my app’s [screen name], using my attached references and notes. This screen helps [target user] accomplish [task] on [desktop/mobile]. It needs to include [essential content and actions]. For version A, borrow [specific elements] from [reference]. For version B, use [different reference or approach]. Keep the content and functionality identical, using realistic sample content. Make the differences meaningful through layout, information hierarchy or navigation, rather than just changing colors. Show the mockups first, then briefly explain the tradeoffs for someone using this screen.

How to get started

Time to start building! Sorry to keep you waiting, but the planning and conceptualizing steps really do prevent much of the problems that vibe coding causes.

Option 1: AI app builders

There are two broad approaches: use an AI app builder, or build with a custom tech stack and an AI coding assistant.

App builders package much of the setup into one environment. That can make them useful for trying an idea quickly. Here are some options:

Before committing, check how the platform handles code export, integrations, pricing, and moving your data elsewhere.

How to get started
Home interface for Lovable

Option 2: Custom tech stack

As someone who has built software before “vibe coding”, I prefer sticking to a custom tech stack. While there may be a learning curve with initial set up, you have far more flexibility around building and using AI tools.

Not to mention, you have better control over costs and flexibility around AI usage.

First, you’ll need to download an IDE (integrated development environment) program. While VSCode is my choice when building web apps, I’d recommend you use Cursor, as it is more “AI native”, with built in agentic AI capabilities. For mobile iOS apps, XCode is the way to go. 

For version control (to keep track of changes made in the app), you’ll need to set up the following:

  • Github account and repository (where your project code will live online)
  • Git (for local version control on your computer)

Then comes the UI framework you choose. While iOS apps have the SwiftUI library, for web apps, the React framework is suitable for web experiences.

If you want to be like me and use VSCode, you will still need AI building capabilities. That can be achieved by installing the Github Copilot Agent plugin so you can have the AI build for you.

As for backend configuration, I recommend Supabase. It’s essentially a ‘backend-as-a-service’ platform that helps you set up databases to save, edit and retrieve information. In layman’s terms, it’s what makes an app an app.

We will go into more detail about database setup in the ‘Building a working app with AI‘ article, but it is a good idea to familiarize yourself with the concepts.

And finally, there’s the platform where you actually deploy the live app. While XCode handles deployment for mobile apps, for a web app, Vercel is a great choice.

Check out the prompts below to help you get started with a custom tech stack for a web app:

Set up the project
Set up a React + Next.js web app in this workspace for [briefly describe your app]. Check what’s already in this folder before making changes. If there’s an existing project, build on it. Otherwise, create a simple starter project using TypeScript and standard tooling. Keep dependencies minimal. Create the files and install the dependencies needed to run it locally. Include a basic welcome screen with my app’s name so I can confirm it works. Leave out authentication, databases, payments and other integrations for now. Run the app and check for errors. Then explain how I can open it in my browser, stop it and restart it later. If anything requires my action, give me the exact steps in plain language.
Create the starter interface
Now turn this starter project into a basic interface for [describe your app]. The main thing a user should be able to do is [describe the core task]. Create only the screens and navigation needed to demonstrate that flow, using sample data stored locally in the app. Use a simple, readable layout that works on desktop and mobile. Make the buttons and forms involved in the main flow respond so I can click through it. Clearly identify anything that is only a placeholder. Keep the code organized so we can add real data and features later. Don’t add a backend or external services yet. Run it, check that the main flow works and fix any errors. Then briefly explain what you built, how I can try it and which parts still use sample data.

Build the prototype

Now comes the fun part: turning your plan into a functioning app.

Before jumping into connecting AI functionality and trying to create every screen and feature, hold your horses!

What we’re trying to do here is to get a quick, simple end-to-end win. Nothing super flashy just yet.

For a booking app, that might mean:

  • Browsing providers
  • Opening a provider’s details
  • Choosing a time
  • Confirming the booking

Choose one complete journey that represents the core of your app. Get it working before branching into more features.

Make the flow work

Use realistic sample data: provider names, available times, example projects, or whatever your screens need. Make sure users can move through the core task:

  • Buttons and forms work. Users can enter information, make selections, and continue to the next step.
  • Choices carry through. A booking confirmation shows the provider and time the user selected.
  • Results can be reviewed. If your app turns notes into a project plan, start with a prewritten plan so you can test how users view and edit it. You’ll connect the AI later.

Bring your design references into this build, too. Attach relevant screenshots and explain which details should guide the layout. Get the screens clear enough to use and evaluate; you can refine the visuals once the flow works.

Here’s a prompt to help you with the rough draft prototype:

Build rough prototype
Build a prototype of an appointment booking app. The first flow lets someone browse providers, choose an appointment, and confirm their booking. **Browse providers** Show a list of providers with their photo, name, specialty, and appointment price. Use realistic sample profiles. Selecting a provider opens their details and available appointment times. **Choose an appointment** On the provider’s detail screen, let users select a date and an available time. Make the selected time clearly visible before they continue. **Enter booking details** Ask for the user’s name, email, and an optional note. Show a summary of the provider, date, time, and price alongside the form. Let users return to change their appointment without losing the information they entered. **Confirm the booking** When the user submits valid details, show a confirmation with the provider, appointment date and time, and booking reference. The confirmation should reflect their actual selections. **Design direction** Use the attached references to guide the layout, typography, and spacing. Keep provider information easy to scan and make the next action clear on each screen. Connect these steps so I can try the full booking flow from start to finish.

Refine in manageable pieces

Once that first version works, make focused requests. “Add a filter for provider availability” or “Let users change their selected time before confirming” gives you a specific change to review. Avoid piling unrelated features and fixes into one prompt.

Test after each change. Try the new behavior, then repeat the steps leading into and out of it. Adding a filter shouldn’t erase a selection or break navigation. Fix any problems before adding more.

Save your progress and decisions. Use version control or your tool’s version history to save working versions before substantial changes. Keep a short project document with the app’s purpose, scope, and decisions so you can give AI the context it needs in a new session.

You’re ready to move on when someone can complete the app’s main task from start to finish, even if some data and results are still simulated.

Road to MVP

With the core flow in place, you’re ready to turn your prototype into a minimal viable product (MVP).

In the next article, we’ll get into detail about refining your user interface, configuring AI functionality and laying the groundwork for a production-grade app.

Moust Camara

Software Engineer & Entrepreneur

Moust is a software engineer and entrepreneur who helps businesses build apps, integrate AI, and streamline operations.