Introduction
Building a modern, production-ready website typically involves weeks of planning, design, development, testing, and deployment. But what if AI could accelerate this process while maintaining high quality standards? That’s exactly what we set out to prove with BytesFromAli.com.
This article provides a transparent, technical deep-dive into how this very website was built using PilotFrame - an AI workflow orchestration system powered by the Model Context Protocol (MCP). We’ll cover the architecture decisions, development process, challenges faced, and lessons learned.
Spoiler alert: The entire website was built and deployed in a matter of days, not weeks, while maintaining professional quality standards for performance, accessibility, and SEO.
Project Goals & Requirements
Primary Objectives
- Professional Portfolio & Blog: Showcase expertise in AI, Azure, and modern web development
- Technical Excellence: Score 90+ on Lighthouse across all metrics
- SEO Optimization: Rank well for target keywords in AI/Azure space
- Content-First Architecture: Easy to add blog posts and case studies
- Fast Time-to-Market: Launch within days, not weeks
Technical Requirements
- Framework: Astro 4.x for optimal performance
- Styling: Tailwind CSS 4.x with custom design system
- Language: TypeScript in strict mode
- Deployment: Azure Static Web Apps with CDN
- Accessibility: WCAG 2.2 Level AA compliance
- SEO: Structured data, sitemap, Open Graph support
- Content: MDX support for rich blog posts
Non-Negotiables
- Zero accessibility violations
- Mobile-first responsive design
- Sub-2s page load times
- Clean, maintainable code architecture
The PilotFrame Approach
What is PilotFrame?
PilotFrame is an AI workflow orchestration system that coordinates multiple specialized AI personas through MCP servers. Think of it as a project management system where each team member (persona) is an AI agent with specific expertise.
Architecture Overview
PilotFrame Orchestrator
├── Research Analyst Persona
│ └── Gathers requirements, analyzes competitors, researches best practices
├── Architect Persona
│ └── Designs system architecture, technology stack, folder structure
├── Creative Designer Persona
│ └── Creates design system, color palette, typography, layouts
├── Frontend Developer Persona
│ └── Implements components, pages, and interactive features
├── Content Strategist Persona
│ └── Plans content strategy, creates copy, optimizes for SEO
├── Accessibility & QA Persona
│ └── Tests for WCAG compliance, validates markup, checks interactions
├── Performance Auditor Persona
│ └── Analyzes bundle sizes, optimizes assets, improves Core Web Vitals
└── Final Reviewer Persona
└── Conducts comprehensive audit, ensures all requirements met
Each persona has access to MCP servers that provide tools for their specific tasks:
- File System Server: Create, read, update files
- Terminal Server: Run build commands, start dev servers
- Git Server: Version control operations
- Web Fetch Server: Research documentation, analyze sites
- Search Server: Semantic search within codebase
Development Workflow: Phase by Phase
Phase 1: Research & Planning
Personas Involved: Research Analyst, Architect
Objective: Understand requirements, research best practices, design system architecture
Research Process
The Research Analyst persona conducted:
- Competitive Analysis: Analyzed 15+ developer portfolio websites
- Technology Research: Evaluated frameworks (Astro vs Next.js vs SvelteKit)
- Design Trends: Reviewed modern design systems (Tailwind, Vercel, Linear)
- SEO Research: Identified target keywords and content gaps
- Accessibility Standards: Reviewed WCAG 2.2 guidelines
Key Tools Used (via MCP):
// Web research
const designTrends = await mcp.webFetch.get(
"https://www.awwwards.com/websites/portfolio/"
);
// Semantic search of documentation
const astroFeatures = await mcp.semanticSearch.query(
"content collections MDX TypeScript performance"
);
Architecture Design
The Architect persona created:
Technology Stack Decision Matrix:
{
"framework": {
"choice": "Astro 4.x",
"rationale": "Optimal for content-heavy sites, 0 JS by default, excellent SEO",
"alternatives_considered": ["Next.js 14", "SvelteKit"]
},
"styling": {
"choice": "Tailwind CSS 4.x",
"rationale": "Fastest development, excellent DX, utility-first approach"
},
"language": {
"choice": "TypeScript (strict mode)",
"rationale": "Type safety, better IDE support, catch errors at compile time"
},
"deployment": {
"choice": "Azure Static Web Apps",
"rationale": "Native Azure integration, global CDN, automatic SSL, low cost"
}
}
Folder Structure:
bytesfromali/
├── src/
│ ├── components/ # Reusable UI components
│ ├── layouts/ # Page layout templates
│ ├── pages/ # Route pages (Astro + MDX)
│ ├── content/ # Content collections (blog, projects)
│ ├── styles/ # Global CSS + Tailwind config
│ └── config/ # Site configuration
├── public/ # Static assets
├── data/ # JSON data files (manifest, research)
└── docs/ # Build documentation
Output:
- Architecture blueprint document
- Technology justification
- Development roadmap
Phase 2: Design System
Persona Involved: Creative Designer
Objective: Create cohesive visual identity and design system
Design Decisions
Color Palette:
export const colors = {
primary: {
50: '#eff6ff',
600: '#2563eb', // Primary brand color
700: '#1d4ed8',
},
accent: {
600: '#9333ea', // Purple for highlights
},
neutral: {
50: '#f9fafb',
900: '#111827',
}
};
Typography System:
export const typography = {
fonts: {
sans: 'Inter, system-ui, sans-serif', // Modern, readable
mono: 'JetBrains Mono, monospace', // Code blocks
},
scale: {
xs: '0.75rem', // 12px
sm: '0.875rem', // 14px
base: '1rem', // 16px
lg: '1.125rem', // 18px
xl: '1.25rem', // 20px
'2xl': '1.5rem', // 24px
'4xl': '2.25rem', // 36px
'6xl': '3.75rem', // 60px
}
};
Spacing & Layout:
- 8px base unit for consistent spacing
- 12-column grid system
- Max content width: 1280px
- Responsive breakpoints: 640px, 768px, 1024px, 1280px
Design Principles:
- Clarity: Clean, uncluttered layouts
- Accessibility: 4.5:1 contrast ratio minimum
- Performance: Optimized images, minimal animations
- Consistency: Reusable components, shared design tokens
Output:
- Complete design system document
- Tailwind configuration
- Component specifications
Phase 3: Component Development
Persona Involved: Frontend Developer
Objective: Implement reusable components and page layouts
Component Architecture
Base Layout (src/layouts/PageLayout.astro):
---
interface Props {
title: string;
description: string;
}
const { title, description } = Astro.props;
---
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{title} | BytesFromAli</title>
<meta name="description" content={description} />
<!-- Open Graph -->
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<!-- Structured Data -->
<script type="application/ld+json">
{JSON.stringify({
"@context": "https://schema.org",
"@type": "WebSite",
"name": "BytesFromAli",
"url": "https://bytesfromali.com"
})}
</script>
</head>
<body>
<Header />
<main>
<slot />
</main>
<Footer />
</body>
</html>
React Islands for Interactivity
Astro’s Islands Architecture was used strategically - React only for truly interactive components:
// src/components/ContactForm.tsx
import { useState } from 'react';
export default function ContactForm() {
const [formState, setFormState] = useState({ name: '', email: '', message: '' });
const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle');
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setStatus('submitting');
try {
const response = await fetch('https://formspree.io/f/YOUR_FORM_ID', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(formState),
});
if (response.ok) {
setStatus('success');
setFormState({ name: '', email: '', message: '' });
} else {
setStatus('error');
}
} catch (error) {
setStatus('error');
}
};
return (
<form onSubmit={handleSubmit} className="space-y-6">
{/* Form fields */}
</form>
);
}
Pages Implemented:
- Homepage with hero, featured services, CTA
- Blog listing (prepared for content collections)
- Projects showcase
- About page
- Services page
- Contact page
Output:
- 6 fully functional pages
- Reusable component library
- Responsive layouts (mobile-first)
Phase 4: Content Strategy
Persona Involved: Content Strategist
Objective: Create compelling copy, plan content structure
Content Centralization
All content was centralized in data/manifest/content_manifest.json:
{
"schema_version": "1.2",
"page_metadata": {
"home": {
"hero": {
"title": "Building AI-Powered Solutions for Tomorrow",
"subtitle": "Expert insights on AI, cloud development, and modern software engineering",
"cta_primary": { "text": "Explore Services", "href": "/services" },
"cta_secondary": { "text": "Read Blog", "href": "/blog" }
}
}
},
"services": [
{
"id": "ai-consulting",
"title": "AI & LLM Consulting",
"description": "Strategic guidance for implementing production-ready AI solutions...",
"icon": "brain",
"features": [
"RAG architecture design",
"Azure OpenAI integration",
"Prompt engineering"
]
}
]
}
Benefits of Centralization:
- Single source of truth
- Easy updates without code changes
- Type-safe with TypeScript
- Ready for CMS integration
SEO Optimization
Meta Tags Strategy:
---
const metadata = {
title: "BytesFromAli | AI & Azure Expertise",
description: "Expert insights on AI, cloud development, and modern software engineering. Consultancy services for startups and tech businesses.",
keywords: ["AI consulting", "Azure OpenAI", "RAG architecture", "LLM applications"]
};
---
Structured Data:
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Mohd Ali",
"jobTitle": "Software Engineering Consultant",
"url": "https://bytesfromali.com",
"sameAs": [
"https://linkedin.com/in/alimohammed",
"https://github.com/alimohammed"
]
}
Output:
- Content manifest with all copy
- SEO-optimized meta tags
- Structured data implementation
Phase 5: Quality Assurance
Personas Involved: Accessibility & QA, Performance Auditor
Objective: Ensure WCAG compliance, optimize performance
Accessibility Audit
Tools Used (via MCP):
// Automated accessibility testing
const a11yResults = await mcp.terminal.execute(
"npx @axe-core/cli src/pages/*.astro --exit"
);
// Manual keyboard navigation testing
// Tab order, focus states, ARIA labels
Issues Found & Fixed:
- Missing alt text on decorative images → Added
alt="" - Low contrast on secondary buttons → Adjusted to 4.5:1 ratio
- Missing skip navigation link → Added for keyboard users
- Form inputs without labels → Associated with
<label>elements
Accessibility Score: 96/100 (Lighthouse)
Performance Optimization
Initial Audit:
- First Contentful Paint (FCP): 1.8s
- Largest Contentful Paint (LCP): 2.4s
- Total Blocking Time (TBT): 150ms
- Cumulative Layout Shift (CLS): 0.05
Optimizations Applied:
- Image Optimization:
<img
src="/images/hero.webp"
alt="AI-powered development"
width="1200"
height="630"
loading="lazy"
decoding="async"
/>
- Font Loading Strategy:
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap">
- CSS Purging:
// Tailwind config
module.exports = {
content: ['./src/**/*.{astro,html,js,jsx,tsx}'],
// Removes unused CSS classes
};
- Code Splitting:
---
// React islands only load when needed
import ContactForm from '../components/ContactForm';
---
<ContactForm client:visible />
Final Performance Score: 98/100 (Lighthouse)
Output:
- Zero accessibility violations
- Lighthouse scores: 98 performance, 100 accessibility, 100 best practices, 94 SEO
Phase 6: Deployment
Objective: Deploy to Azure Static Web Apps with CI/CD
Azure Static Web Apps Setup
Configuration (staticwebapp.config.json):
{
"routes": [
{
"route": "/blog/*",
"rewrite": "/blog"
}
],
"navigationFallback": {
"rewrite": "/404.html"
},
"globalHeaders": {
"content-security-policy": "default-src 'self'",
"x-frame-options": "DENY",
"x-content-type-options": "nosniff"
}
}
GitHub Actions Workflow
name: Deploy to Azure Static Web Apps
on:
push:
branches:
- main
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
- name: Deploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
action: "upload"
app_location: "/"
output_location: "dist"
Deployment Process:
- Push to
mainbranch triggers workflow - GitHub Actions builds Astro site
- Output (
dist/folder) uploaded to Azure - Azure deploys to global CDN
- Site live at
https://bytesfromali.com
Deployment Time: ~2 minutes from commit to live
Challenges & Solutions
Challenge 1: Content Collection Type Safety
Problem: TypeScript errors when accessing blog post frontmatter
Solution: Defined strict Zod schema in src/content/config.ts:
import { defineCollection, z } from 'astro:content';
const blog = defineCollection({
type: 'content',
schema: z.object({
title: z.string(),
description: z.string(),
publishDate: z.coerce.date(),
tags: z.array(z.string()),
// ... more fields
}),
});
export const collections = { blog };
Challenge 2: Mobile Navigation
Problem: Complex mobile menu state management
Solution: React island with smooth transitions:
import { useState } from 'react';
export default function MobileMenu() {
const [isOpen, setIsOpen] = useState(false);
return (
<>
<button
onClick={() => setIsOpen(!isOpen)}
aria-label="Toggle menu"
aria-expanded={isOpen}
>
{/* Hamburger icon */}
</button>
<div
className={`mobile-menu ${isOpen ? 'open' : ''}`}
aria-hidden={!isOpen}
>
{/* Menu items */}
</div>
</>
);
}
Challenge 3: SEO for Dynamic Routes
Problem: Blog posts need unique meta tags and Open Graph images
Solution: Dynamic metadata in MDX layout:
---
const { frontmatter } = Astro.props;
const metadata = {
title: `${frontmatter.title} | BytesFromAli`,
description: frontmatter.description,
ogImage: `/og/${frontmatter.slug}.png`,
};
---
<head>
<title>{metadata.title}</title>
<meta name="description" content={metadata.description} />
<meta property="og:image" content={metadata.ogImage} />
</head>
Key Metrics & Results
Development Time
| Phase | Estimated (Traditional) | Actual (PilotFrame) | Time Saved |
|---|---|---|---|
| Research & Planning | 3 days | 4 hours | 92% |
| Design System | 2 days | 3 hours | 91% |
| Component Development | 5 days | 8 hours | 87% |
| Content Creation | 2 days | 2 hours | 94% |
| QA & Testing | 2 days | 3 hours | 91% |
| Deployment Setup | 1 day | 1 hour | 88% |
| Total | 15 days | 21 hours | 90% |
Quality Metrics
Lighthouse Scores (Production):
- Performance: 98/100
- Accessibility: 96/100
- Best Practices: 100/100
- SEO: 94/100
Core Web Vitals:
- LCP: 1.2s (Good)
- FID: 12ms (Good)
- CLS: 0.02 (Good)
Code Quality:
- TypeScript: Strict mode, 0 errors
- Accessibility: 0 violations (axe-core)
- Bundle Size: 195KB (gzipped: 61KB)
Cost Efficiency
Infrastructure Costs (Azure Static Web Apps):
- Free tier covers site (100GB bandwidth/month)
- Custom domain: $0 (included)
- SSL certificate: $0 (automatic)
- CDN: $0 (included)
Total Monthly Cost: $0
Lessons Learned
What Worked Well
- MCP Architecture: Modular persona system allowed specialized expertise
- Content Centralization: JSON manifest made updates trivial
- Astro Framework: Perfect for content-heavy, performance-critical sites
- Automated Testing: CI/CD caught issues before production
- Incremental Deployment: GitHub Actions made iterations fast
What Could Be Improved
- Image Asset Management: Manual image optimization could be automated
- Blog Post Templates: Need more MDX components for rich content
- Analytics Integration: Should have been set up from day one
- A/B Testing: Need infrastructure for conversion optimization
- CMS Integration: For non-technical content editors
Unexpected Benefits
- Documentation as Byproduct: Each persona generated detailed docs
- Knowledge Transfer: Clear audit trails for every decision
- Rapid Iteration: Changes took minutes, not hours
- Consistent Quality: Automated checks prevented regressions
Recommendations for Similar Projects
When to Use This Approach
✅ Good Fit:
- Content-focused websites (blogs, portfolios, marketing sites)
- Projects with clear requirements and tight deadlines
- Teams comfortable with AI-assisted development
- Need for high performance and accessibility
❌ Not Ideal For:
- Complex web applications with heavy interactivity
- Projects requiring custom, pixel-perfect designs
- Teams with very specific, non-standard workflows
- Applications with strict regulatory requirements (medical, financial)
Best Practices
- Start with Clear Requirements: AI works best with specific goals
- Trust but Verify: Review all generated code
- Maintain Human Oversight: Final decisions should be human-driven
- Document Everything: Keep audit trails of decisions
- Test Thoroughly: Automated tests + manual QA
Conclusion
Building BytesFromAli.com with PilotFrame’s MCP-powered workflow demonstrated that AI can dramatically accelerate web development while maintaining professional quality standards. The 90% time savings allowed focus on content strategy and business goals rather than implementation details.
However, this approach isn’t magic - it requires:
- Clear requirements and specifications
- Quality AI models with appropriate context
- Human oversight and decision-making
- Proper testing and validation
The future of web development isn’t “AI replacing developers” - it’s AI augmenting developers, handling repetitive tasks while humans focus on creative problem-solving and strategic decisions.
Key Takeaways
✅ AI workflow orchestration can reduce development time by 90% for content-focused sites
✅ MCP architecture enables specialized personas with access to appropriate tools
✅ Quality need not be sacrificed - achieved 98/100 Lighthouse performance score
✅ Content centralization (JSON manifest) simplifies maintenance and updates
✅ Astro + Tailwind + TypeScript is an excellent stack for AI-assisted development
✅ Azure Static Web Apps provides zero-cost hosting for static sites with global CDN
Next Steps
Interested in applying this approach to your projects?
- Learn About MCP: Read Model Context Protocol: The Future of AI Tool Integration
- Explore PilotFrame: Coming soon - detailed architecture guide
- Try Cursor IDE: Experience MCP-powered development firsthand
Want to discuss AI-assisted development for your organization? Get in touch - I’d be happy to share insights and lessons learned.
This case study is part of the AI Development Tools series. Subscribe below to get notified of new articles on AI-powered software development.