v2.0
April 2026 Major release- From one trip to a monorepo
A conversation about hosting options for multiple trips compared three approaches: a subdomain per trip, a single hub with path-based routing, or a monorepo. Claude recommended the monorepo to share layout and components across trips, and a new repo
mariatta-travelswas created deployed totravel.mariatta.ca. The original Portugal trip repo was left intact atmariatta.ca/portugal-tripas an early-experiment artifact. - Pluggable sections for different trip types
Discussion about family trips vs conference trips led to a
TripConfigshape with atypefield (familyorconference) and asectionsarray declaring which pages exist (budget, checklist, log, sync). Family trips render a multi-city grid on the home; conference trips render the single city directly with a venue block. Adding a new trip type is adding a section component, not editing templates. - Import four trips: Portugal, Taiwan, LFNW 2026, Core Dev Sprint
Existing repos for the Portugal family trip, Taiwan family trip, USA Bellingham (renamed to LFNW 2026), and the Python Core Dev Sprint 2026 at OpenAI were all imported into the monorepo under
src/trips/<slug>/. A unifiedtypes.tsreplaced the four separate schemas — generic currency and price strings, optionalVenuefor conference trips, optionaliceCreamSpotsfor conference-tradition spots, and a chronological trip registry for prev/next. - Trip statuses: planning, confirmed, completed, not taken
Not every planned trip happens. A
statusfield was added to each trip (planning,confirmed,cancelled) withcompletedauto-derived once the end date has passed. The hub page now has three sections — Upcoming, Archive, and Shelved — and each trip card shows a colour-coded status badge. Cancelled trips render muted with a strikethrough title. - Trip hub landing page
A new hub page at
travel.mariatta.ca/lists all trips as cards with emoji, type (Family trip / Conference), dates, tagline, and status. Trips are ordered chronologically by start date. - Two-tier navigation
Initial navigation layered the trip's own nav on top, replacing the site-level nav — feeling unnatural once inside a trip. Two-tier nav solved it: the top row always reads
✈️ Mariatta Travels · All trips · About; a second row appears inside each trip showing its sections. The breadcrumb was removed since the second row already carries the trip identity. - Prev/next navigation at every level
Two kinds of prev/next: between trips (in the footer, chronological order — e.g. LFNW → Portugal → Taiwan → Core Sprint) and between cities within a multi-city trip (Porto ← Lisbon ← Aveiro, ending in back-to-overview). The city-level nav appears only on city pages.
- Event callout for mixed trips
For trips that mix family vacation and conference (like Portugal, which has PyCon Portugal embedded in Aveiro), a small
EventCallouton the trip home flags the conference —🎤 PyCon Portugal · Sep 3–4— linking directly to the Aveiro page's full venue block. Full details live on the city page where the event happens; the callout makes them discoverable. - Venue block for conference cities
A reusable
VenueBlockcomponent renders event venue info in a 3-column grid with emoji-labelled details (📍 Address, 📅 Dates, 🕘 Hours, 🚇 Transit, 🪪 Access, ✉️ Contact). Populated for PyCon Portugal at Universidade de Aveiro, LinuxFest Northwest at Bellingham Technical College, and the Python Core Dev Sprint at OpenAI in San Francisco. - Ice cream selfie tradition (from a skill)
Claude checked the
new-tripskill and found Mariatta's tradition of taking ice cream selfies at every conference. AnIceCreamSpottype, pinkice-creammap pin category, andIceCreamSpotssection were added. Each conference city now has 3–4 scouted spots with addresses, signature flavours, and photo-worthy notes — plus a "Scout ice cream selfie spot near venue" checklist item. - Budget with charts and multi-currency
The budget page was rebuilt per trip with a CAD ↔ base currency toggle, editable exchange rate, and three Chart.js charts — estimated vs actual by category, spending by category, and spending by city (multi-city trips only). Each trip uses its own
localStoragekey so budgets don't bleed across trips. - Import / Export with download and upload buttons
The sync page now has proper buttons — "Export Data" downloads a
{trip-id}-data-YYYY-MM-DD.jsonfile, "Copy to Clipboard" copies it, "Choose File" reads a JSON file back in, and the textarea accepts pasted JSON. Merge and Replace buttons give control over how incoming data combines with existing. - AI-native dev workflow for the monorepo
The
/new-tripslash command was updated for the monorepo and moved into the repo itself at.claude/commands/new-trip.md, with aninstall.shthat symlinks it globally. ACLAUDE.mdat the root documents the architecture for in-repo work. Both ship with the code and stay in sync with it. - Dedicated changelog page
This list of prompts outgrew its place on the About page. It was moved to its own page at
/changelog/, with a small green-bordered callout on About linking here. The callout lives directly below the "100% generated by Claude" section, so the handoff reads as "…and here's the log of every prompt."
v1.1
April 2026 New features- Track the travel budget
A prompt asked to track travel budget and finances. Claude suggested several approaches including a budget page on the site, a spreadsheet, or a budgeting app. After the spreadsheet option was rejected, Claude built a full budget page with pre-filled estimates across 10 categories — flights, accommodation, food, transport, activities, shopping, and more.
- Log expenses during the trip
The budget page was expanded with an expense log form to record individual purchases — with description, amount, category, budget item, city, and date. Through several rounds of prompting, Claude made the logged expenses update the category actuals in the table above, added the ability to edit and delete entries, and made unassigned expenses appear as dynamic rows in their category section.
- Visualize spending with charts
Claude researched popular charting libraries and recommended Chart.js for its lightweight CDN-friendly approach. Three interactive charts were added: estimated vs actual by category (horizontal bar), spending by category (doughnut), and spending by city (doughnut). All charts update in real time as expenses are added or removed.
- Sync data between devices
Since the budget data lives in localStorage (local to each browser), a prompt asked about syncing between phone and computer. Claude discussed several options and built an import/export feature — download expense data as a JSON file or copy to clipboard, then import on another device by uploading the file or pasting the JSON. Supports merging with existing data or replacing all data.
- Make it installable as a mobile app
A discussion about creating a mobile app led to Claude recommending a Progressive Web App (PWA) as the simplest approach. Claude added a manifest, service worker, and app icons so family members can visit the site on their phone and add it to their home screen — it opens full-screen like a native app and works offline. A notification banner appears when site updates are available.
- Quick expense logging page
A discussion about how the budget page would be used differently during planning vs travel led to creating a separate lightweight
/log/page optimized for quick on-the-go expense entry on a phone. A floating "+" button was also added to the budget page for quick access. The import/export was moved to its own/sync/page to keep things focused. - Multi-currency support (CAD/EUR)
As a Canadian traveling to Portugal, pre-trip expenses are in CAD while on-the-ground spending is in EUR. Claude added a currency toggle and editable exchange rate to the budget page, a currency selector on every expense entry, and per-item native currency on all budget items. All totals, charts, and category breakdowns convert automatically to whichever display currency is selected.
- Custom favicon with personal branding
Claude looked up the favicon from mariatta.ca on GitHub, then designed a new one combining the "M" monogram with a Portuguese flag diagonal split — green and red — to represent both Mariatta's personal brand and the Portugal trip.
v1.0
April 2026 Initial release- Shift the dates
The initial itinerary had arrival in Porto on August 21. The first prompt changed the arrival to August 22, and Claude shifted every date across all three cities — Porto, Lisbon, and Aveiro — including individual day dates, transport dates, and the overview page.
- Add an anniversary restaurant
September 3 is our 20th wedding anniversary. Claude searched for fine dining restaurants in Aveiro suitable for the occasion, recommended Salpoente (Michelin-recognised, in a converted salt warehouse), and added it to both the itinerary and the restaurant list.
- Add PyCon Portugal
PyCon Portugal takes place September 3–4 in Aveiro. Claude added two conference days to the itinerary, updated the return-to-Porto schedule, added a departure day (Sep 5), and adjusted the total trip length from 13 to 14 nights across all pages.
- Add maps and links to all places
Claude added website URLs and Google Maps links to every activity across all three cities. This involved updating the Activity type to support optional
urlandmapUrlfields, updating the DayCard component to render clickable link buttons, and adding links to approximately 40+ activities. - Add overview maps
Each city page got an interactive map (using Leaflet and OpenStreetMap) showing all attractions, hotels, and restaurants as color-coded pins. Claude created a reusable MapSection component, added a MapPoint type, and populated coordinates for every point of interest across all three cities.
- Expand the travel tips
The original overview page had 6 brief tips. Claude expanded this into 4 categorized sections (Money & Payments, Weather & Packing, Getting Around, Practical Tips) with 19 detailed tips covering currency, tipping culture, what to pack, inter-city trains, public transit cards, rideshare apps, power adapters, language, and health/safety.
- Adjust the return schedule
The original plan had an evening return to Porto on Sep 4. A prompt changed this to a morning return on Sep 5, which meant updating the transport info, restructuring the last two days of the itinerary, and removing the need for an overnight in Porto.
- Add ice cream selfie spots
A personal tradition: taking ice cream selfies at tech conferences. Claude researched gelato shops in Aveiro and added suggestions to both PyCon days — Gelados de Portugal (with Portuguese-inspired flavours like ovos moles) and Gelataria Italiana.
- Build a planning checklist
Rather than building a separate Python backend (which was discussed and rejected as over-engineering), Claude built a checklist page within the existing Astro site. It has 8 categories and 48 items covering flights, accommodation, documents, PyCon registration, activity bookings, packing, and pre-departure tasks. Progress is tracked with checkboxes persisted in localStorage, with a progress bar and per-category completion counts.
- Portuguese color theme
The color palette was updated to reflect the Portuguese flag — green, red, and yellow accents throughout the site, from the navigation active states to rating stars, section labels, progress bars, and the hero gradient.
- Add an About page
This page — explaining what the site is, how it was made, and the prompts used to build it.