The Fuel Boat Directory represents a comprehensive transformation of a traditional static HTML website into a modern, interactive web application. The original site served as a vital resource for the UK waterways community, providing information about canal boat fuel services across the network. However, its static nature and outdated infrastructure created significant limitations for both users and administrators.
The original Lock 13 website was built using traditional HTML with inline styles and table-based layouts, reflecting web development practices from an earlier era. The site’s data was deeply embedded within the HTML structure, making updates cumbersome and requiring direct HTML editing for even minor changes. The lack of search or filtering capabilities meant users had to manually scan through long lists of information to find relevant services, whilst limited mobile responsiveness made the site difficult to use on modern devices.
A particularly notable challenge was the site’s approach to protecting contact information, with email addresses stored as images to prevent scraping. Whilst this solved the immediate problem of spam prevention, it created accessibility issues and made the data difficult to update or manage systematically.
The modernisation effort began with a fundamental restructuring of the site’s data architecture. The scattered, unstructured HTML data was transformed into a coherent JSON format, creating a single source of truth for all boat information. This new data structure implemented a consistent schema that normalised previously inconsistent data formats while preserving historical information.
The frontend architecture was completely rebuilt using modern web development practices. The new system implements a component-based structure, with modular boat cards and reusable filter components creating a consistent and maintainable codebase. The search functionality was particularly sophisticated, implementing real-time filtering across multiple data fields whilst maintaining high performance through optimised JavaScript algorithms.
One of the most significant technical achievements was the implementation of a dynamic filtering system. This system allows users to combine multiple search criteria simultaneously, with the results updating in real-time as filters are applied or removed. The state of these filters is preserved in the URL parameters, enabling users to share specific views of the data and maintaining browser history integration for a seamless user experience.
The new application’s search functionality represents a significant technical achievement. The system implements multi-field search capabilities across all boat data, including fuzzy matching for location searches to account for common variations in waterway names. Real-time results updating is achieved through careful optimisation of DOM manipulation and efficient JavaScript execution.
The data management system was built with scalability and maintainability in mind. A key component is the waterway normalisation function, which ensures consistent filtering regardless of variations in naming conventions:
function normaliseWaterway(name) {
if (!name) return '';
return name.replace(/&/g, 'and')
.replace(/\s+/g, ' ')
.trim();
}
The filter system maintains state through a sophisticated URL parameter management system:
function updateURLParameters() {
const params = new URLSearchParams();
if (waterway) params.set('waterway', waterway);
if (service) params.set('service', service);
if (search) params.set('search', search);
if (roadDelivery) params.set('road', '1');
const newURL = `${window.location.pathname}${params.toString() ? '?' + params.toString() : ''}`;
window.history.pushState({}, '', newURL);
}
This implementation enables deep linking and shareable filtered views whilst maintaining browser history functionality.
The application is built using vanilla JavaScript for core functionality, prioritising performance and minimising dependencies. Tailwind CSS provides the styling framework, enabling rapid development of a responsive, mobile-first interface whilst maintaining consistent design patterns throughout the application.
The boat card generation system demonstrates the sophisticated handling of conditional content rendering:
function createBoatCard(boat) {
const card = document.createElement('div');
card.className = 'bg-white rounded-lg shadow p-6 relative';
// Dynamic content generation based on available data
if (boat.status === 'active') {
// Generate active boat content
}
// Add service information
if (boat.services && boat.services.length > 0) {
// Generate services section
}
return card;
}
Performance optimisation was a key focus throughout development. The application implements lazy loading of boat details, efficient DOM updates, and optimised search algorithms to maintain responsive performance even with large datasets. The filtering system caches results where appropriate to minimise unnecessary recalculations.
The modernisation effort has resulted in a significantly improved web application that maintains high performance whilst offering sophisticated functionality. The new system enables instant search results and smooth filtering transitions whilst reducing server load through efficient client-side processing.
The codebase is now highly maintainable, with a modular architecture that separates concerns and enables easy updates. The structured data format simplifies the process of adding or updating boat information, whilst the component-based frontend architecture allows for easy extension of functionality.
The Fuel Boat Directory project demonstrates the successful transformation of a legacy website into a modern web application. Through careful attention to technical architecture, performance optimisation, and user experience, the project delivers sophisticated functionality whilst maintaining simplicity and usability. The implementation showcases strong technical capabilities in modern JavaScript development, data structure design, and frontend architecture, whilst providing a valuable resource for the waterways community.