Vibe Code to codebykarun.com: Choosing the Right Tools (Part 2)
Part 2 of 5 • Previously: What is Vibe Coding?
In Part 1, I introduced vibe coding and my journey as an iOS developer building a web blog. Now let's dive into the first critical phase: choosing the tech stack.
The First Conversation
As an iOS developer, I didn't know the web ecosystem well. Should I use Next.js or Gatsby? React or Vue? The options were overwhelming.
Here's the actual prompt I used:
My First Prompt:
I want to build a personal blog site with two main sections: coding articles
and personal reflections. I'm primarily an iOS developer but comfortable with
TypeScript. What modern tech stack would you recommend for a fast,
SEO-friendly blog that's easy to maintain?
The Response: A detailed breakdown of options, ultimately recommending Next.js 15 with the App Router, TypeScript, Tailwind CSS, and MDX for content.
Going Deeper: Understanding the "Why"
Getting a recommendation is one thing. Understanding it is another. I followed up:
Follow-up Prompt:
Why Next.js 15 specifically? What advantages does the App Router have over
the Pages Router for a blog? I want to understand the tradeoffs.
The Response: "App Router gives you React Server Components by default, which means your blog content renders on the server with zero JavaScript shipped to the client for static content. The file-system routing is more intuitive for content-based sites, and you get better performance out of the box."
This wasn't just a technical recommendation—it came with reasoning, examples, and considerations about my specific use case as someone new to web development.
Content Management Strategy
Next question: How do I manage content?
My Prompt:
I want to write my blog posts in Markdown for simplicity, but I also want the
flexibility to add interactive React components when needed. I don't want to
deal with a complex CMS—just files I can edit. What's the best approach?
The Response: A recommendation for MDX with a file-based content structure.
Follow-up Prompt:
Show me how to structure the content directory and define TypeScript types
for articles. I want type safety throughout the app. Each article should have
a title, excerpt, publish date, tags, and the content itself.
Within minutes, we had:
export interface Article {
slug: string;
title: string;
excerpt: string;
date: string;
tags: string[];
content: string;
}
No deliberating over schemas for hours. Just a conversation that led to a clean, extensible solution.
The Design Decision
As a developer without design expertise, this was my biggest worry. But the right prompt made all the difference:
My Design Prompt:
I want a clean, minimalist design for my blog. Think Hacker News meets
Medium—lots of whitespace, excellent typography, and subtle use of color.
I need dark mode support from day one. The design should feel professional
but not corporate, modern but not trendy. Can you create a cohesive design
system using CSS variables so I can easily adjust the theme later?
The Response: A complete design system with HSL-based CSS variables, typography scales, and spacing tokens.
Refinement Prompt:
The color palette looks good, but I want the dark mode to be less harsh—
more of a deep gray rather than pure black. Also, can you ensure all the
colors have proper contrast ratios for accessibility?
The AI generated a cohesive design system:
- Color palette based on HSL variables for easy adjustments
- Typography scale with proper line heights and font sizes
- Responsive spacing system using Tailwind's scale
- Dark mode with comfortable, eye-friendly colors
What I Learned About Making Decisions with AI
Three key insights emerged:
1. Be Specific About Your Context
Don't just ask "What should I use?" Include:
- Your skill level
- Your goals
- Your constraints
- Your preferences
2. Always Ask "Why?"
Don't accept recommendations blindly. Understanding the reasoning helps you:
- Make better decisions
- Adapt when things change
- Learn as you build
3. Refine Through Dialogue
First answers are starting points. Follow up with:
- Edge cases you're concerned about
- Specific requirements
- Clarifying questions
The Final Stack
After these conversations, here's what we landed on:
- Framework: Next.js 15 with App Router
- Language: TypeScript (strict mode)
- Styling: Tailwind CSS
- Content: MDX with gray-matter
- Linting: Biome (faster than ESLint)
- Deployment: (decided later based on needs)
Every decision was informed, understood, and documented.
Coming Up Next
In Part 3, I'll show you what happened in the first hour of development—from project initialization to having a working content system.
Next in the Series
👉 Continue to Part 3: First Hour of Development
See how I went from empty folder to working blog infrastructure in 60 minutes.
More in this series: Part 1: What is Vibe Coding? • Part 3: First Hour • Part 4: MDX Pipeline • Part 5: Design System • Part 6: Lessons Learned • Part 7: Best Practices