diff --git a/app/infrastructure/page.tsx b/app/infrastructure/page.tsx new file mode 100644 index 0000000..ee0c4e9 --- /dev/null +++ b/app/infrastructure/page.tsx @@ -0,0 +1,136 @@ +"use client"; +import { motion } from "framer-motion"; +import { ShieldCheck, Zap, Globe, Cpu, Terminal } from "lucide-react"; +import Link from "next/link"; + +const CAPABILITIES = [ + { + title: "Cloud Orchestration", + icon: , + skills: ["Kubernetes", "Docker", "Cloud Run", "Multi-Region VPC"], + description: + "Managing containerized application lifecycles and software-defined networks to ensure high availability and regional data sovereignty.", + }, + { + title: "Provisioning & IaC", + icon: , + skills: ["Terraform", "Makefiles", "Shell Scripting", "Versioned State"], + description: + "Defining environment state through version-controlled configurations to ensure reproducible, predictable, and audit-ready cloud resources.", + }, + { + title: "Deployment Pipelines", + icon: , + skills: [ + "GitHub Actions", + "Woodpecker CI", + "Fastlane", + "Automated Testing", + ], + description: + "Architecting CI/CD workflows that bridge the gap between local development and production environments with zero-downtime strategies.", + }, + { + title: "Governance & Security", + icon: , + skills: ["NHS DSPT", "Cyber Essentials", "DPIA", "Secret Management"], + description: + "Hardening infrastructure and delivery pipelines to maintain alignment with UK health data standards and government security frameworks.", + }, +]; + +export default function InfrastructurePage() { + return ( +
+ {/* Tightened Header */} +
+
+ +

+ Infrastructure and Operationss +

+
+

+ Technical manifest of experiences in cloud orchestration, deployment + pipelines, and security frameworks designed for resilient services in + regulated environments. +

+
+ + {/* Tightened Specification List */} +
+ {CAPABILITIES.map((cap, i) => ( + +
+
+ {cap.icon} +

+ {cap.title} +

+
+
+ +
+

+ {cap.description} +

+
+ {cap.skills.map((skill) => ( + + {`// ${skill}`} + + ))} +
+
+
+ ))} +
+ + {/* Corrected Alignment Featured Section */} +
+
+
+

+ Selected Case Study +

+

+ Medical-Grade Architecture Analysis +

+

+ An examination of a multi-cloud environment built to satisfy + UK Cyber Essentials and + NHS DSPT standards, + focusing on data residency and infrastructure-level security. +

+
+ +
+ + + Examine Logic + + + +
+
+
+
+ ); +} diff --git a/app/page.tsx b/app/page.tsx index eba5662..30e2e51 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -181,21 +181,22 @@ export default function Home() { {/* Middle Row: DevOps */} - +
-

DevOps

+

Infrastructure

- Managing self-hosted cloud nodes with automated CI/CD - pipelines and proactive monitoring. + Architecting resilient cloud environments with automated IaC, + multi-region orchestration, and high-integrity security + protocols.

- {["Docker", "Woodpecker", "Hetzner", "Linux", "Uptime"].map( + {["Kubernetes", "Terraform", "GCP", "CI/CD", "Security"].map( (tech) => ( { + const len = images.length; + return (index - currentIndex + len) % len; + }; + + const next = () => setCurrentIndex((prev) => (prev + 1) % images.length); + + return ( +
+
+ + {images.map((img, index) => { + const relIndex = getRelativeIndex(index); + const isTop = relIndex === 0; + + const xOffset = relIndex * 90; + + if (relIndex > 5) return null; + + return ( + { + if (isTop && info.offset.x < DRAG_THRESHOLD) { + next(); + } + }} + onDragEnd={(_, info) => { + // Backup check for quick flicks + if (isTop && info.offset.x < -100) { + next(); + } + }} + onClick={() => !isTop && setCurrentIndex(index)} + className="absolute" + > +
+ + App Screenshot + +
+
+ ); + })} +
+ + {/* Navigation Button */} +
+ +
+
+
+ ); +} diff --git a/data/projects.ts b/data/projects.ts index 0fe22fb..c3e3548 100644 --- a/data/projects.ts +++ b/data/projects.ts @@ -265,7 +265,7 @@ graph TB ], description: "A social decision-making app that solves 'choice paralysis' by allowing groups to swipe on movies and TV shows, using a real-time matching algorithm to find common interests.", - storyLabel: "UX // MOBILE_SYNCHRONIZATION", + storyLabel: "UX // MOBILE SYNCHRONIZATION", images: [ "/projects/choosa/choosa-1.jpg", "/projects/choosa/choosa-2.jpg", @@ -320,42 +320,85 @@ graph LR classDef hub fill:#f59e0b,stroke:#d97706,color:#fff `, }, + { - slug: "flutter-1", + slug: "nutriveat", category: "mobile", - title: "Flutter-1", - subtitle: "Personal R&D Pipeline", - role: "Architect & Creator", - duration: "2025 — Present", - stack: ["Python", "FastAPI", "Next.js", "Redis"], - metrics: ["Sub-50ms Latency", "Automated ETL", "Self-Hosted"], + title: "Nutriveat", + subtitle: "AI-Powered Personalized Nutrition", + role: "Lead Developer & Architect", + duration: "2024 — Present", + stack: [ + "Flutter", + "Firebase", + "OpenAI (GPT-4o)", + "Novita AI", + "StoreKit / Play Billing", + ], + metrics: [ + "Fine-tuned LLM Assistants", + "Direct Store Integrations", + "Multi-Tier Subscriptions", + ], description: - "A data science pipeline tool built to explore high-speed processing and real-time visualization of large datasets.", - images: ["/datasaur-1.jpg"], - repoUrl: "https://git.georgew.dev/georgew/datasaur", - liveUrl: "https://ratoong.com", - engineeringStory: - "In this high-stakes medical environment, I implemented a custom audit logging system that ensured every state change was immutable...", - storyLabel: "DATA EFFICIENCY", - isPrivate: true, - }, - { - slug: "flutter-2", - category: "mobile", - title: "Flutter-1", - subtitle: "Personal R&D Pipeline", - role: "Architect & Creator", - duration: "2025 — Present", - stack: ["Python", "FastAPI", "Next.js", "Redis"], - metrics: ["Sub-50ms Latency", "Automated ETL", "Self-Hosted"], - description: - "A data science pipeline tool built to explore high-speed processing and real-time visualization of large datasets.", - images: ["/datasaur-1.jpg"], - repoUrl: "https://git.georgew.dev/georgew/datasaur", - liveUrl: "https://ratoong.com", - engineeringStory: - "In this high-stakes medical environment, I implemented a custom audit logging system that ensured every state change was immutable...", - storyLabel: "DATA EFFICIENCY", - isPrivate: true, + "A comprehensive health and nutrition platform that leverages fine-tuned generative AI to architect personalized meal plans, automate shopping lists, and provide real-time culinary assistance.", + storyLabel: "AI ORCHESTRATION // MONETIZATION", + images: [ + "/projects/nutriveat/nutriveat-6.jpg", + "/projects/nutriveat/nutriveat-1.jpg", + "/projects/nutriveat/nutriveat-2.jpg", + "/projects/nutriveat/nutriveat-3.jpg", + "/projects/nutriveat/nutriveat-4.jpg", + "/projects/nutriveat/nutriveat-5.jpg", + ], + isPrivate: false, + engineeringStory: ` +Nutriveat represents a deep dive into the practical application of Large Language Models (LLMs) in a consumer-facing mobile environment. The goal was to move beyond a standard "chat wrapper" and create a deeply integrated tool that understands the nuance of dietary constraints, kitchen logistics, and user budgets. + +#### Fine-Tuned AI & Structured Output +A major engineering hurdle was ensuring the AI generated valid, consistent, and safe meal plans. I implemented a system of fine-tuned system prompts and strict schema validation within **Cloud Functions** to force GPT-4o to return structured data. This allowed the app to take raw AI output and instantly transform it into actionable Firestore documents, shopping list items, and high-fidelity image prompts for **Novita AI**. + +#### Native Subscription Architecture +To support the ongoing API costs of generative AI, I architected a robust multi-tier subscription model (Monthly/Annual). I implemented the monetization layer by integrating directly with the **Apple App Store (StoreKit)** and **Google Play Console (Billing Library)**. This involved architecting a custom server-side validation system in Cloud Functions to handle real-time subscription status, grace periods, and cross-platform entitlement logic without the use of third-party middleware. + +#### Context-Aware Culinary Assistance +I developed a specialized AI Chatbot designed to function as a "Kitchen Assistant." Unlike general-purpose bots, this assistant is provided with the specific context of the user's current meal plan, dietary allergies, and available utensils. By using **RAG-lite (Retrieval-Augmented Generation)** principles, the bot can provide accurate unit conversions and tailored cooking instructions that respect the user's specific kitchen setup. + `, + mermaidChart: ` +graph LR + subgraph Client_Mobile [Flutter Frontend] + A[Mobile App]:::traffic + end + + subgraph Firebase_Backend [Control Plane] + Hub((Firebase SDK)):::hub + C[Firestore DB]:::node + D[Cloud Functions]:::node + end + + subgraph AI_Orchestration [Intelligence Layer] + F[OpenAI / GPT-4o]:::node + G[Novita AI / Stable Diffusion]:::node + end + + subgraph Store_Integrations [Native Billing] + H[App Store / Play Store]:::traffic + end + + A <--> Hub + Hub <--> C + Hub --> D + + D ==>|Fine-tuned Prompts| F + D ==>|Image Generation| G + F -.->|JSON Parsing| D + + A <-->|Native IAP Flow| H + H -.->|Server-to-Server Hooks| D + + classDef traffic fill:#2563eb,stroke:#3b82f6,color:#fff + classDef node fill:#16a34a,stroke:#22c55e,color:#fff + classDef hub fill:#f59e0b,stroke:#d97706,color:#fff + `, }, ]; diff --git a/public/projects/nutriveat/nutriveat-1.jpg b/public/projects/nutriveat/nutriveat-1.jpg new file mode 100644 index 0000000..252d9f0 Binary files /dev/null and b/public/projects/nutriveat/nutriveat-1.jpg differ diff --git a/public/projects/nutriveat/nutriveat-2.jpg b/public/projects/nutriveat/nutriveat-2.jpg new file mode 100644 index 0000000..02f09f9 Binary files /dev/null and b/public/projects/nutriveat/nutriveat-2.jpg differ diff --git a/public/projects/nutriveat/nutriveat-3.jpg b/public/projects/nutriveat/nutriveat-3.jpg new file mode 100644 index 0000000..7baddda Binary files /dev/null and b/public/projects/nutriveat/nutriveat-3.jpg differ diff --git a/public/projects/nutriveat/nutriveat-4.jpg b/public/projects/nutriveat/nutriveat-4.jpg new file mode 100644 index 0000000..c066e0f Binary files /dev/null and b/public/projects/nutriveat/nutriveat-4.jpg differ diff --git a/public/projects/nutriveat/nutriveat-5.jpg b/public/projects/nutriveat/nutriveat-5.jpg new file mode 100644 index 0000000..e7bd749 Binary files /dev/null and b/public/projects/nutriveat/nutriveat-5.jpg differ diff --git a/public/projects/nutriveat/nutriveat-6.jpg b/public/projects/nutriveat/nutriveat-6.jpg new file mode 100644 index 0000000..9110377 Binary files /dev/null and b/public/projects/nutriveat/nutriveat-6.jpg differ