I am a 27-year-old Temple University graduate and a seasoned Senior Full Stack Software Engineer with a wealth of technical prowess. I possess strong analytical skills, a proven track record in orchestrating and leading engineering teams, and extensive hands-on experience in team management.
π Live Website: www.vaporjawn.dev
- Frontend: React 18, TypeScript, Material-UI (MUI)
- Build Tool: Vite
- Styling: CSS3, Material-UI Theme System
- Icons: FontAwesome, Material Icons
- Routing: React Router v6
- CI/CD: GitHub Actions
- Deployment: GitHub Pages
- Testing: Jest
- Code Quality: ESLint, Prettier
- Node.js (v18+ recommended)
- npm or yarn
# Clone the repository
git clone https://github.com/Vaporjawn/Vaporjawn.github.io.git
# Navigate to the project directory
cd Vaporjawn.github.io
# Install dependencies
npm installLaunches Jest test runner.
Run npm run test:watch for interactive watch mode.
Run npm run test:cov for coverage reports.
Runs ESLint to check for code quality and style issues.
Automatically fixes issues where possible.
Runs Prettier to format code consistently.
Deploy your React application to GitHub Pages.
This builds the app and deploys it to the gh-pages branch.
Runs the full quality check pipeline: build, format, lint, and test with coverage.
-
Clone the repository
git clone https://github.com/Vaporjawn/Vaporjawn.github.io.git cd Vaporjawn.github.io -
Install dependencies
npm install
-
Start development server
npm start
-
Run tests
npm test
- Framework: React 18 with TypeScript
- Build Tool: Vite
- UI Libraries: Material-UI (MUI), FontAwesome
- Routing: React Router DOM
- Testing: Jest + React Testing Library
- Linting: ESLint + Prettier
- Deployment: GitHub Pages
Runs the app in development mode with hot reload. Open http://localhost:5173 to view it in your browser.
The page will automatically reload when you make changes. Lint errors will be displayed in the console.
Builds the app for production to the dist folder.
The build is optimized for best performance with minified files and hashed filenames.
Locally preview the production build to test before deployment.
Launches the test runner.
Run npm run test:watch for interactive watch mode.
Run npm run test:cov for coverage reports.
Runs ESLint to check for code quality issues and automatically fixes what it can. The build will fail if there are linting errors.
Fetches GitHub contribution data and updates the portfolio. This updates the contribution visualization data.
Verifies GPG commit signature configuration for secure contributions.
Builds and deploys the application to GitHub Pages. Only maintainers with push access can deploy.
- Node.js 18 or higher
- npm or yarn package manager
- Git with GPG signing configured (recommended)
-
Clone the repository
git clone https://github.com/Vaporjawn/Vaporjawn.github.io.git cd Vaporjawn.github.io -
Install dependencies
npm install
-
Set up environment
# Copy environment template (if exists) cp .env.example .env.local -
Start development server
npm start
-
Run tests
npm test
- Linting: ESLint with TypeScript support
- Formatting: Prettier with automatic formatting
- Testing: Jest + React Testing Library
- Type Safety: Strict TypeScript configuration
Formats all TypeScript, JavaScript, and markdown files using Prettier.
Runs the complete quality check pipeline: build + format + lint + test with coverage.
Deploys the production build to GitHub Pages. The site will be available at the configured custom domain.
src/
βββ components/ # Reusable UI components
β βββ header/ # Navigation header with dark mode toggle
β βββ footer/ # Site footer
β βββ socials/ # Social media links
βββ pages/ # Page components
β βββ home/ # Homepage
β βββ projects/ # Projects showcase with filtering
β βββ resume/ # Resume viewer with download
βββ routes/ # Route definitions
βββ assets/ # Static assets (images, PDFs)
βββ colors.ts # Theme color constants
βββ main.tsx # Application entry point
- π Dark/Light Mode: Seamless theme switching with system preference detection
- π± Responsive Design: Mobile-first approach with Material-UI breakpoints
- β‘ Fast Loading: Optimized with Vite's fast HMR and build system
- π§ͺ Type Safety: Full TypeScript implementation
- π SEO Optimized: Proper meta tags and semantic HTML
- βΏ Accessibility: WCAG compliant components and keyboard navigation
- π CI/CD Pipeline: Automated testing, linting, and deployment
- π GitHub Contributions Heatmap: Daily automated JSON materialization via GitHub Action (secure, no client secrets) with progressive fallback chain
- π¦ Automated NPM Packages Listing: Live, zeroβmaintenance list of published npm packages (maintainer feed + selective download enrichment, cached with intelligent revalidation)
Create a .env file in the root directory:
VITE_APP_TITLE=Victor Williams
VITE_APP_DESCRIPTION=Senior Full Stack Software EngineerThe contributions calendar is generated offline by a scheduled workflow that writes public/data/contributions.json.
- Create a fineβgrained (or classic) PAT with minimal scopes (
read:useris sufficient for public contribution data). - Add it as a repository secret named
CONTRIB_GRAPHQL_TOKEN(Settings β Secrets and variables β Actions β New repository secret). - Manually run the workflow: Actions β "Update Contributions Calendar" β Run workflow.
- After success, a commit like
chore(contrib): update contributions.json [skip ci]appears. - Hard refresh the site; the heatmap renders from JSON. Until first run a placeholder + guidance panel is shown.
Fallback order inside the UI component:
JSON heatmap β external SVG (ghchart.rshah.org) β local static PNG (/contributions-dark.png or /contributions-light.png) β error message
Detailed documentation: docs/contributions.md
The Projects page includes a dynamic, zeroβmaintenance NPM Packages section that automatically lists all public packages published under the vaporjawn npm maintainer account.
GET https://registry.npmjs.org/-/v1/search?text=maintainer:vaporjawn&size=250(primary package metadata)GET https://api.npmjs.org/downloads/point/last-week/:pkg(enrichment β only for the first 10 packages to limit request fanβout)
- Clientβside
localStoragerecord:{ timestamp, packages[] } - TTL: 12 hours (43200000 ms)
- Fresh Read: If cache exists and TTL valid β synchronous render from cache (fast paint)
- Stale-While-Revalidate: If stale β return cached data immediately (if any) while background fetch refreshes silently
- Manual Refresh: βRefresh NPM packagesβ button bypasses cache & forces network (always updates timestamp)
- Error Resilience: On network failure with stale cache β continue showing last known data; with no cache β user sees error state
To avoid unnecessary API traffic, weekly download counts are only fetched for the first 10 packages (sorted by recency). Additional packages still display name, version, description, and keywords.
- Primary:
date(published / modified recency as provided by search index) - Secondary (tie break): package name (alphabetical)
- Expand / collapse control with accurate
aria-expanded+ descriptive label ("Hide NPM packages list" / "Show NPM packages list") - Live status region (
aria-live="polite") announces: loading β error β empty β count summary (e.g. βShowing 7 packagesβ) - Keyboard focus order preserved; no focus traps introduced
- Semantic grouping under heading
h2for screen reader navigation
- Bounded enrichment (max 10 download requests)
- No enrichment until base list resolves (prevents waterfall during initial paint)
- Local cache eliminates repeated maintainer search within TTL window
- Background revalidation keeps UI responsive while data updates
Returns:
{
packages: Array<{
name: string;
version: string;
description: string;
keywords: string[];
npmUrl: string;
weeklyDownloads?: number; // only for enriched subset
}>;
loading: boolean; // true only during first (nonβcached) or forced fetch
error: string | null; // network / parse issues when no viable cached data
refresh: () => void; // bypass cache, force new network round
}- Hook tests validate: initial fetch, fresh vs stale cache, forced refresh, enrichment cap (β€10), error handling fallbacks
- Component tests validate: loading, empty, error, populated list, refresh invocation, aria-live state transitions
- Idle-time enrichment for remaining packages
- Server pre-render (SSR / static re-hydration) with buildβtime snapshot
- Pagination / virtualized list for very large maintainer portfolios
- Offline-first with
navigator.onLineawareness
No additional configuration is requiredβfeature activates automatically on build & deploy.
The site is configured to deploy to www.vaporjawn.dev via the CNAME file.
The project uses Jest for unit testing. Test files are located alongside components with .test.tsx extension.
# Run tests once
npm test
# Run tests in watch mode
npm run test:watch
# Generate coverage report
npm run test:covThe site automatically deploys to GitHub Pages on every push to the main branch using GitHub Actions.
Manual deployment:
npm run deploy- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
All new commits to main and contributions via Pull Request are expected to be cryptographically signed (SSH signing preferred; GPG supported). Unsigned commits will surface without the green "Verified" badge in GitHub.
Quick check (most recent commit):
npm run verify-signFull setup and troubleshooting guide: see COMMIT_SIGNING.md.
Tip: Enable "Require signed commits" in repo branch protection once all local environments are configured.
This project is open source and available under the MIT License.
- Website: www.vaporjawn.dev
- Email: [email protected]
- LinkedIn: victorwilliams719
- GitHub: @Vaporjawn
- Devpost: Vaporjawn
- Twitter: @vaporjawn