Contributing to MeshMonitor
July 28, 2026 ยท View on GitHub
Thank you for your interest in contributing to MeshMonitor! This guide will help you get started with development and ensure your contributions meet our quality standards.
๐ Getting Started
System Tests (End-to-End)
We also have a comprehensive system test suite that verifies the full deployment using Docker.
# Run the full system test suite (builds fresh Docker image)
./tests/system-tests.sh
# Run tests against your running dev environment (Fast!)
./tests/dev-test.sh
# Run tests against a specific Meshtastic node
TEST_NODE_IP=192.168.1.50 ./tests/system-tests.sh
Running Tests Locally
Before submitting a PR, ensure all tests pass:
# Run all tests
npm run test:run
# Run tests in watch mode during development
npm run test
# Run tests with coverage report
npm run test:coverage
# Run specific test files
npm run test:run src/services/database.test.ts
# Run tests with UI (great for debugging)
npm run test:ui
Test Categories
-
Unit Tests: Test individual functions and components
- Database operations (
src/services/database.test.ts) - React components (
src/components/*.test.tsx) - API endpoints (
src/server/*.test.ts)
- Database operations (
-
Type Checking: Ensure TypeScript types are correct
npm run typecheck -
Linting: Follow our code style guidelines
npm run lint
Writing Tests
When adding new features, include appropriate tests:
// Example test structure
describe('YourFeature', () => {
it('should handle normal cases', () => {
// Test implementation
});
it('should handle edge cases', () => {
// Test edge cases
});
it('should handle errors gracefully', () => {
// Test error handling
});
});
๐ Pull Request Process
Before Submitting
-
Ensure all tests pass:
npm run test:run npm run typecheck npm run lint -
Update documentation if you've changed APIs or added features
-
Test your changes with a real Meshtastic node if possible
-
Build the project to ensure it compiles:
npm run build npm run build:server
PR Guidelines
- Create a feature branch:
git checkout -b feature/your-feature-name # or git checkout -b fix/issue-description
refactor:Code refactoringtest:Test additions or changeschore:Maintenance tasks
๐ค Automated Checks
Interface icons
- Use the shared
UiIconcomponent and a semantic registry name for app-owned interface icons. Do not hardcode emoji, checkmarks, arrows, stars, or similar Unicode glyphs in components or translated UI copy. - Use
BrandIconfor supported brands. Brand SVG data comes from Simple Icons and must record its source and version; do not substitute a lookalike emoji. - User-authored content and protocol/domain data (for example messages, reactions, waypoint symbols, and script-selected emoji) remain data, not interface icons. Any new source-level exception needs an issue-referenced ESLint disable explaining why it is content rather than UI.
npm run lint:ciblocks new hardcoded UI glyphs. Existing violations are ratcheted while they are migrated toUiIcon.
Our CI/CD pipeline runs automatically on all PRs:
GitHub Actions Workflows
-
CI (
ci.yml)- Runs on every PR, whatever branch it targets
- Lint ratchet, type checking, and the full unit suite on Node 22 / 24 / 25 (against real PostgreSQL and MySQL service containers)
- Frontend, server, documentation, and Docker build validation
- Security scanning
A separate
pr-tests.ymlused to run alongside this one, but every job in it was a strict subset of a job here โ it re-ran the same suite a fourth time on Node 24 and then re-ran parts of it again. Its one unique job, the VitePress documentation build, now lives inci.yml. -
Release Pipeline (
release.yml)- Runs on version tags
- Full test suite
- Multi-platform Docker builds
- Automated release notes
Status Checks
All PRs must pass these checks:
- โ All tests passing
- โ TypeScript compilation successful
- โ Linter warnings resolved (or documented)
- โ Docker build successful
- โ Security scan clean
๐ Project Structure
meshmonitor/
โโโ src/
โ โโโ components/ # React components
โ โโโ server/ # Express backend
โ โโโ services/ # Shared services
โ โโโ test/ # Test utilities
โโโ docs/ # Documentation
โ โโโ architecture/ # System architecture docs
โโโ public/ # Static assets
โโโ .github/ # GitHub Actions workflows
โโโ tests/ # Additional test files
๐ Reporting Issues
When reporting issues, please include:
-
Environment details:
- Node.js version
- Operating system
- Browser (for frontend issues)
- Meshtastic firmware version
-
Steps to reproduce
-
Expected vs actual behavior
-
Error messages and logs
-
Screenshots (if applicable)
๐ก Feature Requests
We welcome feature requests! Please:
- Check existing issues first
- Describe the use case
- Explain the expected behavior
- Consider implementation complexity
๐๏ธ Development Tips
Hot Reloading
Both frontend and backend support hot reloading in development mode.
Database Development
# Reset database during development
rm data/meshmonitor.db
# The database will be recreated on next start
Docker Development
# Build and test Docker image locally
docker build -t meshmonitor:local .
docker run -p 8080:3001 meshmonitor:local
Debugging
- Frontend debugging: Use React Developer Tools
- Backend debugging: Use Node.js inspector
node --inspect dist/server/server.js - Test debugging: Use Vitest UI
npm run test:ui
๐ Code Style
We use ESLint and TypeScript for code quality:
- Use TypeScript for all new code
- Follow existing patterns in the codebase
- Add types for all function parameters and returns
- Use meaningful variable names
- Add comments for complex logic
- Keep functions small and focused
๐ Thank You!
Your contributions make MeshMonitor better for everyone. We appreciate your time and effort in improving this project!
If you have questions, feel free to:
- Open an issue for discussion
- Ask in pull request comments
- Refer to existing code for patterns
Happy coding! ๐