← All posts

From Prompt to Production: Lessons from Vibe Coding an App Using ChatGPT Only

Originally published on Medium →

Getting started

This past Sunday I “vibe coded” an application using only ChatGPT — without writing a single line of code myself. The project, RecapLM (an AI-powered quiz tool for students), took about 4–5 hours to build from start to finish. My goal was to explore and derive some best practices for vibe coding, and I discovered some interesting insights along the way.

My initial framework consisted of seven steps:

  1. Ask the GenAI to define the project scope.
  2. Ask it to generate code based on the scope.
  3. Ask it to refactor the code for simplicity.
  4. Ask it to write tests.
  5. Iterate using the tests and ask it to fix broken parts.
  6. Ask it to add comments.
  7. Ask it to generate comprehensive documentation.

1. Ask the GenAI to define the project scope

Starting with AI-generated scope definition provides valuable context. I recommend asking the AI to generate functionality ideas, user interface considerations, and potential constraints or edge cases. This brainstorming phase establishes a solid foundation before coding begins.

2. Ask the GenAI to generate code based on the scope

Rather than requesting the entire codebase at once, breaking development into smaller, manageable chunks produces better results. I suggest incremental requests like:

  • “Generate the folder structure for a Next.js app based on the project scope.”
  • “Now let’s create the QuestionCard.tsx component.”

This approach keeps you in control of the development process instead of allowing the AI to generate overwhelming amounts of code simultaneously.

3. Ask the GenAI to refactor for simplicity

You can delegate code cleanup to the AI by asking it to refactor for clarity, conciseness, and best practices. The human developer retains the final decision on whether to accept proposed changes, ensuring quality remains a priority.

4. Ask the GenAI to write tests

I skipped this step for this frontend-focused project, choosing manual testing instead. However, comprehensive unit and integration tests would be beneficial for backend applications.

5. Iterate with the GenAI to fix bugs

During manual testing, I discovered two effective strategies:

#1: Use “Deep Search” to fix unsolvable bugs

When the AI couldn’t resolve persistent issues, explicitly requesting “search deeply for this problem” prompted web searches. This helped identify outdated package versions and alternative solutions that standard debugging couldn’t reveal.

#2: Copy and paste the code involved in the error/refactor

Since LLMs have limited context memory, including actual code snippets in fix requests significantly reduces errors. When multiple components interact, providing all relevant code together yields more accurate solutions.

6. Ask the GenAI to generate comments

This step proved unnecessary because the refactoring phase already produced well-commented code.

7. Ask the GenAI to create comprehensive documentation

At project completion, I requested a comprehensive README.md file from ChatGPT, including a project structure screenshot to jog the AI’s memory. The resulting documentation was surprisingly solid despite potential context limitations.

Other key findings and final thoughts

I observed that developers already engage in “vibe coding” when collaborating with LLMs, but this project emphasized a different mindset: trusting the process and fixing issues as they arise rather than fully understanding every AI decision.

Work dynamics shifted toward product management — testing features, reporting behaviors, and requesting changes — rather than traditional programming. Notably, a subtle inversion of control emerged, with the AI issuing commands to the developer.

Why generalists might thrive here

Generative AI draws from broad knowledge across domains. Generalists with mid-level experience across multiple tools and frameworks excel at collaboration with AI. They can adapt quickly, pose effective questions, and recognize when outputs require adjustment. Deep specialization in one framework matters less than architectural understanding and the ability to evaluate AI suggestions critically.

That’s a wrap!

Structured prompting combined with iterative refinement can produce functional applications in remarkably short timeframes. May the (vibe) code be with you!