Apparently, zero of the imagineers building this Disneyland Paris cafe conceived that “Chuck Wagon” sounds like what a cowboy would call a wheeled vomit trough. 😂
Tag: travel
Contactless Transport in London vs Paris
Paris’s public transport tickets suck… for now!
In his blog post yesterday, Terence Eden observed that of all the cities he’s travelled to over the last year, Paris had the most-ridiculously-unhelpful public transport ticketing system:
Fuck Paris. The only way to buy a metro ticket is to download an app. Fair enough. But, after downloading the app it tells you to install another app!
![]()
What the actual fuck? A convoluted, messy, and frustrating situation which has resulted in awful reviews for them.
Trains and metro travel require separate tickets at different prices. You can’t easily hop from one to another. You need to think carefully about the route you’re taking. A more convoluted route may be significantly cheaper because it doesn’t involve swapping between services.
This absolutely parallels my experience of hopping around the Paris’s metro area, last time I was there.
I was interested to hear, though, that by 2030 virtually all of Paris’s public transport will accept contactless payment, bringing its convenience level to a similar level to that of London. Cool.1
From the sounds of things, this is clearly designed as a convenience for visitors to the city, not regulars and locals:
Dès le 30 juin 2026, les touristes et les voyageurs hyperoccasionnels pourront opter pour valider leur titre en sortie de l’aéroport d’Orly sur la ligne 14 avec la carte bancaire.2
Paris’s relationship with tourists is different from London’s
But the bit that surprised me is Paris’s pricing for the parts they’ve deployed so far:
Les prix des titres de transport via les bornes d’achat sont les suivants :
- Bus/tram/funiculaire : 2,55 € (soit + 0,50 € sur le prix classique) ;
- Métro/train/RER : 3,35 € (soit + 0,80 € sur le prix classique) ;
- Aéroports : 14,80 € (soit + 0,80 € sur le prix classique).
Buying transport tickets in Paris using a contactless card… costs 0.50 € to 0.80 € more. Paris will charge you for the convenience of tapping in and out with your carte bancaire.
Contactless is clearly more-convenient for city visitors, but I think the difference between London and Paris’s attitude to it says something about the relationship both cities have with their tourists. In London, most travellers can use whatever bank card and mobile wallet they’ve already got… and they’ll get as good a deal as possible. But in Paris, doing the same will invariably cost more than a conventional ticket would. You pay a convenience-tax.
Both cities get tens of millions of annual visitors and extract billions of euros worth of financial benefit from their tourist economies. Paris doing slightly better overall, but they’re closely-comparable enough that differences like this probably mean something.
I’m not saying that London loves tourists and Paris hates them! It’s not so simple as that. But I think perhaps the cites try to present themselves in a different way.
London’s public transport says: we’ll work around you. You can learn the rules as you go; you don’t have to “learn London” to get around. Just use your usual contactless card wherever you go; we’ll work out the details, and your daily cost will get capped just the same as if you chose to pick up an Oyster card. Visiting the city as a tourist is an ordinary use-case for the transport network.
Paris’s public transport says: you should learn the rules. You’re welcome to visit, but you either need to do the work to be a “temporary Parisian”… or you can just use your usual contactless card but we’ll charge you a premium for the convenience. Visiting the city as a tourist is a special case that the transport network sees differently from being a local.
Neither approach is “wrong”… but I think it’s interesting. And now I’m wondering what the approach is like across other European cities.
Footnotes
1 I’ll almost-certainly have to tackle the current-generation of Paris’s public transport at some point before then, but I’ll look forward to the improved version once it rolls-out.
2 “From 30 June 2026, tourists and hyper-ocassional travellers will be able to pay by bank card on Line 14 out of Orly Airport.” Emphasis mine.
The secret API I used to tell LeShuttle about different outbound and return passengers
I’ve got an upcoming trip to France: I’ll be driving there through the Channel Tunnel, via LeShuttle. But owing to a quirk in our family travel arrangements, we’ve have a slightly different set of passengers in the car for the outbound leg than for the return journey.
LeShuttle’s broken website
This is something that LeShuttle’s Advance Passenger Information registration form ought to be able to handle… but it very-much can’t.
I was able to provide all of the personal and passport details of everybody on the outbound leg, but un-checking the “Return passenger information is the same” checkbox did… nothing. In fact, when saving the form and logging in again, the checkbox would be automatically re-checked.1
This is the point at which a normal person would either:
- Add the details of all passengers, both outbound and returning, to the form, and just hope they can sort out the confusion at the terminal, or,
- Try to get hold of a human Help Centre/Contact Us system (good luck!) who can sort it out.
Fortunately, I am not a normal person. I… am a software security engineer.
API reverse-engineering
My browser debug tools quickly indicated how this entire process works, and gave a clue as to what was broken in LeShuttle’s systems.
- When you log in, it makes a
POSTrequest tohttps://nextus-api-prod.leshuttle.com/b2c-api/GuestApi/Read?bookRef=...&surname=..., including your booking reference and surname (which acts as your password) in the relevant parameters. - This returns all of your details in a JSON document. Prettified, and with all of the actual data replaced with explanatory comments, it looks something like this:
{
"loginDetails": {
/* credentials you used and other metadata */
},
"bookingDetails": {
"outboundTravelDetails": {
/* details about your outbound train and vehicle */
},
"returnTravelDetails": {
/* details about your return train and vehicle */
},
"leadName": {
/* details of the person who booked the trip */
},
"outboundPaxDetails": {
/* For the outbound journey: */
"paxLine": [
/* First passenger: */
{
"paxDets": {
/* - name, nationality, gender, DOB */
},
"docDets": {
/* - passort number, expiry, issuing country */
}
},
/* Second passenger: */
{
/* ... and so on .... */
},
],
/* Total number of passengers: */
"noOfPax": "4"
},
"returnPaxDetails": {
/* For the return journey: */
"paxLine": [
/* ... each passenger: same format as outbound... */
],
/* Total number of passengers: */
"noOfPax": "5"
},
"storedPaxDetails": {
/* Pre-saved details? All blank for me */
},
/* More metadata */
},
"status": {
/* Yet more metadata */
},
/* Even more metadata */
}
- Once you’ve made some changes, you press “Save”. This triggers a
POSTrequest tohttps://nextus-api-prod.leshuttle.com/b2c-api/GuestApi/SavewithContent-Type: application/jsonand the entire JSON document from before, with your modifications, passed back.2
If you’re a programmer, you’re probably already making a guess as to what the underlying problem is. And you’re probably right:
- The “Return passenger information is the same” checkbox value is not stored in the data that gets passed back and forth.
- Instead, it’s derived by looking at the outbound and return passenger information. If it matches, it gets checked.
- If it’s initially checked… the form doesn’t bother loading the UI that allows return passenger details to be modified.
- But… this means that it never loads that UI:
- the first time you visit the page the passenger list is empty both ways, which matches: anything you enter will necessarily be recorded into both the outbound and return fields, so
- the next time you visit, it also matches… so it still doesn’t load the fields,
- and so on.3
“Fixing” the problem
Knowing how the API worked, I was able to simply take the JSON document from the /Read endpoint, modify it so that the outboundPaxDetails and
returnPaxDetails each contained the correct details for that leg of the journey (being sure also to update the total number of passengers noOfPax, which is for
some reason a stored value rather than a derived one), and then submit it back via the /Save endpoint.
Having done this, I hit the /Read endpoint again to confirm that the data had, indeed, retained the data I submitted. When logging in again to the Web interface, I noticed
that the checkbox now doesn’t automatically check itself. The correct data gets passed back and forth4.
Obviously LeShuttle need to fix their damn site. But at least – thanks to a little API reverse-engineering – I was able to submit the details they wanted from us.
Footnotes
1 Before anybody asks: yes, I tried all of the obvious things like using different browsers, clearing caches, disabling plugins, etc. I even had another passenger, using a different computer and operating system, give it a go. This one’s definitely a bug in LeShuttle’s systems.
2 I choose to assume that they’re doing some kind of server-side validation to ensure that a customer can’t, for example, modify details they’re not permitted to without a charge, such as which train they’re booked onto or the registration plate of the vehicle they’re bringing. But obviously I haven’t tested this, because it’s not among the information that I’m authorised to modify. Ethical hackers get permission before they poke at things they’re not sure whether they’re supposed to… especially if it’s a travel-related system and they’re somebody who has an unusual name that routinely gets them stopped and questioned at the UK border in general. 🤭
3 It occurs to me that possibly LeShuttle provide access to the relevant form only after the outbound journey has been made? Which would be a terrible design for the system and would represent terrible UI (why provide the checkbox if it doesn’t do anything?). I decided not to chance that this could be the expected approach, though, and just “fixed” the data up-front.
4 I haven’t tried modifying any of the outbound details to see if this re-breaks the return details. I suspect it would be fine, based on my analysis that the bug exists only in the front-end. But I can’t be sure without testing, and proper testing is something that LeShuttle’s own techies are getting paid to do. I don’t care enough about their website to do it for free!
Food divided by Distance
I was pretty ill yesterday. It’s probably a combination of post-flood stress and my shitty lungs’ ability to take a sore throat and turn it into something that leaves me lying in bed and groaning.
I spent most of the morning in and out of a fitful sleep, during which I dreamed up the most-bizarre application: a GPS tracker app that, after being told your destination and what you were eating, reported your journey progress to social media by describing where you were going and how much of your food was left1.
I should be clear that in the dream, I wasn’t the one that invented this concept; in fact, I didn’t even understand it at first (maybe I still don’t!). In the dream I was at some kind of unconference event with a variety of “make art with the Web” types, and I missed a session by falling asleep2. I woke (within the dream) right before the session ended and rushed in to see what was being presented, and only got the tail-end of the explanation of how a project – this project – worked, after which I felt rushed to try to understand it before somebody inevitably tried to talk to me about it.
But it could work, couldn’t it? If you’re one of those people who routinely tracks and shares their location (like Aaron Parecki, whose heatmapping inspired my own) or journeys (like Jeremy Keith does), it’s a way to add a bit of silliness to that sharing.
I’m probably not going to implement this. It is, in the end, the kind of stupidity that could (should?) only appear in the dreams of somebody who’s got a bad head cold.
But if you manage to take this idea and turn it into something… actually good?… let me know!
Or if you’ve just got a cool, “Web 2.0-ey” idea for the name of an app that tracks both your journey progress and your meal consumption, I’d love to hear that too.
Footnotes
1 Under the assumption that its consumption would be evenly distributed throughout the journey. Because everybody does that, right? Counting the number of steps they make before taking another equal-sized bite. Right?
2 Even in my dreams, I can dream of falling asleep. And, sometimes, of dreaming. A fever probably helps.
F-Day plus 12
It’s now twelve days since a flood struck my house, causing the ground floor to be submerged under a couple of feet of water and ultimately leading us to kick off an insurance claim process.
And man, a home insurance claim seems to be… slow. For instance, we originally couldn’t even get anybody out to visit us until F-day plus 10 (later improved to F-day plus 7). The insurance company can’t promise that they’ll confirm that they’ll “accept liability” (agree to start paying for anything) until possibly as late as F-day plus 17. Nobody will check for structural damage until F-day plus 191.
Oh, and the insurance company have advised us to look for something like a “12 month let with a 6 month break clause”, which is horrifying. We could be out of our home for up to a year.
Some days it feels like being stuck in a nowhere-place… but simultaneously still having to make the regular everyday stuff keep ticking over. Visiting the house- currently stripped of anything damp and full of drying equipment – feels like stepping onto another planet… or like one of those dreams where you’re somewhere familiar except it’s wrong somehow.
But spending time away from it, “as if” on holiday except-not, is weird too: like we’re accepting the ambiguity; leaning-in to limbo. Especially while we’re waiting for the insurance company to do their initial things, it feels like life is both on hold, and not-allowed to be on hold.
And I worry that by the time they’re committed to paying for us to stay somewhere else for at least half a year, they lose any incentive they might have to contract for speed. There’s no hurry any more. We’re expected to just press pause on our home, but carry on with our lives regardless, pretending that everything’s normal.
So yeah, it’s a weird time.
Footnotes
1 I’m totally committed to this way of counting the progress, which I started on F-day plus 3. I get the feeling like it might be a worthwhile way of keeping track of how long all of this takes.
2 Normally, the younger and older child are able to get to school on foot or via a bus that stops virtually outside our house, each day, so an hour-plus round-trip to their schools and back up to twice a day is a bit of a drag! We’re managing to make it work with a little creativity, but I wouldn’t want to make it a long-term plan!
3 And do some work from there, amidst the jet engine-like noise of the dehumidifiers!
Sky potholes
Amusing announcement from the captain of my plane out of Tenerife South this afternoon. In place of the usual recommendation to keep your seatbelt fastened while seated in case of turbulence, he advised that there was a “risk of potholes”.
I’m sure the analogy makes sense to the Brits aboard, but I hope it translated well for the Spanish speakers on this plane!
Dan Q found GC45BDD Mirador La Paz
This checkin to GC45BDD Mirador La Paz reflects a geocaching.com log entry. See more of Dan's cache logs.
My partner Ruth and I are staying at the Meliá hotel down in the city, from which amazingly I was able to get a WiFi connection despite the considerable distance!
As others have observed, the hint is misleading for this cache. Substitute the word “right” in place of the word “left” and the hint makes more sense!
SL, TFTC! And thanks for the great view!
Dan Q found GC9PMF7 Crossing the street
This checkin to GC9PMF7 Crossing the street reflects a geocaching.com log entry. See more of Dan's cache logs.
QEF while on the way down from Taoro Park with Ruth. SL, TFTC!
Dan Q did not find GC1PYFN Parque Taoro
This checkin to GC1PYFN Parque Taoro reflects a geocaching.com log entry. See more of Dan's cache logs.
Ruth and I made several attempts today without success: a muggle was sat nearby in such a way that access to the GZ was obstructed. We took a walk to the nearby Anglican church – whose architecture, if you ignore the volcanic rock, is uncannily like that of Anglican churches in the UK – but then we returned the muggle had very much set up camp and was going nowhere. We attempted to find a way to the cache from the opposite side without luck, and eventually had to give up. 😔
Dan Q found GC9MCDM The Queen Of Mystery
This checkin to GC9MCDM The Queen Of Mystery reflects a geocaching.com log entry. See more of Dan's cache logs.
After solving the riddle yesterday, my partner Ruth and I came up from the seafront to find this cache today. What a delightful spot to hide the cache, and what a wonderful puzzle (and spot of local literary history) with which to bring us here.
SL, FP awarded. Greetings from Oxfordshire, UK. TFTC!
Without Bloganuary
In January 2024 I participated in Bloganuary, a “write a blog post every day for a month” challenge organised by Automattic. I wasn’t 100% impressed by the prompts made available and was – as an employee of Automattic – shuffling towards trying to help make them better in a future year. To be part of the solution!
I didn’t participate in January 2025, because I was on sabbatical and – as well as it feeling a little “close” to work! – Bloganuary intersected with a winter-sun trip to Trinidad & Tobago, where – despite a state of emergency being declared – Ruth and I unlocked a geohashing graticule, experienced small-world serendipity, and generally explored beautiful and remote places.1
Of course, two significant things changed since then:
- As part of a sweeping range of redundancies, I was let go from my position at Automattic2, and
- Automattic ceased running Bloganuary: I’m guessing that the folks responsible for making it happen were among the many that Automattic decided to axe, or else their shifting priorities – reflected by their waves of layoffs – are no longer compatible with providing that service to bloggers.
Ah well, I figured. I’d just do my own thing. I can write something for every day in January 2026, can’t I?
Generating a chart...
If this message doesn't go away, the JavaScript that makes this magic work probably isn't doing its job right: please tell Dan so he can fix it.
Turns out that yes, I can. 53 posts over 31 consecutive days, so far this year. This year might be my fastest run at 100 Days To Offload yet.
In general, I suppose I’ve been blogging more-frequently lately. Why is that? I guess it’s been a realisation that a blog post doesn’t always have to be polished to perfection. I still write long-form posts which require research and planning, like setting up a network of Windows 3.x VMs just to get screenshots of what programming then looked like or making that podcast episode with the music in it… but I’m also feeling more-free to just express myself in the moment. To share things I see that look interesting or funny or pretty, or just whatever I’m thinking. I’ve been using “kinds” to categorise my posts so it’s easy for people to avoid my more-inane stuff if they like, but that’s a secondary consideration because ultimately… I blog for me.
I’ve also been trying to make blogging more social. Over the last year I’ve made an effort to (visibly) “follow” more personal bloggers and correspond with them (including in new – by which I mean old – ways like exchanging postcards!).
Anyway… all of which is to say that I’ve been writing more and I’ve been loving it. The best way to read more of what I’m writing, if you’d like to, remains: by subscribing via RSS.
But regardless of how and why you’ve come to find this post – thanks for dropping be: drop me a message and say hi and let’s be friends.
Footnotes
1 I’d anticipated having a lack of Internet access, but in fact 4G was widespread throughout both islands and overall I managed to post something on every day except three in January 2025.
2 Based on friends I’ve spoken to, there seem to have been a lot more folks let go since; the company seems to be shrinking quite a lot, which might go some way to explaining my second observation too.
Dan Q found GC9PVXZ EL CRÁTER DE LA RAMBLETA
This checkin to GC9PVXZ EL CRÁTER DE LA RAMBLETA reflects a geocaching.com log entry. See more of Dan's cache logs.
My partner Ruth and I were disappointed not to be able to hike any of the trails up here today – they’re all closed – but enjoyed finding both the nearby Virtual and this Earthcache geocaches. The evidence of lava flows (that remain to this day!) are really quite impressive.
Dan Q found GC9P71A El tEidE
This checkin to GC9P71A El tEidE reflects a geocaching.com log entry. See more of Dan's cache logs.
My partner Ruth and I are spending a long weekend in Puerto de la Cruz. We loved coming up to see this beautiful, bleak, stark volcanic landscape.
TFTC!
Hollandaise Sauce
If I’m on holiday and a hotel offers me eggs benedict for breakfast, I’ll almost always order it. But I’d never make it at home.
I tell myself that this is because hollandaise sauce is notoriously easy to mess up. That I don’t want to go through the learning process only to make something inferior to what I eat as a holiday treat.
But maybe it’s just that my brain wants to keep eggs benedict as a signifier that I’m on holiday. That I can unplug from the world, stop thinking about work, and enjoy a leisurely breakfast with some creamy eggs and a long black coffee.
Maybe eggs benedict just has to remain “holiday food”, for me.
Airborne RSS
RSS readers rock. Having a single place you connect for a low-bandwidth bundle of everything you might want to read means it doesn’t matter how slow the WiFi is on your aeroplane, you can get all the text content in one tap.
(I’m using Capy Reader to connect to FreshRSS, by the way.)
Time to catch up on some news, blogs, etc.!




