π A modern, high-performance React portfolio showcasing enterprise-grade web development
BootstrapSpark is a production-ready, enterprise-grade developer portfolio built with React 19, TypeScript, and Vite. It demonstrates modern frontend engineering best practices, serverless architecture, and cloud-native deployment patterns. The project serves as both a personal portfolio and a comprehensive reference implementation for scalable, maintainable web applications.
- π¨ Modern UI/UX - Bootstrap 5 + custom SCSS with dark/light theme switching
- β‘ Performance First - Vite + lazy loading + code splitting for optimal UX
- π Type Safety - Full TypeScript implementation with strict mode
- π Multi-Platform - Dual deployment (Azure Static Web Apps + GitHub Pages)
- π Real-time Features - SignalR chat, live weather, dynamic content
- βΏ Accessibility - WCAG compliant with semantic HTML and ARIA
- π± Responsive - Mobile-first design that works on all devices
- π CI/CD Ready - Automated builds and deployments via GitHub Actions
π Before modifying security headers, READ THIS: CSP_README.md
This site uses a frontend-only architecture that pulls all content from external sources (markhazleton.com). The CSP configuration is intentionally permissive and required for the site to function. Tightening the CSP will break:
- Image loading from markhazleton.com
- Service worker functionality
- Development hot reload
- External API integrations
See CSP_README.md and documentation/SECURITY.md for details.
graph TD
A[React Frontend] --> B[Azure Functions API]
A --> C[External APIs]
B --> D[WebSpark Backend]
C --> E[OpenWeather API]
C --> F[RSS Feeds]
A --> G[SignalR Hub]
G --> H[Real-time Chat]
A --> I[Static Assets]
I --> J[Azure CDN]
- π Dark/Light Mode - Persistent theme switching with smooth transitions
- π± Responsive Design - Mobile-first approach with Bootstrap 5 components
- β‘ Fast Loading - Optimized bundle size with lazy-loaded components
- π SEO Optimized - Meta tags, Open Graph, JSON-LD structured data
- βΏ Accessible - WCAG 2.1 AA compliant with keyboard navigation
- π Real-time Chat - SignalR integration with multiple AI personalities
- π€οΈ Weather Widget - Live weather data with interactive maps (Leaflet)
- π° RSS Integration - Dynamic blog post feeds with XML parsing
- π Fun Elements - Random jokes API integration
- π Project Showcase - Searchable, sortable portfolio from markhazleton.com
- πΊοΈ Interactive Maps - Location-based weather visualization
- π TypeScript - Strict type safety and IntelliSense support
- π§ͺ Modern Tooling - ESLint, Prettier, SCSS compilation
- π Documentation - Comprehensive guides in
/documentation - π Hot Reload - Instant development feedback with Vite
π― Frontend Core
- React 19.1 - Latest React with concurrent features
- TypeScript 5.9 - Type safety and modern JavaScript features
- Vite 7.0 - Lightning-fast build tool and development server
- React Router 7.7 - Client-side routing and navigation
π¨ Styling & UI
- Bootstrap 5.3.7 - Responsive component framework
- SCSS/Sass 1.89 - Enhanced CSS with variables and mixins
- React Bootstrap 2.10 - Bootstrap components for React
- Bootstrap Icons 1.13 - Comprehensive icon library
- Bootswatch 5.3 - Bootstrap theme variants
π§ State & Data
- React Context API - Global state management
- Axios 1.11 - HTTP client for API requests
- date-fns 4.1 - Modern date utility library
- xml2js 0.6 - XML parsing for RSS feeds
π APIs & Integration
- SignalR 9.0 - Real-time web communication
- OpenWeather API - Weather data via WebSpark proxy
- JokeAPI - Entertainment content integration
- Leaflet 1.9 - Interactive maps and geolocation
βοΈ Cloud & Deployment
- Azure Static Web Apps - Serverless hosting with CDN
- Azure Functions - Serverless API endpoints
- GitHub Pages - Alternative static hosting
- GitHub Actions - CI/CD automation
π§Ή Development Tools
- ESLint 9.32 - Code linting and quality
- TypeScript ESLint - TypeScript-specific linting
- Concurrently - Run multiple npm scripts
- rimraf - Cross-platform file removal
- ts-node - TypeScript execution for scripts
BootstrapSpark/
βββ π± src/ # Source code
β βββ π§© components/ # React components
β β βββ About.tsx # About section with tech stack
β β βββ Articles.tsx # RSS blog integration
β β βββ Chat.tsx # SignalR real-time chat
β β βββ Header.tsx # Navigation with theme toggle
β β βββ Hero.tsx # Landing page hero section
β β βββ Projects.tsx # Portfolio project showcase
β β βββ WeatherForecast.tsx # Weather widget with maps
β β βββ ... # Additional components
β βββ π¨ scss/ # SCSS styling
β β βββ components/ # Component-specific styles
β β βββ utilities/ # Custom utility classes
β β βββ variables/ # SCSS variables and mixins
β β βββ styles.scss # Main stylesheet entry
β βββ π§ contexts/ # React context providers
β βββ π data/ # Static data files
β βββ οΏ½ services/ # API service layers
β βββ π models/ # TypeScript interfaces
β βββ βοΈ utils/ # Utility functions
βββ βοΈ api/ # Azure Functions
β βββ proxy-rss/ # RSS proxy function
βββ π documentation/ # Project documentation
βββ ποΈ docs/ # Production build output
βββ βοΈ .github/ # GitHub workflows and templates
βββ π Configuration files # Various config files
# Clone the repository
git clone https://github.com/markhazleton/BootstrapSpark.git
cd BootstrapSpark
# Install dependencies
npm install
# Start development server
npm run devπ That's it! Open http://localhost:3000 to see the app.
| Command | Description |
|---|---|
npm run dev |
π Start development server with hot reload |
npm run build |
π¦ Build production bundle |
npm run preview |
π Preview production build locally |
npm run lint |
π Lint codebase with ESLint |
npm run type-check |
β Run TypeScript compiler check |
npm test |
π§ͺ Run unit tests with Vitest |
npm run test:ui |
π¨ Run tests with interactive UI |
npm run test:coverage |
π Run tests with coverage reports |
npm run format |
β¨ Format code with Prettier |
npm run format:check |
π Check code formatting without changes |
npm run clean |
π§Ή Remove build artifacts and cache |
npm run build-css |
π¨ Compile SCSS to CSS |
npm run watch-css |
ποΈ Watch and compile SCSS changes |
npm run generate-seo-files |
π Generate sitemap.xml and robots.txt |
Release documentation and GitHub Releases are intentionally connected.
- Run
/devspark.releaseto generate.documentation/releases/vX.Y.Z/and the associated changelog updates. - Commit the generated release artifacts.
- Push the release commit to
main. - Create and push the matching tag, for example
v2.1.0.
When the tag is pushed, GitHub Actions publishes a GitHub Release whose body comes from .documentation/releases/vX.Y.Z/release-notes.md and uploads a packaged build artifact plus checksum.
This project uses automated code quality gates to ensure consistency:
- Pre-commit Hooks - Husky runs linting and formatting before commits
- Prettier - Automatic code formatting across all file types
- ESLint - TypeScript and React best practices enforcement
- Vitest - Unit testing with 80%+ coverage targets
- TypeScript Strict Mode - Full type safety across the codebase
Commit Workflow:
- Stage your changes with
git add - Commit triggers automatic formatting and linting on staged files
- If any issues are found, the commit is blocked until fixed
- Tests run automatically in CI/CD pipeline
The project is configured for automatic deployment to Azure Static Web Apps:
- Automatic CI/CD - Triggered on push to
mainbranch - Serverless API - Azure Functions for backend services
- Global CDN - Worldwide content delivery
- Custom Domains - SSL certificates included
- Preview Deployments - Automatic PR previews
Configuration Files:
.github/workflows/azure-static-web-apps-*.yml- GitHub Actions workflowstaticwebapp.config.json- Azure SWA routing and settingsapi/- Azure Functions for serverless backend
Alternative deployment to GitHub Pages (requires committing build output):
# Build for GitHub Pages deployment
npm run build
# Note: docs/ is gitignored. To deploy to GitHub Pages,
# you would need to temporarily unignore or use a CI workflow.Setup: Enable GitHub Pages in repository settings, source: /docs folder.
# Run linting
npm run lint
# Type checking
npx tsc --noEmit
# Check for outdated dependencies
npm outdated# Security audit
npm audit
# Fix vulnerabilities
npm audit fix- Semantic HTML - Proper heading hierarchy and landmarks
- ARIA Labels - Screen reader compatibility
- Color Contrast - WCAG 2.1 AA compliant
- Keyboard Navigation - Full keyboard accessibility
We welcome contributions! Please see our Contributing Guide for details.
- 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
- π Complete Documentation - Comprehensive guides
- οΈ Architecture Guide - System design
- π Deployment Guide - Deployment options
- WebSpark - Backend API ecosystem
- PromptSpark - AI prompt engineering
- DataSpark - Data visualization platform
- Lighthouse Score: 95+ across all metrics
- Bundle Size: <500KB gzipped
- First Contentful Paint: <1.5s
- Time to Interactive: <3s
- οΏ½ Issues: GitHub Issues
- π¬ Discussions: GitHub Discussions
- π Bug Reports: Use the bug report template
- β¨ Feature Requests: Use the feature request template
This project is licensed under the MIT License - see the LICENSE file for details.
- React Team - For the amazing framework
- Microsoft Azure - For excellent cloud services
- Bootstrap Team - For the responsive framework
- Vite Team - For the lightning-fast build tool
- Open Source Community - For countless contributions
- Responsive Design: Mobile-first, accessible, and optimized for all device sizes (Bootstrap 5.3)
- Dark/Light Mode: Theme toggle with persistent context-based state
- Dynamic Content: RSS feed integration, real-time weather, jokes, and chat
- TypeScript: Strict type safety and modern React patterns
- SEO Optimized: Meta tags, Open Graph, and JSON-LD structured data
- Serverless Backend: Azure Functions for API/data proxying
- Dual Deployment: GitHub Pages & Azure Static Web Apps (with CI/CD)
- CI/CD: Automated builds and deployments via GitHub Actions
- Accessibility: Semantic HTML, ARIA, and color contrast best practices
- Performance: Lazy loading, code splitting, and optimized assets
- Frontend: React 19.1, TypeScript 5.8, Vite 6.3
- Styling: Bootstrap 5.3.5, SCSS/Sass, React Bootstrap, Bootstrap Icons
- State Management: React Context API
- Routing: React Router v7.5
- APIs: Axios, OpenWeather, JokeAPI, SignalR (real-time chat), XML2JS (RSS)
- Maps: Leaflet & React Leaflet
- Markdown: React Markdown
- Date Handling: date-fns
- Syntax Highlighting: Prism.js
- Serverless: Azure Functions (API)
- CI/CD: GitHub Actions
- Deployment: Azure Static Web Apps, GitHub Pages
BootstrapSpark/
βββ public/ # Static assets
βββ src/
β βββ assets/ # Images, SVGs
β βββ components/ # React components (hooks/, modules/)
β βββ contexts/ # React context providers
β βββ css/ # Compiled CSS
β βββ data/ # Static data (JSON, XML)
β βββ models/ # TypeScript interfaces/types
β βββ scss/ # SCSS source files (components/, utilities/, variables/)
β βββ services/ # API/data services
β βββ App.tsx # Main app
β βββ main.tsx # Entry point
βββ api/ # Azure Functions (serverless API)
βββ docs/ # Production build output
βββ .github/ # Workflows, issue/PR templates
βββ scripts/ # Utility scripts (SEO, robots.txt, etc.)
βββ vite.config.ts # Vite config
βββ tsconfig.json # TypeScript config
βββ staticwebapp.config.json# Azure SWA config
βββ swa-cli.config.json # SWA CLI config
βββ package.json # Dependencies & scripts
- Node.js: v18 or higher
- npm: v9+ recommended
- .env files: Supports environment-specific config via
.env,.env.development,.env.production, etc. Seevite.config.tsfor details. - Required Variables: (example)
VITE_BASE_URL- Base URL for the appOPENWEATHER_API_KEY- (if using direct weather API)- See
vite.config.tsand service files for more
# Clone the repository
git clone https://github.com/markhazleton/BootstrapSpark.git
cd BootstrapSpark
# Install dependencies
npm install| Script | Description |
|---|---|
npm run dev |
Start dev server with HMR and SCSS watcher |
npm run build |
Build production bundle (outputs to docs/) |
npm run preview |
Preview local production build |
npm run lint |
Lint codebase with ESLint |
npm run clean |
Remove build artifacts and cache |
npm run build-css |
Compile SCSS to CSS |
npm run watch-css |
Watch and auto-compile SCSS |
npm run generate-sitemap |
Generate sitemap.xml |
npm run generate-robots |
Generate robots.txt |
npm run generate-seo-files |
Generate all SEO files |
npm run dev
# Open http://localhost:3000- Lint:
npm run lint(uses ESLint, seeeslint.config.js) - Type Checking: TypeScript strict mode enabled
- Formatting: (Recommend using Prettier or VSCode default)
npm run build
npm run preview # (optional, to preview build)- Output is in
docs/(gitignored build artifact β not committed to the repository) - Azure SWA and CI/CD build from source automatically
- Run
npm run buildbeforenpm run previewto generate build output locally
This project uses Dependabot for automated dependency updates and security vulnerability detection.
When Dependabot PRs appear, use these resources for organized remediation:
- DEPENDABOT_QUICKSTART.md - β‘ Start here! Quick 5-minute guide
- DEPENDABOT_REMEDIATION_PLAN.md - π Comprehensive execution plan
- DEPENDABOT_CHECKLIST.md - β Step-by-step checklist
- .documentation/scripts/powershell/manage-dependabot.ps1 - π€ PowerShell automation helper
# See all open Dependabot PRs organized by priority
.\.documentation\scripts\powershell\manage-dependabot.ps1 -Action list
# Run tests before merging
.\.documentation\scripts\powershell\manage-dependabot.ps1 -Action test-all
# Get guided merge workflow
.\.documentation\scripts\powershell\manage-dependabot.ps1 -Action merge-critical# Check for vulnerabilities
npm audit
# View detailed security report
npm audit --json
# Check GitHub Security tab
# https://github.com/markhazleton/BootstrapSpark/securityNote: All scripts and documentation prioritize security fixes and provide clear guidance for safe dependency updates.
- No automated tests included yet.
- Manual Testing: Use the live demo or local preview to verify features.
- Recommended: Add unit/integration tests with Jest, React Testing Library, or Cypress.
- Build:
npm run build(outputs todocs/) - Push: Commit and push
docs/tomainbranch - Enable Pages: In GitHub repo settings, set Pages source to
/docsonmain - Access:
https://<your-username>.github.io/<repository-name>/
-
Config Files:
staticwebapp.config.json,swa-cli.config.json,.github/workflows/azure-static-web-apps-gentle-smoke-063be0b10.yml
-
CI/CD Workflow: Automated publishing is handled by a GitHub Actions workflow:
- Trigger: Runs on push and pull requests to the
mainbranch. - Jobs:
build_and_deploy_job: Builds and deploys the app and API unless the PR is closed.close_pull_request_job: Cleans up deployments when a PR is closed.
Key Steps:
-
Checkout code: Uses
actions/checkout@v3with submodules. -
Setup Node.js: Uses
actions/setup-node@v3(Node 18, npm cache). -
Install dependencies: Runs
npm cifor clean install. -
OIDC Client: Installs
@actions/coreand@actions/http-clientfor authentication. -
Get Id Token: Uses
actions/github-script@v6to retrieve an OIDC token for Azure authentication. -
Build and Deploy: Uses
Azure/static-web-apps-deploy@v1with these settings:azure_static_web_apps_api_token: Secure token from repo secretsaction: "upload"app_location:/(root)api_location:api(serverless API)output_location:docs(Vite build output)app_build_command:npm run buildskip_app_build/skip_api_build: falsegithub_id_token: OIDC token for secure deployment
-
Close PR Deployments: When a PR is closed, the workflow runs a job to clean up preview deployments using the same Azure action.
Reference: See
.github/workflows/azure-static-web-apps-gentle-smoke-063be0b10.ymlfor the full workflow file. - Trigger: Runs on push and pull requests to the
-
Local Dev:
npm install -g @azure/static-web-apps-cli swa start
-
Features:
- Global CDN, SSL, serverless API, staging environments, advanced routing
- Dependencies: Run
npm outdatedandnpm updateregularly - Security: Use
npm auditand keep dependencies patched - Azure Best Practices: Use managed identity, never hardcode secrets, follow Azure security guidance
- Accessibility: Test with screen readers and color contrast tools
- Performance: Audit with Lighthouse, optimize images/assets
- Accessibility: Semantic HTML, ARIA, alt text, keyboard navigation, color contrast
- Security: No secrets in code, uses environment variables, follows Azure best practices
- Performance: Lazy loading, code splitting, optimized assets, CDN delivery
Contributions are welcome!
- Issues: Use GitHub Issues
- Pull Requests: Fork, branch, and submit PRs
- Code Style: Follow existing TypeScript/React patterns and lint rules
- Templates: See
.github/ISSUE_TEMPLATE/for bug/feature templates
- Q: Build fails on Windows?
- A: Ensure Node.js v18+, use PowerShell, and check for locked files in
node_modules.
- A: Ensure Node.js v18+, use PowerShell, and check for locked files in
- Q: Weather/Chat/API not working?
- A: Check environment variables and API keys.
- Q: Styling issues?
- A: Run
npm run build-cssand ensure SCSS compiles without errors.
- A: Run
- Q: How do I update dependencies?
- A:
npm updateand review changelogs for breaking changes.
- A:
- Semantic HTML5, meta tags, Open Graph, JSON-LD, canonical URLs, mobile-friendly, fast loading
- See
index.htmland SEO context for implementation details
- Building My First React Site Using Vite and GitHub
- Adding Weather to My Profile Application
- Using TypeScript with React: Lessons Learned
An evidence-based narrative of this repository's development history, contributor patterns, and architecture: Repo Story (2026-04-06)
This project is licensed under the MIT License - see the LICENSE file for details.
- Issues: GitHub Issues
- Pull Requests: Welcome!
- General Questions: Please use GitHub Issues for all support and contact
Built with β€οΈ by the BootstrapSpark community. Report an issue