惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

AI
AI
爱范儿
爱范儿
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
有赞技术团队
有赞技术团队
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
罗磊的独立博客
D
Docker
美团技术团队
Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
月光博客
月光博客
P
Proofpoint News Feed
博客园 - 聂微东
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
H
Help Net Security
T
Tailwind CSS Blog
S
Securelist
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
Jina AI
Jina AI
C
Cybersecurity and Infrastructure Security Agency CISA
Y
Y Combinator Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - Franky
S
Security @ Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
U
Unit 42
S
SegmentFault 最新的问题
Project Zero
Project Zero
P
Palo Alto Networks Blog
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
F
Full Disclosure
P
Privacy & Cybersecurity Law Blog
J
Java Code Geeks
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
Recent Commits to openclaw:main
Recent Commits to openclaw:main
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
V
Vulnerabilities – Threatpost
S
Schneier on Security

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
How to migrate with Claude Code and not die trying
Sergio Azóca · 2026-04-29 · via DEV Community

Migrating no longer hurts

I migrated the entire design of this site in a couple of days. Before Claude Code, that same migration would have eaten up two weeks of my time, and I'd probably have put it off for six months out of pure laziness.

I've been doing migrations for years. Vue 2 to Vue 3, full design systems, architectural refactors that touched hundreds of files. They all had one thing in common, they hurt. Long, mechanical projects with high risk and little visible reward. The kind of work you know has to be done but keep putting off because it sounds like hell.

Not anymore.

The historical pain of migrating

Migrating from Vue 2 to Vue 3 was a quarter-long project. Not because of real technical difficulty (most of it was replacing deprecated APIs), but because of sheer volume. Hundreds of components, each with its own quirks, all of them needed touching. Add Pinia, Vue Router 4, the third-party plugins that didn't yet support v3. And while you were migrating, the rest of the team kept merging features into main. By the time you tried to merge back, it was hell.

Migrating a design system was similar but worse. You change the token system, the base components, the prop names. Suddenly every <Button variant="primary" /> in the app needs review, and when you have hundreds of those, no team signs off on a full quarter just for that.

The pattern was always the same, high load, low motivation, indefinite procrastination.

Why migrations are the perfect scenario for an agent

After doing several with Claude Code, I've identified three conditions where they're ideal:

  1. High volume of mechanical changes. The oxlint PR at my current job touched more than 700 files. Most were trivial adjustments (import order, equivalent patterns). Exactly the kind of work that is humanly tedious and that an agent does in minutes.

  2. Clear, automatable feedback. Linter, Typecheck, Tests, they pass or they don't. The Build compiles or it doesn't. Every step is a loop with binary response, exactly the kind of signal an agent needs to iterate without continuous supervision.

  3. Accessible documentation. The target tool almost always has a migration guide. Pass the guide to the agent, give it the project context, and it stops making things up.

If your task meets all three, stop procrastinating. It's work for an agent.

Case 1: a monorepo's toolchain

The team at my current job operated a monorepo with 7 applications on Cloudflare Workers, around 1,670 TypeScript files managed with pnpm workspaces. The quality pipeline used Biome for lint and format, and tsc for type-check.

Two bottlenecks:

  • Biome and tsc required NODE_OPTIONS='--max-old-space-size=8192' to avoid out of memory crashes during CI.
  • tsc, single-threaded, took 25 seconds to typecheck the entire monorepo.

We'd been watching for months what the oxc team (oxlint, oxfmt, everything they're building in Rust) was shipping. The question wasn't whether the migration was worth it, but how much effort it was going to cost.

Migration to oxlint + oxfmt

The steps:

  1. Replace Biome with oxlint and oxfmt.
  2. Configure .oxlintrc.json with 129 active rules.
  3. Configure an equivalent .oxfmtrc.json.
  4. Update scripts in package.json.
  5. Adjust the GitHub Actions pipeline.
  6. Adjust the editor config.

The bulk of the work wasn't switching tools. It was adjusting code to meet the new rules (mostly about import order and equivalent patterns). Claude Code made the changes, we ran the validations, adjusted, repeated.

Metric Biome oxlint (Jan 2026) oxlint (Mar 2026)
Average time 3.70s 1.04s 0.49s
Files analyzed 1,227 1,262 ~1,670

oxlint was processing more files with more rules in a fraction of the time. And the tool keeps improving with every release.

Migration to tsgo

TypeScript 7 (tsgo) is the rewrite of tsc (TypeScript Compiler) in Go. Microsoft promised 7x to 10x improvements. The migration was even more straightforward:

  1. Install @typescript/native-preview.
  2. Change the script from NODE_OPTIONS='--max-old-space-size=8192' tsc to tsgo.
  3. Adjust tsconfig.json (drop baseUrl, add ./ as prefix in paths).
  4. Update the CI cache (from .tsbuildinfo to .tsgo-cache).
  5. Fix types in places where tsgo is stricter than tsc.

The bonus, you no longer need the memory config. tsgo runs in Go without Node's constraints.

Metric tsc tsgo (Jan 2026) tsgo (Mar 2026)
Time (cold) 25.34s 5.32s 0.76s
CPU usage ~132% ~430% ~430%
Requires memory config Yes (8 GB) No No

33 times faster on typecheck, without touching a single line of TypeScript code in the project.

The final number

Phase Before Migration Today (Apr 2026)
Lint 3.70s 1.04s 0.49s
Typecheck 25.34s 5.32s 0.76s
Total 29.04s 6.36s 1.25s

