Skip to content

feat: site overhaul — hero rewrite, projects promotion, structural cleanup#123

Merged
jbdevprimary merged 1 commit into
mainfrom
feat/site-overhaul
Apr 15, 2026
Merged

feat: site overhaul — hero rewrite, projects promotion, structural cleanup#123
jbdevprimary merged 1 commit into
mainfrom
feat/site-overhaul

Conversation

@jbdevprimary
Copy link
Copy Markdown
Contributor

@jbdevprimary jbdevprimary commented Apr 15, 2026

Summary

Above-the-fold rewrite + structural cleanup + SEO hardening in one shot.

Hero

  • Status pill ("Available · Independent OSS"), stats strip (15+ Years, $100K+/mo, 5 PyPI, 5 OSS), positioning tagline, collapsed CTA hierarchy.
  • Self-hosted fonts (no Google Fonts render-blocking).

Content

  • radioactive-ralph and paranoid-passwd promoted to first-class `projects[]`.
  • Per-job `tech[]` chips; AWS/GCP/Azure highlighted in amber.
  • Explicit reader-value tab order: About → Projects → Work → Skills → Earlier Career → Education.

Structure

  • `App.tsx` decomposed from 397 → 90 LOC under `src/components/sections/`.
  • Collapsing sticky header absorbs mini-hero on scroll.
  • Cross-linked `/` ↔ `/resume/`; resume page has back-nav + Featured Projects + anchor ids.
  • Footer shows version + build date.

SEO

  • Canonical URLs, og:image (1200x630), Twitter card, JSON-LD Person, sitemap.

Build

  • `scripts/generate-og-image.ts` and `scripts/generate-resume-pdf-only.ts`.
  • release.yml regenerates og + resume artifacts on every deploy.

Test plan

  • Local build clean, typecheck clean, lint clean
  • Desktop + mobile screenshots reviewed
  • Tab navigation verified (Projects tab shows 5 cards including radioactive-ralph + paranoid-passwd)
  • Resume page has back-nav + tech chips + projects section
  • Lighthouse 100/100/100 on deployed site
  • og:image appears correctly on LinkedIn/Slack share preview

🤖 Generated with Claude Code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added social media sharing preview image for better content distribution
    • Introduced navigational tabs for organized section browsing
    • Enhanced hero section with status indicator and statistics display
    • Added HTML resume viewer alongside PDF/DOCX downloads
    • Improved SEO with sitemaps, Open Graph tags, Twitter cards, and structured data
  • Updates

    • Domain changed to jonbogaty.com
    • Version and build date now visible in footer
    • Refined typography and visual styling
    • Enhanced project showcase with technology badges

…eanup

Hero & content (above-the-fold rewrite):
- Status pill ("Available · Independent OSS") with pulse
- Stats strip: 15+ Years, $100K+/mo Cloud saved, 5 PyPI packages, 5 OSS frameworks
- Tagline: "Founding-DevOps operator who ships OSS frameworks. Python + Go, multi-cloud, 15+ years."
- CTA hierarchy: Download Resume (primary), View Resume (secondary), icon-only socials
- Self-hosted fonts via @fontsource (removed render-blocking Google Fonts link)

Content & structure:
- radioactive-ralph and paranoid-passwd promoted to first-class projects[] (5 total)
- Explicit tab order: About → Projects → Work → Skills → Earlier Career → Education
- Per-job tech[] chips in resume.json; cloud providers (AWS/GCP/Azure) highlighted
- App.tsx decomposed 397 → 90 LOC; new src/components/sections/ directory

UX:
- Collapsing sticky header: absorbs mini-hero (name + Resume) once user scrolls past hero
- Horizontal scroll fade-mask for tab overflow
- Resume page: back-to-site nav bar, tagline, Featured Projects section, tech chips, anchor ids per job
- Cross-links /  <-> /resume/; HTML resume option in footer
- Version + build-date displayed in footer (v1.3.0 · updated YYYY-MM-DD)

SEO & metadata:
- Canonical URLs; og:image (1200x630 with name/tagline/status); twitter:card; JSON-LD Person
- @astrojs/sitemap integration; site URL corrected to https://www.jonbogaty.com
- Layout.astro rewritten with full metadata surface

Design system:
- Brand tokens in index.css: --brand-amber, --brand-steel, --brand-success, --brand-on-light
- prefers-reduced-motion kills gradient animation + Framer Motion durations
- Hero name gradient extracted to .hero-name CSS utility class

