Part 1: Chat apps
The first comparison starts with the simplest interface: a chat box. Chat apps are easy to try. They also make you move code by hand between the browser and your editor.
Start with the chat applications people usually try first:
Microsoft Copilot here means the chat product, not GitHub Copilot. Microsoft Copilot behaves like a chat app, while GitHub Copilot works inside an editor or repository workflow.
The shared prompt
Use a compact prompt for chat apps:
implement snake in react
The ChatGPT demo uses the same ask with slightly different wording:
Create snake game using React.
The prompt is short on purpose. A small prompt tests the default behavior of each tool. Look at which framework assumptions it makes and how much code it returns. Check whether the answer is ready to paste into a local project.
Try the same prompt in at least two chat apps.
Compare how each one structures the answer before you copy anything:
- Does it return one component or a whole project?
- Does it assume Tailwind, plain CSS, or another styling system?
- Does it include setup commands?
- Does it explain where the file should go?
- Does it include controls, score, and restart behavior?
Use those questions to compare the tools. The code matters, but the flow around the code matters too.
Local Vite shell
The finished snake-chatgpt folder is a Vite React app.
To recreate that shell from scratch, start with the React template:
npm create vite@latest snake-chatgpt -- --template react
cd snake-chatgpt
npm install
The finished app uses Tailwind through the Vite plugin.
Add the same packages if your generated answer uses Tailwind classes:
npm install tailwindcss @tailwindcss/vite
Configure vite.config.js with the plugin. The component returned by the chat
app uses Tailwind utility classes for the board and controls.
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [react(), tailwindcss()],
})
The matching src/index.css is one line:
@import "tailwindcss";
Now run the app:
npm run dev
Open the local Vite URL that appears in the terminal. Now the important comparison is not visual polish. It is whether the chat answer can be turned into a running project without a lot of manual repair.
Tailwind version gotcha
The ChatGPT answer uses React and Tailwind CSS. A first setup answer can mix in older Tailwind initialization steps.
That makes the terminal fail with this error:
$ npx tailwindcss init -p
could not determine executable to run
The model may know an older version of a tool, and frontend setup commands change often.
Ask ChatGPT to search and use the current Tailwind instructions:
Use the most up-to-date instructions for Tailwind CSS.
Search to find the most up-to-date instructions for Tailwind.
If the answer still mixes the old and new approaches, tighten the request:
Use only the newest instructions, not the old ones.
You want the Vite plugin setup shown above. The lesson is not Tailwind specific. When generated setup commands fail, ask the model to verify against current documentation. Watch whether it combines old and new answers.
Package shape
The snake-chatgpt/package.json file keeps the default Vite scripts and
adds React, Vite, ESLint, and Tailwind packages:
{
"name": "snake-chatgpt",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"lint": "eslint .",
"preview": "vite preview"
}
}
The dependency list is small. That helps the comparison because the app is still mostly generated component code.
The app is not mostly framework setup:
{
"dependencies": {
"react": "^19.1.0",
"react-dom": "^19.1.0"
},
"devDependencies": {
"@tailwindcss/vite": "^4.1.11",
"@vitejs/plugin-react": "^4.6.0",
"vite": "^7.0.4"
}
}
The full package also has ESLint packages and type packages. The shorter set above is enough to understand which pieces affect the generated React app directly.
Claude chat comparison
Try the same app in Claude chat:
Create the snake game using React.
The generated app runs in Claude's preview.
Then ask for two changes:
I want to use WASD for controlling the snake.
Also I want to have two modes: walls and pass through.
Claude edits the preview directly. That is more convenient than a plain text
answer, but the download path still matters. In this demo, the available
download is a single tsx file. You still create a local project, paste the
file, install the right dependencies, and run it.
Claude also hits the free-message limit during the live demo. That is part of the tool comparison too. A tool can produce good code and still be awkward if the session limit interrupts the workflow.
Chat app friction
Chat applications are helpful. They are not convenient for ongoing development because you keep moving between the chat application and the IDE.
That is the main takeaway from this part. Chat is good for producing a first draft, explaining code, and asking for focused changes. Once the code is in a real project, tools that can read and edit files in place feel more natural.
Before moving on, look at the generated app in Part 1 continued: ChatGPT Snake code. The code shows the result a chat app can leave behind.