12/17/2025•8 min•nextjsreacttailwinddockeri18nrtl
The Challenge
Building a developer portfolio that truly stands out requires more than just listing projects. It needs to reflect your technical capabilities while providing an exceptional user experience. For this portfolio, the goals were ambitious:
Bilingual support (English/Persian) with proper RTL handlingPremium glassmorphism UI that feels modern yet accessibleProduction-ready infrastructure with Docker and automated deploymentsPerformance optimization without sacrificing visual appealTech Stack
Core Framework
Next.js 15 with App Router for server components and optimal performanceReact 18 with concurrent featuresTailwind CSS for utility-first styling with custom design tokensInternationalization
next-intl for type-safe translationsCustom RTL utilities for Persian layoutLocale-aware date formattingInfrastructure
Docker multi-stage builds for minimal image sizeDocker Compose for local development and productionGitHub Actions for CI/CDKey Features Implemented
1. Glassmorphism Design System
The UI uses a carefully crafted glassmorphism aesthetic:
.glass-card {
background: rgba(17, 21, 44, 0.8);
backdrop-filter: blur(12px);
border: 1px solid rgba(22, 242, 179, 0.1);
}
Hover states add depth with glow effects:
.card:hover {
border-color: rgba(22, 242, 179, 0.4);
box-shadow: 0 0 30px rgba(22, 242, 179, 0.2);
transform: translateY(-4px);
}
2. RTL-First Approach
Instead of treating RTL as an afterthought, the design system was built with bidirectional support from the start:
Tailwind's rtl: variants for directional stylesLogical properties (ms-4, me-4) instead of physical (ml-4, mr-4)Mirrored gradients and animations for Persian3. Performance Optimizations
Dynamic imports for heavy components (Lottie animations, Marquee)Image optimization with Next.js Image componentFont subsetting for Persian typographyStaggered animations using CSS animation-delay4. Blog System
The blog section features:
Responsive grid layout (1→2→3 columns)Tag-based filtering with searchReading time calculationLocale-aware relative datesLessons Learned
Cache invalidation is hard - Next.js build cache required multiple full rebuilds during developmentRTL is more than text direction - Shadows, gradients, and animations all need considerationAccessibility matters - Focus states, keyboard navigation, and contrast ratios improve UX for everyoneWhat's Next
Blog post MDX support for rich contentDark/light theme togglePerformance monitoring with Web VitalsAutomated visual regression testing---
This portfolio is open source. Feel free to explore the code and adapt it for your own use.