CityWander is a mobile application developed during the Enterprise Mobile Application Development course at the University of Salerno, in collaboration with the company ITSvil.
It aims to offer a personalized and interactive tourism experience in Salerno, through modern technologies like geofencing, gamification, and image recognition. The app is designed to be scalable and cross-platform, supporting both Android and iOS.
- 🎮 Gamification & Rewards: Interactive experiences with a virtual assistant and achievement system.
- 📍 Geofencing: Location-based content triggered in real-time.
- 📷 Image Recognition: Restaurant and landmark identification using AI.
- 📈 Crowdfunding: A visibility system where restaurants can promote themselves by contributing content.
Main Technologies:
- Flutter & Dart for mobile app development (cross-platform for iOS and Android).
- Docker for containerization and deployment.
- GitLab for CI/CD and code management.
- Android & iOS for mobile platforms.
Backend:
- Spring Boot & Java for backend development.
- MyBatis & Swagger for API handling.
- PostgreSQL for the database.
- RESTful APIs for communication between frontend and backend.
Frontend:
- Figma for UI/UX design.
- Function12 & Canva for enhancing the visual experience.
Web Scraper:
- Selenium & Python for scraping relevant data to build the tours.
- Geoapify for geolocation-based services.
AI & Image Recognition:
- TensorFlow, Keras, & Flask for implementing image recognition using the ResNet50 model.
The application was developed using Flutter 3.13.6 and is compatible with both Android and iOS devices.
Both backends — the main backend (Spring Boot) and the image recognition service (Flask) — are fully containerized using Docker, making the system easily deployable and scalable across any environment.
The core backend is developed in Spring Boot using Java 17.
It uses the MyBatis framework for persistence with a PostgreSQL database.
The controller layer exposes RESTful APIs, allowing communication with the Flutter app through JSON objects.
All API endpoints have been tested and documented using Swagger.
UI mockups were designed using Figma, and transitioned into Flutter using Function12, a conversion tool that accelerated the design-to-code workflow.
Canva was used for creating high-quality graphics, including assets like the illustration of Prince Arechi.
A Python-based web scraper was built with Selenium to extract restaurant data from TripAdvisor.
This scraper was primarily used to populate the initial database and is capable of supporting automated submissions from restaurant owners.
To enhance the scraped data, we used a geocoding algorithm via Geoapify to convert addresses into GPS coordinates.
The app includes an image recognition module based on transfer learning with ResNet50.
The model was fine-tuned for improved performance and can make predictions from .jpg input images.
The module is deployed within a Flask server and integrates with the Flutter frontend:
images are uploaded to the server, which then responds with the predicted restaurant name based on the model’s output.
-
Compile the backend project using Maven with Java 17:
Runclean installto generate the JAR file for deployment. -
Start the preconfigured Docker containers:
docker compose up -d
-
To reset containers and volumes (e.g., after changing DB init scripts):
docker compose down -v
-
Access and test REST endpoints:
- Swagger UI → http://localhost:13004/citywanderbackend/
- PostgreSQL DB Web Admin → http://localhost:13001/browser/
Requires Flutter 3.13.6.
-
Install dependencies:
flutter pub get flutter pub upgrade
-
Run the app on an emulator or physical device:
flutter run
-
Make sure Python 3.8 and all required dependencies are installed.
-
Build the Docker image:
docker image build -t imagerecognition . -
Run the container:
docker run -p 5000:5000 -d --name AIRecognition imagerecognition
-
Recognize an image (GET):
http://localhost:5000/imageRecognition?imageName=prova1.jpgExample response:
{ "recognizedImage": "Ingordo" } -
Upload an image (POST):
Send a
POSTrequest to:http://localhost:5000/uploadImageWith the image file attached in form-data as the
imagefield.
Response: the name of the uploaded file.
CityWander/
├── code/ → Source code
│
├── docs/ → Documentation
│ ├── Volantino tecnologie CityWander.png → Brochure of technologies used
│ ├── CityWander_Presentation.pptx → Project presentation
│ ├── CityWander_One_Minute_Shot.pptx → One-minute project summary
│ ├── CityWander_Flyer.png → Event flyer
│ └── docs_intermediate/ → Intermediate project documents
│ ├── App_Challenge_Description_Interfaccia.xlsx → Challenge description
│ ├── CityWander_Project_Proposal_ITSVIL.docx → Project proposal
│ └── CityWander_RAD.pdf → Requirement Analysis Document
│
├── img/ → Images used in the project
│ └── ... → All images for presentations and demos
│
├── app-arm64-v8a-release.apk
├── .gitignore → Git ignore file
└── README.md → Project documentation (this file)
The CityWander app can be downloaded and installed directly on your Android device using the APK file:
Simply download the APK, enable installation from unknown sources in your Android settings, and install the app to begin your personalized tourism experience in Salerno.
- Project Presentation (PPT)
- One-Minute Project Summary (PPT)
- Technologies Used (Flyer)
- Requirement Analysis Document (PDF)
- Arcangeli Giovanni
- Campochiaro Fabiano
- Di Lauro Francesco
- Di Maio Marco
In collaboration with ITSvil S.r.l., as part of an academic-industry project at the University of Salerno.
This project is licensed under the CC BY-NC-SA 4.0 License
You may share and adapt this work for non-commercial purposes only, as long as you give appropriate credit and distribute your contributions under the same license.
For commercial use, explicit permission from the authors is required.


