Inspiration

Every group gathering faces the same friction: the "Coordination Cost." When friends or colleagues are scattered across a city, finding a location that is geographically fair to everyone is a surprisingly complex optimization problem. Subjective negotiation often leads to decision fatigue ("I don't care, you pick") or unfair commute times.

We wanted to solve this by replacing social friction with Algorithmic Fairness. By treating the meeting point as a geospatial centroid problem, MeetSpot calculates the mathematical middle ground to surface venues that minimize collective travel variance. Fair for everyone, decided in seconds.

What it does

MeetSpot is an intelligent geospatial agent that optimizes group coordination. It takes multiple addresses (2-10 participants), calculates the optimal geodesic centroid, and recommends high-quality venues via an interactive interface.

Core Capabilities:

  • Semantic Address Resolution: Solves ambiguity in user inputs (e.g., mapping colloquial "BeiDa" to "Peking University, Haidian District") via a custom entity resolution layer.
  • Multi-Intent Concurrent Search: Users can query mixed venue types (e.g., "Cafe + Library + Restaurant") simultaneously. The system executes parallel searches to fetch diverse options without latency penalties.
  • Weighted Ranking Engine: Venues are ranked not just by proximity, but by a multi-factor scoring algorithm: Rating × Distance × Scenario Match × User Requirements (e.g., "Quiet", "Parking").
  • Dynamic Theming: Supports 12 distinct venue taxonomies with custom color-coded UI and localized naming conventions.
  • Interactive Visualization: Generates shareable, standalone HTML results with embedded maps, navigation links, and responsive card layouts.

How we built it

Backend (High-Concurrency Architecture) Built with FastAPI (Python) to leverage native asynchronous capabilities.

  • Concurrency: Utilized aiohttp to orchestrate parallel requests to the Amap (Gaode) API. Geocoding and POI searches run concurrently, significantly reducing TTI (Time to Interactive).
  • Data Persistence: SQLAlchemy handles optional user authentication and session data management.

Recommendation Engine ( The Logic)

  • Geospatial Math: Uses spherical geometry to calculate accurate geodesic midpoints for pairs, and weighted centroids for groups of 3+ participants.
  • Scoring Algorithm: We engineered a weighted formula to rank venues: $$Score = (Rating \times 10) + (20 - DistancePenalty) + ScenarioMatch + RequirementBonus$$

Frontend (UX/UI) A lightweight SPA built with Vanilla JavaScript, designed with Glassmorphism principles. It features deep integration with the Amap JS SDK for dynamic marker rendering and responsive layouts that work on any device.

Infrastructure (DevOps) Implemented a robust Three-Tier Configuration System:

  1. Full TOML config for local development.
  2. Environment variables for cloud containers (Render/Railway).
  3. Minimal fallback mode for serverless functions (Vercel). CI/CD is handled via GitHub Actions to ensure Python 3.11/3.12 compatibility on every push.

Challenges we ran into

  • Geospatial Ambiguity: Inputs like "Tsinghua" are ambiguous (University vs. Street name). We solved this by maintaining a curated dictionary of 60+ university abbreviations with specific city prefixes baked into the resolution logic.
  • API Rate Limiting: External mapping APIs enforce strict QPS (Queries Per Second) quotas. We implemented an Exponential Backoff retry mechanism and in-memory caching to handle bursts of traffic without hitting limits.
  • Result Diversity Bias: Naive search algorithms tend to flood results with the most abundant category (e.g., Cafes). We developed a Balanced Selection Algorithm that enforces a distribution quota, ensuring 2-3 high-quality results per requested category type.
  • Cross-Environment Consistency: ensuring the codebase ran identically on a local MacBook, a Docker container, and a serverless Vercel function required strict dependency management and graceful degradation logic.

Accomplishments that we're proud of

  • Sub-Second Latency: Through async architecture and aggressive caching, we achieved recommendation generation times of 0.3s - 0.8s.
  • Zero-Config Deployment: We optimized the DX (Developer Experience) so anyone can clone the repo, set a single AMAP_API_KEY, and run the app instantly.
  • Accessibility-First: Implemented WCAG AA compliant color palettes, validated automatically via our design_tokens.py utility.
  • Production Readiness: Included rate limiting, health checks, structured logging, and graceful error handling from Day 1.
  • Maintainable Codebase: Our concise architecture documentation (CLAUDE.md) allows new developers to understand the system context in under 5 minutes.

What we learned

  • Async Python Nuances: Debugging race conditions in concurrent API calls taught us the value of structured logging. We implemented visual log prefixes (📝, 🔍, ✅, ❌) to trace request flow instantly.
  • The "Human" Element of UX: Technical correctness isn't enough. An error message saying "Not Found" is a failure; a message saying "Did you mean 'Peking University'?" is a feature.
  • MVP Philosophy: We cut 3 complex features (Real-time traffic, Weather, Price filtering) to focus on shipping a rock-solid core experience that solves the primary problem perfectly.
  • Configuration as a Feature: Building a flexible configuration system upfront paid off when deploying to 4 different hosting platforms without code changes.

What's next for MeetSpot

  • User Accounts: Integration of Auth0 for saving "Base Nodes" (Home/Work) and meeting history.
  • WeChat Mini Program: porting the frontend to a native Mini Program for easier sharing within social chats.
  • Isochrone Analysis: upgrading the routing engine to calculate "Time-Travel Equidistance" (fairness by minutes) rather than just physical distance.
  • Group Collaboration: A "Voting Mode" where participants can upvote/downvote recommended venues before a final decision is made.
  • Global Expansion: Abstracting the map provider layer to support Google Maps/Mapbox for international usage.

Built With

Share this project:

Updates