Thank you for your interest in contributing to the FAForever Patchnotes project! This document provides guidelines and instructions for contributing.
- Search existing issues to avoid duplicates
- Use a clear, descriptive title
- Provide detailed reproduction steps
- Include browser/device information
- Add screenshots or GIFs if relevant
- Check if the feature has already been requested
- Clearly describe the feature and its benefits
- Explain the use case and why it's valuable
- Consider implementation complexity
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes following our coding standards
- Test thoroughly across different browsers
- Submit a pull request with a clear description
- Fix typos or unclear explanations
- Add missing documentation
- Improve code comments
- Update the README when needed
- Suggest UI/UX improvements
- Report accessibility issues
- Propose design enhancements
- A local web server (e.g., Live Server for VS Code, Python's
http.server, Node'shttp-server) - Modern web browser (Chrome, Firefox, Edge, Safari)
- Text editor or IDE (VS Code recommended)
-
Clone the repository:
git clone https://github.com/FAForever/patchnotes.git cd patchnotes -
Serve the files:
Using Python:
python -m http.server 8000
Using Node.js:
npx http-server -p 8000
Using VS Code Live Server:
- Install the Live Server extension
- Right-click on
index.htmland select "Open with Live Server"
-
Open in browser: Navigate to
http://localhost:8000 -
Enable debug mode: Add
?debug=trueto the URL to see console logs
patchnotes/
├── index.html # Main entry point
├── manifest.json # PWA manifest
├── sw.js # Service worker for offline support
├── assets/
│ ├── data/
│ │ └── patches.json # Patch data (JSON format)
│ └── images/ # All images and icons
├── pages/ # Individual patch HTML files
│ └── [year]/
│ └── [patch].html
├── scripts/ # JavaScript modules
│ ├── logger.js # Logging utility
│ ├── populatePatches.js # Main patch rendering logic
│ ├── search.js # Search functionality
│ ├── coreUI.js # UI management (theme, background)
│ ├── errorBoundary.js # Error handling
│ ├── performance.js # Performance monitoring
│ └── analytics.js # User behavior tracking
└── style/ # CSS files
├── root.css # CSS variables and base styles
├── index.css # Main stylesheet
└── components/ # Component-specific styles
- Use ES6+ features where supported
- Avoid global variables - use modules or IIFE patterns
- Add JSDoc comments to public functions
- Use meaningful variable names
- Keep functions small and focused
- Use the Logger class instead of
console.logfor debug output
Example:
/**
* Filters patches based on search criteria
* @param {string} query - The search query
* @param {Array} patches - Array of patch objects
* @returns {Array} Filtered patches
*/
function filterPatches(query, patches) {
const logger = new Logger('Filter');
logger.debug('Filtering patches', { query, count: patches.length });
// Implementation...
}- Use CSS variables for theming (defined in
root.css) - Follow BEM naming for component classes when appropriate
- Mobile-first approach for responsive design
- Test dark and light themes
- Ensure accessibility (contrast ratios, focus states)
- Use semantic HTML5 elements
- Add ARIA labels for accessibility
- Include alt text for images
- Keep structure consistent across patch pages
Test your changes in:
- ✅ Chrome/Edge (latest)
- ✅ Firefox (latest)
- ✅ Safari (latest)
- ✅ Mobile browsers (iOS Safari, Chrome Android)
- Test offline functionality
- Verify service worker updates
- Check manifest and icons
- Test "Add to Home Screen" on mobile
- Use keyboard navigation (Tab, Enter, Escape)
- Test with screen readers
- Check color contrast ratios
- Verify focus indicators
-
Create the HTML file:
- Copy a recent patch file from
/pages/[year]/ - Update the content following the existing template
- Save as
/pages/[year]/[patch-number].html
- Copy a recent patch file from
-
Update patches.json:
{ "patch": "3830", "link": "pages/2026/3830.html", "date": "February 5, 2026" }Add the entry at the beginning of the
balancearray (newest first) -
Test locally:
- Verify the patch appears in the list
- Check the link works correctly
- Test search and filtering functionality
-
Update relevant documentation
-
Test your changes thoroughly
-
Update the service worker cache version if needed (
sw.js) -
Write a clear PR description:
- What changes were made
- Why the changes are needed
- How to test the changes
- Screenshots/GIFs if UI changes
-
Reference related issues using
#issue-number
feat: Add new search featurefix: Correct mobile display issuedocs: Update contributing guidelinesstyle: Improve button hover statesrefactor: Simplify patch rendering logicperf: Optimize image loading
Use CSS variables defined in root.css:
- Light mode and dark mode support
- Maintain WCAG AA contrast ratios
- Use accent color (
--Accent-Color) sparingly
- Primary font: Open Sans
- Headings: Ubuntu
- Maintain readable font sizes (minimum 16px for body)
- Mobile: < 768px
- Tablet: 768px - 1024px
- Desktop: > 1024px
Add ?debug=true to the URL to enable verbose logging
When testing PWA features:
- Open DevTools → Application → Service Workers
- Click "Unregister"
- Clear site data
- Reload
Patches not loading?
- Check browser console for errors
- Verify
patches.jsonsyntax (use a JSON validator) - Ensure file paths are correct
Styles not updating?
- Clear browser cache
- Check service worker isn't serving old cached version
- Increment cache version in
sw.js
- Discord: Join the FAForever Discord
- GitHub Issues: Ask questions by opening an issue
- Documentation: Check the main README.md
- Be respectful and inclusive
- Provide constructive feedback
- Focus on what is best for the community
- Show empathy towards others
All contributors will be recognized in our contributors list. Thank you for helping improve the FAForever Patchnotes!
Questions? Feel free to open an issue or reach out on Discord!