Skip to content

Commit 276e811

Browse files
committed
reframe frontendsupport
1 parent 4a94592 commit 276e811

File tree

15 files changed

+612
-31
lines changed

15 files changed

+612
-31
lines changed

CLAUDE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Build the smallest correct solution that matches the spec.
1010
- Prefer small functions and descriptive names over comments.
1111
- Don't change unrelated files.
1212
- Avoid fixed pixels; use `vars.space` from `@cutting/component-library` for spacing.
13+
- Prefer existing npm packages over reimplementing functionality.
1314

1415
## Output expectations
1516

apps/frontendsupport/.claude/settings.local.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"WebFetch(domain:frontendrescue.com)",
55
"WebFetch(domain:www.reddit.com)",
66
"WebFetch(domain:portal.catchpoint.com)",
7-
"Bash(cat:*)"
7+
"Bash(cat:*)",
8+
"WebSearch"
89
]
910
}
1011
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
---
2+
meta:
3+
title: AI Builds Fast. Then You Pay For It
4+
description: What happens when AI-generated code hits production - duplication at industrial scale
5+
date: "2026-01-18T00:00:00.000Z"
6+
tags: ["AI", "slop"]
7+
---
8+
9+
Here's what I'm seeing in codebases with the new wave of AI-generated code.
10+
11+
## The Duplication Problem
12+
13+
Here's what actually happens. A developer plans a feature with AI that needs a table with inline editing. AI builds one from scratch using MUI primitives. It works. Ship it.
14+
15+
Next sprint, different feature, same need. AI builds another table. Slightly different. Also works. Ship it.
16+
17+
Six months later you have five bespoke table implementations across your codebase. Each one has its own bugs. Each one handles edge cases differently. None of them know the others exist.
18+
Now someone asks for CSV export. That's five implementations. Pagination bug? Five places to fix - if you can find them all. Virtualisation for performance? Five separate efforts.
19+
20+
Meanwhile, [material-react-table](https://www.material-react-table.com/) exists. Three years of edge cases solved. Keyboard navigation, cell validation, copy/paste, accessibility, column resizing - all done. Tested by thousands of developers. But AI didn't know to use it, and nobody asked.
21+
22+
## Copy and Diverge Problem
23+
24+
When AI hits complex code it doesn't understand, it copies what it needs and loosens the types to make it compile. Now you have two versions - one battle-tested, one not. They drift apart. You fix a bug in the original, the copy still has it.
25+
26+
I reviewed a PR recently with an 800-line file - a near-copy of an existing utility with loosened types, no tests, and key behaviour stripped out. GitHub hides large files by default. I missed it the first time."
27+
28+
This is happening everywhere AI is used heavily. Tables, forms, modals, data fetching, auth flows - all being copied, loosened, and left to diverge.
29+
30+
## The Maths
31+
32+
Before AI, one developer might introduce some duplication. Code review would catch most of it. The rate was manageable.
33+
34+
Now every developer has a tool that generates plausible-looking code at high speed, and the bias is always toward creating something new rather than finding and extending what exists.
35+
36+
5 bespoke implementations × 10 features each = 50 things to maintain.
37+
38+
Each "quick win" becomes permanent maintenance burden. The codebase gets heavier with every feature. Velocity drops. Nobody understands why.
39+
40+
## What Should Happen
41+
42+
One table component, configured per use case. New feature added once, everyone benefits. That's basic software engineering. We learned this decades ago.
43+
44+
## What Actually Happens
45+
46+
AI doesn't have memory between sessions. It doesn't know your codebase has a preferred table library. It doesn't know someone on another team already solved this problem last month. It doesn't know that the quick solution will cost you ten times as much to maintain.
47+
48+
And if you need AI to understand your own codebase to work in it, you've already lost.
49+
50+
## "Can't You Just Train AI to Use Existing Components?"
51+
52+
You can try. I have a CLAUDE.md with explicit instructions - check for existing components first, use our design system, don't reinvent the wheel.
53+
54+
It still ignores them regularly.
55+
56+
AI instructions work some of the time, not reliably. And they require every developer to include the right context every time. New devs don't know the instructions exist. The AI doesn't know what it doesn't know - it can't check for components it was never told about.
57+
58+
Instructions are better than nothing. But they're not a solution.
59+
60+
## The Coming Reckoning
61+
62+
Right now we're in the hype phase. Everyone's excited about shipping faster. The teams that went hard on AI-generated code in 2024 will hit the wall in 2025. Can't maintain it. Can't scale it. Can't onboard new developers into the mess.
63+
64+
## The cleanup work is coming. The question is whether you'll need it.

apps/frontendsupport/src/components/About/About.tsx

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export function About(): JSX.Element {
99
<PageBlock>
1010
<Box component="section">
1111
<Stack space="large">
12-
<Heading level="1">Performance-first frontend</Heading>
12+
<Heading level="1">Frontend First</Heading>
1313
<Box>
1414
<LazyLoadedImage
1515
src="https://res.cloudinary.com/ddospxsc8/image/upload/v1690230987/me_voddxj.png"
@@ -23,14 +23,7 @@ export function About(): JSX.Element {
2323
Paul Cowan (CEO)
2424
</TextLink>
2525
</Heading>
26-
<Text>
27-
I help teams make modern websites and web apps noticeably faster so key pages load quickly, feel
28-
responsive, and stay visually stable.
29-
</Text>
30-
<Text component="p">
31-
Most of my work is performance-focused: reducing JavaScript bloat, improving rendering (SSR/CSR), caching,
32-
taming third-party scripts, and turning slow pages into measurable wins.
33-
</Text>
26+
3427
<Text component="p">
3528
I’m an open-source fanatic with countless&nbsp;
3629
<TextLink
@@ -81,13 +74,6 @@ export function About(): JSX.Element {
8174
</TextLink>
8275
</Text>
8376
</List>
84-
<Text>
85-
I run short performance sprints that audit, fix, and prove improvements with clear before/after results.
86-
</Text>
87-
<Text>
88-
I’m pragmatic, fast-moving, and focused on impact: fewer bytes shipped, faster interactions, and smoother
89-
page experiences.
90-
</Text>
9177
</Stack>
9278
</Box>
9379
<Box marginTop="large">
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export function ImagePlaceholder(): JSX.Element {
2+
return (
3+
<svg width={150} height={100} viewBox="0 0 150 100" fill="none" xmlns="http://www.w3.org/2000/svg">
4+
<rect width="150" height="100" fill="#e0e0e0" />
5+
<path d="M60 35h30v30H60z" stroke="#999" strokeWidth="2" fill="none" />
6+
<circle cx="68" cy="45" r="4" fill="#999" />
7+
<path d="M62 60l8-10 6 7 10-12 12 15H62z" fill="#999" />
8+
</svg>
9+
);
10+
}

apps/frontendsupport/src/components/Posts/Posts.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Box, Heading, List, PageBlock, Stack, Text, vars } from '@cutting/compo
22
import { Image } from '@unpic/react';
33

44
import type { PostData } from '../../types/post';
5+
import { ImagePlaceholder } from '../ImagePlaceholder/ImagePlaceholder';
56
import { LazyLoadedImage } from '../LazyLoadedImage/LazyLoadedImage';
67
import { TextNavLink } from '../TextNavLink/TextNavLink';
78

@@ -25,8 +26,12 @@ export function Posts({ posts }: PostsProps): JSX.Element {
2526
style={{ border: `1px solid ${vars.foregroundColor.primary}` }}
2627
>
2728
<Box display={{ mobile: 'block', desktop: 'flex' }} alignItems="center">
28-
<Box marginRight="small">
29-
{post.image && <ImageComponent loading="lazy" src={post.image} width={150} height={100} />}
29+
<Box marginRight="small" style={{ minWidth: 150, minHeight: 100 }}>
30+
{post.image ? (
31+
<ImageComponent loading="lazy" src={post.image} width={150} height={100} />
32+
) : (
33+
<ImagePlaceholder />
34+
)}
3035
</Box>
3136
<Stack space="medium">
3237
<Heading level="2">

apps/frontendsupport/src/json/blurhash_image_map.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
[
2+
{
3+
"id": "dry_xucuh4.png",
4+
"url": "https://res.cloudinary.com/ddospxsc8/image/upload/v1768738185/dry_xucuh4.png",
5+
"blurhash": "ULIEz:%%M{I9~X.8WBIB5n#kozS$4nD%s:tR",
6+
"width": 686,
7+
"height": 456
8+
},
29
{
310
"id": "performance_avzere.png",
411
"url": "https://res.cloudinary.com/ddospxsc8/image/upload/v1768061685/frontendsupport/performance_avzere.png",

apps/frontendsupport/src/pages/Home/Home.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ export function Home(): JSX.Element {
2121
>
2222
<Box>
2323
<Heading level="1" weight="regular">
24-
I make slow sites fast
24+
I fix frontend messes
2525
</Heading>
2626
<Box marginY="xxxlarge">
2727
<Text component="p" size="large">
28-
I find what&apos;s slowing you down and fix it. You get faster pages, fewer bounces, and more sales.
28+
AI-generated or otherwise.
2929
</Text>
3030
</Box>
3131
<Box marginBottom="xxxlarge">
32-
<Heading level="2">If your site isn&apos;t faster, you don&apos;t pay.</Heading>
32+
<Heading level="2">If I don&apos;t fix it, you don&apos;t pay.</Heading>
3333
</Box>
3434
<ContactButtons justify="center" />
3535
<Scroller />
@@ -43,24 +43,24 @@ export function Home(): JSX.Element {
4343
<div className={styles.serviceCard}>
4444
<h3 className={styles.serviceCardTitle}>Find the problem</h3>
4545
<ul className={styles.serviceCardList}>
46-
<li>Identify bloat</li>
47-
<li>Find the worst images</li>
48-
<li>Identify layout shift</li>
49-
<li>Find slow third-party scripts</li>
46+
<li>Audit your codebase</li>
47+
<li>Identify duplication and technical debt</li>
48+
<li>Map what&apos;s slowing your team down</li>
5049
</ul>
5150
</div>
5251
<div className={styles.serviceCard}>
5352
<h3 className={styles.serviceCardTitle}>Fix it</h3>
5453
<ul className={styles.serviceCardList}>
55-
<li>Prioritize what matters most</li>
56-
<li>Hit Google&apos;s speed targets</li>
54+
<li>Remove duplication (DRY)</li>
55+
<li>Set up foundations that scale</li>
56+
<li>Remove what shouldn&apos;t be there</li>
5757
</ul>
5858
</div>
5959
<div className={styles.serviceCard}>
6060
<h3 className={styles.serviceCardTitle}>The proof</h3>
6161
<ul className={styles.serviceCardList}>
62-
<li>Before and after metrics</li>
63-
<li>If it&apos;s not faster, you don&apos;t pay</li>
62+
<li>Your team moves faster</li>
63+
<li>If it&apos;s not better, you don&apos;t pay</li>
6464
</ul>
6565
</div>
6666
</div>
@@ -69,7 +69,7 @@ export function Home(): JSX.Element {
6969

7070
<section className={styles.ctaSection}>
7171
<div>
72-
<h2 className={styles.ctaTitle}>Ready to speed up your site?</h2>
72+
<h2 className={styles.ctaTitle}>Ready to fix the mess?</h2>
7373
<p className={styles.ctaSubtitle}>Free call to find out what&apos;s slowing you down</p>
7474
<ContactButtons justify="center" />
7575
<Scroller />

plans/ai-backlash-observations.md

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
# AI Backlash Observations
2+
3+
## Purpose
4+
5+
Document what you're seeing first-hand as AI-generated code hits reality. When the backlash comes, you'll have specific examples and language that resonates.
6+
7+
## The Hype Cycle
8+
9+
1. **Christmas 2024:** "I built an app with one prompt!"
10+
2. **Early 2025:** "Look what AI can do!"
11+
3. **3-6 months later:** "Why is this codebase unmaintainable?"
12+
4. **Later:** "We need someone to fix this"
13+
14+
## Your Bet
15+
16+
The backlash comes before AI gets good enough to fix its own messes. Probably 1-2 years window.
17+
18+
## What to Track
19+
20+
- AI ignoring instructions (even with good CLAUDE.md / system prompts)
21+
- Patterns that keep appearing despite guidance
22+
- Codebases that become unmaintainable
23+
- Teams struggling to onboard into AI-generated code
24+
- "Rebuilt from scratch" stories
25+
- Devs refusing to work on AI messes
26+
- Founders realising they can't sell/raise with incomprehensible code
27+
28+
## Observations
29+
30+
### January 2025
31+
32+
**Exponential Duplication - The Core Problem**
33+
34+
AI duplicates on an industrial scale. Every solved problem gets re-solved badly, across every team, every codebase.
35+
36+
**Example: Table Components**
37+
38+
- Dev asks AI for "table with editing"
39+
- AI builds from scratch using @mui primitives instead of using material-react-table (3+ years of edge cases solved, tested by thousands)
40+
- Works for the demo
41+
- Edge cases appear: keyboard navigation, cell validation, copy/paste, accessibility, column resizing
42+
- Dev asks AI to fix each one, AI adds more code
43+
- Repeat across multiple teams/features
44+
- Now you have multiple bespoke table implementations, each with its own bugs
45+
46+
**The Multiplication Problem**
47+
48+
- 5 bespoke tables × 10 features = 50 implementations to maintain
49+
- New requirement (export to CSV): 5 separate implementations
50+
- Bug in pagination logic: 5 places to fix, if you can find them all
51+
- Virtualisation, paging, sorting - every feature added to every table separately
52+
- One team does it right, others don't know that solution exists
53+
54+
**The Timeline**
55+
56+
- Month 1: "AI is so fast, we shipped 5 features!"
57+
- Month 6: "Why does everything take so long now?"
58+
- Month 12: "We need to rebuild"
59+
60+
**What Should Happen**
61+
62+
One table component, configured per use case. New feature added once, everyone benefits.
63+
64+
**What AI Creates**
65+
66+
Fragmented, diverging copies. Each "quick win" becomes permanent maintenance burden. Codebase gets heavier with every feature.
67+
68+
**Key Talking Point**
69+
70+
"AI speed now becomes AI debt later. Most teams don't see it until they're drowning."
71+
72+
---
73+
74+
### Template for Each Observation
75+
76+
**Date:**
77+
**Context:** (client work, personal project, community discussion)
78+
**What happened:**
79+
**What AI got wrong:**
80+
**What a senior dev would have done differently:**
81+
**Potential talking point:**
82+
83+
---
84+
85+
## Patterns Emerging
86+
87+
(summarise recurring themes as you collect observations)
88+
89+
## Language That Might Resonate
90+
91+
(phrases, framings, ways to describe the problem that non-technical buyers would understand)
92+
93+
## Signals the Backlash is Coming
94+
95+
- [ ] First "we rebuilt from scratch" posts appearing
96+
- [ ] Hiring posts mentioning "clean up AI-generated code"
97+
- [ ] VCs/founders complaining about technical debt from AI
98+
- [ ] Devs publicly refusing AI-heavy roles
99+
- [ ] Conference talks about AI code quality problems

0 commit comments

Comments
 (0)