A personal travel planning system built around an Excel workbook and a Python desktop GUI. Designed to replace a multi-system workflow (Asana checklist, separate spreadsheets, manual calendar blocking across 3 calendars) with a single hub.
Every trip required touching 6+ systems: Asana for the task checklist, a travel Excel doc, a presentations list, 3 separate calendars (KF Squared, Hughes Fam, DataOnWheels), Precursive (twice, for no-travel block and PTO), Trinet for PTO, and then back to the spreadsheet for final expenses. That meant the same trip info was being entered in multiple places, and it was easy to forget a step.
Travel planning is inherently a data problem. The volume is low (dozens of trips per year, not thousands), the data is simple (names, dates, prices, yes/no flags), and the user already works in Excel daily. A database would add complexity without adding value. Excel also means anyone can open the file, filter, sort, and do ad hoc analysis without special tools.
The original plan was to embed a VBA UserForm directly in the workbook. We tried multiple approaches to programmatically inject VBA into an .xlsm file (openpyxl, LibreOffice UNO API, manual vbaProject.bin construction). None worked reliably because VBA binary format (vbaProject.bin) is a proprietary Microsoft OLE compound document that no open-source tooling can create from scratch.
Rather than require a manual VBA import process (Alt+F11, import .bas file, build UserForm by hand), we pivoted to a Python tkinter GUI. This is better for several reasons: it runs on any OS with Python, it has no dependency on Excel's macro security settings, and it can be launched with a double-click. The Excel file stays as a clean .xlsx data store with no macros to worry about.
The 3 calendars (KF Squared, Hughes Fam, DataOnWheels) are a mix of providers. Rather than building separate integrations for Google Calendar, Outlook, and Apple Calendar, we generate standard .ics files. Every calendar app on every platform can import .ics. One click in the GUI generates all 3 calendar folders. The tradeoff is that importing is manual (drag the .ics file into the calendar), but it only happens once per trip.
The Asana "Travel Template" was a task checklist with 15 items. Rather than keep Asana in the loop as a separate system, the checklist is now a tab in the Excel workbook and a section in the GUI. Checking a box in the GUI writes "Done" directly to the Trip Checklist tab. A % Complete formula shows progress at a glance.
The original Flight & Hotel Options tab had a single "Flight" type. We split it into "Flight - Leaving" and "Flight - Returning" so outbound and return options can be compared independently. The GUI shows them in separate sections, and the calendar event description lists them separately in the booked itinerary.
Calendar events include the full booked itinerary in the description field: outbound flight with times and confirmation number, return flight, hotel with confirmation number, venue, event link, and general notes. This means all trip details are visible in the calendar without opening the spreadsheet.
| File | Purpose |
|---|---|
Travel Manager v2.xlsx |
Main workbook (6 tabs: Trips, Flight & Hotel Options, Expenses, Presentations, Trip Checklist, Packing Checklist) |
trip_dashboard.py |
Desktop GUI for managing trips, checklists, options, and calendar generation |
generate_calendar.py |
Standalone CLI for generating .ics files from the workbook |
SETUP.md |
Quick-start setup instructions |
calendar_events/ |
Generated .ics files organized by calendar (KF_Squared, Hughes_Fam, DataOnWheels) |
TravelManager_VBA.bas |
VBA module (unused, kept for reference if VBA approach is ever revisited) |
TripDashboard_UserForm.txt |
VBA UserForm instructions (unused, kept for reference) |
pip install openpyxl
python trip_dashboard.py
These still require manual action in external systems. The checklist tracks whether they've been done.
- Blocking time in Precursive (no travel + PTO)
- Entering PTO in Trinet
- Importing .ics files into each calendar
- Entering final expenses into the company travel spreadsheet