You know what? Folks keep saying “chatgpt 5 vibe coding” like it’s a real version. It’s not a version I can click. It’s more of a feel. A rhythm. I spent two weeks coding that way—me, a MacBook, VS Code, and ChatGPT open like a chatty teammate who never gets tired. Here’s how it actually went for me, with real code that shipped. If you're looking for a concise rundown on pairing workflows, this short field guide lays out the basics.
If you’d like the blow-by-blow of those fourteen days, my candid notes are in this two-week “honest tea” write-up.
What I mean by “vibe coding”
It’s simple:
- I describe the tiny goal.
- I paste a bit of code or an error.
- I ask for the next small move, not a giant rewrite.
- We keep the loop short. Push, test, tweak, repeat.
Feels like a jam session. I lead the tempo. ChatGPT lays down riffs, but I keep the beat.
If the term still feels fuzzy, check out my hands-on take on what vibe coding means in practice.
My stack for this run:
- Python 3.11, Flask 3.0, Pandas 2.2
- Node 18, React 18
- VS Code, iTerm, and the ChatGPT desktop app
- MacBook Pro, Seattle rain, too much cold brew
Curious which AI copilots pair best with that stack? I'm partial to a few highlighted in this roundup of the best AI for vibe coding. For the gear itself, the picks that keep me moving are in this list of vibe coding tools I actually rely on.
Test 1: A tiny Flask API for dad jokes
I wanted a tiny API I could call from a toy front end. Nothing fancy. ChatGPT drafted the first pass. I asked for small, clear code and human names.
Here’s the starter app it helped shape:
# app.py
from flask import Flask, jsonify
import random
app = Flask(__name__)
JOKES = [
"I would tell you a UDP joke, but you might not get it.",
"Why do Java developers wear glasses? Because they don't C#.",
"There are 10 types of people: those who understand binary, and those who don't."
]
@app.get("/joke")
def joke():
return jsonify({"joke": random.choice(JOKES)})
if __name__ == "__main__":
app.run(debug=True)
First run worked on localhost, but my React page threw a CORS error. I pasted the error into ChatGPT. It suggested a quick patch with flask-cors and scoped it to the one route. Nice and clean.
from flask_cors import CORS
CORS(app, resources={r"/joke": {"origins": "*"}})
Was that safe? For a demo, sure. For prod, I’d lock it down. It even reminded me to pin the package version and note it in requirements.txt. Little things like that matter when you come back in a month.
Test 2: A React button that lied
I had a subscribe form that sent twice. It looked fine. It felt wrong. ChatGPT asked for the snippet, then pointed out the missing e.preventDefault() and the need to guard on “loading.” Simple fix. Honest code. (If you’re curious about the other vibe-coding apps I actually use, VS Code and the ChatGPT desktop app did most of the lifting here.)
import { useState } from "react";
function SubscribeForm() {
const [email, setEmail] = useState("");
const [status, setStatus] = useState("idle"); // idle | loading | ok | error
const onSubmit = async (e) => {
e.preventDefault();
if (status === "loading") return;
setStatus("loading");
try {
const res = await fetch("/api/subscribe", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email }),
});
setStatus(res.ok ? "ok" : "error");
} catch {
setStatus("error");
}
};
return (
<form onSubmit={onSubmit}>
<input
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="you@example.com"
/>
<button disabled={status === "loading"}>
{status === "loading" ? "Working..." : "Join"}
</button>
{status === "ok" && <p>Check your inbox.</p>}
{status === "error" && <p>Something went wrong.</p>}
</form>
);
}
Did I need a debounce? Nope. This tiny guard did the trick. ChatGPT kept the fix small. My favorite part: it didn’t push a full refactor. It matched my vibe.
Test 3: Cleaning a crusty CSV with dates that lied
Real mess: a CSV from a client with money as text (“$1,234.50”) and dates like “03/08/2024.” US? EU? Who knows. I gave ChatGPT 10 sample rows. It suggested a sane parse with dayfirst=True and a tight cleanup for amounts.
import pandas as pd
df = pd.read_csv("orders.csv")
# Dates: prefer day-first; keep rows we can parse
df["date"] = pd.to_datetime(df["date"], errors="coerce", dayfirst=True)
df = df.dropna(subset=["date"])
# Money: strip $ and commas, then to float
df["amount"] = (
df["amount"]
.astype(str)
.str.replace(r"[$,]", "", regex=True)
.astype(float)
)
weekly = (
df.assign(week=df["date"].dt.to_period("W").dt.start_time)
.groupby("week", as_index=False)["amount"].sum()
)
print(weekly.head())
On the first try, it forgot dayfirst. I ran a quick check with two planted rows, and the months were wrong. I pasted the mismatch and asked, “Fix without breaking US rows.” It suggested using a rule: if day > 12, treat as day-first, else fallback. It showed a helper function. That felt human. And it worked on my sample.
What wowed me
- It made clean names. Clear verbs. Fewer “utils” that hide stuff.
- It stayed small. I said “no frameworks,” and it listened.
- It was fast at glue work: CORS, headers, env hints, tiny tests.
- When I pasted errors as-is, it read the trace well and cut straight to the line.
What bugged me
- It gave me a package that didn’t exist once. Just made it up. I laughed, then I checked PyPI. Not there.
- It sometimes pushed a “new pattern” that didn’t match my code style. I had to say, “Keep my style.”
- Version drift: it used a function that moved in Pandas. We pinned versions and it was fine.
Little tricks that helped
- Set guardrails: “No big rewrites. Tiny steps.”
- Ask it to write a small test for every tricky bit. Even one assert helps.
- Paste real input. Not just “Hello world,” but your ugly row 13.
- When it’s guessing, ask for a “scratchpad” note. It will show its plan and risks.
- Keep a running “assumptions” list in the chat. I had four bullets. We checked them when things broke.
Need a fuller playbook? I pulled together a vibe-coding guide with real code snippets that expands on these tricks.
Side note: practicing crisp, real-time conversation isn’t limited to code reviews. If you want a playful, adults-only arena to sharpen your quick-fire writing outside the IDE, check out Sexting.vip where consensual, private chat scenarios let you experiment with snappy language and narrative flow—skills that can make your technical communication even tighter when you switch back to dev mode. Similarly, if you’d like a location-based sandbox for concise, attention-grabbing copy, the community overview at Doublelist Sierra Vista breaks down posting etiquette, safety best practices, and the latest local threads—handy for polishing clear communication under a different kind of deadline.
Time check
I tracked time with Toggl because I’m that person.
- Boilerplate tasks