From 29 seconds to 1.25. 23 times faster. And what finally convinced the team were precisely those results. Without measuring before and after, the migration is just "Sergio changed the tools". With the results, it's "lint and typecheck are 23X faster".

Lesson: always measure. That's what turns a migration into a story the team understands and signs off on.

Case 2: screaming architecture in a large frontend

Before the toolchain migration, I'd done another one: applying screaming architecture to the main product's frontend. Reorganizing the repo from technical folders (components/, services/, store/) into feature modules (modules/Auth/, modules/Orders/, etc).

The change itself is simple: move files and update imports. But when it's hundreds of files in hundreds of imports, it's the textbook definition of "mechanical work nobody wants to do on a Friday".

This is where Claude Code shines. The pattern is uniform, changes are verifiable (compiles or doesn't), and the only new rule is "everything in feature X lives in modules/X/". The agent gets the pattern from the first example and applies it everywhere else.

All I had to do was define the contract (specs). Which modules to create, what counts as shared, how to handle files that touched more than one feature. After that it was iterate, validate build, validate tests, adjust.

Lesson: structural refactors are ideal when the pattern is clear but the volume is high. Define the rules once, let the agent apply them everywhere.

Case 3: the redesign of this site

The most recent one and the closest to this post. Migrating sergioazocar.com from the previous design to the current one: edge-to-edge layout with BentoGrid, Nuxt UI v4, Tailwind v4, custom color system (beacon and orbit), dark-only theme, translucent borders with color-mix.

The difference with the previous cases is that the project context was entirely mine. I have a well-kept CLAUDE.md, with the repo conventions, the stack, the i18n rules, the blog post patterns, the gotchas. When I ask Claude Code to migrate a component to the new border system, I don't need to explain what border-(muted) is or where it's defined. It already knows.

That's dogfooding. The project is ready for the agent to be useful from the first prompt. And that pays dividends fast, every turn moves forward instead of being spent re-explaining context.

Lesson: investing in a good CLAUDE.md isn't overhead, it's the difference between a useful agent and one that hallucinates.

The playbook

After several migrations, this is what I always do:

  1. Plan before generating. A poorly scoped migration is a failed migration. Define the scope, the steps, the files. If you don't have clarity before starting, the agent won't either.

  2. Atomic PRs per phase. In the toolchain case, oxlint and tsgo were separate PRs. If something breaks, you know exactly which phase caused it.

  3. Validate every step. Lint, type-check, tests, preview. Claude Code runs the commands, you read the output. Skipping validation because "the previous change passed" is the recipe for piling up 50 errors before you notice.

  4. Keep a CLAUDE.md up to date. Stack, conventions, commands, project gotchas. The difference between an agent that understands the repo and one that makes things up.

  5. Measure before and after. Without numbers there's no story to tell, nor argument to pitch to the team.

  6. Pair programming, not autopilot. The agent doesn't replace judgment, it amplifies it. You decide what gets done, it runs and brings the feedback.

The tools I use in a migration

After several migrations, there's a setup I repeat. These are the pieces that make the difference between useful Claude Code and Claude Code that wastes your time.

A CLAUDE.md specific to the current context. Conventions, commands, gotchas, and the migration in progress. Don't copy package.json (Claude Code can read it already), write what isn't inferable from the deps. Minimal example:

# Project name

## Relevant stack (what isn't inferable from package.json)

- Deployed to Cloudflare Workers
- i18n with prefix strategy (ES/EN)
- Composition API only, no Options API
- oxlint instead of eslint

## Commands

- `pnpm lint` — oxlint
- `pnpm test` — vitest

## Migration in progress

Biome → oxlint + oxfmt. Replace each rule with its equivalent,
run `pnpm lint` after every batch, don't touch tests in this PR.

Enter fullscreen mode Exit fullscreen mode

/plan before generating. Makes the agent investigate the repo, propose a structured plan, and only execute after you approve it. Perfect for migrations, it saves you from starting three times because the first scope was wrong.

Sub-agents to parallelize. While the main agent keeps editing, launch a sub-agent that runs pnpm typecheck or pnpm test on another module and brings back the result. For large migrations, 2-3 sub-agents in parallel split the work and keep the main agent's context clean.

Hooks for automatic validation. A PostToolUse hook that runs pnpm lint after every Edit is the cheapest way to stop having to ask "validate" every time. It runs on its own, if it fails the agent sees it and fixes it on the next turn.

What NOT to do

  • Don't ask for everything at once. "Migrate the whole repo" is the worst possible instruction. Split into phases, one at a time.

  • Don't skip validation. Even if the change looks trivial, run the checks. The error you assume doesn't exist is the one that ends up in production.

  • Don't let it invent paths or APIs. If it cites a function you don't recognize, verify it exists before accepting the change.

  • Don't merge without understanding the changes. The agent accelerates your work, it doesn't replace your responsibility. If you don't understand what changed, you're not migrating, you're crossing your fingers.

Closing

The barrier to entry for migrating dropped dramatically. What used to be a quarterly project is now a weekend project. What you used to push back six months, you can start today and finish in a couple of days.

If you have a migration that's been stuck for a while, open Claude Code this week. You'll probably finish it before the sprint ends.

And even if the final metrics don't come out that pretty, you'll still understand more about your codebase in two days than in the six months you'd been putting it off.