21 KiB
Personal Data YAML Formats
This document describes the YAML files read from ../personal-data/. It is intended for humans and LLMs generating new entries.
General Rules
- Use YAML lists for most files.
airports.yamlis a mapping keyed by IATA code. - Use ISO-like YAML dates and datetimes:
- Date:
2026-03-14 - Datetime with timezone:
2026-03-14 09:30:00+01:00
- Date:
- Use lowercase ISO 3166-1 alpha-2 country codes, for example
gb,be,us. - Use quoted strings for prices and identifiers that might otherwise be parsed as numbers:
'154.34','06525269','0042'. - Currencies must be in
config.CURRENCIESorGBP. - Travel and trip-related entries are grouped by the
tripdate. That date should match an entry intrips.yamlwhen a named trip is needed, but trip groups can also be created from travel/accommodation/conference entries. - Keep chronological files sorted by their natural start field.
validate_yaml.pychecks ordering for trips, flights, trains, ferries, conferences, and accommodation. - Coordinates are
latitudethenlongitude, both numeric.
Cross-File References
flights.yamlflightairlinevalues referenceairlines.yamliata.flights.yamlflightfromandtovalues referenceairports.yamlkeys.trains.yamljourney and legfromandtovalues referencestations.yamlname.ferries.yamlfromandtovalues referenceferry_terminals.yamlname.buses.yamlfromandtovalues referencebus_stops.yamlname.coaches.yamlfromandtovalues referencecoach_stations.yamlname.- Station, stop, and terminal
routesvalues name GeoJSON files without the.geojsonextension.
accommodation.yaml
Top-level shape: list of accommodation stays.
Used by: agenda events, trip pages, trip maps, busy/location logic.
Required fields:
type: accommodation category such ashotel,apartment,airbnb.name: property name.country: lowercase country code.location: city or place name.trip: trip start date.from: check-in datetime.to: check-out datetime.
Common optional fields:
- Booking:
operator,booking_reference,confirmation_code,booking_url,url,email,phone. - Money:
price,currency,room_rate,estimated_taxes,estimated_additional_fees. - Room/stay:
address,room_type,room_name,room_number,number_of_adults,breakfast_included,breakfast,cancellation_policy,free_cancellation,refundable. - Coordinates/IDs:
latitude,longitude,timezone,osm_node,wikidata. - Loyalty:
rewards,radisson_rewards_number.
Example:
- type: hotel
operator: Example Hotels
name: Example Central Hotel
location: Brussels
country: be
trip: 2026-02-06
from: 2026-02-06 15:00:00+01:00
to: 2026-02-09 11:00:00+01:00
address: 1 Example Street, Brussels
confirmation_code: ABC123
price: '312.50'
currency: EUR
number_of_adults: 1
room_type: Standard double
breakfast_included: true
latitude: 50.8466
longitude: 4.3528
airlines.yaml
Top-level shape: list of airlines.
Used by: flight loading and display.
Required fields:
iata: two-character IATA airline code.icao: three-character ICAO airline code.name: airline name.
Optional fields:
flight_number_prefer_icao: boolean. When true, display flight numbers with the ICAO code instead of the IATA code.
Example:
- iata: BA
icao: BAW
name: British Airways
- iata: U2
icao: EZY
name: easyJet
flight_number_prefer_icao: true
airports.yaml
Top-level shape: mapping keyed by IATA airport code.
Used by: flight loading, distance calculation, maps, unbooked route hints.
Required fields for each airport:
iata: IATA code. Should match the mapping key.name: airport name.city: city or main served place.country: lowercase country code.latitude,longitude: numeric coordinates.qid: Wikidata QID.
Optional fields:
alt_name: display name override used in labels.elevation: metres.website,url.
Example:
BRU:
iata: BRU
name: Brussels Airport
city: Brussels
country: be
qid: Q220613
latitude: 50.9014
longitude: 4.4844
elevation: 56
website: https://www.brusselsairport.be/
bus_stops.yaml
Top-level shape: list of bus stops.
Used by: bus trip loading, maps, route rendering.
Required fields:
name: stop name referenced bybuses.yaml.city: city or place.country: lowercase country code.latitude,longitude: numeric coordinates.routes: mapping from destination stop name to GeoJSON filename without.geojson.
Optional fields:
Atco: UK ATCO stop code.osm_node.
Example:
- name: West Street
city: Bristol
country: gb
Atco: '0100BRA10073'
osm_node: 485403178
latitude: 51.4393854
longitude: -2.6017977
routes:
Bristol Airport: West_Street_to_Bristol_Airport
buses.yaml
Top-level shape: list of bus journeys.
Used by: trip loading, maps, trip timeline. Bus journeys are not counted for Schengen tracking.
Required fields:
trip: trip start date.depart: departure datetime.arrive: arrival datetime.validate_yaml.pyrequires arrival after departure and duration no more than 12 hours.from,to: names frombus_stops.yaml.
Optional fields:
operator,price,currency.
Example:
- trip: 2026-03-14
depart: 2026-03-14 08:20:00+00:00
arrive: 2026-03-14 08:55:00+00:00
from: West Street
to: Bristol Airport
operator: First Bus
price: '2.00'
currency: GBP
coach_stations.yaml
Top-level shape: list of coach stations.
Used by: coach trip loading, maps, route rendering.
Fields are the same pattern as bus_stops.yaml, except entries describe coach stations.
Example:
- name: Example Coach Station
city: Example City
country: gb
latitude: 51.4500
longitude: -2.5800
routes:
Other Coach Station: example_city_to_other_city
coaches.yaml
Top-level shape: list of coach journeys.
Used by: trip loading, maps, trip timeline. Coach journeys are not counted for Schengen tracking.
Required fields:
trip,depart,arrive,from,to.fromandtomust be names fromcoach_stations.yaml.
Optional fields:
operator,class,booking_reference,price,currency,price_details.
Example:
- booking_reference: ABC123
trip: 2026-05-25
price: '55.00'
currency: GBP
depart: 2026-05-26 14:45:00+01:00
arrive: 2026-05-26 18:30:00+01:00
from: Example Coach Station
to: Other Coach Station
operator: Example Coaches
class: Standard
price_details:
base_fare: '55.00'
conferences.yaml
Top-level shape: list of conferences and conference-like events.
Used by: agenda events, trip pages, trip maps, conference list, CFP reminders.
Required fields:
name: event name.topic: topic/category.location: city or location label.- Date information, either as legacy top-level
startandend, or preferred nesteddates.
Preferred dates fields:
status: one ofexact,tentative, orapproximate.- For
exactandtentative:startandenddates/datetimes.endmust be no earlier thanstart, and duration must be under 20 days. - For
approximate:earliestandlatestdates for sorting/past-future filtering. label: optional human-readable date text. Recommended fortentativeandapproximate, for examplelikely first weekend of February 2027orMarch 2027.basis: optional explanation of why a tentative date is expected.
Date status behavior:
exact: confirmed dates. These create agenda events, iCalendar entries, and timeline bars.tentative: guessed or unconfirmed exact dates. These appear on the conference list with a status badge, but do not create agenda/iCalendar events or timeline bars.approximate: only a broad date range is known. These appear on the conference list with a status badge, but do not create agenda/iCalendar events or timeline bars.
Legacy fields:
- Existing top-level
startandendare still supported and are treated asexactunlessdate_statussays otherwise.
Common optional fields:
- Series:
series, a key fromconference_series.yaml. - Trip/location:
trip,country,venue,address,latitude,longitude. - Attendance:
going,registered,speaking,online,accommodation_booked,transport_booked. - Partial attendance:
attend_start,attend_end. These may be dates or timezone-aware datetimes and are used on trip pages instead of official dates. - Web/CFP:
url,cfp_end,cfp_url,hashtag,description. - Money/tickets:
free,price,currency,ticket_type. - Other flags:
hackathon,attendees.
Exact example:
- name: FOSDEM
series: fosdem
topic: FOSDEM
location: Brussels
country: be
trip: 2026-02-06
dates:
status: exact
start: 2026-02-07
end: 2026-02-08
attend_start: 2026-02-07 14:00:00+01:00
attend_end: 2026-02-08
going: true
registered: true
accommodation_booked: true
transport_booked: true
url: https://fosdem.org/2026/
venue: Universite Libre de Bruxelles
address: Av. Franklin Roosevelt 50, 1050 Bruxelles, Belgium
latitude: 50.8132
longitude: 4.3822
Tentative example:
- name: FOSDEM
series: fosdem
topic: FOSDEM
location: Brussels
country: be
dates:
status: tentative
start: 2027-01-30
end: 2027-01-31
label: likely first weekend of February 2027
basis: FOSDEM is usually on the weekend where Sunday is the first Sunday in February
url: https://fosdem.org/2027/
Approximate examples:
- name: Wikimedia Hackathon 2027
series: wikimedia-hackathon
topic: Wikimedia
location: Albania
country: al
dates:
status: approximate
label: mid-April 2027
earliest: 2027-04-11
latest: 2027-04-20
hackathon: true
- name: PyCascades 2027
series: pycascades
topic: Python
location: TBC
dates:
status: approximate
label: March 2027
earliest: 2027-03-01
latest: 2027-03-31
conference_series.yaml
Top-level shape: mapping from stable series ID to series metadata.
Used by: conference list pages, conference series index/detail pages, and validation of conferences.yaml series references.
Required fields for each series:
name: display name for the series.
Common optional fields:
topic: default topic/category.cadence: for exampleannualorrecurring.usual_location: common city/place when the event usually stays in one place.country: common lowercase country code when stable.url: series homepage.notes: free-text generation or scheduling notes.
Example:
fosdem:
name: FOSDEM
topic: FOSDEM
cadence: annual
usual_location: Brussels
country: be
url: https://fosdem.org/
notes: Usually the weekend where Sunday is the first Sunday in February.
geomob-london:
name: Geomob London
topic: Maps
cadence: recurring
usual_location: London
country: gb
url: https://thegeomob.com/
entities.yaml
Top-level shape: list of people/entities.
Used by: birthday events.
Required fields for birthday support:
name: full name.label: display name.type: for examplehuman.birthday: mapping withday,month, and optionallyyear.
Optional fields:
relation,email.
If birthday.year is omitted, age is shown as unknown.
Example:
- name: Ada Example
label: Ada
type: human
relation: friend
birthday:
day: 10
month: 12
year: 1990
events.yaml
Top-level shape: list of general events.
Used by: agenda events and trip pages.
Required fields:
name: event type.- One date source:
date: single event date/datetime, orstart_date: used for events with a separateend_date, orrrule: recurrence rule string.
Optional fields:
title: display title.end_date: explicit end date/datetime.duration: ISO 8601 duration such asPT2H,P1D.url.- Trip/map fields:
trip,location,country,venue,address,latitude,longitude.
Special cases:
- For
name: travel_insurance, the event date field isend_date; noend_dateis attached to the generated event. - For recurring events, if the
rrulehas noBYHOUR,BYMINUTE, orBYSECOND, generated events are all-day dates. Otherwise generated datetimes are localized to UK time. skip_trips=Trueconsumers ignore entries withtrip.
Examples:
- name: travel_insurance
start_date: 2026-05-04
end_date: 2027-05-03
- name: meetup
title: Example Geo Meetup
date: 2026-06-18 18:30:00+01:00
duration: PT2H
url: https://example.org/meetup
location: Bristol
country: gb
latitude: 51.4545
longitude: -2.5879
- name: market
title: Monthly Example Market
rrule: FREQ=MONTHLY;BYDAY=1SA
ferries.yaml
Top-level shape: list of ferry journeys.
Used by: trip loading, maps, trip timeline, Schengen tracking.
Required fields:
trip: trip start date.depart,arrive: datetimes. Ferryarriveis required.from,to: names fromferry_terminals.yaml.
Common optional fields:
operator,ferry,direction,class,booking_reference,price,currency.price_details: free-form mapping of fare components.vehicle: mapping with fields such astype,registration,height,length,extras.
Example:
- booking_reference: ABC123
trip: 2026-05-04
price: '302.00'
currency: GBP
depart: 2026-05-04 23:00:00+01:00
arrive: 2026-05-05 08:00:00+02:00
from: Portsmouth
to: Cherbourg
operator: Brittany Ferries
class: Commodore cabin
price_details:
base_fare: '153.00'
cabin: '149.00'
vehicle:
type: Example car
registration: AB12CDE
height: 1.63m
length: 4.15m
ferry_terminals.yaml
Top-level shape: list of ferry terminals.
Used by: ferry loading and route rendering.
Required fields:
name: terminal name referenced byferries.yaml.city,country.latitude,longitude.routes: mapping from destination terminal name to GeoJSON filename without.geojson. Ferry route rendering expects a GeoJSON route.
Optional fields:
osm_node,osm_way.
Example:
- name: Portsmouth
city: Portsmouth
country: gb
osm_way: 123456
latitude: 50.8120
longitude: -1.0880
routes:
Cherbourg: portsmouth_cherbourg
flight_destinations.yaml
Top-level shape: list of origin rules for unbooked conference flight route hints.
Used by: trip maps when a trip has conferences but no booked travel.
Required fields:
origin: origin airport IATA code.airline: airline IATA code. Currently loaded for validation/description but not used in origin selection.destinations: list of destination airport IATA codes.
Example:
- origin: BRS
airline: U2
destinations:
- AMS
- BCN
- CDG
flights.yaml
Top-level shape: list of flight bookings. Each booking contains one or more flight legs.
Used by: agenda transport events, trip loading, maps, distance calculation.
Required booking fields:
trip: trip start date.flights: list of flight leg mappings.
Common optional booking fields:
booking_reference,price,currency.
Required flight leg fields:
depart: departure datetime.from,to: airport IATA codes fromairports.yaml.flight_number: numeric/string flight number without airline prefix.airline: airline IATA code fromairlines.yaml.
Common optional flight leg fields:
- Time/location:
arrive,from_terminal,to_terminal,duration. - Seat/cabin:
seat,seat_type,class,cabin. - Aircraft:
plane,registration. - Tracking:
distance,co2_kg,openflights_trip,reason. - Ticket/passenger:
e_ticket_number,ticket_number,frequent_flyer_number,passenger_name,passengers,baggage,payment_details.
validate_yaml.py checks that every booking has trip, all flight airlines exist in airlines.yaml, bookings are sorted by first departure, and currencies are configured. It reports flights missing co2_kg.
Example:
- booking_reference: ABC123
trip: 2026-04-22
price: '62.50'
currency: GBP
flights:
- depart: 2026-04-22 17:20:00+01:00
arrive: 2026-04-22 20:20:00+02:00
from: LHR
to: BRU
flight_number: '1234'
airline: BA
duration: 01:00
seat: 5F
seat_type: W
class: C
cabin: business
plane: Airbus A320
registration: G-ABCD
co2_kg: 154
follow_launches.yaml
Top-level shape: list of SpaceDevs launch slugs.
Used by: no current in-repo reader was found, but the file appears intended as a watch list for launch update tooling.
Example:
- starship-integrated-flight-test-5
- artemis-ii
stations.yaml
Top-level shape: list of railway stations.
Used by: train loading, maps, route rendering.
Required fields:
name: station name referenced bytrains.yaml.country: lowercase country code.latitude,longitude.routes: mapping from destination station name to GeoJSON filename without.geojson.
Common optional fields:
uic,alpha3,wikidata,osm_node.
Note: the code reads routes, not rotues; rotues appears to be a typo in existing data and should not be used for new entries.
Example:
- name: London St Pancras
uic: 7015400
alpha3: STP
wikidata: Q720102
latitude: 51.531921
longitude: -0.126361
country: gb
routes:
Brussels Midi: london_brussels_eurostar
subscriptions.yaml
Top-level shape: list of subscriptions.
Used by: subscription renewal agenda events when renewal_date is present.
Required fields:
name: subscription name.
Common optional fields:
- Dates:
start,start_date,renewal_date. price: mapping withamountandcurrency.term: mapping withdurationandunitorterm_unit.- Account:
email,account_url,account_number.
Only items with renewal_date create agenda events.
Example:
- name: Example Magazine
start_date: 2026-01-01
renewal_date: 2027-01-01
price:
amount: 99
currency: GBP
term:
duration: 1
unit: year
email: me@example.com
account_url: https://example.com/account
account_number: '001234'
trains.yaml
Top-level shape: list of train journeys. Each journey contains one or more legs.
Used by: agenda transport events, trip loading, trip timeline, maps, stats.
Required journey fields:
operator: booking/operator label.from,to: station names fromstations.yaml.trip: trip start date.depart,arrive: journey datetimes or dates.legs: list of leg mappings.
Common optional journey fields:
class,number,tickets,ticket_code,total_price,co2_kg.
Required leg fields:
from,to: station names fromstations.yaml.depart,arrive.operator.
Common optional leg fields:
train,number,service,service_number,service_numbers,reporting_number,mode.- Seat/reservation:
coach,seat,seat_type,seat_features,reservation_number,platform. class,trip,url.
Ticket fields are free-form but commonly include booking_reference, url, price, currency, booking_date, ticket, ticket_code, ticket_type, from, to, class, validity, route, fare, quantity, seat_reservation.
Example:
- operator: eurostar
from: London St Pancras
to: Brussels Midi
trip: 2026-02-06
depart: 2026-02-06 15:04:00+00:00
arrive: 2026-02-06 18:12:00+01:00
class: Standard Premier
tickets:
- booking_reference: ABCDEF
url: https://example.com/booking/ABCDEF
price: '89.00'
currency: GBP
legs:
- from: London St Pancras
to: Brussels Midi
depart: 2026-02-06 15:04:00+00:00
arrive: 2026-02-06 18:12:00+01:00
coach: 1
seat: 41
operator: Eurostar
travel_rewards.yaml
Top-level shape: list of travel loyalty accounts.
Used by: no current in-repo reader was found. The file is structured as account metadata.
Common fields:
name: programme name.type: category such ashotel,airline,rail.member_number: membership identifier.balance: current points/miles balance.expiry: expiry date or null.url: account URL.person: account holder key/name.email,note.
Example:
- name: Example Rewards
type: hotel
member_number: '123456789'
balance: 3665
expiry: 2027-08-15
url: https://example.com/rewards
person: edward
trips.yaml
Top-level shape: list of trip metadata.
Used by: trip grouping and trip titles.
Required fields:
trip: trip start date. This is the grouping key used by travel, accommodation, conferences, and trip events.
Optional fields:
name: explicit trip title.private: boolean. Private trips are hidden from unauthenticated users.
Example:
- trip: 2026-02-06
name: Brussels for FOSDEM
private: false