A modern, minimalist website for the San Francisco Bay Area funk & soul band Sinister Dexter with automated image processing.
- Responsive Design - Mobile-first approach, works on all devices
- Automated Image Processing - Drop images in
photos/, they're automatically resized and optimized - Dynamic Content - Shows and gallery loaded from JSON/processed images
- Hero Section - Eye-catching landing with band tagline
- Shows Section - Upcoming performances loaded from
shows.json - Music Streaming - Embedded Spotify and Apple Music players
- Photo Gallery - Lightbox-enabled gallery with multiple image sizes
- Social Links - Instagram, X, Facebook, YouTube (coming soon)
- Mailing List - Email signup form (ready for integration)
- Merch Section - Placeholder for future merchandise store
- HTML5
- Tailwind CSS (via CDN)
- Vanilla JavaScript
- Node.js for image processing (Sharp)
- Font Awesome icons
- Google Fonts (Bebas Neue & Inter)
/sindex
βββ docs/ # Documentation
β βββ CLAUDE.md # AI assistant context
β βββ DEPLOYMENT.md # Deployment guide
β βββ SETUP.md # Setup instructions
β βββ ... # Other documentation
β
βββ scripts/ # Build and utility scripts
β βββ build.js # Main build script
β βββ process-images.js # Image processing
β βββ test-site.js # Testing suite
β βββ ... # Other scripts
β
βββ template/ # Source templates and data
β βββ data/ # JSON data files
β β βββ members.json # Band members
β β βββ shows.json # Show listings
β β βββ tracks.json # Music tracks
β β βββ videos.json # YouTube videos
β βββ partials/ # Handlebars templates
β β βββ components/ # Reusable components
β β βββ sections/ # Page sections
β β βββ head/ # HTML head elements
β βββ styles.css # Source Tailwind CSS
β
βββ public/ # Generated output (DO NOT EDIT)
β βββ index.html # Generated website
β βββ index.php # PHP version
β βββ styles.css # Compiled CSS
β βββ images/ # Processed images
β βββ thumbnail/ # 400x400
β βββ small/ # 640x480
β βββ medium/ # 1024x768
β βββ large/ # 1920x1080
β βββ manifest.json # Image registry
β
βββ photos/ # Source photos for processing
βββ package.json # NPM configuration
βββ tailwind.config.js # Tailwind configuration
βββ README.md # This file
-
Create a new branch from
main:git checkout main git pull origin main git checkout -b feature/your-feature-name
-
Make your changes on the feature branch
-
Test your changes locally:
npm run build:test # Build and run tests npm run dev # Preview locally
-
Commit and push your branch:
git add . git commit -m "Descriptive commit message" git push origin feature/your-feature-name
-
Create a Pull Request on GitHub:
- Go to the repository on GitHub
- Click "Compare & pull request"
- Provide a clear description of your changes
- Wait for review and approval
- All tests must pass
- Clear, descriptive commit messages
- Updated documentation if needed
- No direct commits to
mainbranch
When your PR is merged to main, the site will automatically:
- Run all tests
- Build the production site
- Deploy to the live server
# Install dependencies
npm install
# Build and serve the static site
npm run dev
# Or step by step:
npm run build:images # Convert HEIC and process all images
npm run build:html # Generate static HTML with all data inlined
npm run serve # Start local server
# The site is now fully static - just open public/index.html in any browser!npm run build:html- Generate static HTML from templates and data files (creates both index.html and index.php)npm run build:css- Build and minify Tailwind CSSnpm run build:images- Convert HEIC files and process all imagesnpm run build- Run full build pipeline (images, CSS, HTML, optimization, accessibility, sitemap)
npm run process-images- Process images with smart caching (only new/changed files)npm run process-images:force- Force reprocess all imagesnpm run watch-images- Auto-process images on file changesnpm run convert-heic- Convert HEIC files to JPG (macOS only)node process-favicon.js- Generate all favicon sizes from favicon-source.pngnode process-member-photos.js- Process band member photos specifically
npm run sitemap- Generate sitemap.xml and sitemap.txt
npm run test- Run comprehensive site testing (HTML, SEO, accessibility, performance)npm run test:quick- Run quick regex-based testsnpm run build:test- Build and test the site
npm run serve- Start local Python HTTP server on port 8000npm run dev- Build everything and start local servernpm run preview- Preview with Wrangler (Cloudflare)npm run worker:dev- Run Cloudflare Worker locally
./deploy.sh staging- Deploy to Cloudflare Pages staging./deploy.sh prod- Deploy to Cloudflare Pages production./deploy.sh ftp- Deploy to FTP server (uses .env credentials)npm run deploy- Deploy with Wranglernpm run deploy:staging- Deploy to staging with Wrangler
npm run clean- Remove processed images and cache./convert-heic.sh- Shell script for HEIC conversion
All tools are now in the scripts/ directory:
scripts/build.js- Main static site generatorscripts/process-images.js- Image processing pipelinescripts/process-favicon.js- Favicon generatorscripts/process-members.js- Band member photo processorscripts/generate-sitemap.js- Sitemap generator
Set up a cron job to automatically rebuild the site weekly:
# Edit crontab
crontab -e
# Add this line (runs every Monday at 2 AM):
0 2 * * 1 /path/to/sindex/update-site.sh --deployOr run manually:
./update-site.sh # Just rebuild locally
./update-site.sh --deploy # Rebuild and deploy to CloudflareEdit template/data/shows.json to add or modify upcoming shows:
{
"date": "2024-03-15",
"dayOfWeek": "FRI",
"venue": "The Independent",
"city": "San Francisco, CA",
"time": "9:00 PM",
"ticketUrl": "https://www.theindependentsf.com",
"featured": true
}Simply drop new images into the photos/ directory and run:
npm run process-images # Process only new/changed images
npm run process-images:force # Force reprocess all images
npm run watch-images # Auto-process on file changesImages are automatically:
- Smart cached - Only new/changed files are processed
- Converted from HEIC to JPG (on macOS using
convert-heic.sh) - Resized to multiple sizes (thumbnail, small, medium, large, original)
- Optimized in both WebP and JPG formats
- Added to the gallery automatically
Note on HEIC files: If you see HEIC errors, run ./convert-heic.sh first to convert them to JPG.
Update URLs in the Connect section as new profiles are created.
- Create YouTube channel for the band
- Add real band photos to gallery
- Integrate mailing list with service (Mailchimp/ConvertKit)
- Connect shows.json to dynamically load shows
- Add Google Analytics or similar
- Set up custom domain
- Design and add merchandise when available
The project includes comprehensive testing tools to validate HTML, accessibility, SEO, and performance before deployment.
npm run testThis runs the advanced testing suite that checks:
- HTML Validation: DOCTYPE, meta tags, canonical URLs, structured data
- Accessibility: ARIA labels, landmarks, alt text, keyboard navigation
- SEO: Robots meta, sitemap, heading structure, HTTPS resources
- Performance: File size, minification, resource hints, modern formats
- Security: Unique IDs, valid links, security practices
The test suite provides:
- β Detailed pass/fail for each check
- π Category scores (percentage passed)
- π Overall site quality score
- π‘ Recommendations for improvements
For even more comprehensive testing, install these optional tools:
# W3C HTML Validator
npm install -g html-validator-cli
html-validator public/index.html
# Accessibility Testing
npm install -g pa11y
pa11y public/index.html
# Google Lighthouse
npm install -g @lhci/cli
lhci autorunThe site supports multiple deployment methods:
The site automatically deploys to FTP when pull requests are merged to the main branch.
Go to your repository Settings β Secrets and variables β Actions, and add:
FTP_HOST=server298.com
FTP_USER=your_ftp_username
FTP_PASSWORD=your_ftp_password
FTP_REMOTE_DIR=www/www-2025
When a PR is merged, the workflow will:
- Build and test the site
- Deploy to FTP
- Comment on the PR with deployment status
# Deploy to staging
./deploy.sh staging
# Deploy to production
./deploy.sh prod# Deploy to FTP (uses .env file)
./deploy.sh ftpYour site will be live at: https://sinisterdexter.net
See DEPLOYMENT.md for detailed instructions including:
- GitHub auto-deployment setup
- Custom domain configuration
- Content updates workflow
- Rollback procedures
- Purple (
#9333ea) - Primary brand color - Amber (
#f59e0b) - Accent color - Black & grays - Background and text
- Gradient combinations for visual interest
For bookings and inquiries: booking@sinisterdexter.net
- Instagram: @sindex_band
- X/Twitter: @sindexband
- Facebook: SinDex.Band
- Apple Music: Artist Page
- Spotify: Artist Page