Inspired by Peter Gostev's LinkedIn post about his workflow: Data > Claude Code > Visualization > Deploy, I decided to test Claude Code with my own challenge. Peter had analyzed Epoch AI's dataset of 500 AI supercomputers, creating clean visualizations with a simple prompt. Inspired by his approach, I went on transforming a 340-page PDF about AI trends into an interactive presentation. What unfolded was a fun experiment, with an AI assistant learning in real-time why Dieter Rams' principles have endured for decades.
The Initial Dance: Claude's Problem-Solving Ballet
I started with what seemed like a straightforward request:
"Take a look at the file Trends_Artificial_Intelligence.pdf. go through the data presented. I'm interested in a react-based presentation that visually explores AI trends, past growth and future projections, with clear graphics, data-driven insights and expert commentary."
Watching Claude Code work is mesmerizing. Unlike chat-based AI, it operates directly in your terminal, creating a stream of actions and decisions:
⏺ Read(../Trends_Artificial_Intelligence.pdf) ⎿ Error: This tool cannot read binary files. ⏺ Bash(python3 -c "import PyPDF2; print('PyPDF2 available')") ⎿ PyPDF2 available ⏺ Perfect! I can extract the PDF content using Python.
Within minutes, Claude had:
- Written a 98-line Python script to extract PDF content
- Processed 340 pages of data
- Identified 670 companies, 142 metrics, 24 geographic data points
- Created a full React TypeScript application
- Built visualization components with Recharts
- Implemented responsive design
The technical execution was flawless. Each component was well crafted:
// Clean, functional components const MetricCard: React.FC<MetricCardProps> = ({ title, current, projected, unit, color, index }) => { return ( <motion.div initial={{ opacity: 0, y: 50 }} animate={{ opacity: 1, y: 0 }} transition={{ delay: index * 0.1 }} > {/* Thoughtful implementation */} </motion.div> ); };
The Turning Point: "Make It Beautiful"
The application worked perfectly. Data displayed correctly, charts rendered smoothly. But I the design was really poor, so I instructed Claude Code to work on this.
"it's working. however: it's not really beautiful. use your ultrathink power and improvde the design aesthetics. also, the insights are kind of poor - improve this. go deep and work hard on visualizations."
Claude's interpretation of "ultrathink power" was revealing. It immediately created an enhanced data extraction system:
def extract_enhanced_insights(pdf_path): insights = { 'market_segments': [], 'company_analysis': [], 'investment_flows': [], 'geographic_trends': [], # ... sophisticated categorization }
Then came what can be called a kind of "design explosion". Claude installed advanced visualization libraries and created what it called a "premium design system":
export const designSystem = { colors: { primary: { 50: '#f0f4ff', // ... through to 900: '#1a1654' } }, gradients: { heroGradient: 'radial-gradient(ellipse at top, #1e1b4b 0%, #0f0f23 50%, #000000 100%)', // ... multiple animated gradients }, animations: { float: 'float 3s ease-in-out infinite', sparkle: 'sparkle 20s linear infinite', // ... numerous animation definitions } }
The components became increasingly elaborate:
RadarChart.tsx
(252 lines) with animated transitionsSankeyDiagram.tsx
(230 lines) for investment flowsAnimatedMetricDashboard.tsx
(308 lines) with spring physicsNetworkVisualization.tsx
(317 lines) with force-directed graphs
The CSS was... ambitious:
/* Animated background stars */ body::before { content: ''; position: fixed; background-image: radial-gradient(2px 2px at 20px 30px, #eee, transparent), radial-gradient(2px 2px at 40px 70px, rgba(255,255,255,0.8), transparent); animation: sparkle 20s linear infinite; } .gradient-text { background: linear-gradient(135deg, #6366f1, #8b5cf6, #d946ef); animation: gradient-shift 3s ease infinite; } .interactive-card:hover { transform: translateY(-8px) rotateX(5deg) rotateY(5deg); box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2); }
The Dieter Rams Intervention
After building and viewing the result, my feedback was blunt. The design was a far cry from being clean and minimalist. So I asked Claude Code to read the design principles of Dieter Rams and apply them:
"just checked the design. it's poor, because the content is hardly readable. go and read the design principles of Dieter Rams and learn from them: https://www.braun-audio.com/en-GLOBAL/10principles check the visuals and learn from them. go!"
What happened next was fascinating. Claude didn't just tone down the effects—it studied and internalized a design philosophy:
⏺ Fetch(https://www.braun-audio.com/en-GLOBAL/10principles) ⎿ Received 60.5KB (200 OK) ⏺ Perfect! Now I understand the issue. Following Rams' principles: "Less, but better" - I need to create a clean, functional design that prioritizes readability and understanding over visual effects.
The Design Transformation
Claude created an entirely new design system, explicitly commenting on each principle:
// Dieter Rams-Inspired Design System // Principles: Less but better, functional, understandable, honest export const ramsDesign = { // Principle 1: Good design is innovative // Principle 3: Good design is aesthetic colors: { // Primary palette - high contrast, purposeful white: '#FFFFFF', black: '#000000', gray: { 50: '#F9FAFB', // Lightest - for backgrounds 900: '#111827' // Darkest - for primary text }, // Purposeful accent colors only blue: '#2563EB', // Primary actions, links green: '#16A34A', // Success, positive trends red: '#DC2626', // Errors, negative trends } }
The new CSS was a study in restraint:
/* Dieter Rams-Inspired Design System */ /* Principles: Functional, Understandable, Honest, Minimal */ /* No animations unless functionally necessary */ /* No gradients unless they improve comprehension */ /* No shadows unless they establish hierarchy */ .card { background: var(--white); border: 1px solid var(--gray-200); border-radius: var(--radius-md); padding: var(--space-xl); /* No drop shadows, no glow effects */ }
New components emerged with clear purpose:
// CleanMetricCard - focused on data communication const CleanMetricCard: React.FC<CleanMetricCardProps> = ({ title, value, change, unit, description, trend }) => { return ( <div className="card"> <h3 className="text-sm font-medium text-secondary mb-xs">{title}</h3> <div className="flex items-baseline gap-xs"> <span className="text-3xl font-bold text-primary">{value}</span> {unit && <span className="text-lg text-secondary">{unit}</span>} </div> {/* Simple, clear, functional */} </div> ); };
Claude's Learning Process
What struck me was how Claude documented its understanding:
⏺ Applied Rams' Principles: 1. Good design is innovative → Clean, modern React components without unnecessary complexity 2. Good design makes a product useful → Focus on data comprehension and actionable insights 3. Good design is aesthetic → Beautiful through simplicity, not decoration 4. Good design makes a product understandable → Clear typography hierarchy, intuitive navigation 5. Good design is unobtrusive → Content-first approach, minimal UI interference 6. Good design is honest → Real data, clear charts, no misleading visuals 7. Good design is long-lasting → Timeless design patterns, no trendy effects 8. Good design is thorough → Consistent spacing, typography, and interaction patterns 9. Good design is environmentally-friendly → Optimized bundle size (56KB reduction!), minimal animations 10. Good design is as little design as possible → "Less, but better"
The Technical Reality
Even in this philosophical journey, real-world development intruded:
Error: Cannot find module './lib/commentParser' npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree
Claude methodically worked through build issues, dependency conflicts, and deployment problems. When the built application wouldn't run directly from the file system, it diagnosed and fixed the issue:
"homepage": ".",
The Results
The transformation was dramatic:
- Bundle size: Reduced by 56KB
- Build time: Significantly faster
- Readability: Dramatically improved
- User comprehension: Clear and immediate
- Visual hierarchy: Logical and consistent
The final design proved that sophistication doesn't require complexity. Every element served a purpose. Every color had meaning. Every spacing decision improved readability.
What Claude Learned (And What I Learned About Claude)
Watching an AI assistant learn design philosophy in real-time revealed several insights:
-
AI Can Internalize Abstract Principles: Claude didn't just copy Rams' rules—it understood and applied them contextually.
-
Learning Requires Unlearning: Claude had to override its training data's bias toward "impressive" effects.
-
Constraints Foster Better Solutions: The Rams principles provided boundaries that led to more creative solutions.
-
Philosophy Beats Prescription: Teaching Claude why (Rams' principles) was more effective than telling it what(make it readable).
The Meta-Lesson
A fascinating aspect wasn't that Claude could build complex visualizations or implement sophisticated animations. It was that it could learn when not to use them. In trying to create something "beautiful" with "ultrathink power," Claude had implemented every modern web trend in its training data. But when pointed to Rams' principles, it demonstrated the ability to unlearn, to strip away, to find beauty in simplicity.
The final application shows that good design isn't about the features you add, but the ones you choose to leave out. And sometimes, the best teacher for an AI isn't more data or better prompts—it's the wisdom of a German industrial designer who believed that less, but better, is always enough.
Unlock the Future of Business with AI
Dive into our immersive workshops and equip your team with the tools and knowledge to lead in the AI era.