Part 1: Chat apps

The first comparison starts with the simplest interface: a chat box. Chat apps are easy to try, but 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. The flow is different. 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 the tool: which framework assumptions it makes, how much code it returns, and whether the answer is ready to paste into a local project.

Try the same prompt in at least two chat apps. Compare the shape of 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, so 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, which makes the terminal fail with this error:

$ npx tailwindcss init -p
could not determine executable to run

This is a common LLM failure mode. 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 and 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, not 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, so 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, but they are not convenient for ongoing development because they require moving back and forth 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 become more natural.

Before moving on, look at the generated app in Part 1 continued: ChatGPT Snake code. The code shows the kind of result a chat app can leave behind.

Questions & Answers (0)

Sign in to ask questions