diff --git a/app/cv/page.tsx b/app/cv/page.tsx new file mode 100644 index 0000000..4536527 --- /dev/null +++ b/app/cv/page.tsx @@ -0,0 +1,386 @@ +"use client"; + +import PageLayout from "@/components/PageLayout"; +import { Mail, Globe, MapPin, ExternalLink, Server, Zap } from "lucide-react"; + +export default function CVPage() { + return ( + + {/* Hide the print button itself during printing */} +
+ +
+ + {/* Main Container*/} +
+
+
+
+ George A. Webberley +
+
+

+ George A. Webberley +

+

+ Full Stack Engineer // Systems Architect +

+
+
+ + {/* Contact Info - Explicitly right-aligned for print */} +
+
+ Copenhagen, Denmark +
+
+ george@georgew.dev +
+
+ georgew.dev +
+
+
+ +
+ {/* Main Column */} +
+
+

+ Professional Summary +

+

+ After 5 years as a dental surgeon, a serendipitous broken leg + led me to discover that software engineering perfectly suits my + analytical mind. Now an MSc (Distinction) graduate and Senior + Engineer, my core expertise lies in the entire product + lifecycle. I’m less about a specific niche and more about the + whole stack. I enjoy the challenge of creating a clean frontend, + connecting a stable backend API, and building the infrastructure + that keeps it all running. I'm always looking for the most + efficient way to get a project from 'concept' to + 'shipped'. +

+
+ +
+

+ Engineering Experience +

+
+ {/* Brain+ Section */} +
+
+

+ Brain+, Copenhagen +

+ + 2022 — Present + +
+

+ Technical Lead & Senior Full Stack Developer +

+
    +
  • + Product Ownership: I act as the bridge + between technical and product teams; I handle the full + product lifecycle from initial design and sprint planning + to final demos. +
  • +
  • + Infrastructure: Architected a resilient + multi-cloud setup focusing on high availability, + scalability, and security. I leveraged container + orchestration (K8s), modern load balancers, and VPC + security policies all managed through IaC (Terraform) to + ensure 24/7 reliability. +
  • +
  • + DevOps & Automation: Built automated + CI/CD pipelines using GitHub Actions and Fastlane for + mobile releases. I utilize Kubectl and custom Makefiles to + streamline cluster management and standardize local + development environments. +
  • +
  • + Full Stack Delivery: Scaled core features + using Ruby on Rails REST API services and Flask, while + managing the rigorous documentation and release processes + required for high-stakes medical compliance. +
  • +
+
+ + {/* Other Roles */} +
+ {/* StageUp */} +
+
+

+ StageUp, Cardiff +

+ + 2021 — 2022 + +
+

+ Delivered new features and backend logic for a startup + platform, while maintaining the GCP infrastructure and + deployment pipelines. +

+
+ {[ + "Angular", + "Node.js", + "PostgreSQL", + "Terraform", + "Docker", + "GCP", + ].map((t) => ( + + {t} + + ))} +
+
+ + {/* Startemup */} +
+
+

+ Startemup, Ontario +

+ + 2021 — 2023 + +
+

+ Technical troubleshooter for complex WordPress + customizations requiring bespoke PHP logic and deep + performance optimization. +

+
+ {[ + "PHP", + "WordPress", + "Performance Optimization", + "Bespoke Logic", + ].map((t) => ( + + {t} + + ))} +
+
+ + {/* Ratoong */} +
+
+

+ Ratoong, Copenhagen +

+ + 2020 — 2022 + +
+

+ Leading the end-to-end development of a functional SPA, + moving from initial UI designs to a live production + environment. +

+
+ {["Angular", "Firebase", "GCP", "SPA Architecture"].map( + (t) => ( + + {t} + + ), + )} +
+
+
+
+
+
+ + {/* Sidebar */} +
+
+

+ Technical Mastery +

+
+
+

+ Infrastructure & Ops +

+
+ {[ + "Kubernetes", + "Docker", + "Terraform", + "GCP", + "OTC", + "CI/CD", + "VPC", + ].map((s) => ( + + {s} + + ))} +
+
+
+

+ Full Stack Engineering +

+
+ {[ + "TypeScript", + "Flutter", + "Python", + "React", + "Angular", + "Node.js", + "Rails", + "PostgreSQL", + "NoSQL", + ].map((s) => ( + + {s} + + ))} +
+
+
+
+ +
+

+ Education +

+
+
+

+ MSc Computer Science +

+

+ Distinction +

+

+ Univ. of Bristol +

+
+
+

+ Bachelor of Dental Surgery +

+

+ Univ. of Bristol (Merit) +

+
+
+
+ +
+

+ Systems Tinkering +

+
+
+
+ +

+ Cloud-Hybrid Laboratory +

+
+

+ I manage a suite of self-hosted services. A playground for + breaking things in private. I use{" "} + Tailscale and Woodpecker CI to orchestrate + everything from Grafana surf dashboards to + personal wikis. +

+
+
+
+ +

+ Product Prototyping +

+
+

+ Building quirky apps like a "not-pokemon" pet + collecting game and a space-rocket countdown dashboard. + Check out my portfolio website for full + details! +

+
+
+
+ +
+

+ Human +

+

+ Surfing, photography, and following space news. Usually found + watching anime while tinkering with my server stack. Currently + learning Danish (undskyld på forhånd). +

+
+ +
+
+

+ Portfolio Deep Dive +

+

+ Detailed architecture diagrams and documentation: +

+ + {/* Web Version: Clickable Link */} + + GEORGEW.DEV + + + {/* Print Version: Static text that won't be stripped by "a" selectors */} +
+ GEORGEW.DEV +
+
+
+
+
+
+
+ ); +} diff --git a/app/globals.css b/app/globals.css index 1c1f98e..b4a2d28 100644 --- a/app/globals.css +++ b/app/globals.css @@ -31,3 +31,62 @@ body { max-width: none; word-break: break-word; } + +@media print { + @page { + size: A4; + margin: 0 !important; /* Use 0 here, and handle padding in the React component */ + -webkit-margin-before: 0; + -webkit-margin-after: 0; + } + + html, + body { + height: 100%; + overflow: hidden; + } + + /* Force the body to be the exact width of A4 to prevent scaling */ + body { + width: 210mm; + height: 297mm; + margin: 0; + padding: 0; + background: white !important; + -webkit-print-color-adjust: exact !important; + print-color-adjust: exact !important; + } + + /* Hide everything outside the CV content */ + #safari-extension-is-installed, + main a[href="/"], + main a[href*="back"], + footer, + .no-print { + display: none !important; + } + + /* Ensure the PageLayout wrapper doesn't add width or centering */ + main { + display: block !important; + min-height: auto !important; + padding: 0 !important; + margin: 0 !important; + background: white !important; + color: black !important; + } + + /* 3. Ensure the inner container doesn't push content down */ + main > div { + margin: 0 !important; + padding: 0 !important; + max-width: none !important; + } + + /* 4. Fix the "page break" issue after the title */ + h1, + header { + break-after: avoid; + break-inside: avoid; + } +} diff --git a/app/page.tsx b/app/page.tsx index 7f30759..69b4593 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -58,6 +58,12 @@ export default function Home() { > LinkedIn + + CV + diff --git a/public/profile.jpg b/public/profile.jpg new file mode 100644 index 0000000..fc6c2b8 Binary files /dev/null and b/public/profile.jpg differ