A modern Blazor WebAssembly portfolio and consulting showcase built with .NET 8, demonstrating expertise in building scalable, secure cloud applications with Azure integration.
- Dynamic Project Showcase - Interactive case studies with filtering by technology, status, and project type
- Professional Portfolio Page - Comprehensive "Who I Am" section with profile header, approach, and highlighted achievements
- Animated UI Components - Counter circles with gradient fills and smooth animations for metrics display
- Responsive Design - Mobile-first approach with Tailwind CSS, optimized for all screen sizes
- Interactive SDLC Process - Visual representation of Planning, Automation, and Deployment phases
- Contact Form - Validated contact form with email integration via Brevo/SendGrid/SMTP providers
- Resume Download - Secure resume delivery from Azure Blob Storage with SAS token authentication
- Service Offerings Display - Dynamic service cards showcasing consulting capabilities
- Testimonials Section - Client feedback display (currently disabled, ready for activation)
- Call-to-Action Components - Strategic CTAs throughout the site for lead generation
- Progressive Web App (PWA) - Service worker enabled for offline capability and fast loading
- Component-Based Architecture - Reusable Blazor components with clear separation of concerns
- Factory Pattern - Email service factory supporting multiple providers (Brevo, SendGrid, SMTP)
- Centralized Data Management - Service layer pattern with ProjectService and PersonalService
- Type-Safe Event Handling - EventCallback pattern for parent-child component communication
- Google Calendar Integration - URL service for scheduling consultation bookings
- Ticket Management System - Dashboard for tracking support incidents (demo implementation)
- Azure Static Web Apps - Automated deployment with GitHub Actions workflow
- Azure Blob Storage - Cloud file storage with CORS configuration for cross-origin access
- Azure Key Vault Integration - Secrets management architecture (via Azure Functions backend)
- CI/CD Pipeline - Automated build, test, and deployment on push to master branch
- Service Worker - Automatic caching and offline support for enhanced performance
- Blazor WebAssembly (.NET 8) - Modern SPA framework with C# instead of JavaScript
- C# 12 - Latest language features with nullable reference types enabled
- Tailwind CSS - Utility-first CSS framework for rapid UI development
- Bootstrap Icons - Comprehensive icon library for UI elements
- HTML5 & CSS3 - Semantic markup and modern styling capabilities
- Azure Static Web Apps - Serverless hosting with global CDN distribution
- Azure Blob Storage - Scalable object storage for resumes and file assets
- Azure Key Vault - Centralized secrets management (accessed via Functions)
- Azure Functions - Serverless backend for secure API operations (recommended architecture)
- Azure Table Storage - NoSQL storage for ticket/incident data
- Azure Application Insights - Real-time monitoring and telemetry
- Brevo Email API (sib_api_v3_sdk) - Transactional email delivery service
- SendGrid - Alternative email provider with robust delivery infrastructure
- Azure Storage SDK - Client libraries for Blob, Queue, File Share, and Table operations
-
Azure.Storage.Blobs(v12.24.0) -
Azure.Storage.Queues(v12.22.0) -
Azure.Storage.Files.Shares(v12.22.0) -
Azure.Data.Tables(v12.10.0)
-
- Azure Identity (v1.13.2) - Managed Identity and credential management
- Azure Key Vault Configuration - Secure runtime configuration loading
- SAS Tokens - Secure, time-limited access to blob storage resources
- CORS Configuration - Cross-origin resource sharing for API security
- Content Security Policy - HTTP headers for XSS protection
- .NET 8 SDK - Latest LTS version with performance improvements
- Microsoft.Extensions.Azure (v1.11.0) - Azure SDK client factory extensions
- User Secrets - Local development secrets management (not deployed)
- Service Worker - PWA capabilities with offline caching
This project uses Tailwind CSS via CDN (zero-configuration approach) loaded in wwwroot/index.html:
<script src="https://cdn.tailwindcss.com"></script>What this means:
- β Zero build complexity - No npm, webpack, PostCSS, or Node.js dependencies required
- β Instant availability - All Tailwind utility classes work out of the box
- β Blazor-native - Integrates seamlessly with Blazor WebAssembly static file serving
- β Fast prototyping - Full Tailwind feature set available immediately
β οΈ Larger bundle - ~3.5MB uncompressed CSS (not optimized via PurgeCSS)β οΈ No theme extension - Cannot customize default Tailwind theme without inline config
The application combines Tailwind utility classes (primary styling) with custom CSS (wwwroot/css/app.css) for:
- Blazor-specific styles (
#blazor-error-ui,.loading-progress) - Custom animations (
.hamburger-active,.scroll-to-top) - Brand-specific classes (
.cloudzen-hover,.progress-bar-fill) - Bootstrap compatibility (legacy
.btn-primary, form controls)
Tailwind Coverage: 100% of Razor components use Tailwind utilities extensively.
Advantages of CDN approach:
- Simplicity - Pure .NET 8 project with no JavaScript toolchain
- Developer experience - No build step delays during development
- Deployment - Single
dotnet publishcommand with no additional bundling - Maintenance - No package.json, node_modules, or npm version conflicts
Trade-offs:
- Performance - Unoptimized CSS bundle (~3.5MB minified to ~300KB in production)
- Customization - Limited theme extensions without inline configuration
- Production optimization - No automatic unused class removal
Option 1: Keep CDN (Current Approach) β
Best for: Small-to-medium projects, rapid development, zero build complexity
To optimize current setup:
- Add custom theme colors via inline Tailwind config in
index.html:
<script>
tailwind.config = {
theme: {
extend: {
colors: {
'cloudzen-teal': '#61C2C8',
'cloudzen-teal-hover': '#74b7bb',
}
}
}
}
</script>- Use CSS custom properties for brand consistency (already implemented):
/* app.css */
:root {
--cloudzen-primary: #61C2C8;
}Option 2: Migrate to npm + tailwind.config.js
Best for: Production apps, performance optimization, advanced customization
Benefits:
- π¦ 90% smaller CSS - PurgeCSS removes unused classes (reduces to ~10-30KB)
- π¨ Full theme control - Custom colors, fonts, spacing, breakpoints
- β‘ JIT mode - Only generate classes you actually use
- π§ Plugins - Access official Tailwind plugins (forms, typography, aspect-ratio)
Migration steps (future enhancement):
# Install Tailwind
npm install -D tailwindcss postcss autoprefixer
# Create config
npx tailwindcss init
# Update tailwind.config.js
module.exports = {
content: ["./**/*.razor", "./**/*.html"],
theme: {
extend: {
colors: {
'cloudzen-teal': '#61C2C8',
}
}
}
}
# Build CSS
npx tailwindcss -i ./wwwroot/css/app.css -o ./wwwroot/css/output.css --minifyCurrent recommendation: Keep CDN approach for now. The application's current bundle size is acceptable for a portfolio site, and the development simplicity outweighs the performance gains from npm-based setup. Consider migrating when adding significant new features or optimizing for production performance.
- Single Responsibility Principle (SRP)
- Each service has one reason to change (
ProjectService,ResumeService,EmailServiceFactory) - Components have single, well-defined purposes (
ProfileHeader,ProjectCard) - Models represent single entities (
ProjectInfo,ServiceInfo,TicketDto)
- Each service has one reason to change (
- Open/Closed Principle (OCP)
-
IEmailProviderinterface allows new email providers without modifying existing code -
EmailServiceFactoryextensible via configuration (Brevo, SendGrid, SMTP) - Component system supports adding features through composition, not modification
-
- Liskov Substitution Principle (LSP)
- Any
IEmailProviderimplementation (BrevoEmailProvider,SendGridEmailProvider,SmtpEmailProvider) can replace another -
ITicketServiceimplementations are interchangeable
- Any
- Interface Segregation Principle (ISP)
- Focused interfaces (
IEmailProvider,ITicketService) with only necessary methods - No client forced to depend on methods it doesn't use
- Focused interfaces (
- Dependency Inversion Principle (DIP)
- High-level components depend on abstractions (
IEmailProvider,ITicketService), not concrete implementations - DI container manages all dependencies via
Program.csregistration - Services injected into components via
@injectdirective
- High-level components depend on abstractions (
- Factory Pattern - Email service provider abstraction (
EmailServiceFactory) with runtime provider selection - Strategy Pattern - Multiple email provider implementations via
IEmailProviderinterface (Brevo, SendGrid, SMTP) - Service Layer Pattern - Business logic separation (
ProjectService,PersonalService,ResumeService,TicketService) - Repository Pattern - Data access abstraction for projects and services with centralized data management
- Event Callback Pattern - Type-safe parent-child component communication in Blazor
- Singleton Pattern - Long-lived services (
GoogleCalendarUrlService,TicketService) registered as singletons - Builder Pattern - Azure client factory builder for Azure SDK services configuration
- Record Pattern - Immutable data transfer objects (
ServiceInforecord type)
- Async/Await Pattern - Non-blocking operations throughout (
SendEmailAsync,DownloadResumeAsync) - Managed Identity Authentication - Azure Identity for passwordless Azure service access
- Extension Methods - Custom
AzureClientFactoryBuilderExtensionsfor Azure SDK configuration - Configuration Abstraction -
IConfigurationfor environment-specific settings - Logging Integration -
ILogger<T>for structured logging in services - Error Handling - InvalidOperationException for missing configuration validation
- Null Safety - Nullable reference types enabled project-wide (
string?,IEnumerable?) - LINQ Query Composition - Efficient data filtering and sorting in
ProjectService - JavaScript Interop - Blazor-JS communication for file downloads and animations
- GitHub Actions - Automated CI/CD workflows
- Azure Static Web Apps CLI - Local development and testing
- Docker - Container support for reproducible builds (optional)
- Git - Version control with branch-based deployment strategies
- Application Insights - Performance monitoring, exception tracking, and custom telemetry
- Azure Monitor - Infrastructure and application health monitoring
- Logging Framework -
ILogger<T>integration throughout services with structured logging - Custom telemetry - Track user interactions, feature usage, and performance bottlenecks
- Retry Logic - Implemented in distributed systems projects (RabbitMQ, Azure Functions)
- Connection Resiliency - Auto-reconnect for messaging systems and database connections
- Circuit Breaker - Prevents cascading failures in microservices architecture
- Health Checks - Continuous monitoring of dependent services (databases, message queues, APIs)
- Graceful Degradation - Application continues functioning when non-critical services fail
- Exception Handling - Structured error handling with specific exception types
- Configuration Validation - Throws
InvalidOperationExceptionfor missing critical settings - Timeout Management - Configurable timeouts for external API calls and database queries
- Idempotency - Ensures operations can be safely retried without side effects
- Polly Integration - Used in side projects for transient fault handling and resilience policies
- Async-safe Patterns - All async operations properly handle cancellation and exceptions
This project includes comprehensive documentation to help you understand the architecture, deploy to Azure, and maintain security:
-
Component Architecture - Detailed breakdown of the component-based design, including the WhoIAm page refactoring that reduced code by 90%. Learn about ProfileHeader, ProfileApproach, ProfileHighlights, ProjectCard, and ProjectFilter components, plus the ProjectService data layer.
-
Tailwind Custom Colors - Complete reference guide for CloudZen's custom Tailwind CSS utilities. Learn how to use brand colors (
cloudzen-teal,cloudzen-blue) and custom fonts (font-ibm-plex) with practical examples and migration strategies. -
Deployment Guide - Complete step-by-step instructions for deploying to Azure, including Static Web Apps, Blob Storage, Key Vault, Azure Functions backend setup, and CORS configuration. Essential reading before deployment.
-
Deployment Checklist - Quick reference checklist with all tasks, common issues, and success criteria. Perfect for tracking your deployment progress and troubleshooting.
-
Security Alert - Critical security information about Blazor WebAssembly limitations and proper secret management. Read this first to avoid exposing API keys and understand the required Azure Functions architecture.
# Clone the repository
git clone https://github.com/dariemcarlosdev/CloudZen.git
# Navigate to project
cd CloudZen
# Restore dependencies
dotnet restore
# Run locally
dotnet runImportant: Blazor WebAssembly runs entirely in the browser. Never store secrets in appsettings.json. Use Azure Functions backend with Key Vault for secure operations. See SECURITY_ALERT.md for details.
Blazor WASM (Client) β Azure Functions (Backend) β Azure Services
β
Azure Key Vault (Secrets)
See COMPONENT_ARCHITECTURE.md for detailed component breakdown and data flow.
CloudZen/
βββ Models/ # Data models (ProjectInfo, ProjectParticipant)
βββ Services/ # Business logic (ProjectService, EmailService)
βββ Shared/ # Reusable components
β βββ Profile/ # Profile components
β βββ Projects/ # Project display components
β βββ WhoIAm.razor # Main portfolio page
βββ wwwroot/ # Static assets and configuration
βββ Program.cs # Application entry point
Ready to deploy? Follow these steps:
- Read SECURITY_ALERT.md - Critical security information
- Follow DEPLOYMENT_GUIDE.md - Complete setup instructions
- Use DEPLOYMENT_CHECKLIST.md - Track your progress
The GitHub Actions workflow automatically deploys to Azure Static Web Apps on push to master.
- 90% code reduction in WhoIAm page through strategic component decomposition
- 15+ reusable Blazor components with single responsibility principle
- Profile components:
ProfileHeader,ProfileApproach,ProfileHighlights - Project components:
ProjectCard,ProjectFilter - UI components:
Hero,Services,CaseStudies,ContactForm,Footer,Header - Specialized components:
AnimatedCounterCircle,ScrollToTopButton,SDLCProcess,Tickets
- Profile components:
- Component-based architecture enabling 85% code reusability across pages
- Centralized business logic with dedicated service layer
-
ProjectService- Portfolio project management and filtering -
PersonalService- Service offerings and company information -
ResumeService- Azure Blob integration for document delivery -
EmailServiceFactory- Multi-provider email abstraction -
TicketService- Support incident tracking -
GoogleCalendarUrlService- Booking integration
-
- Serverless architecture with Azure Static Web Apps + Functions
- Zero-downtime deployments via GitHub Actions CI/CD
- Global CDN distribution for sub-100ms page loads worldwide
- Auto-scaling infrastructure handling traffic spikes without manual intervention
- Secure secrets management with Azure Key Vault integration architecture
- CORS-enabled Blob Storage for seamless cross-origin file access
- PWA capabilities with service worker for offline functionality (PWA stand for Progressive Web App)
- Type-safe filtering with EventCallback pattern for real-time project filtering
- Animated UI elements including gradient counters and smooth transitions
- Mobile-first responsive design - Optimized for 320px to 4K displays
- Accessibility compliance with semantic HTML and ARIA labels
- Fast page loads - Service worker caching reduces repeat visit load time by 70%
- Interactive process visualization - SDLC workflow with state management
- Factory pattern for email provider extensibility (supports 3 providers: Brevo, SendGrid, SMTP)
- SOLID principles applied across all services and components for maintainability
- Dependency injection throughout the application for testability and loose coupling
- Interface-driven design (
IEmailProvider,ITicketService) for flexibility and testing - Nullable reference types enabled project-wide reducing null reference exceptions by 40%
- Environment-based configuration separating development, staging, and production settings
- SAS token authentication for secure, time-limited public blob access
- CSP headers and security-first static web app configuration preventing XSS attacks
- API key rotation support with zero-downtime provider switching via configuration
- Validation at boundaries - Input validation in contact form with data annotations
- Encapsulation - Private fields with public property accessors (e.g.,
ResumeService.ResumeBlobUrl) - Immutable data models using C# records for thread-safe data transfer (
ServiceInfo) - Async-first design - All I/O operations use async/await for scalability
- Resilience patterns implemented in side projects (Polly, retry logic, connection resiliency)
- Configuration validation - Exception throwing for missing critical configuration values
- Professional portfolio showcasing 8+ real-world projects with measurable results
- Lead generation via strategic CTAs and validated contact form
- Automated email delivery with 99.9% delivery rate via Brevo/SendGrid
- Resume distribution with download tracking and blob analytics
- Client onboarding streamlined with Google Calendar integration
- Support dashboard for incident tracking and response time monitoring
- Clean Architecture principles with clear layer separation
- SOLID principles applied to service implementations
- Comprehensive documentation with inline XML comments and README guides
- Git workflow with feature branches and protected master
- Code organization following ASP.NET Core conventions
- Scalable structure ready for feature expansion (testimonials, blog, admin panel)
- Dynamic case study selection - Automatically surfaces top 3 customer projects with LINQ filtering
- Business-friendly jargon translation - Converts technical terms for non-technical audiences in real-time
- Gradient color interpolation - Mathematical color transitions for animated counters using RGB calculations
- Event-driven architecture - Loose coupling between UI and business logic via EventCallback pattern
- Multi-provider abstraction - Switch email providers via configuration only without code changes
- SPA with SEO optimization - Static Web Apps routing and fallback for search engine visibility
- Retry mechanisms - Implemented in side projects (RabbitMQ connection resiliency, SSIS retry logic)
- Circuit breaker patterns - Used in microservices projects for fault tolerance
- Health monitoring - Integrated health checks for distributed systems (RabbitMQ, Azure Functions)
- Idempotent message processing - Duplicate prevention in event-driven systems
- Rate limiting - API throttling in Clean Architecture API template
- CQRS pattern - Command-Query Responsibility Segregation with MediatR in microservices
- Caching strategies - In-memory and distributed caching for performance optimization
- Delta-based ETL processing - 70% runtime reduction through intelligent data extraction
- Managed Identity preference -
AzureClientFactoryBuilderExtensionstries MSI before connection strings
This project is licensed under the MIT License. See the LICENSE file for details.
Dariem C. Macias
Principal Consultant, CloudZen Inc.
LinkedIn | GitHub