A travel safety platform that helps travelers make more informed decisions about where to stay, visit, and explore.
TravelShield provides travelers with safety information, community reviews, and location-based features to help them discover and evaluate cities and areas before and during a trip.
A full-stack application that combines a Ruby on Rails backend with an interactive map, geolocation services, search, authentication, user-generated content, and cloud-based image storage.
- 🔐 User authentication and account management
- 🗺️ Interactive maps with Mapbox GL
- 📍 Location-based search and geocoding
- 🔎 Search and filtering for cities and areas
- ⭐ Community reviews and ratings
- ❤️ Favorite locations
- 📷 Cloud-based image management with Cloudinary
- 📄 Paginated results
- 👤 User profiles and community-generated content
- 📱 Responsive interface for desktop and mobile devices
- Ruby 3.1.2
- Ruby on Rails 7.1.3
- PostgreSQL
- Devise — authentication
- PgSearch — full-text search
- Geocoder — geocoding and location-based features
- Pagy — pagination
- HTML5
- SCSS
- Bootstrap 5
- JavaScript
- Stimulus
- Turbo / Hotwire
- Mapbox GL
- Cloudinary — image storage and delivery
- Puma — application server
- Selenium / Capybara — system testing
- Docker — containerization support
TravelShield follows the conventional Model–View–Controller (MVC) architecture provided by Ruby on Rails.
┌──────────────────────┐
│ User / Browser │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Rails Controllers │
└──────────┬───────────┘
│
┌───────────────┼────────────────┐
▼ ▼ ▼
┌──────────┐ ┌────────────┐ ┌─────────────┐
│ Models │ │ Views │ │ Services │
└────┬─────┘ └────────────┘ └─────────────┘
│
▼
┌──────────────┐
│ PostgreSQL │
└──────────────┘
External integrations:
Mapbox GL → Interactive maps
Geocoder → Location/geocoding
Cloudinary → Image storage
The application uses Rails conventions to separate responsibilities between controllers, models, views, and supporting components.
Make sure you have the following installed:
- Ruby 3.1.2
- Rails 7.1.3+
- PostgreSQL
- Node.js
- Yarn
You can verify your Ruby and Rails versions with:
ruby -v
rails -vgit clone https://github.com/digidweb/lewagon-travel-shield.git
cd lewagon-travel-shieldbundle installyarn installCreate a .env file in the project root.
Example:
CLOUDINARY_URL=your_cloudinary_url
MAPBOX_API_KEY=your_mapbox_api_keyDo not commit credentials or API keys to the repository.
rails db:create
rails db:migrate
rails db:seedbin/devThen open:
http://localhost:3000
The project includes system testing support through Capybara and Selenium.
Run the test suite with:
bundle exec rails testFor a specific test file:
bundle exec rails test test/path/to/test_file.rbTravelShield combines search and geolocation capabilities to help users discover information about specific locations.
PgSearch is used to support search functionality, while Geocoder handles geolocation-related features.
This combination allows the application to work with both textual location searches and geographic information.
The application integrates Mapbox GL to provide an interactive map experience.
The map allows users to visually explore locations and interact with geographic information rather than relying exclusively on traditional lists.
This integration demonstrates how a Rails application can combine server-side application logic with third-party JavaScript APIs.
User-generated content can include images that are managed through Cloudinary.
The integration handles cloud-based image storage and delivery while keeping the Rails application responsible for the associated application data.
User authentication is implemented with Devise, providing the foundation for:
- User registration
- Login/logout
- Session management
- Authentication-protected features
This allows user-generated content such as reviews and favorites to be associated with individual accounts.
The application uses Pagy to paginate collections of records.
Pagination helps prevent unnecessarily large result sets from being loaded and displayed at once, providing a better user experience as the amount of content grows.
TravelShield was originally developed as the final project of the Le Wagon Web Development Bootcamp.
This repository contains the version developed and maintained in my GitHub account.
The project provided practical experience working on a collaborative full-stack Rails application, including:
- Rails MVC architecture
- Database modeling with PostgreSQL
- Authentication
- RESTful routes and controllers
- CRUD operations
- Search
- Geolocation
- Interactive maps
- Third-party API integrations
- Image management
- Responsive UI development
- Git and collaborative development workflows
Note: This repository is based on the original Le Wagon project structure. The project should therefore be evaluated in the context of the contributions and implementation work made within this repository rather than as an entirely independent application created from scratch.
Building TravelShield provided practical experience with the challenges involved in developing a full-stack application where multiple parts of the system need to work together:
User
│
├── Authentication
│
├── Search
│
├── Reviews
│
├── Favorites
│
└── Location
│
├── Geocoder
└── Mapbox
The project was particularly useful for understanding how Rails can serve as the foundation for an application while integrating specialized third-party services for maps, geolocation, authentication, search, and media storage.
If continuing the project, the following improvements would be natural next steps:
- Add automated CI with GitHub Actions
- Increase automated test coverage
- Add API endpoints for mobile or third-party clients
- Improve accessibility (WCAG)
- Add more advanced search filters
- Add user moderation and reporting features
- Add security and performance monitoring
- Introduce background jobs for asynchronous operations
- Add a production deployment pipeline
- Improve observability with structured logging and error tracking
This project was developed as part of a technical learning project and is maintained in this repository for portfolio and educational purposes.