A modern, responsive Angular web application for the Kansas City St. Andrew Pipes & Drums, serving as the digital home for one of Kansas City's finest and oldest pipe and drum bands. The site provides resources for fans, prospective students, current members, and event organizers.
- π΅ Concert Announcements - Eye-catching dismissible banner for upcoming events with ticket links
- πΈ Photo Gallery - Responsive image galleries with lazy-loading and thumbnail optimization
- πΌ Music Library - Audio samples of performances and competition scores
- π Performance Schedule - Upcoming events and appearances
- πΌ Hire Us - Information for booking the band for events
- π Contact Information - Easy ways to reach band leadership and instructors
- βΉοΈ About Us - Band history, achievements, and member information
- π Secure Authentication - Bcrypt-based password hashing with rate limiting
- π Competition Results - Detailed score sheets and judge recordings
- π Band Documents - Constitution, policies, and member resources
- ποΈ 3D Models - STL files for band cap badge and kilt pin
- πͺ Session Management - 24-hour sessions with automatic logout
- π± Responsive Design - Optimized for mobile, tablet, and desktop
- β‘ Performance Optimized - Lazy loading, WebP images, code splitting
- βΏ Accessible - WCAG compliant with semantic HTML and ARIA labels
- π Security Enhanced - Client-side rate limiting, bcrypt hashing, session management
- π³ Docker Support - Containerized deployment with Nginx
- π SEO Optimized - Meta tags, OpenGraph, Twitter Cards, structured data
- Quick Start
- Installation
- Configuration
- Development
- Security Features
- Building & Deployment
- Project Structure
- Scripts & Utilities
- Testing
- Contributing
- Documentation
- License
# Clone the repository
git clone https://github.com/yourusername/Pipeband.git
cd Pipeband
# Install dependencies
npm install
# Start development server
npm start
# Navigate to http://localhost:4200/- Node.js (v16.x or higher recommended)
- npm (v8.x or higher)
- Angular CLI (v16.x)
npm install -g @angular/cli@16
-
Clone the Repository
git clone https://github.com/yourusername/Pipeband.git cd Pipeband -
Install Dependencies
npm install
-
Configure Environment (See Configuration section)
-
Start Development Server
ng serve # or npm start -
Open Browser Navigate to
http://localhost:4200/
The site includes a protected members-only section. To configure authentication:
Default password: CHANGE_ME
The repository includes pre-configured hash parts for this password. You can start developing immediately.
-
Generate Hash Parts
node scripts/generate-hash-parts.js "YourProductionPassword" -
Update
src/app/auth.service.tsCopy the output from the script and replace lines 15-17:
private readonly p1 = atob('YOUR_GENERATED_PART_1'); private readonly p2 = atob('YOUR_GENERATED_PART_2'); private readonly p3 = atob('YOUR_GENERATED_PART_3');
-
Security Note: Never commit production passwords to version control!
π Detailed Guide: See scripts/README-HASH-GENERATOR.md
src/environments/environment.ts- Production configurationsrc/environments/environment.development.ts- Development configuration
ng serve
# or
npm startNavigate to http://localhost:4200/. The application will automatically reload when you change source files.
| Command | Description |
|---|---|
npm start |
Start development server |
npm run build |
Build for production |
npm run watch |
Build with file watching |
npm test |
Run unit tests |
ng generate component component-name |
Generate new component |
ng generate service service-name |
Generate new service |
Generate new components, services, directives, etc.:
ng generate component component-name
ng generate service service-name
ng generate directive directive-name
ng generate pipe pipe-name
ng generate guard guard-name
ng generate module module-name- β Use TypeScript strict mode (already enabled)
- β Follow Angular style guide
- β Write unit tests for new features
- β Use semantic HTML and ARIA labels
- β Optimize images (WebP format, responsive sizes)
- β Test on multiple devices and browsers
This application implements multiple layers of security for the members-only section:
- Industry-standard bcrypt algorithm with 10 salt rounds
- Hash split into 3 obfuscated parts to make it harder to find in JS bundle
- Automatic salt generation and management
- ~100ms computation time prevents brute-force attacks
- 5 failed login attempts trigger 15-minute lockout
- Lockout persists across page refreshes
- Live countdown timer shows remaining lockout time
- Visual feedback on remaining attempts
- 24-hour automatic session expiration
- Secure token generation with timestamps
- Session validation on every protected route access
- Manual logout functionality
- β Non-sensitive member content
- β Competition scores and band documents
- β Keeping casual visitors out
β Not suitable for:
- Personal information
- Financial data
- HIPAA/GDPR protected content
For true security, consider:
- AWS Lambda@Edge for edge authentication
- AWS Cognito for managed auth
- API Gateway + Lambda for server-side validation
π Detailed Security Guide: See SECURITY-IMPLEMENTATION.md
ng build --configuration production
# or
npm run buildBuild artifacts will be in the dist/pipeband directory.
docker build -t pipeband-image .docker run --name pipeband-container -d -p 8080:80 pipeband-imageNavigate to http://localhost:8080/
This site is designed to run as a static website on AWS:
-
Build the application
npm run build
-
Upload to S3
aws s3 sync dist/pipeband s3://your-bucket-name --delete
-
Invalidate CloudFront cache
aws cloudfront create-invalidation --distribution-id YOUR_DIST_ID --paths "/*"
The included nginx.conf provides:
- Gzip compression
- Browser caching headers
- SPA routing support
- Security headers
Pipeband/
βββ src/
β βββ app/
β β βββ about/ # About Us page
β β βββ contact/ # Contact page
β β βββ hire/ # Hire Us page
β β βββ home/ # Home page (with concert banner)
β β βββ login/ # Login page (enhanced security)
β β βββ members/ # Members-only section (protected)
β β βββ music/ # Music library
β β βββ photos/ # Photo galleries
β β βββ schedule/ # Performance schedule
β β βββ auth.service.ts # Authentication service (bcrypt)
β β βββ auth.guard.ts # Route guard
β β βββ meta.service.ts # SEO meta tags service
β βββ assets/
β β βββ optimized/ # Optimized WebP images
β β βββ photos/ # Photo gallery images
β β βββ score-sheets/ # Competition recordings & PDFs
β β βββ band_logo.webp # Band logo
β βββ environments/ # Environment configurations
β βββ styles.css # Global styles
βββ scripts/
β βββ generate-hash-parts.js # Bcrypt hash generator
β βββ generate_thumbnails.py # Photo thumbnail generator
β βββ README-HASH-GENERATOR.md
βββ Dockerfile # Docker configuration
βββ nginx.conf # Nginx server config
βββ package.json # npm dependencies
βββ angular.json # Angular CLI configuration
βββ SECURITY-IMPLEMENTATION.md # Security documentation
βββ BCRYPT-UPGRADE-GUIDE.md # Bcrypt migration guide
βββ README.md # This file
Generate secure bcrypt hash for member authentication:
# Interactive mode (password hidden)
node scripts/generate-hash-parts.js
# Command-line mode
node scripts/generate-hash-parts.js "YourPassword"π Full Documentation: scripts/README-HASH-GENERATOR.md
Generate optimized thumbnails for photo galleries:
Prerequisites:
pip install PillowUsage:
python scripts/generate_thumbnails.py GALLERY_IDExample:
python scripts/generate_thumbnails.py 2024_Highland_GamesThis creates 400x400 WebP thumbnails in src/assets/photos/GALLERY_ID/thumbs/
Generate manifest JSON files for photo galleries:
# PowerShell
.\scripts\Generate-Manifest.ps1 -GalleryId "2024_Highland_Games"
# Bash
bash scripts/generate_manifest.sh "2024_Highland_Games"ng testExecutes unit tests via Karma
ng test --code-coverageCoverage report will be in coverage/ directory.
ng e2eNote: You need to add an e2e testing package first (e.g., Cypress, Playwright)
Recommended Setup:
ng add @cypress/schematicWe welcome contributions! Please follow these guidelines:
- Fork the repository
- Create a feature branch
git checkout -b feature/amazing-feature
- Make your changes
- Follow Angular style guide
- Write/update tests
- Update documentation
- Test your changes
npm test npm run build - Commit your changes
git commit -m "Add amazing feature" - Push to your fork
git push origin feature/amazing-feature
- Open a Pull Request
- Follow Angular Style Guide
- Use TypeScript strict mode
- Write meaningful commit messages
- Document public APIs with JSDoc
- Add unit tests for new features
- β
Run tests:
npm test - β
Check linting:
ng lint - β
Build successfully:
npm run build - β Update documentation if needed
- README.md (this file) - Project overview and setup
- SECURITY-IMPLEMENTATION.md - Security architecture and implementation
- BCRYPT-UPGRADE-GUIDE.md - Bcrypt migration and technical details
- scripts/README-HASH-GENERATOR.md - Hash generator utility guide
- CODE_OF_CONDUCT.md - Community guidelines
- CONTRIBUTING.md - Contribution guidelines
- LICENSE - Project license
- Email newsletter signup
- Event calendar with iCal export
- Online store for merchandise
- Member directory with profiles
- Practice attendance tracking
- Sheet music library
- Video gallery
- Blog/news section
- Server-side authentication (Lambda@Edge)
- Progressive Web App (PWA) features
- Advanced analytics dashboard
- Multi-language support
- Accessibility improvements (WCAG 2.1 AA)
- Performance monitoring
Solution: Verify the hash parts in auth.service.ts match your password. Regenerate with:
node scripts/generate-hash-parts.js "YourPassword"Solution: Ensure you have both bcrypt and bcryptjs installed:
npm install bcrypt bcryptjs @types/bcryptjsSolution: Add .dockerignore with:
node_modules
dist
.git
*.md
Solution:
- Check if thumbnails exist:
src/assets/photos/GALLERY_ID/thumbs/ - Regenerate thumbnails:
python scripts/generate_thumbnails.py GALLERY_ID - Verify manifest.json exists in gallery folder
- π§ Contact: BusinessManager@kcpipeband.org
- π Report bugs: Open a GitHub issue
- π¬ Discussions: GitHub Discussions tab
Kansas City St. Andrew Pipes & Drums
- Website: kcpipeband.org
- Facebook: @Kansas-City-St-Andrew-Pipes-and-Drums
- Email: BusinessManager@kcpipeband.org
This project is licensed under the terms specified in the LICENSE file.
Copyright Β© 2023-2026 Kansas City St. Andrew Pipes & Drums
All rights reserved.
- Angular Team - For the excellent framework
- Angular Material - For beautiful UI components
- Band Members - For content and feedback
- Contributors - For improvements and bug fixes
- Business Manager: Rory McKee - BusinessManager@kcpipeband.org
- Bagpipe Lessons: Dorothy May - BagpipeLessons@kcpipeband.org
- Drum Lessons: Kyle Womelduff - DrumLessons@kcpipeband.org
- Quartermaster: Rydel Van Dyke - vandyke6059@twc.com
St. Andrew's Episcopal Church
6401 Wornall Terrace
Kansas City, MO 64113
Tuesday nights, 7:00 PM - 9:00 PM
PO Box 648
Shawnee Mission, KS 66201-0648
If you find this project useful, please consider giving it a star on GitHub!
Made with β€οΈ by the Kansas City St. Andrew Pipes & Drums community
π΅ CeΓ²l is CΓ irdeas (Music and Friendship) π΅
