A comprehensive marine navigation and routing application designed for recreational and professional mariners. Built with Flutter for optimal cross-platform desktop performance.
NavTool is a modern Electronic Chart Display and Information System (ECDIS) designed to provide mariners with advanced navigation capabilities. The application features a clean, responsive interface that adapts to different screen sizes and platforms.
- Electronic Chart Display and Information System (ECDIS)
- Advanced Route Planning and Optimization
- Weather Routing with GRIB Data Integration
- Real-time GPS Position and Tracking
- Cross-platform Desktop Support (Windows, macOS, Linux)
- Responsive UI for various screen sizes
- Material Design 3 with modern theming
- Custom SVG icon support
- Version display functionality
- ✅ Linux (Primary development platform)
- ✅ Windows (Full desktop support)
- ✅ macOS (Full desktop support)
- ✅ iOS (Mobile support)
- Framework: Flutter 3.8.1+
- Language: Dart
- UI Components: Material Design 3
- Icons: Custom SVG with flutter_svg
- Package Info: package_info_plus for version management
- Chart Data: NOAA ENC S-57 format support
lib/
├── app/ # App configuration and routing
│ ├── app.dart # Main app widget
│ └── routes.dart # Route definitions
├── features/ # Feature-based organization
│ ├── home/ # Home screen and main interface
│ └── about/ # About screen and app information
├── widgets/ # Reusable widgets
│ ├── app_icon.dart # Custom SVG app icon
│ ├── main_menu.dart # Desktop menu bar
│ └── version_text.dart # Dynamic version display
└── main.dart # App entry point
- Flutter SDK 3.8.1 or higher
- Dart SDK
- Platform-specific development tools:
- Linux: CMake, GTK development libraries
- Windows: Visual Studio with C++ support
- macOS: Xcode
-
Clone the repository
git clone https://github.com/frye/navtool.git cd navtool
-
Install dependencies
flutter pub get
-
Run the application
# For development flutter run -d linux # Linux flutter run -d windows # Windows flutter run -d macos # macOS # For release build flutter build linux flutter build windows flutter build macos
- ✨ Launch screen assets and iOS project configuration
- 🎨 Updated app icon with custom SVG design
- 📱 Version display functionality with package_info_plus integration
- 🖥️ Windows runner support for desktop deployment
- 🎨 Desktop-first UI design with VS Code-inspired menu bar
- 📱 Responsive layout supporting both desktop and mobile interfaces
- ⚙️ Material Design 3 implementation with adaptive theming
- 🚀 Phase 3 Download Manager foundations: queue-based downloads, unified manager UI, categorized errors, speed & ETA, automatic retry on network recovery, metrics & diagnostics export. See Download Manager User Guide.
- Chart data loading and display
- GRIB weather data integration
- GPS integration with NMEA support
- Route planning and optimization
- Waypoint management
- Navigation instruments display 8000
This project follows Flutter best practices with:
- Feature-based architecture for scalability
- Responsive design patterns for multi-platform support
- Material Design 3 for modern UI/UX
- Modular widget system for reusability
NavTool implements a comprehensive dual testing strategy to ensure reliability in marine environments:
# Fast development feedback (recommended for development)
./scripts/test.sh unit
# All standard tests (recommended for pre-commit)
./scripts/test.sh validate
# Real network integration tests (manual validation)
./scripts/test.sh integration
# CI/CD appropriate tests
./scripts/test.sh ci
Mock-Based Unit Tests (test/
)
- Fast execution with mocked NOAA API responses
- Comprehensive error scenario testing
- Rate limiting and performance validation
- Runs in CI/CD pipelines
Real Network Integration Tests (integration_test/
)
- Tests against actual NOAA API endpoints
- Validates real data structures and marine connectivity
- Handles slow/intermittent network scenarios
- Requires real device and network connectivity
Coverage
- All 10 previously failing integration tests now pass
- Mock tests provide immediate development feedback
- Integration tests ensure real-world compatibility
See TEST_STRATEGY.md for detailed testing documentation.
# Linux
flutter build linux --release
# Windows
flutter build windows --release
# macOS
flutter build macos --release
The first phase of the chart download reliability overhaul has been completed. Highlights:
- Unified progress model: all progress values now normalized (0.0–1.0) across service + state notifier.
- Atomic file writes: downloads stream into
<filename>.part
then rename after optional checksum validation to avoid partial/corrupt final files. - Pause/Resume improvements: pause captures partial size and persists resume metadata explicitly; resume continues from existing
.part
file. - Notifier integration:
DownloadServiceImpl
pushes progress/status directly intoDownloadQueueNotifier
(auto-creates entries if not pre-queued). - Network suitability gate stub: hook in place for future adaptive deferral (currently always allows start, with logging scaffolding).
- Persistent resume data: saved periodically during transfer and on pause for recovery.
- New tests:
test/download/download_service_phase1_test.dart
validates normalization, atomic rename, and pause persistence.
Upcoming phases will introduce segmented/ranged downloads, adaptive concurrency, richer UI feedback, integrity verification pipelines, and metrics.
NavTool includes NOAA ENC test data for development and testing:
Location: test/fixtures/charts/noaa_enc/
- US5WA50M - Elliott Bay harbor-scale chart (143.9 KB)
- US3WA01M - Puget Sound coastal-scale chart (625.3 KB)
For current official charts visit: https://nauticalcharts.noaa.gov/
See docs/chart_test_data_inventory.md
for complete documentation.
NavTool provides comprehensive S-57 Electronic Navigational Chart parsing capabilities for marine navigation applications.
import 'dart:io';
import 'package:navtool/s57.dart';
Future<void> main() async {
// Load S-57 chart data
final data = await File('US5WA50M.000').readAsBytes();
// Parse chart data (use current API)
final chart = S57Parser.parse(data);
// Display chart summary
print('Features: ${chart.summary()}');
// Find soundings (depth measurements)
final soundings = chart.findFeatures(types: {'SOUNDG'}, limit: 5);
for (final f in soundings) {
print('Sounding depth: ${f.attributes['VALSOU']} m');
}
// Export depth areas and soundings as GeoJSON
final geojson = chart.toGeoJson(types: {'DEPARE', 'SOUNDG'});
print('GeoJSON features: ${geojson['features'].length}');
}
- Complete S-57 Support: Parse base charts (.000) and updates (.001+)
- Spatial Querying: Efficient R-tree indexing for geographic searches
- Marine Objects: Navigation aids, depth areas, soundings, coastlines
- GeoJSON Export: Standard format for web mapping integration
- Warning System: Comprehensive error handling and data validation
- Performance Optimized: Sub-second parsing for typical harbor charts
// Find navigation aids in an area
final lighthouses = chart.findFeatures(
types: {'LIGHTS'},
bounds: S57Bounds(north: 47.61, south: 47.60, east: -122.33, west: -122.34)
);
// Get depth information for route planning
final depthAreas = chart.findFeatures(types: {'DEPARE'});
for (final area in depthAreas) {
final minDepth = area.attributes['DRVAL1'] as double?;
final maxDepth = area.attributes['DRVAL2'] as double?;
print('Depth range: ${minDepth} - ${maxDepth} meters');
}
// Search for named features
final namedFeatures = chart.findFeatures(textQuery: 'harbor');
- S-57 Format Overview - Technical format details
- Troubleshooting Guide - Common issues and solutions
- Implementation Analysis - Current capabilities and roadmap
- Performance Benchmarks - Speed and memory usage
This is a private project focused on marine navigation solutions. For questions or collaboration opportunities, please contact the project maintainer.
This project is not published to pub.dev and is intended for private use.
NavTool - Professional Marine Navigation for the Modern Mariner