Stop scrolling, start exploring. Discover your dream destinations in Indonesia with personalized recommendations.
Table of Contents
Every great project starts with a problem. Here's ours:
The Problem: The modern traveler faces a paradox of choice—an overwhelming amount of information when planning a trip. Sifting through countless blogs, reviews, and travel sites is time-consuming and often leads to visiting the same popular, overcrowded places. This "information overload" can diminish the travel experience and prevents tourists from discovering hidden gems that match their unique interests.
Our Solution: "Teman Wisata" (meaning "Travel Buddy") is a recommender system designed to solve this problem for tourism in Indonesia. By leveraging machine learning, our platform provides highly individualized travel recommendations. We analyze user preferences and interactions to suggest attractions across five major Indonesian cities: Jakarta, Yogyakarta, Semarang, Bandung, and Surabaya. Our goal is to simplify trip planning, enhance the traveler's journey, and promote a diverse range of local attractions.
Here's what our project can do. We focused on creating a seamless user experience through these core functionalities:
-
🎯 Personalized Recommendations: After rating a few destinations, the system uses collaborative and content-based filtering to generate a personalized list of similar locations that are likely to appeal to the user.
-
📍 Rate Destinations: Users can rate tourist attractions, which helps the system learn their preferences and improve the quality of future recommendations.
-
🏆 Discover Top Places: See a curated list of the top-rated destinations and popular attractions by province to get inspiration for your next trip.
-
⚡ Fast & Responsive: Implemented caching for the recommendation models to ensure users receive suggestions quickly and efficiently.
-
🔐 Secure Authentication: A complete authentication system allows users to sign up, log in, and manage their own interaction data securely.
Seeing is believing. Check out our project in action!
This project was built with a modern, scalable, and resilient MLOps stack. Our goal was to ensure high performance, reliability, and robust observability from development to production.
🛠️ Technology & Architecture This project was built with a modern, scalable, and resilient MLOps stack. Our goal was to ensure high performance, reliability, and robust observability from development to production. Core Technologies:
Our system is designed as a microservices architecture, containerized and orchestrated with Kubernetes (K3s). The infrastructure is deployed on a single VM, prioritizing resource efficiency while maintaining full compatibility and scalability.
- Frontend: Built with TypeScript, Alpine.js, Vite, Handlebars, Tailwind, and DaisyUI for a responsive, fast, and efficient user interface.
- Backend: A high-performance RESTful API powered by FastAPI (Python), handling all business logic, data processing, and interactions with the ML models.
- Database & Cache: We use Supabase (PostgreSQL) as our primary database for relational data and Redis for high-speed caching of frequent queries and recommendation results.
- Machine Learning: Models are trained using the RecTools library. The entire ML lifecycle, including experiment tracking and model storage, is managed with MLflow and MinIO.
- Deployment & Orchestration: The application is containerized with Containerd and deployed on a lightweight K3s Kubernetes cluster running on Ubuntu 22.04 LTS. Networking is managed by Flannel and exposed securely via NGINX Ingress Controller and Cloudflare.
- Observability: A comprehensive monitoring and logging stack is implemented using Prometheus, Grafana, Loki, and Promtail to provide deep insights into system health, metrics, and logs.
Want to get your hands dirty? Follow these steps to set up the project on your local machine. For more detail, please visit the main repository.
# 1. Clone the main repository
git clone https://github.com/TemanWisata/teman-wisata.git
# 2. Navigate into the project directory
cd teman-wisata
# 3. Install dependencies (requires Python and Node.js)
# Follow the detailed setup instructions in the repository's README.
# 4. Set up your environment variables
# Create a .env file based on the provided examples.
# 5. Start the application (using Docker Compose for local dev)
make docker-build
make docker-runThis project was made possible by our dedicated team.
| Name | Role | GitHub Profile | LinkedIn Profile |
|---|---|---|---|
| Putu Gede Pradana Adnyana | ML Engineer | @pradanaadn | /in/pradanaadn |
| Achmad Rifki Raihan Syah Bagja | ML Engineer | @achmadrrb | /in/achmad-rifki-raihansyah-bagja |
| Ahmad Hufron | DevOps Engineer | @ahmadhufron | /in/ahmadhufron |
We're proud of what we've built, but we're not done yet! Here are some features and improvements we're planning for the future:
- Enable Autoscaling: Adopt autoscaling with HPA or KEDA to dynamically adjust resources based on traffic load.
- Expand to a Multi-Node HA Cluster: Migrate from a single-node VM to a high-availability cluster to improve fault tolerance and scalability.
- Implement a CI/CD Pipeline: Automate the build, test, and deployment process to streamline development and ensure code quality.
- Enable Distributed MinIO: Configure MinIO in a distributed mode for more resilient and scalable object storage.
- Add Distributed Tracing: Integrate Tempo or Jaeger to get a comprehensive view of requests as they travel through our microservices.
- Introduce a Service Mesh: Implement a service mesh like Kiali to enhance observability, traffic management, and security between services.




