Skip to main content
AI Development Tools

Case Study: Building BytesFromAli.com with AI Workflow Orchestration

A detailed look at how this website was built using PilotFrame's MCP-powered workflow orchestration. Learn about the architecture decisions, development process, and lessons learned from building a production website with AI assistance.

Mohd Ali
10 min read
#Case Study #MCP #Astro #Azure Static Web Apps #AI Development #PilotFrame

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

  1. Professional Portfolio & Blog: Showcase expertise in AI, Azure, and modern web development
  2. Technical Excellence: Score 90+ on Lighthouse across all metrics
  3. SEO Optimization: Rank well for target keywords in AI/Azure space
  4. Content-First Architecture: Easy to add blog posts and case studies
  5. 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:

  1. Competitive Analysis: Analyzed 15+ developer portfolio websites
  2. Technology Research: Evaluated frameworks (Astro vs Next.js vs SvelteKit)
  3. Design Trends: Reviewed modern design systems (Tailwind, Vercel, Linear)
  4. SEO Research: Identified target keywords and content gaps
  5. 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:

  1. Clarity: Clean, uncluttered layouts
  2. Accessibility: 4.5:1 contrast ratio minimum
  3. Performance: Optimized images, minimal animations
  4. 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:

  1. Missing alt text on decorative images → Added alt=""
  2. Low contrast on secondary buttons → Adjusted to 4.5:1 ratio
  3. Missing skip navigation link → Added for keyboard users
  4. 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:

  1. Image Optimization:
<img 
  src="/images/hero.webp" 
  alt="AI-powered development"
  width="1200"
  height="630"
  loading="lazy"
  decoding="async"
/>
  1. 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">
  1. CSS Purging:
// Tailwind config
module.exports = {
  content: ['./src/**/*.{astro,html,js,jsx,tsx}'],
  // Removes unused CSS classes
};
  1. 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:

  1. Push to main branch triggers workflow
  2. GitHub Actions builds Astro site
  3. Output (dist/ folder) uploaded to Azure
  4. Azure deploys to global CDN
  5. 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

PhaseEstimated (Traditional)Actual (PilotFrame)Time Saved
Research & Planning3 days4 hours92%
Design System2 days3 hours91%
Component Development5 days8 hours87%
Content Creation2 days2 hours94%
QA & Testing2 days3 hours91%
Deployment Setup1 day1 hour88%
Total15 days21 hours90%

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

  1. MCP Architecture: Modular persona system allowed specialized expertise
  2. Content Centralization: JSON manifest made updates trivial
  3. Astro Framework: Perfect for content-heavy, performance-critical sites
  4. Automated Testing: CI/CD caught issues before production
  5. Incremental Deployment: GitHub Actions made iterations fast

What Could Be Improved

  1. Image Asset Management: Manual image optimization could be automated
  2. Blog Post Templates: Need more MDX components for rich content
  3. Analytics Integration: Should have been set up from day one
  4. A/B Testing: Need infrastructure for conversion optimization
  5. 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

  1. Start with Clear Requirements: AI works best with specific goals
  2. Trust but Verify: Review all generated code
  3. Maintain Human Oversight: Final decisions should be human-driven
  4. Document Everything: Keep audit trails of decisions
  5. 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?

  1. Learn About MCP: Read Model Context Protocol: The Future of AI Tool Integration
  2. Explore PilotFrame: Coming soon - detailed architecture guide
  3. 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.