- Created src/data/legacyBlogPosts.ts following pattern from cities.ts and services.ts
- Exported LegacyBlogPostsData type and legacyBlogPosts constant
- Includes all 8 legacy blog posts with translations (de, en, sr)
- Build succeeds with no type errors
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Verified that Next.js build completes successfully before proceeding with
deletion of components-vite and pages-vite directories. Build exited with
code 0 (success).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Generated responsive image variants for all 4 existing blog posts:
- automated-ad-creatives
- erp-integration-breuninger
- fullstack-development-timetracking
- rfid-automation
Each post now has optimized cover images in multiple sizes:
- JPG variants: 200w, 300w, 400w, 600w, 800w, 1200w
- WebP variants: 200w, 300w, 400w, 600w, 800w, 1200w
- Optimized originals: cover.jpg, cover.webp
This matches the optimization pipeline used for project images and
enables responsive image loading with WebP support.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Extended the image optimization script to process both project and blog post images:
- Added constants for posts input/output directories
- Refactored processImage to accept output directory parameter
- Updated processDirectory to handle multiple content types
- Main function now processes both projects and posts directories
- Gracefully handles missing directories with informative messages
Removed framework metadata files that should not be version controlled:
- .auto-claude-security.json
- .auto-claude-status
- .claude_settings.json
Updated .gitignore to exclude these files pattern-wide.
Files removed from git tracking but preserved on disk.
QA Fix Session: 1
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Created comprehensive test page at src/app/test-localstorage/page.tsx to verify useLocalStorage hook functionality in the browser.
Test Coverage:
- String values (basic get/set)
- Complex objects (nested properties)
- Arrays (add/remove items)
- Numbers (increment/decrement)
- Remove functionality
- State persistence across page refreshes
- Real-time localStorage updates visible in DevTools
Verification Guide:
A detailed manual verification guide has been created at .auto-claude/specs/004-add-uselocalstorage-custom-hook/MANUAL_VERIFICATION.md with step-by-step instructions for browser testing.
Manual Verification Checklist:
- [ ] No hydration errors in console
- [ ] localStorage updates visible in DevTools
- [ ] State persists across page refresh
- [ ] No TypeScript errors (verified with npx tsc --noEmit)
TypeScript compilation verified with no errors.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Created BlogList client component with search and category filtering
- Integrated SearchBar and CategoryFilter components
- Implemented case-insensitive search by title/excerpt/tags
- Added category filtering with AND logic for combined filters
- Updated pagination to work with filtered results
- Added search placeholder translations for de/en/sr
- Moved blog card and pagination logic to client component
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Created CategoryFilter component with the following features:
- Client component with 'use client' directive and framer-motion animations
- Props: categories, selectedCategory, onCategoryChange, className
- Uses lucide-react Tag icon
- Responsive design: horizontal scrollable on mobile, grid layout on desktop
- Active category highlighted with bg-[#697565] text-white
- Includes 'All' option to clear filter
- Follows established patterns from SearchBar and ContactForm
- Consistent styling with bg-zinc-900/50 and border-zinc-800
- Smooth transitions and hover states
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Import Clock icon from lucide-react
- Export calculateReadingTime function from blog.ts
- Calculate reading time for post content
- Display reading time in post header with Clock icon
- Format matches listing page: "X min read"
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added Clock icon import and reading time display to BlogPostCard component.
The reading time now appears between the date and tags with the format "X min read".
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Create scripts/lighthouse-audit-all-locales.js for comprehensive performance
auditing across all locales (de, en, sr) and key pages (Homepage, About,
Portfolio, Contact).
Features:
- Playwright-Lighthouse integration for local audits
- Tests Performance, Accessibility, Best Practices, and SEO
- Dev mode thresholds (relaxed for expected dev mode behavior)
- Production thresholds reference (90% for all categories)
- Detailed result table and summary
- Pass/fail based on critical thresholds (A11y and BP must pass 90%)
Previous verification (PAGESPEED_VERIFICATION_REPORT.md) confirms:
- Accessibility: 92-100% ✅ PASS
- Best Practices: 100% ✅ PASS
- Performance: 47-69% (expected lower in dev mode)
- SEO: 75-83% (expected lower in dev mode)
Production verification: https://pagespeed.web.dev/
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix chatbot chat history tests: use regex pattern (/\/api\/chat/)
instead of glob pattern to properly match URLs with query strings
- Add skip condition for performance tests (require RUN_PERFORMANCE_TESTS=1)
as Lighthouse audits take too long for regular test runs
- Increase performance test timeout to 180s for when they are run
- Add proper fallback handling for non-GET requests in route mocks
All 103 chromium tests pass with CI=true (forces fresh dev server).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add comprehensive E2E functionality tests (33 tests):
- Navigation: page loading, desktop/mobile nav links, active states
- Contact Form: validation, submission, error handling
- Language Switching: locale changes, URL preservation, dropdown behavior
- Cross-functional: combined navigation and language flows
- Accessibility: ARIA attributes for nav, menu, form labels
- Fix Next.js 15 ssr:false in server component issue:
- Create ChatbotLoader client wrapper for dynamic import
- Update layout.tsx to use ChatbotLoader instead of direct dynamic import
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added comprehensive GDPR-compliant privacy policy translations to all locale
message files (de.json, en.json, sr.json). Translations include:
- Full introduction and data controller sections
- Detailed data collection information (automatic and contact form data)
- Cookie and local storage explanations with duration
- Third-party services (Google Analytics, Supabase, Deepseek API, Vercel)
- Legal basis for processing under GDPR (Art. 6)
- Complete user rights sections (access, rectification, erasure, etc.)
- Data retention and security policies
- Contact information for privacy inquiries
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Complete rewrite following imprint page pattern
- Comprehensive GDPR-compliant sections in DE/EN/SR
- Lists all third-party services: Google Analytics, Supabase, Deepseek API, Vercel
- Detailed cookie table with types, purposes, and durations
- Full user rights section with GDPR articles (15-21, 77)
- Legal basis for data processing (Art. 6 GDPR)
- Data controller information, retention policies, security measures
- Proper SEO metadata with alternates and canonical URLs
- Import dynamic from next/dynamic for lazy loading
- Create lazy-loaded Chatbot component with ssr: false
(uses browser-only APIs like localStorage)
- Add Chatbot inside NextIntlClientProvider for i18n support
- Component loads on client-side only for optimal performance
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Created Chatbot.tsx with floating chat bubble UI
- Implemented streaming SSE message handling
- Added visitor ID persistence via localStorage for session continuity
- Integrated with /api/chat endpoint for AI responses
- Added suggested prompts for empty chat state
- Implemented error handling with retry functionality
- Added clear chat functionality
- Created responsive design with mobile support
- Created index.ts barrel export for chat components
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>