I highly dislike the Google Calendar timezone selection dropdown. It doesn't have a search bar - ironic for a search company! This GreasyMonkey/Tampermonkey userscript adds keyboard-only city search inputs to Google Calendar timezone dropdowns with fuzzy matching, comprehensive city data, and airport codes.
before.after.video.mp4
- 🔍 Fuzzy search - Type city names with typo tolerance
- ⌨️ Keyboard-only - No mouse required, full arrow key navigation
- 🌍 Comprehensive data - 5,767 cities + 5,515 airports across 399 timezones
✈️ Airport codes - Search by IATA codes (DMK, JFK, SFO, etc.)- 🎯 Smart matching - Exact, starts-with, contains, and fuzzy matching
- 📍 Two inputs - Separate search for start and end timezone
- 🕐 GMT offset display - See timezone offset in search results
Install a userscript manager for your browser:
- Chrome/Edge: Tampermonkey
- Firefox: Tampermonkey or Violentmonkey
- Other browsers: Check GreasyFork for compatible extensions
- Go to the Releases page
- Download
google-calendar-timezone-helper.user.jsfrom the latest release - Open the downloaded file in your browser
- Tampermonkey will automatically detect it and prompt to install
- Click "Install"
- Open Google Calendar and create/edit an event
- Locate the timezone fields - you'll see search inputs below them
- Type a city name or airport code - e.g., "berlin", "nyc", "bangkok"
- Navigate results:
↓/↑- Move through suggestionsEnter- Select highlighted timezoneEscape- Clear and closeTab- Move to next field
Cities:
- Type "berlin" → Berlin, Germany (Europe/Berlin)
- Type "bangkok" → Bangkok, Thailand (Asia/Bangkok)
- Type "bangk" → Fuzzy matches Bangkok
- Type "san fran" → San Francisco, United States
Airports:
- Type "DMK" →
✈️ Don Mueang International Airport (DMK), Thailand - Type "JFK" →
✈️ John F Kennedy International Airport (JFK), United States - Type "SFO" →
✈️ San Francisco International Airport (SFO), United States - Type "BKK" →
✈️ Suvarnabhumi Airport (BKK), Thailand - Type "YYZ" →
✈️ Lester B. Pearson International Airport (YYZ), Canada
- Data Sources:
- Cities from
city-timezonesnpm package (5,767 cities) - Airports from
@nwpr/airport-codesnpm package (5,515 airports)
- Cities from
- Fuzzy Matching: Implements Levenshtein distance algorithm for typo tolerance
- IATA Code Search: Airports are searchable by their 3-letter codes (DMK, JFK, etc.)
- Ranking: Results sorted by:
- Match type (exact > IATA exact > starts-with > contains > fuzzy)
- Population (larger cities ranked higher)
- Programmatic Selection: Directly sets timezone values without clicking
dist/google-calendar-timezone-helper.user.js- Built userscript (install this)google-calendar-timezone-helper.template.user.js- Source templategenerate-city-data.js- Generates city + airport databuild.js- Embeds data into userscriptpackage.json- Dependencies for data generationcity-timezone-data.js- Generated data (created by npm run build)
The userscript includes comprehensive city and airport data by default. If you need to customize:
- Edit
generate-city-data.jsto modify the data sources - Run
npm run buildto regenerate the userscript - Reinstall the updated
dist/google-calendar-timezone-helper.user.js
You can directly edit CITY_TIMEZONE_DATA in the template, but your changes will be lost on rebuild. Each entry has this structure:
"America/Los_Angeles": [
{ n: "Los Angeles", c: "United States", p: 3971883, t: "city" },
{ n: "LAX Airport", c: "United States", p: 0, t: "airport", iata: "LAX" }
]# Install dependencies
npm install
# Build the userscript (generates data + embeds in template)
npm run build
# Edit the source template
# File: google-calendar-timezone-helper.template.user.js
# After changes, rebuild
npm run build
# Test the built userscript
# File: dist/google-calendar-timezone-helper.user.js
# Install in Tampermonkey and test on https://calendar.google.com.
├── dist/
│ └── google-calendar-timezone-helper.user.js # Built file (install this)
├── google-calendar-timezone-helper.template.user.js # Source template
├── generate-city-data.js # Generates city + airport data
├── build.js # Embeds data into template
├── city-timezone-data.js # Generated data (git-ignored)
└── package.json
This project uses GitHub Actions to automatically create releases when you push a version tag.
To publish a new release:
# Tag the release (e.g., v1.0.0)
git tag v1.0.0
# Push the tag to GitHub
git push origin v1.0.0What happens automatically:
- GitHub Actions workflow triggers (
.github/workflows/release.yml) - Dependencies are installed using Node.js 24
- Userscript is built via
npm run build - GitHub release is created with auto-generated release notes
dist/google-calendar-timezone-helper.user.jsis attached as a downloadable asset
Users can then install directly from the Releases page by clicking the .user.js file!
MIT
All contributions welcome.