I Know a Place

I Know a Place is an interactive map that highlights how a single location can hold countless unique stories and experiences for different people.

This project was built for the 2025 TEDxCMU main event.

RoleProduct Designer · Frontend Developer
ToolsNext.js · OpenAI API · Google API · Leaflet.js · Figma
DurationJan 2025 – May 2025

Overview

TEDxCMU’s 2025 theme was “I Know a Place” — the idea that a single location can hold completely different memories, meanings, and stories for every person who has been there.

I was brought on as the project lead to build an interactive web experience for the live event. Attendees could walk up to a shared screen, drop a pin on a map, and submit a short story about a place that meant something to them. The stories would appear as live pins for everyone to explore throughout the night.

The core challenges were: keeping the experience fast and frictionless for a live audience, moderating submissions in real time without a dedicated person watching, and making the map feel playful rather than clinical.


+-----------------------+     submits payload      +-----------------------+
| User Submits Story    | -----------------------> | Next.js API Route     |
| Input Modal (Next.js) | { story, location, ... } | /api/submit           |
+-----------------------+                          +-----------------------+
                                                               |
                                            +------------------+------------------+
                                            | (parallel AI processing)            |
                                            v                                     v
+-----------------------+     moderation pass      +-----------------------+     tag generation         +-----------------------+
| OpenAI Moderation     | -----------------------> | Google Sheets API     | <------------------------- | OpenAI API            |
| Content Safety Check  |                          | Append Row / DB       | { tags: [...] }            | Tag Generator         |
+-----------------------+                          +-----------------------+                            +-----------------------+
                                                               |
                                                               | story & tags saved
                                                               v
                                                   +-----------------------+
                                                   | Leaflet.js Map        |
                                                   | Interactive Pin       |
                                                   +-----------------------+

Map Features

The implemented map features include Zoom In and Zoom Out functionality. When selecting a library to build the map, we carefully considered how information would be displayed at different zoom levels to avoid overwhelming the screen. Ultimately, we chose Leaflet.js for its flexibility and control over zoom behavior.

Webpage on First Load

I Know a Place map on first load

Zooming In

Zooming Out

Story Checking and Generating Tags

Since the team was busy and overwhelmed during the event, I wanted to avoid assigning someone to manually review the stories uploaded to the map. To address this, I integrated a call to the OpenAI API upon upload to automatically check if a story is appropriate for the event.

I also used the OpenAI API to generate tags for each story, helping categorize them. During user testing with the team, we found that the auto-generated tags added an element of joy and playfulness to the story submission process.

Generating tags to a story

Checking for appropriate story

Submitting Stories

To store the stories, the team used a Google Sheets as our database. Completely free of charge, easy to add and remove from, and if anything went wrong we could just create a new Google Sheets.

Writing/Reading to/from Google Sheets Database

Design Components

Apart from the map interactions, the main component that required designing was the modal that popped up for users to input stories.

The modal consists of an input and final submitted state.

Design Components

Design components