diff --git a/public/images/OLDgaming-setup.jpg b/public/images/OLDgaming-setup.jpg new file mode 100644 index 0000000..894cd2c Binary files /dev/null and b/public/images/OLDgaming-setup.jpg differ diff --git a/public/images/OLDpro-workspace.jpg b/public/images/OLDpro-workspace.jpg new file mode 100644 index 0000000..c8972de Binary files /dev/null and b/public/images/OLDpro-workspace.jpg differ diff --git a/public/images/gaming-setup.jpg b/public/images/gaming-setup.jpg index 894cd2c..757f20e 100644 Binary files a/public/images/gaming-setup.jpg and b/public/images/gaming-setup.jpg differ diff --git a/public/images/pro-workspace.jpg b/public/images/pro-workspace.jpg index d71a563..4e6f265 100644 Binary files a/public/images/pro-workspace.jpg and b/public/images/pro-workspace.jpg differ diff --git a/src/components/layout/SectionHeader.astro b/src/components/layout/SectionHeader.astro index a1a23c5..34af958 100644 --- a/src/components/layout/SectionHeader.astro +++ b/src/components/layout/SectionHeader.astro @@ -8,7 +8,7 @@ * The kicker is rendered as a monospace number/label per the spec's "Accent/ * quotes: a monospace or display font sparingly for section numbers" guidance. */ -import Icon from '@components/Icon.astro'; +import Icon from "@components/Icon.astro"; interface Props { /** Monospace kicker, e.g. "02" or "Experience". */ @@ -19,32 +19,46 @@ interface Props { /** Optional mdi icon shown beside the kicker. */ icon?: string; class?: string; - align?: 'left' | 'center'; + align?: "left" | "center"; } -const { kicker, title, subtitle, icon, class: className = '', align = 'left' } = Astro.props; +const { + kicker, + title, + subtitle, + icon, + class: className = "", + align = "left", +} = Astro.props; ---
- {kicker && ( - - {icon && } - {kicker} - - )} + { + kicker && ( + + {icon && } + {kicker} + + ) + }

{title}

- {subtitle && ( -

- {subtitle} -

- )} + { + subtitle && ( +

+ {subtitle} +

+ ) + }
diff --git a/src/components/professional/SkillGrid.astro b/src/components/professional/SkillGrid.astro index 2ef72f6..143cb37 100644 --- a/src/components/professional/SkillGrid.astro +++ b/src/components/professional/SkillGrid.astro @@ -11,58 +11,101 @@ * treatment (decorative, not a proficiency claim) to feel like the spec's * "visual skill bars" suggestion without implying false metrics. */ -import Icon from '@components/Icon.astro'; -import Placeholder from '@components/layout/Placeholder.astro'; +import Icon from "@components/Icon.astro"; +import Placeholder from "@components/layout/Placeholder.astro"; const core = [ - { icon: 'cloud', label: 'Cloud Architecture & Development' }, - { icon: 'cellphone-link', label: 'Mobile Application Development' }, - { icon: 'server-network', label: 'SAP Business Technology Platform (BTP)' }, - { icon: 'account-group', label: 'Team Leadership & Technical Mentorship' }, - { icon: 'translate', label: 'Cross-functional Communication' }, + { icon: "cloud", label: "Cloud Architecture & Development" }, + { icon: "cellphone-link", label: "Mobile Application Development" }, + { icon: "server-network", label: "SAP Business Technology Platform (BTP)" }, + { icon: "account-group", label: "Team Leadership & Technical Mentorship" }, + { icon: "translate", label: "Cross-functional Communication" }, ]; const emerging = [ - { icon: 'chart-line', label: 'SAP BTP deep-dive (active expansion)' }, - { icon: 'robot', label: 'AI-powered development tooling' }, - { icon: 'cog-refresh', label: 'Advanced automation and workflow engineering' }, + { icon: "chart-line", label: "SAP BTP deep-dive (active expansion)" }, + { icon: "robot", label: "Cutting edge AI-powered development tooling" }, + { + icon: "cog-refresh", + label: "Advanced automation and workflow engineering", + }, ]; // Technical stack mixes known items (from spec context) with explicit gaps. const techStack = [ - { icon: 'code-braces', label: 'Languages', value: null, hint: 'Likely JavaScript/TypeScript, Python, Java, ABAP given SAP focus.' }, - { icon: 'cube-outline', label: 'Frameworks', value: null, hint: 'Add your primary frameworks here.' }, - { icon: 'microsoft-azure-devops', label: 'Cloud Platforms', value: 'SAP BTP, [others]', hint: 'List the cloud platforms you ship on.' }, - { icon: 'git', label: 'Tools', value: 'Git, CI/CD pipelines, [fill in]', hint: 'Add the rest of your toolchain.' }, - { icon: 'brain', label: 'AI/ML', value: 'Hands-on experience with machine learning frameworks and LLM integration', hint: null }, + { + icon: "code-braces", + label: "Languages", + value: + "JavaScript, TypeScript, Java, Python, C#, C, SQL, HTML, CSS, and many more.", + hint: "JavaScript, TypeScript, Java, Python, C#, C, SQL, HTML, CSS, and many more.", + }, + { + icon: "cube-outline", + label: "Frameworks", + value: "React, Vue, Astro, Flask", + hint: "Add your primary frameworks here.", + }, + { + icon: "microsoft-azure-devops", + label: "Cloud Platforms", + value: "SAP BTP, Google Cloud Platform, AWS", + hint: "List the cloud platforms you ship on.", + }, + { + icon: "git", + label: "Tools", + value: "Git, Gitea, CI/CD pipelines", + hint: "Add the rest of your toolchain.", + }, + { + icon: "brain", + label: "AI/ML", + value: + "Hands-on experience with machine learning frameworks and LLM integration and agent harnesses like ClaudeCode, Hermes, and OpenClaw", + hint: null, + }, ]; ---
-

Core Competencies

+

+ Core Competencies +

@@ -70,46 +113,67 @@ const techStack = [

Technical Stack

- {techStack.map((item) => ( -
-
- - {item.label} + { + techStack.map((item) => ( +
+
+ + + {item.label} + +
+ {item.value ? ( +

+ {item.value} +

+ ) : ( + + )}
- {item.value - ?

{item.value}

- : } -
- ))} + )) + }
-

Emerging & Exploring

+

+ Emerging & Exploring +

    - {emerging.map((item, i) => ( -
  • -
  • - - - {item.label} -
  • - ))} + + + {item.label} + + + )) + }
diff --git a/src/content/experience/implico.md b/src/content/experience/implico.md index 932b64e..5169c63 100644 --- a/src/content/experience/implico.md +++ b/src/content/experience/implico.md @@ -3,11 +3,11 @@ # This seeds the Experience timeline. The narrative bullets below are the spec's # template bullets; Greg should replace the bracketed placeholders with real # outcomes, metrics, and dates. See docs/CONTENT.md for how to add more roles. -company: 'Implico Inc.' -title: 'Software Developer / Lead Developer / Team Lead' -period: '[Greg to fill dates]' -focus: 'Cloud and mobile application development, SAP-adjacent solutions.' -icon: 'briefcase' +company: "Implico Inc." +title: "Software Developer / Lead Developer / BTP Cloud and Mobile App Lead" +period: "Mar 2019 - Present" +focus: "BTP, Cloud, and Mobile application development, SAP-adjacent solutions." +icon: "briefcase" order: 10 --- @@ -15,8 +15,9 @@ Current expansion: **SAP Business Technology Platform (BTP)**. Key contributions: -- Lead development on [cloud/mobile project], delivering [specific outcome]. -- Architect and maintain [system/platform], supporting [X users/clients]. +- Lead development on Carrier Connect, delivering a robust 3rd party carrier logistics tool. +- Architect and maintain multiple carrier integration systems, supporting over 1000 active users and 100 companies. - Collaborate with cross-functional teams to translate business requirements into technical solutions. - Mentor junior developers and establish coding standards and review practices. - Drive adoption of new technologies and frameworks within the team. +- Maintain responsible AI usage guidelines in an every changing ecosystem. diff --git a/src/content/projects/placeholder-project.md b/src/content/projects/placeholder-project.md index 13f16ee..6d08f4d 100644 --- a/src/content/projects/placeholder-project.md +++ b/src/content/projects/placeholder-project.md @@ -4,12 +4,12 @@ # entries. To replace it: copy this file, edit the frontmatter + body, and bump # `placeholder: false`. Or just delete this file and add your own. See # docs/CONTENT.md. The schema lives in src/content.config.ts. -title: 'Your project here' -role: 'Lead Developer' -tech: ['TypeScript', 'Node.js', 'SAP BTP'] +title: "PUT PROJECTS HERE" +role: "Lead Developer" +tech: ["TypeScript", "Node.js", "SAP BTP"] summary: > This is a placeholder so the project grid has the right layout. Replace it - with a real 2-3 sentence description of what the project does and your + with a real 2-3 sentence description of what the project does and my contribution, then add links below. order: 100 placeholder: true diff --git a/src/pages/about.astro b/src/pages/about.astro index da6a31e..10c18f9 100644 --- a/src/pages/about.astro +++ b/src/pages/about.astro @@ -27,7 +27,7 @@ const quickFacts = [ { icon: "dice-multiple", text: "Running D&D & Daggerheart campaigns" }, { icon: "book-open-variant", - text: "Currently reading: Heir of Fire by Sarah J. Maas", + text: "Currently tandem reading: Heir of Fire and Tower of Dawn by Sarah J. Maas", }, { icon: "tea", text: "Fueled by loose-leaf Chinese tea and Mountain Dew" }, ]; @@ -64,11 +64,12 @@ const quickFacts = [ class="border-l-2 pl-5 font-sans text-xl leading-relaxed sm:text-2xl" style="border-color: var(--color-accent); color: var(--color-text);" > - I am Greg: a software developer based in Philadelphia who spends his - free time running tabletop RPGs, making resin dice and custom cards, 3D - printing anything I can, and reading his way through fantasy series at - an alarming rate. I live with my partner Krystina, our mini dachshund - Kashi, and more board games than any reasonable apartment should hold. + I am Greg: a software developer and technical team lead based in + Philadelphia who spends his free time running tabletop RPGs, making + resin dice and custom cards, 3D printing anything I can, and reading his + way through fantasy series at an alarming rate. I live with my partner + Krystina, our mini dachshund Kashi, and more board games than any + reasonable apartment should hold.

