- AI CODING CLUB
- Posts
- ✨Vibe Coding with ChatGPT, Claude & VS Code
✨Vibe Coding with ChatGPT, Claude & VS Code
My 3-Step Stack for Fast AI-Powered Prototyping

“There’s a new kind of coding I call vibe coding, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists.”
That quote hit me like a line of clean Tailwind.
Why? Because it’s exactly how I’ve been shipping tools lately:
No boilerplate. No frameworks. No noise.
Just vibes, AI, and a lean Flask stack.
I call it my 3-Step Stack — a workflow built around:
ChatGPT to shape the idea
Claude to generate clean, modular code
VS Code to run, tweak, and ship
Let’s walk through a real example.
🧠 Step 1: Loose Thought → Structured Prompt (via ChatGPT)
Here’s the kind of raw prompt I drop into ChatGPT:
"I want to build a minimal blog CMS powered by the OpenAI API. Users can create blog posts based on a configurable prompt, in one language, and auto-translate them into others. The homepage should show the latest posts with a search bar. I also want category pages (e.g. /category/ai) and tag pages (e.g. /tag/llm). Posts should be filterable by category or tag. Admins should be able to log in (simple magic link auth is fine), create and edit posts, and trigger translations. Media (images, PDFs, etc.) should be uploaded to Cloudflare R2 and attached to posts. Keep the design minimal but mobile-friendly using Tailwind. Make sure everything is properly split into Flask routes, with separate HTML/JS/CSS files. No React or fancy frontend frameworks — just clean, modular Vanilla JS. The database should be Postgres (on Railway), with media references stored alongside post metadata."
ChatGPT then turns that into a Claude-ready prompt with structure and clarity:
Build a Flask-based multilingual blog CMS with the following features:
1. Public-facing:
- Homepage listing latest posts
- Search bar to filter posts
- Category pages (e.g., /category/ai)
- Tag pages (e.g., /tag/llm)
- Each post supports multiple languages (switch via dropdown)
2. Admin functionality:
- Simple login (e.g., magic link for admin email in .env)
- Admin dashboard to configure the copywriting prompt, then create/edit/translate posts via OpenAI API
3. Media:
- Upload images or files to Cloudflare R2
- Attach media to blog posts
4. Stack:
- Flask backend (main.py)
- PostgreSQL via psycopg2 (deployed on Railway)
- HTML templates (Jinja), Tailwind via CDN
- Vanilla JS (modular, one file per view)
- index.js, admin.js, post.js, etc.
- SweetAlert2 for alerts
- CSS in index.css, admin.css, etc.
- .env for secrets (OpenAI key, R2 keys, etc.)
- Procfile and requirements.txt included
5. Output format:
- main.py
- templates/index.html, post.html, admin.html
- static/js/*.js
- static/css/*.css
- requirements.txt
- migration.py if DB structure changes
Now Claude knows what to build. Time for step two.
📦 Step 2: Claude Builds the Files (Batch Mode)
I paste the structured brief into Claude — along with my default assistant context at the bottom (see next block) — and let it generate the full codebase in logical chunks, all presented in dedicated artifacts.
If a file gets cut off mid-reply, I say:
admin.js was truncated. Please continue where you left off (do not start from scratch) and proceed with the next files.
Claude never panics — it just continues exactly where it left off.
The “do not start from scratch” part is key, to spare tokens.
Assistant context added to every Claude prompt:
You’re a helpful AI-coding assistant specialized in Flask apps.
Stack:
- Flask (main.py)
- PostgreSQL via psycopg2
- Tailwind via CDN
- Vanilla JS in static/*.js
- CSS in static/*.css
- SweetAlert2 for notifications
- Modular JS (e.g., index.js, admin.js)
- .env managed with python-dotenv
- media uploads via Cloudflare R2
- Procfile: web: gunicorn main:app
- requirements.txt for dependencies
Always return:
- main.py
- HTML templates
- JS (1 file per view)
- CSS (modular if needed)
- requirements.txt
- migration.py for DB updates
Max 4 files per reply. If needed, split output across replies.
💻 Step 3: Run & Refine in VS Code
Once the files are in, I drop them into a clean VS Code project.
I clean up requirements.txt
by removing version pins (for compatibility with Python 3.12+):
flask
gunicorn
psycopg2
python-dotenv
requests
boto3
I create a .venv (with the latest Python version installed on my computer) and when prompted to install the packages from requirements.txt, I accept.
If a DB is involved, I create it on Railway, then copy .env
values locally.
Cloudflare R2 credentials go in .env
too — for secure media uploads.
Then I can run main.py
Now I’m in full Edit Mode in GitHub Copilot (using Claude Sonnet 3.7) — tweaking routes, polishing UI, testing uploads — all inside VS Code.
It’s fast. Focused. Fun.
🧑💻 When I Use Replit Instead
Replit is great for:
Demos
Simple tools
1-page apps
It gives me:
A full cloud IDE
Live previews
Built-in deploys
Secret management
I prefer it over Bolt or Lovable because I get more control, and when I outgrow it, I just export the files and move back into VS Code + Railway + Cloudflare R2.
💡 Beware that it can be much more expensive than a ChatGPT/Claude/VS Code workflow though, especially for projects involving a lot of iterations (you’re charged for each checkpoint).
🔁 TL;DR — The 3-Step Stack That Works
ChatGPT to shape a loose idea into a Claude-ready brief
Claude to generate modular Flask projects, piece by piece
VS Code to run, test, and refine everything locally
It’s vibe coding — with structure.
Fast enough for throwaway ideas, solid enough for real tools.
🚀 Your Turn: Try the 3-Step Stack
Have an idea you’ve been sitting on?
This week, try vibe coding it into existence:
Write a messy, natural-language prompt describing what you want to build. Don’t worry about structure.
Drop it into ChatGPT and ask for a Claude-ready version.
Feed that into Claude, batch-generate your files, then open it all in VS Code.
Run it. Tweak it. Vibe with it.
🎯 Mini challenge: Build a tiny tool that uses the OpenAI API — could be a content generator, translator, or a simple assistant. Use Flask + Tailwind + Vanilla JS. Keep it clean, minimal, and functional.
Then share your result with me. I’d love to feature your projects in this newsletter.
Just hit reply.
Let’s build.