An intelligent event discovery platform that learns user preferences through calibration and recommends personalized events using vector similarity search. The system combines modern AI embeddings with a seamless user experience to help people discover events they'll love.
We provide a convenient development script that manages the entire stack:
# 1. Verify all prerequisites are installed
./dev.sh verify
# 2. Start frontend and backend
./dev.sh run
# 3. (Optional) Seed the database with event data if needed
./dev.sh ingestAvailable commands:
./dev.sh verify- Check all required software is installed./dev.sh run- Start backend (port 5266) + frontend (port 5173)./dev.sh stop- Stop all running services./dev.sh ingest- Seed Weaviate database with events (optional, data already seeded)./dev.sh clean- Clean all build artifacts./dev.sh help- Show all commands
- Node.js 18+ (for frontend) - Download or
brew install node - .NET 9.0 (for backend) - Download or
brew install --cask dotnet-sdk - Java 17+ (for ingestion) - Usually pre-installed
You'll need to create a .env file in backend/TravelAgent/:
# Copy the template
cp backend/TravelAgent/.env.template backend/TravelAgent/.env
# Then edit backend/TravelAgent/.env and add your credentials:
# - OpenAI API Key from https://platform.openai.com/api-keys
# - Weaviate Cloud Instance from https://console.weaviate.cloud
# - RapidAPI Key (optional) from https://rapidapi.com/apidojo/api/booking-comNote: Both backend and ingestion share the same .env file located in backend/TravelAgent/.env
Migration: If you have an existing ingestion/.env file, you can delete it. The ingestion component now uses the backend's .env file.
If you prefer to run components individually:
First, create the .env file that both backend and ingestion will use:
cd backend/TravelAgent
# Create .env file with your credentials:
cat > .env << EOF
WEAVIATE_HOST=https://your-cluster.weaviate.network
WEAVIATE_API_KEY=your-weaviate-api-key
OPENAI_API_KEY=your-openai-api-key
OPENAI_EMBED_MODEL=text-embedding-3-large
RAPIDAPI_KEY=your-rapidapi-key
RAPIDAPI_HOST=booking-com.p.rapidapi.com
EOF
cd ../..cd ingestion
# Build
./gradlew shadowJar
# Seed database with events (uses backend's .env)
./run.sh seed_calibration # 15 calibration events
./run.sh seed_real # 83 real events
# Optional: Test recommendations
./run.sh load_personas
./run.sh recommend
cd ..cd backend/TravelAgent
# .env file already created in step 1
# Restore dependencies
dotnet restore
# Run backend (with git workaround for newer git versions)
EnableSourceControlManagerQueries=false dotnet run
# Backend will start on http://localhost:5266cd frontend
# 1. Install dependencies
npm install
# 2. Run development server
npm run dev
# Frontend will start on http://localhost:5173Stores 100 objects with 1536-dimensional vectors across 3 collections. Enables semantic search for personalized recommendations.
Collections: CalibrationEvent (15 objects), Event (83 objects), Persona (2 objects)
Generates embeddings using text-embedding-3-large model. All 98 events vectorized for semantic understanding.
Continuous security scanning and vulnerability detection. Dashboard shows active monitoring:
7 security issues detected and tracked, including DoS vulnerabilities and code quality checks.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BERLIN HACKATHON MONOREPO β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β FRONTEND β β
β β ββββββββββββββββββββββββββββ β β
β β β 1. Onboarding β β β
β β β 2. Calibration Flow β β β
β β β 3. Like/Dislike Events β β β
β β β 4. Fetch Recommendations βββββββββββββ β β
β β β 5. Event Details β β β β
β β β 6. Travel & Booking β β β β
β β ββββββββββββββββββββββββββββ β β β
β β β β β
β β Tech: React/Next.js, TypeScript β β β
β ββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ β
β β BACKEND β β
β β β β β
β β ASP.NET Core API β β β
β β - Event endpoints β β β
β β - Recommendation logic β β β
β β - Weaviate integration β β β
β ββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ β
β β INGESTION β β
β β β β β
β β Event Data Pipeline (Java) β β β
β β - Generate event data β β β
β β - Create OpenAI embeddings β β β
β β - Seed Weaviate database β β β
β β - Test recommendation engine β β β
β ββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββ β
β β WEAVIATE VECTOR DB β β
β β ββββββββββββββββββββββββββ β β
β β β CalibrationEvent β β β
β β β Event (Real Events) β β β
β β β Persona (User Prefs) β β β
β β ββββββββββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
This repository contains three main components:
Purpose: Complete user experience and application logic
Responsibilities:
- User onboarding and authentication
- Calibration flow (showing sample events)
- Collecting user feedback (likes/dislikes)
- Querying Weaviate for personalized recommendations
- Displaying event details with travel and booking options
- Full UI/UX implementation
Tech Stack: React/Next.js, TypeScript, TailwindCSS, Weaviate Client
Purpose: Backend API and business logic
Responsibilities:
- RESTful API endpoints
- Event data management
- Recommendation logic
- Weaviate database integration
- Authentication and authorization
Tech Stack: ASP.NET Core, C#
Purpose: Event data ingestion and testing infrastructure
Responsibilities:
- Generate realistic event data (simulating event providers like StubHub)
- Create OpenAI embeddings for all events
- Seed Weaviate database with vectorized events
- Test persona creation and recommendation logic
- Validate vector similarity search
Tech Stack: Java 17, Gradle, Weaviate Client, OpenAI API
Why separate: In production, this would be replaced by real event provider APIs. For the hackathon, we needed to generate realistic test data. This component also contains testing utilities to verify the recommendation engine works correctly.
- User signs up and starts onboarding
- System shows 15 calibration events from various categories
- User likes/dislikes events to express preferences
- Frontend sends feedback to create user persona vector
- Frontend queries Weaviate Event collection with user's persona vector
- Vector similarity search returns top matching events
- User browses personalized recommendations
- User clicks event to see details
- System generates travel itinerary
- Shows booking options (flights, hotels, tickets)
- User can proceed to book
- Weaviate: Vector database for semantic search and recommendations
- OpenAI:
text-embedding-3-largemodel for event embeddings - Aikido: Security and monitoring
- React/Next.js: Modern web framework
- TypeScript: Type-safe development
- TailwindCSS: Styling
- Weaviate Client: Direct database queries
- ASP.NET Core: Web API framework
- C#: Primary language
- Java 17: Core application language
- Gradle: Build and dependency management
- Jackson: JSON processing
- OkHttp: HTTP client for OpenAI API
Each event is converted to a 1536-dimensional vector using OpenAI:
Input: "Coldplay World Tour. Stadium concert by Coldplay... City: Munich. Category: Music."
Output: [0.023, -0.145, 0.089, ..., 0.234] (1536 numbers)
User preferences are learned from calibration feedback:
likesMean = average(vectors of liked events)
dislikesMean = average(vectors of disliked events)
personaVector = normalize(likesMean - 0.5 Γ dislikesMean)
Find events with vectors most similar to personaVector
Using cosine similarity distance
Return top 5 matches
βββββββββββββββββββββββ
β Event Data Files β
β (JSON) β
ββββββββββββ¬βββββββββββ
β
βΌ
βββββββββββββββββββββββ
β Ingestion Pipeline β
β - Generate vectors β
β - Normalize β
ββββββββββββ¬βββββββββββ
β
βΌ
βββββββββββββββββββββββ
β Weaviate DB β
β - Store events β
β - Store vectors β
ββββββββββββ¬βββββββββββ
β
βΌ
βββββββββββββββββββββββ
β Backend API β
β - Query by vector β
β - Business logic β
ββββββββββββ¬βββββββββββ
β
βΌ
βββββββββββββββββββββββ
β Frontend App β
β - Display results β
β - User interaction β
βββββββββββββββββββββββ
- 15 diverse events across categories (Sports, Music, Culture, Festivals)
- Learns user preferences through simple like/dislike interactions
- No complex forms or questionnaires
- Semantic understanding of event content
- Goes beyond keyword matching
- Discovers events similar in meaning and context
- Each user gets unique recommendations
- Learns from both positive and negative feedback
- Balances liked attributes while avoiding disliked ones
- From discovery to booking
- Travel planning integrated
- Seamless user experience
Berlin-Hackathon-MonoRepo/
βββ frontend/ # User-facing application
β βββ components/ # React components
β βββ pages/ # Application pages
β βββ lib/ # Weaviate client
β
βββ backend/ # ASP.NET Core API
β βββ Controllers/ # API endpoints
β βββ Services/ # Business logic
β βββ Models/ # Data models
β
βββ ingestion/ # Event data pipeline
βββ src/main/java/com/example/trips/
β βββ App.java # CLI entry point
β βββ EmbeddingService.java # OpenAI integration
β βββ WeaviateClientWrapper.java # Database operations
β βββ Seeder.java # Event ingestion
β βββ Personas.java # Persona vector computation
β βββ Recommender.java # Recommendation logic
βββ data/
β βββ calibration_events.json # 15 training events
β βββ real_events.json # 83 recommendation events
β βββ calibration_feedback.json # Test persona preferences
βββ build.gradle # Dependencies
βββ run.sh # Convenience script
βββ run-all.sh # Full pipeline script
The ingestion component includes testing infrastructure to validate the recommendation engine:
cd ingestion
# Seed calibration events (15 events for user training)
./run.sh seed_calibration
# Seed real events (83 events for recommendations)
./run.sh seed_real
# Load test personas from feedback data
./run.sh load_personas
# Generate recommendations for test personas
./run.sh recommend
# Run complete pipeline
./run-all.sh- Liam: Likes sports, music festivals, cultural events
- Sophie: Likes marathons, fashion, arts, indie culture
These commands verify:
- β Events are vectorized correctly
- β Persona vectors are computed accurately
- β Vector similarity search returns relevant results
- β The entire pipeline works end-to-end
- Monorepo architecture: Frontend, backend, and data pipeline unified in one repository
- Production-minded: Ingestion pipeline simulates real event providers for hackathon demo
- AI-powered: Uses OpenAI embeddings and vector similarity for intelligent recommendations
- Complete solution: From onboarding to booking, full user journey implemented
- Testable: Ingestion includes testing infrastructure to validate recommendation quality
- Scalable: Architecture ready for production deployment with real data sources
The monorepo structure provides clear separation of concerns while keeping all components together for easy development and deployment.
Repository: https://github.com/XtzZZZ/Berlin-Hackathon-MonoRepo

