Claude Opus 5 vs Sonnet 5: I Built the Same App with Both — Step by Step (Copy My Spec)
Anthropic shipped Claude Opus 5 on July 24. It is the same price as Opus 4.8 but better on every benchmark.
Claude Opus 5 vs Sonnet 5: I Built the Same App with Both — Step by Step (Copy My Spec)

Anthropic shipped Claude Opus 5 on July 24. It is the same price as Opus 4.8 but better on every benchmark.
💥 Master Any Skills in 3 Months
- 📚 Up to 50% OFF Premium Courses ⏰ Limited-Time Offer [👉 **Enroll Now & Start Learning](https://trk.udemy.com/zz4NBO)***

Opus 5 is available right now on Claude Pro. Claude Sonnet 5 is the default option for Claude Code.
I ran the same spec through Claude Opus 5 and Claude Sonnet 5 in Claude Code.
Here’s every step, the exact spec you can copy, and the prompt counts that show you whether the upgrade matters.
Step 1: The Setup
You need Claude Pro ($20/month) and Claude Code installed. If you don’t have Claude Code yet:
npm install -g @anthropic-ai/claude-code
Create a project folder:
mkdir opus5-test && cd opus5-test
Create a .env file with your Supabase credentials:
VITE_SUPABASE_URL=your_project_url
VITE_SUPABASE_ANON_KEY=your_anon_key
Step 2: The Database (Run Once in Supabase SQL Editor)
create extension if not exists "uuid-ossp";
create table categories (
id uuid default uuid_generate_v4() primary key,
name text not null unique
);
create table expenses (
id uuid default uuid_generate_v4() primary key,
user_id uuid references auth.users(id) on delete cascade,
description text not null,
amount decimal(10,2) not null,
category_id uuid references categories(id),
expense_date date not null default current_date,
created_at timestamp with time zone default now()
);
alter table expenses enable row level security;
alter table categories enable row level security;
create policy "Users can view own expenses" on expenses
for select using (auth.uid() = user_id);
create policy "Users can insert own expenses" on expenses
for insert with check (auth.uid() = user_id);
create policy "Users can update own expenses" on expenses
for update using (auth.uid() = user_id);
create policy "Users can delete own expenses" on expenses
for delete using (auth.uid() = user_id);
create policy "Anyone can view categories" on categories
for select to authenticated using (true);
insert into categories (name) values
('Software'), ('Hardware'), ('Travel'), ('Marketing'),
('Office Supplies'), ('Subscriptions'), ('Meals'), ('Other');
Step 3: The Spec (Copy This Exactly)
This is the exact prompt I pasted into Claude Code for both tests:
Build a team expense tracker app.
Stack: React, Vite, TypeScript, Tailwind CSS, Supabase.
Supabase project URL and anon key are in .env as
VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY.
The database already has two tables: expenses (id, user_id,
description, amount, category_id, expense_date, created_at)
and categories (id, name). RLS is enabled. Categories are
pre-seeded: Software, Hardware, Travel, Marketing, Office
Supplies, Subscriptions, Meals, Other.
Build these 5 features:
1. Auth: email/password sign up and login using Supabase Auth.
Protect all routes - redirect unauthenticated users to login.
2. Dashboard: 3 data cards at top (total spending this month,
number of expenses, average expense amount). Below cards,
a bar chart for spending by category and a line chart for
daily spending this month.
3. Add expense form: modal with description (text), amount
(number), category (dropdown from categories table), date
(date picker, default today). Validate description and
amount before saving.
4. Expenses table: all expenses for logged-in user. Columns:
date, description, category name, amount. Category filter
dropdown above the table. CSV export button that downloads
currently filtered expenses as .csv file.
5. Mobile responsive using Tailwind breakpoints.
Dark sidebar navigation with light content area. Clean design.
Step 4: Sonnet 5 Build

Here’s what happened:
Prompt 1: Sonnet 5 built auth, the dashboard with three cards and both charts, the add expense modal, and the expenses table. All rendered. The category filter dropdown populated from Supabase.
The bug: CSV export downloaded a file, but the category filter wasn’t applied. Clicking “Export CSV” with “Travel” filtered still exported all expenses.
Prompt 2: “The CSV export doesn’t respect the active category filter. Fix it so the exported file only contains the filtered rows.”
Fixed in one follow-up. CSV now respects the filter.
Total: 2 prompts. Solid build. One bug on first pass. Mobile responsive worked.

Step 5: Opus 5 Build
Create a fresh folder (don’t reuse the Sonnet 5 project):
Prompt 1: Opus 5 built everything. Auth, dashboard with three cards and both charts, add expense modal with validation, expenses table with category filter, and CSV export.

The difference: The CSV export worked on the first pass. Opus 5 connected the filter state to the export function without me mentioning it as a separate concern.
Two bonus additions I didn’t ask for:
- Empty-state message on the dashboard when no expenses exist (“No expenses yet. Add your first one!”)
- ON DELETE CASCADE on the category foreign key
Total: 1 prompt. Complete build. No follow-up needed.

What the Benchmarks Confirm
Anthropic’s numbers back up what the build test showed:
- Frontier-Bench: Opus 5 more than doubles Opus 4.8’s score
- SWE-Bench Verified: 97.0%
- SWE-bench Pro: 79.2%
- ARC-AGI-3: 30.2%
- Context window: 1M tokens (same as 4.8)
- Max output: 128K tokens
- Thinking: On by default — no toggle needed
The safety classifiers fire 85% less often than on Fable 5.
Final Thoughts
After building the same application with both models using the exact same specification, the difference wasn’t dramatic… but it was noticeable.
Claude Sonnet 5 is still an excellent coding model. It delivered a complete, production-ready expense tracker in just two prompts.
Claude Opus 5, however, behaved more like an experienced senior engineer. It anticipated edge cases, connected related features without additional instructions, and shipped a polished implementation in a single prompt.
That lines up with Anthropic’s benchmark improvements. The higher SWE-Bench scores aren’t just numbers on a chart — they translated into fewer iterations, less prompt refinement, and less time spent fixing small issues.
Sonnet 5 is the best value, but Opus 5 is the model you reach for when getting it right on the first attempt matters most.
I’m an AI software engineer and tools curator. I test, break, and review AI-powered tools so you don’t waste time on the hype. Reach out to me at felixkebaya@gmail.com.
***Follow me for more authentic breakdowns like this one.***
***Connect with me on LinkedIn.***
***Follow me on Substack***
Thank you for being a part of the community
Before you go:

👉 Be sure to clap and follow the writer ️👏️️
👉 Follow us: **Linkedin| [Medium](https://medium.com/codetodeploy)**
👉 CodeToDeploy Tech Community is live on Discord — **Join now!**
Disclosure: This post includes affiliate and partnership links.
메타데이터
- post_id
- dd4f1ab5dd6d
- slug
- claude-opus-5-vs-sonnet-5-i-built-the-same-app-with-both-step-by-step-copy-my-spec-dd4f1ab5dd6d
- url
- https://medium.com/codetodeploy/claude-opus-5-vs-sonnet-5-i-built-the-same-app-with-both-step-by-step-copy-my-spec-dd4f1ab5dd6d
- canonical_url
- https://medium.com/codetodeploy/claude-opus-5-vs-sonnet-5-i-built-the-same-app-with-both-step-by-step-copy-my-spec-dd4f1ab5dd6d
- author_url
- https://medium.com/@felixkebaya
- status
- ok
- fetched_at
- 2026-08-09 04:52:39