Build:
- release.yml regenerates og-image + resume PDF/DOCX on every deploy
- scripts/generate-og-image.ts (Playwright-rendered) and scripts/generate-resume-pdf-only.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 15, 2026 19:58
@jbdevprimary jbdevprimary merged commit e32fd3a into main Apr 15, 2026
10 of 11 checks passed
@jbdevprimary jbdevprimary deleted the feat/site-overhaul branch April 15, 2026 19:58
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 15, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 0e8cf253-f721-4067-b4cf-a86c95a60a0c

📥 Commits

Reviewing files that changed from the base of the PR and between 2aeec52 and a40bba6.

⛔ Files ignored due to path filters (4)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • public/Jon_Bogaty_Resume.docx is excluded by !**/*.docx
  • public/Jon_Bogaty_Resume.pdf is excluded by !**/*.pdf
  • public/og-image.png is excluded by !**/*.png
📒 Files selected for processing (20)
  • .github/workflows/release.yml
  • astro.config.mjs
  • package.json
  • scripts/generate-og-image.ts
  • scripts/generate-resume-pdf-only.ts
  • src/App.tsx
  • src/components/HeroSection.tsx
  • src/components/SectionTabs.tsx
  • src/components/SiteFooter.tsx
  • src/components/sections/AboutSection.tsx
  • src/components/sections/EarlierCareer.tsx
  • src/components/sections/EducationList.tsx
  • src/components/sections/JobList.tsx
  • src/components/sections/ProjectGrid.tsx
  • src/components/sections/SkillGrid.tsx
  • src/content/resume.json
  • src/env.d.ts
  • src/index.css
  • src/layouts/Layout.astro
  • src/pages/resume.astro

📝 Walkthrough

Walkthrough

This PR refactors the architecture to migrate from dynamic section rendering to explicit component imports, introduces Playwright-based artifact generation (OG image and resume PDF in CI), integrates sitemap plugin, updates configuration to custom domain, enhances HeroSection with status/stats, and enriches resume content with tech stacks and new projects.

Changes

Cohort / File(s) Summary
CI/Workflow Artifacts
.github/workflows/release.yml
Added Playwright browser installation and OG image generation step, introduced dedicated resume PDF generation script, expanded artifact verification to check PDF, DOCX, and OG image outputs.
Project Configuration
astro.config.mjs, package.json
Enabled @astrojs/sitemap integration, updated site URL to custom domain, added Playwright and font source dependencies, introduced build-time version/date constants via Vite, added generate:og script.
Generation Scripts
scripts/generate-og-image.ts, scripts/generate-resume-pdf-only.ts
Two new Playwright-based utilities: OG image generation (1200×630 PNG from HTML template) and dedicated resume PDF generation from existing HTML output with Letter-sized formatting and margins.
Component Architecture Refactoring
src/App.tsx
Replaced dynamic SectionRenderer and inline sub-components with imported dedicated section components; removed dynamic tab generation, introduced explicit TABS ordering, added heroSentinelRef for scroll detection; net reduction of 307 lines.
Hero & Section Components
src/components/HeroSection.tsx, src/components/SectionTabs.tsx, src/components/sections/* (AboutSection, EarlierCareer, EducationList, JobList, ProjectGrid, SkillGrid)
Updated HeroSection props from summary to tagline plus optional status and stats; redesigned buttons and added status/stat UI. Introduced new SectionTabs component with intersection-observer-based sticky header and collapse behavior. Added six new section-specific components replacing previous in-file renderers.
Supporting Components & Layout
src/components/SiteFooter.tsx, src/layouts/Layout.astro, src/pages/resume.astro
SiteFooter now displays app version and build date, includes HTML resume viewer link. Layout extends with canonical links, OG/Twitter metadata, JSON-LD structured data, webfont imports, and revised title/description logic. Resume page adds sticky navigation, displays featured projects (top 5), includes tech chips per job, and hides navigation in print.
Styling & Environment
src/index.css, src/env.d.ts
Added brand color variables (--brand-amber, --brand-steel, etc.), introduced .hero-name gradient text animation, .pulse-dot keyframe animation, .scroll-fade-x horizontal fade mask, and reduced-motion accessibility override. Declared global __APP_VERSION__ and __BUILD_DATE__ type constants.
Content & Metadata
src/content/resume.json
Added tagline, status badge (with optional pulse), and stats array to about section. Injected tech arrays into multiple work entries. Promoted two projects (radioactive-ralph, paranoid-passwd) from internal highlights to full project objects with descriptions, URLs, tech stacks, and package breakdowns.

Sequence Diagram(s)

OG Image and Resume PDF Generation Flow

sequenceDiagram
    participant CI as CI Workflow
    participant Gen as Generate Script
    participant PW as Playwright
    participant Chrome as Chromium
    participant Page as Page
    participant FS as File System

    CI->>Gen: Invoke generate-og-image.ts
    Gen->>Gen: Load resume.json
    Gen->>Gen: Build HTML template
    Gen->>PW: Launch browser
    PW->>Chrome: Start headless browser
    Chrome-->>PW: Browser instance
    Gen->>Page: Create new page
    PW->>Page: Set viewport (1200×630)
    Gen->>Page: Load HTML via setContent
    Page->>Page: Render & wait networkidle (20s)
    Gen->>Page: Take PNG screenshot
    Page-->>Gen: Screenshot buffer
    Gen->>FS: Write to public/og-image.png
    FS-->>Gen: File written
    Gen->>Chrome: Close browser
    Chrome-->>Gen: Browser closed
    Gen-->>CI: Log file size
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 Hop, hop—new sections bloom with care!
Tech chips gleaming, gradients in the air,
Playwright clicks to birth og-images bright,
The resume now shines with stats in flight!
🌟 Architecture grows, refactored with delight.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/site-overhaul

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@amazon-q-developer amazon-q-developer Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary

Note: This PR (#123) is already merged and closed. This review is performed post-merge based on available PR metadata.

PR Overview

This is a major site overhaul with 1,565 additions and 464 deletions across 24 files, including hero rewrite, SEO improvements, structural refactoring, and build automation.

Key Observations

Unable to Complete Full Review: The PR's source branch is no longer accessible, preventing detailed line-by-line code analysis of:

  • New build scripts (generate-og-image.ts, generate-resume-pdf-only.ts)
  • GitHub Actions workflow changes
  • Component refactoring and new implementations
  • Configuration changes

From PR Description - Incomplete Testing:
Two critical test items remain unchecked:

  • Lighthouse 100/100/100 verification on deployed site
  • og:image preview testing on LinkedIn/Slack

Recommendations

  1. Complete pending tests on the deployed site to verify SEO and performance improvements
  2. Monitor production for any issues from this large changeset
  3. For future PRs: Break large refactors (24 files) into smaller, focused PRs for proper security and functionality review

Since the code is already merged, ensure post-deployment verification is completed and monitor for any production issues.


You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the resume application by modularizing sections into individual components, enhancing the hero section with status and statistics, and adding automated scripts for generating Open Graph images and PDF resumes. It also improves SEO with JSON-LD and meta tags, and updates the resume content with detailed technical stacks for work experience and projects. Feedback suggests self-hosting fonts within the OG image generation script to eliminate external network dependencies and ensure build consistency.

Comment on lines +18 to +19
@font-face { font-family: 'Instrument Serif'; src: url(https://fonts.gstatic.com/s/instrumentserif/v5/jizEREVNn4nADZqV5yRuqaKbiaLD.woff2) format('woff2'); font-weight: 400; }
@font-face { font-family: 'JetBrains Mono'; src: url(https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO1l.woff2) format('woff2'); font-weight: 500; }
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

To improve build reliability and align with the site's self-hosting font strategy, consider loading the fonts from the local @fontsource packages instead of fetching them from Google Fonts. This removes an external network dependency from your build process and ensures consistency.

You can achieve this by reading the font files, converting them to base64 data URIs, and embedding them in the CSS.

Here's an example of how you could modify the script:

import { createRequire } from 'node:module';
import { readFileSync, writeFileSync } from 'node:fs';
// ... other imports

const require = createRequire(import.meta.url);

// Helper to read font file and create a base64 data URI
function getFontDataUri(path: string): string {
  const fontPath = require.resolve(path);
  const fontFile = readFileSync(fontPath);
  return `data:font/woff2;base64,${fontFile.toString('base64')}`;
}

const instrumentSerif = getFontDataUri(
  '@fontsource/instrument-serif/files/instrument-serif-latin-400-normal.woff2'
);
const jetbrainsMono = getFontDataUri(
  '@fontsource/jetbrains-mono/files/jetbrains-mono-latin-500-normal.woff2'
);

// ...

const html = `<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<style>
  @font-face { font-family: 'Instrument Serif'; src: url(${instrumentSerif}) format('woff2'); font-weight: 400; }
  @font-face { font-family: 'JetBrains Mono'; src: url(${jetbrainsMono}) format('woff2'); font-weight: 500; }
  /* ... rest of the styles */