diff --git a/src/pages/index.astro b/src/pages/index.astro index 1dd90bf..1cb1055 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -25,7 +25,7 @@ const cards = [ { icon: "briefcase", title: "Professional", - copy: "From SAP-adjacent cloud apps to full-stack mobile — a decade of building software that businesses actually use.", + copy: "From SAP-adjacent cloud to full-stack mobile, a decade of building software that businesses actually use.", href: "/professional", image: "/images/pro-workspace.jpg", alt: "Developer workspace with code on screen", @@ -33,7 +33,7 @@ const cards = [ { icon: "dice-multiple", title: "Tabletop", - copy: "Currently running two campaigns in Foundry VTT and playtesting MCDM's Crows. Always rolling dice.", + copy: "Currently obsessed with Spirit Island, Magic: The Gathering, and running campaigns in Foundry VTT. Always planning more; always rolling dice.", href: "/interests/ttrpgs", image: "/images/ttrpg-dice.jpg", alt: "Polyhedral dice on a dark surface", @@ -41,7 +41,7 @@ const cards = [ { icon: "palette", title: "Making", - copy: "Resin dice, 3D prints, and whatever else catches my eye. If it involves layers and precision, I am in.", + copy: "Resin dice, 3D prints, TCG proxies, and whatever else catches my eye. If it involves really nice cardboard or mastering a new craft, I am in.", href: "/interests/making", image: "/images/making-resin.jpg", alt: "Resin crafting in progress", diff --git a/src/pages/interests/gaming.astro b/src/pages/interests/gaming.astro index afe8280..c3040ac 100644 --- a/src/pages/interests/gaming.astro +++ b/src/pages/interests/gaming.astro @@ -5,31 +5,55 @@ * Per-interest template: header + tagline, verbatim overview, platforms card * grid, favorite genres, currently playing placeholder, and related interests. */ -import BaseLayout from '@layouts/BaseLayout.astro'; -import Reveal from '@components/motion/Reveal.astro'; -import InterestHero from '@components/layout/InterestHero.astro'; -import InterestCard from '@components/cards/InterestCard.astro'; -import SectionHeader from '@components/layout/SectionHeader.astro'; -import RelatedInterests from '@components/layout/RelatedInterests.astro'; -import Placeholder from '@components/layout/Placeholder.astro'; -import Icon from '@components/Icon.astro'; +import BaseLayout from "@layouts/BaseLayout.astro"; +import Reveal from "@components/motion/Reveal.astro"; +import InterestHero from "@components/layout/InterestHero.astro"; +import InterestCard from "@components/cards/InterestCard.astro"; +import SectionHeader from "@components/layout/SectionHeader.astro"; +import RelatedInterests from "@components/layout/RelatedInterests.astro"; +import Placeholder from "@components/layout/Placeholder.astro"; +import Icon from "@components/Icon.astro"; const platforms = [ - { icon: 'sony-playstation', title: 'PlayStation 5', body: 'Main console for AAA titles and exclusives.' }, - { icon: 'nintendo-switch', title: 'Nintendo Switch / Switch 2', body: 'Handheld and docked. Nintendo first-party plus indie gems.' }, - { icon: 'steam', title: 'Steam', body: 'The primary PC library. Strategy, RPGs, and an ever-growing backlog.' }, + { + icon: "sony-playstation", + title: "PlayStation 5", + body: "Main console for AAA titles and exclusives.", + }, + { + icon: "nintendo-switch", + title: "Nintendo Switch / Switch 2", + body: "Handheld and docked. Nintendo first-party plus indie gems.", + }, + { + icon: "steam", + title: "Steam", + body: "The primary PC library. Strategy, RPGs, and an ever-growing backlog.", + }, ]; const genres = [ - 'RPGs (both Western and JRPG)', - 'Strategy and tactics', - 'Open-world exploration', - 'Indie darlings', + "RPGs (both Western and JRPG)", + "Strategy and tactics", + "Building and crafting", + "Automation", + "Open-world exploration", + "Indie darlings", ]; const related = [ - { href: '/interests/pokemon', title: 'Pokémon', icon: 'pokeball', blurb: 'Nintendo console overlap and a lifelong obsession.' }, - { href: '/interests/ttrpgs', title: 'TTRPGs & Tabletop', icon: 'dice-multiple', blurb: 'Digital RPGs as another expression of the same impulse.' }, + { + href: "/interests/pokemon", + title: "Pokémon", + icon: "pokeball", + blurb: "Nintendo console overlap and a lifelong obsession.", + }, + { + href: "/interests/ttrpgs", + title: "TTRPGs & Tabletop", + icon: "dice-multiple", + blurb: "Digital RPGs as another expression of the same impulse.", + }, ]; --- @@ -48,48 +72,92 @@ const related = [
{/* Overview */} -
-

Gaming is my other constant. I span console generations with a PlayStation 5, Nintendo Switch 2, and a Steam library that has gotten politely out of hand. I'm particularly drawn to RPGs, strategy games, and anything with a deeply layered world. If a game has lore compendiums, I'm reading them.

+
+

+ Gaming is my other constant. I span console generations with a + PlayStation 5, Nintendo Switch 2, and a Steam library that has gotten + politely out of hand. I'm particularly drawn to RPGs, strategy games, + and anything with a deeply layered world. If a game has lore + compendiums, I'm reading them. +

{/* Platforms */}
- +
- {platforms.map((p, i) => ( - - {p.body} - - ))} + { + platforms.map((p, i) => ( + + + {p.body} + + + )) + }
{/* Genres */}
- +
    - {genres.map((g) => ( -
  • - - {g} -
  • - ))} + { + genres.map((g) => ( +
  • + + {g} +
  • + )) + }
{/* Currently */}
- +
- Gaming setup + Gaming setup
- +
diff --git a/src/pages/interests/index.astro b/src/pages/interests/index.astro index a67b864..901845e 100644 --- a/src/pages/interests/index.astro +++ b/src/pages/interests/index.astro @@ -6,51 +6,56 @@ * sub-page, using the spec's taglines. Sets surface="interest" so the whole * page reads warm (cream/amber) regardless of the global light/dark toggle. */ -import BaseLayout from '@layouts/BaseLayout.astro'; -import Reveal from '@components/motion/Reveal.astro'; -import Icon from '@components/Icon.astro'; -import SectionHeader from '@components/layout/SectionHeader.astro'; -import AnimatedBackground from '@components/hero/AnimatedBackground.tsx'; -import SacredGeometry from '@components/mystic/SacredGeometry.astro'; -import ConstellationField from '@components/mystic/ConstellationField.tsx'; +import BaseLayout from "@layouts/BaseLayout.astro"; +import Reveal from "@components/motion/Reveal.astro"; +import Icon from "@components/Icon.astro"; +import SectionHeader from "@components/layout/SectionHeader.astro"; +import AnimatedBackground from "@components/hero/AnimatedBackground.tsx"; +import SacredGeometry from "@components/mystic/SacredGeometry.astro"; +import ConstellationField from "@components/mystic/ConstellationField.tsx"; const interests = [ { - href: '/interests/ttrpgs', - icon: 'dice-multiple', - title: 'TTRPGs & Tabletop', - tagline: 'Three campaigns, two systems, one rolling table.', - blurb: 'Long-running D&D and Daggerheart campaigns on Foundry VTT, plus the Crows playtest. Worldbuilding, NPC relationships, and player-driven narrative.', - image: '/images/ttrpg-dice.jpg', - alt: 'Polyhedral dice on a dark surface', + href: "/interests/ttrpgs", + icon: "dice-multiple", + title: "TTRPGs & Tabletop", + tagline: "Have dice, will roll.", + blurb: + "Card Games, Board Games, and Long-running D&D and Daggerheart campaigns on Foundry VTT. Worldbuilding, NPC relationships, and player-driven narrative.", + image: "/images/ttrpg-dice.jpg", + alt: "Boardgame Shelf", }, { - href: '/interests/gaming', - icon: 'sony-playstation', - title: 'Gaming', - tagline: 'If it has a screen or a controller, I have probably played it.', - blurb: 'PlayStation 5, Nintendo Switch 2, and a politely out-of-hand Steam library. RPGs, strategy, and anything with a deeply layered world.', - image: '/images/gaming-setup.jpg', - alt: 'Gaming setup with controller', + href: "/interests/gaming", + icon: "sony-playstation", + title: "Gaming", + tagline: "We do not talk about my backlog.", + blurb: + "PlayStation 5, Nintendo Switch 2, and a politely out-of-hand Steam library. RPGs, strategy, and anything with a deeply layered world.", + image: "/images/gaming-setup.jpg", + alt: "Gaming setup desk", }, { - href: '/interests/reading', - icon: 'book-open-page-variant', - title: 'Reading & Media', - tagline: 'Perpetually three books ahead of my to-read list.', - blurb: 'The Cosmere, Dune, the Pendergast saga, and Throne of Glass. Plus light novels, manga, manhwa, anime, and film.', - image: '/images/fantasy-books.jpg', - alt: 'Fantasy bookshelf', + href: "/interests/reading", + icon: "book-open-page-variant", + title: "Reading & Media", + tagline: "Perpetually three books ahead of my to-read list.", + blurb: + "The Cosmere, Dune, the Pendergast saga, and Throne of Glass. Plus light novels, manga, manhwa, anime, and film.", + image: "/images/fantasy-books.jpg", + alt: "Fantasy bookshelf", }, { - href: '/interests/making', - icon: 'palette', - title: 'Making & Creating', - tagline: 'If it involves layers and precision, I am in.', - blurb: 'Resin dice in a pressure pot, miniatures and terrain on the Elegoo Mars 4 and Bambu Labs P1S. Much of it ends up on the virtual table.', - image: '/images/making-resin.jpg', - alt: 'Resin crafting in progress', - }, + href: "/interests/making", + icon: "palette", + title: "Making & Creating", + tagline: + "If it involves really nice cardboard or mastering a new craft, I am in.", + blurb: + "Resin dice in a pressure pot, fun and functional prints on the P1s, custom TCG proxies and decks. Passion and utility.", + image: "/images/making-resin.jpg", + alt: "Polyhedral dice on a dark bag", + } /* { href: '/interests/pokemon', icon: 'pokeball', @@ -59,7 +64,7 @@ const interests = [ blurb: 'A lifelong obsession from Red and Blue to modern competitive. Steel/Psychic, beautiful design, absolutely devastating in battle.', image: '/images/pokemon-cards.jpg', alt: 'Trading card collection', - }, + },*/, ]; --- @@ -70,9 +75,13 @@ const interests = [ >
- {/* Full animated Milky Way field + stars, matching the Home hero treatment. */} + { + /* Full animated Milky Way field + stars, matching the Home hero treatment. */ + } -
+
- {interests.map((item, i) => ( - - -
- {item.alt} -
-
- - - - ))} + + + )) + } {/* Cross-link back to professional wing */} @@ -134,9 +164,20 @@ const interests = [ class="card card-interactive group flex h-full flex-col justify-center gap-2 border-dashed p-5 text-center" style="border-color: color-mix(in srgb, var(--color-accent) 40%, transparent);" > - -

The other wing

-

See where curiosity meets the day job.

+ +

+ The other wing +

+

+ See where curiosity meets the day job. +

diff --git a/src/pages/professional/index.astro b/src/pages/professional/index.astro index 76338f6..844d1d4 100644 --- a/src/pages/professional/index.astro +++ b/src/pages/professional/index.astro @@ -55,8 +55,8 @@ const projects = (await getCollection("projects")).sort(
@@ -152,7 +152,7 @@ const projects = (await getCollection("projects")).sort( kicker="04" icon="view-grid" title="Projects" - subtitle="What I've built. Replace the placeholder with 3-6 of your own." + subtitle="What I've built. [TODO: Replace the placeholder with 3-6 of my projects]" />
@@ -164,10 +164,6 @@ const projects = (await getCollection("projects")).sort( )) }
-
{/* ===== 5. Education ===== */}