</style>
</head>
...
`;
// ...

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR overhauls the portfolio site’s above-the-fold experience and content structure, hardens SEO metadata, and updates the build/release pipeline to regenerate share + resume artifacts on deploy.

Changes:

  • Decomposes the main app into section components with an explicit tab order and a collapsing sticky header.
  • Expands resume/project data (tagline/status/stats, promoted projects, per-job tech chips) and updates the resume page layout.
  • Adds SEO primitives (canonical, OG/Twitter tags, JSON-LD Person, sitemap) plus Playwright-based OG image and resume PDF generation in CI.

Reviewed changes

Copilot reviewed 19 out of 24 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/pages/resume.astro Adds featured projects section, back-nav/downloads, anchor ids, and per-job tech chips for the resume page.
src/layouts/Layout.astro Introduces self-hosted font imports and adds canonical/OG/Twitter/JSON-LD metadata.
src/index.css Adds brand CSS variables and new utility/animation styles (scroll fade mask, hero gradient, pulse, reduced-motion handling).
src/env.d.ts Declares global build-time constants for version/build date.
src/content/resume.json Extends resume content with hero metadata, promoted projects, and per-job tech arrays.
src/components/sections/SkillGrid.tsx New skills grid layout with “headline” categories emphasized.
src/components/sections/ProjectGrid.tsx New projects grid with deterministic accent color and package/tech rendering.
src/components/sections/JobList.tsx New work experience UI with selectable job list and tech-chip highlighting for cloud platforms.
src/components/sections/EducationList.tsx New education section renderer.
src/components/sections/EarlierCareer.tsx New earlier-career summary renderer.
src/components/sections/AboutSection.tsx New about section renderer with contact + profile links.
src/components/SiteFooter.tsx Adds HTML resume link and displays injected version/build-date metadata.
src/components/SectionTabs.tsx New sticky tabs header that collapses based on hero scroll sentinel.
src/components/HeroSection.tsx Reworks hero to use tagline/status/stats and updates CTA hierarchy + social icon buttons.
src/App.tsx Replaces monolithic renderer with explicit tab ordering and section components.
scripts/generate-resume-pdf-only.ts New script to generate the PDF from prebuilt HTML using Playwright.
scripts/generate-og-image.ts New Playwright-based OG image generator (1200×630) written to public/.
public/Jon_Bogaty_Resume.docx Updates the committed DOCX resume artifact.
pnpm-lock.yaml Adds lockfile entries for sitemap, fontsource, and astro check tooling.
package.json Adds sitemap/fontsource deps, astro check dev dependency, OG generation script, and updates homepage URL.
astro.config.mjs Sets site to the custom domain, enables sitemap, and injects build metadata via Vite define.
.github/workflows/release.yml Installs Playwright browser in CI and regenerates OG image + resume PDF artifacts during deploy.
Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

Comment thread src/pages/resume.astro
Comment on lines 2 to 6
/**
* Print-optimized resume page.
* Rendered as static HTML by Astro — zero JavaScript.
* Pandoc converts this to PDF and DOCX during the build.
*/
Comment thread src/pages/resume.astro
body { padding: 0; }
@page { margin: 0.5in; size: letter; }
.sitenav { display: none; }
.tech-chips { display: none; }
.catch(() => {
// Shader load failed — CSS fallback stays
})
.catch(() => {})
Comment on lines +7 to +19
import { chromium } from 'playwright'
import resume from '../src/content/resume.json' with { type: 'json' }

const root = resolve(import.meta.dirname!, '..')
const out = resolve(root, 'public/og-image.png')

const html = `<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<style>
@font-face { font-family: 'Instrument Serif'; src: url(https://fonts.gstatic.com/s/instrumentserif/v5/jizEREVNn4nADZqV5yRuqaKbiaLD.woff2) format('woff2'); font-weight: 400; }
@font-face { font-family: 'JetBrains Mono'; src: url(https://fonts.gstatic.com/s/jetbrainsmono/v24/tDba2o-flEEny0FZhsfKu5WU4xD-IQ-PuZJJXxfpAO1l.woff2) format('woff2'); font-weight: 500; }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants