The Husbands by Holly Gramazio

Cover of The Husbands by Holly Gramazio, with tagline 'you wait ages for The One... then 203 come along at once'. Five-colour poster art shows a woman wearing a sleeveless top, long skirt, and trainers using a hand saw to cut through a ladder which stretches up through the title and at the top of which we can just make out the trousered legs of a man, climbing past a pendant light.I’m still lagging way-behind on writing-up the nonfiction I’ve been reading this year, and I’m long overdue1 to share my love of Holly Gramazio‘s debut novel, The Husbands. Which is excellent; truly un-put-downable. I’d come across Holly’s writing before by playing Dicey Dungeons, but I hadn’t realised that until later when, four chapters into this book, I decided to look her up (in the hope, perhaps, that she’d written any other books I could add to my reading list – the answer is… not yet).

Here’s the skinny. Lauren comes home from a night out to find her husband waiting for her. Which is immediately confusing and concerning, because when she left for the evening, she wasn’t married. But all the evidence suggests that now, somehow, mysteriously, she has a husband: she finds letters addressed to the pair of them, her phone is full of photos of them together going back through their wedding and beyond, and all of her friends back up the fact that she really has made a life with this man… that she just can’t remember.

But the weirder bit she discovers a little later. Whenever her husband goes up into the attic, he’s replaced with a different husband. A different man, it seems, that she could conceivably have married, in some strange alternate timeline. By controlling how and when they do so, she comes to discover that she can cycle through a seemingly-endless supply of husbands, and as she comes to accept and understand her new life, begins to use this as a kind-of… dating superpower? “Trying on” a husband for as many minutes, hours, days, or months it takes to decide whether or not to “keep” him2.

That’s the premise, and it’s perfectly fun (although occasionally dark) – sort of a parody of “swipe-left/swipe-right” modern dating, taken to an extreme – but wouldn’t by itself be reason enough to recommend it. But what comes next is what makes it so special.

Aaand… I feel like I can’t say more without spoiling it. And you really should read it! Suffice to say that the writing is compelling, and engaging, and there are plenty sufficient twists and turns to keep you interested even if you wouldn’t normally go in for… what I’m going to describe as a romantic-comedy. Our protagonist’s situation feels relatable even while it’s unfamiliar, and I enjoyed both laughing at her exploits while also grieving her losses. And again: the surprises and quirks are really fun.

So yeah – you should 100% read this fantastic debut. I loved it so much, and everybody I’ve already recommended it to has agreed with me that it’s a great page-turner. And while you wait for your copy to arrive, why not generate yourself a random husband courtesy of a widget on Gramazio’s website?

Footnotes

1 I think I finished reading it about the same time as Terence Eden, who also gave a rave review, if you’re wondering exactly how far “behind” I am.

2 Needless to say, I found myself thinking of how to apply the Secretary Problem to Lauren’s lifestyle long before it came up in the book!

×

Dan Q found GC93M2N Segsbury Fort

This checkin to GC93M2N Segsbury Fort reflects a geocaching.com log entry. See more of Dan's cache logs.

A challenging but worthwhile find during a walk along and around the Ridgeway.

A windswept and rolling rural landscape, with storm clouds brewing in the distance.

My initial attempt to collect the coordinates was way off because I misinterpreted some of the instructions and it yielded a point almost 2km away! My second attempt looked better, giving a likely-looking spot… but the checksum was out by one!

I triple-checked all the sources and was still out! I was most-confident in my calculated latitude, so I permuted all possible one-point longitude changes that would satisfy the checksum. This yielded two candidates: one a tenth of a minute out from my original calculation, and one a thousandth of a minute out.

The one that was a tenth of a minute out from my calculation “felt wrong”, being way off the path, so I merely glanced its way as I walked past to the other. The one that was a thousandth of a minute – which equates to only around a metre! – looked better, and sure enough when I got there I found a multitude of likely hiding spots.

Standing proud of dense green foliage, and with cropped fields behind, a wooden noticeboard describes the route and features of the Ridgeway.

The hide itself was sneaky too: I had to go further from the path than I expected in order to “look back” and spot the cache – very tricky in the thickening undergrowth! But find it I did, and duly signed the log before returning it to its snug little spot.

TFTC! FP awarded for the adventure.

× ×

Three(ish) Weeks In Spain

Ruth, JTA, the kids and I are all back in the UK1 after a three week period during which some or all of us were consistently in Spain. The whole adventure was the kind of masterpiece of epic planning that only Ruth could have pulled off, and it worked spectacularly2.

A fawn-coloured French Bulldog lies comfortably on a blanket on a sofa, with her tongue sticking out in a large sideways blep.
I wasn’t around for the first week of the trip, but continued working from home (with the dog, pictured) as per the usual.

San Sebastián

Through clever permutations of remote-working from overseas (mostly by Ruth) and overlapping/intersecting stretches of annual leave (mostly by JTA and I), we were able to avoid having to send the dog to the dogsitter for a block of more than a single week3, didn’t need to break the bank on our collective leave budgets, and managed to give the kids the longest possible block of continuous immersion in the language and culture of Spain.

A group of children in wetsuits surf on low waves.
The one time I tried surfing, I wasn’t good at it, but I was reassured that was normal for a first day. The kids disproved that theory, becoming pretty reasonable boarders very quickly.

In the first week (when I wasn’t there), the kids got to take a mixture of surfing classes and Spanish language lessons in San Sebastián, among other activities. The Bordeaux wildfires caused some travel chaos for the others getting there, but they made it work in the end.

Tarragona

Later, I flew out to meet up with them and we switched to the opposite coast of Spain, staying in a delightful little villa North of Tarragona. The summer heatwaves that are affecting the continent made the middle of the day especially oppressive, so we did as the locals do and sensibly sheltered indoors during the hottest part of the day… but the kids in particular were glad to be able to take a dip in the pool to cool off.

Under nearly-cloudless skies and surrounded by trees and olive and grape-laden slopes, a stone villa and its outbuildings sit prominently under the bright sun.
The villa was a lovely building in a fabulous spot, nestled among hillside olive groves and vineyards, but the lack of wired Internet access/WiFi plus the signal-blocking stone walls made it more “disconnected” than we’d anticipated4!

As has become my tradition when travelling and on family holidays – because I’m an earlier riser than most, but also because I wanted to make the most of the coolest part of the day – I got out early most days for a whole bunch of geocaching expeditions5. But once others were awake we found plenty of other opportunities to explore the area.

Wide/panoramic view from a pagoda-like tower, where a woman and two children lean over a railing to look at a network of bridge-linked islands in a lake below, dotted with palm and other trees.
Parc Samà‘s breezy towers and water features took some of the heat out of the day, when we visited its attractive botanic gardens.

Having come from, remarkably, a similar level of temperature and humidity in the UK, I was interested to see how much greener everything was here on the Mediterranean coast. The plants here, better-adapted to hot and dry summers than those that we plant on our little island, were clearly more-suited to these kinds of conditions. Is it perhaps time that Britain started ditching her lawns and other year-round thirsty vegetation… instead planting more tropical-adjacent plants to provide shade (and carbon capture!) as the climate continues to shift?

A freshwater turtle pokes its head out of blue-green water near a rocky shore, with small black fish visible swimming in the depths.
This little fella had the right idea about keeping cool.

I enjoyed that we were able to split out time between a diversity of activities. A week-long jaunt can be dominated by a single activity – a skiing holiday, for example – but by the time you’re spending most of a month exploring a country, you want to be able to mix things up a bit, right?

A Roman aquaduct spans a forested valley.
Per local legend (and in common with many similar spans around the world6, which usually share a myth about the devil aiding in its otherwise-impossible construction in exchange for the first soul to cross it and then being tricked when an animal is sent across first), the Ferreres Aquaduct  is also known as Devil’s Bridge, which lead me to observe that of all the architecture I’ve seen with which Hell’s ruler is credited, this might be the best (nice work, Satan!).

Sometimes we kept it slow-paced and relaxing, like reading by the pool while the children invent splashing-based games or playing board games in the shade. Other times we explored history and culture, like our visit to the Ferreres Aqueduct, the Catedral de Tarragona, or the old Roman amphitheatre.

Two children wearing VR headsets and holding parasols, in the ruins of a restored Roman amphitheatre.
An augmented reality tour of the amphitheatre was both engaging and educational for the kids, bringing to life its long and complex history: did you know it started as an amphitheatre, but later was the ground of a church (commemorating Saint Fructuosus, who was executed there), then became a prison, and now… it’s an amphitheatre again: in addition to being a historical monument it’s used to stage concerts and things!

And other times still we even did the typical “British tourist in Spain” things, like a trip to the beach or an expedition out on a catamaran to swim in the sea while the sun set.

Dan, a white man, drips from a swim in the sea as he stands, holding a plastic cup of white wine, on the deck of a catamaran.
I expected the catamaran trip to be a bit tacky, but it was actually lush. (I may have availed myself of the open bar, a bit!)

Obviously the biggest reason for our trip was to catch sight of the total solar eclipse as it passed over the region, and our villa’s garden/vineyard was without a doubt a superlative spot for this. We’d initially been concerned that visibility of the low-in-the-sky/close to sunset eclipse might be obstructed by the hills and that, therefore, we’d need to find another spot from which to spectate, but an early-in-the-week experiment of watching the sunset (with an eye on the clock) reassured us that this wasn’t the case. So – as long as we were lucky with the cloud cover – we should be set.

Dan sits on a sun lounger on a driveway, alongside a covered brick barbeque building. He's alongside two children doing the same, and all are wearing disposable eclipse glasses.
A particular highlight of the entire trip was hanging out as a family in our private vineyard, watching the solar eclipse.

I’ve been fortunate enough to have had great visibility of a total solar eclipse once before, in 1999, but honestly: this one beat it. The perfect location, the reds of the setting sun, the “moon illusion” exaggerating the perceived size of the moon as it approached the sun, the joy of vicariously sharing in the childrens’ wonder… all of these made the whole experience pretty mind-blowing.

The sun completely occluded by the moon.
You’ve seen pictures of eclipses before, but this one is mine. I maintain that even the good/professional photographs are poor substitutes for the real experience, though!

We watched, we awed, and then we saw the still half-obscured sun gradually disappear over the horizon. And then, a round of hugs and cheers and conversation later, we sat up late to enjoy the Perseids begin their nocturnal display.

Over the silhouette of hills, a total solar eclipse is just coming to an end, with a 'diamond ring' effect resulting from the sun's reappearance visible.
Mostly I was looking at the sky (through the safety of my eclipse glasses, of course). But I managed to snap a handful of photographs that, despite the limitations of my phone’s camera, came out pretty well.

PortAventura

After our week in the villa we delivered JTA to the airport to return home. Then Ruth, the kids and I drove on to PortAventura, perhaps our favourite theme park anywhere in the world. Since our last visit, the younger kid has reached a milestone of height that permits him to ride all of the largest rides, and he was excited to take advantage of this newfound privilege.

A man (Dan), a woman (Ruth), and two children sit in a circular boat on a 'river rapids' style ride.
A particularly useful thing about PortAventura compared to some other theme parks is that it’s designed with heatwaves in mind: it’s got lots of natural shade, cooling-off areas, and the right ratio of water rides for when you positively, absolutely need a good soaking.

Both the elder child and I were particularly excited to share with him my favourite non-looping rollercoaster, Shambhala. Shambhala is simply excellent: it’s a highly-vertical smooth ride with a free and open-feeling restraint that, collectively, give amazing “air” and a sensation of “flying” that’s hard to compare to almost any other coaster ride I’ve been on. I could sing its praises aplenty.

A man with a screwdriver repairs the restraint system on a rollercoaster car.
The second we reached the front of the line for our first ride on Dragon Khan it broke down. But we got to watch it being repaired right in front of us, so that’s cute!

Going to Disneyland Paris and PortAventura in the same summer gives me the confidence to say: PortAventura is the better theme park. The rides, the theming, the food, the queue management, the accommodation, the value-for-money… it’s all better. So if  you’re considering a European theme park trip and you don’t care about getting your photo taken with Goofy or whatever… PortAventura would be my suggestion.

PortAventura’s water park is good too, although it was pretty busy on the day we went. Their 30-metre tall near-vertical waterslide King Khajuna is a little intimidating7, but nothing our thrillseeking little man wasn’t up for.

Barcelona

Finally, we made our way to Barcelona for a “wind-down” couple of days at a hotel we’ve always enjoyed there. Aside for being mistaken for staff while I was using my laptop by the rooftop pool, there’s little of note to say about it: we took it easy, did as little as we could get away with, and generally “unplugged” before our journey back to the UK and a return to normal life (boo!).

Altogether a fabulous trip… and a really interesting experiment in a model that we could replicate if we ever opted for a three week (but drop-in/drop-out/telework) holiday in future. Though… I’d again want (our scheduling queen) Ruth to wrangle the logistics, because it gets complicated when there are so many moving parts!

Footnotes

1 Although not in our house, of course, which is still being repaired following the flood in February; it’s now F-Day plus 191 days… more on that in a future blog post, I’ve no doubt.

2 For a while, she was talking about trying to engineer it into a five-week expedition spanning both this and our trip to France earlier in the summer (to which JTA, the kids and I drove/LeShuttle’d, and to which Ruth flew following a work-related event in Austria: my, what a cosmopolitan life we’re leading this year!). But that’d have been an enormously more-complicated affair and I’m glad we settled on this “simpler” trip in the end!

3 Not that she cares: the dog loves hanging out with her little doggy friends, and is always excited to be taken to our dogsitter‘s, where she also “commutes” for a workday or two most weeks.

4 During out post-holiday ‘retro’ (because of course that’s what we do), the lack of connectivity appeared as both a negative and a positive on some of our lists! Obviously we’re all aware that a little digital disconnection is healthy and valuable, but sometimes it takes being in the middle of nowhere to impose the requisite self-discipline to keep off your devices!

5 Geocaching logs: 1, 2, 3, 4, 5, 6, 7, 8, 9 (my 1000th successful find)not that Geocaching.com can count that correctly!10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37.

6 Obviously, the Devil’s Bridge nearest where I used to live and at which Ruth and I spent our first anniversary – back when we had no idea that we’d be able to make our relationship last… what…? 19 years this month!) – will always have a special place in my heart.

7 Reaching the top of King Khajuna’s tower, you can feel it swap in the breeze, and when you get to the slide itself its ‘horizon’ disappears precipitously until you shuffle completely up to it, at which point there’s little choice about your destination! While we queued for our first goes, we witnessed several people reach the top, change their minds, and turn back!

× × × × × × × × × × × × ×

Dan Q found GCB0EGT Passejant amb la Boira – Un altre túnel?

This checkin to GCB0EGT Passejant amb la Boira - Un altre túnel? reflects a geocaching.com log entry. See more of Dan's cache logs.

Found in the fourth place I looked. Nice container size, like the last letterbox hybrid.

This is where we’ll part ways. As much as I’ve loved this series so far and would enjoy exploring more of it, I need to get back to my accommodation where, apparently, my kids are waking up and ready for another fun day. So I’ll be switching to the Més enllà de la via II trail and finishing my walk soon FP awarded for this series as a whole; I’ve loved every moment of it (even that one frustrating cache from a few minutes back!).

TFTC, and if you the CO ever find yourself over my way, can I plug my cache GC9GTV3 Drive Slowly; Fox Crossing. It’s 100% the kind of hide you’d enjoy based on what I’ve seen of your work here!

Dan Q found GCB7V16 Bye bye, arreveure!

This checkin to GCB7V16 Bye bye, arreveure! reflects a geocaching.com log entry. See more of Dan's cache logs.

My family and I are on holiday, staying a couple of villages away. I came out this morning to see if I could find a couple of local caches before the day’s activities. This was the first.

A great container in good condition. I love it when a cache can be hidden “in sight”. FP awarded. SL, TFTC, and greetings from Oxfordshire, UK!

Dan Q found GC8ZYPV AMAGATALL MAS CARGOL – Camps

This checkin to GC8ZYPV AMAGATALL MAS CARGOL - Camps reflects a geocaching.com log entry. See more of Dan's cache logs.

I’ve been doing what remains of the Ruta Pels Volants del Mars De Salort series of took a diversion to find this cache. The impressive host didn’t need a hint – she’s pretty easy to find!

The cache container is absolutely excellent. Amazing camouflage! It’s a shame this is my 1001st find and not my 1000th because I’d have loved to make this great container my milestone! FP awarded.

Dan waves in a bright forest.

Signed log and returned to its hiding place. TFTC/GPA, and greetings from Oxfordshire, UK!

×

Dan Q found GC6QV1F #17 RUTA PELS VOLTANTS DEL MAS DE SALORT

This checkin to GC6QV1F #17 RUTA PELS VOLTANTS DEL MAS DE SALORT reflects a geocaching.com log entry. See more of Dan's cache logs.

A quick and easy find in a now-familiar hide and container format.

And while perhaps not as memorable as my walk through the abandoned olive groves to find the damaged cache GC6QTTM therein, this find was memorable fire a different reason: it’s my 1000th cache found!1

Dan with his arms raised in celebration, alongside the superimposed words '1000th find'.

Struck a pose for a victory selfie to celebrate. FP awarded for the memories.

Footnotes

1 GCCOM might disagree with because it won’t count my finds on other geocaching platforms, but my record at danq.me/geo/stats is canonical.

×

Dan Q found GC6QTWA #13 RUTA PELS VOLTANTS DEL MAS DE SALORT

This checkin to GC6QTWA #13 RUTA PELS VOLTANTS DEL MAS DE SALORT reflects a geocaching.com log entry. See more of Dan's cache logs.

Finding the cache was easy. Reaching around to pull it from its hiding place was harder! But soon I had it in hand. This has been a lovely morning walk.

Now I should have some breakfast and make my lazy children get out of bed!

TFTC/GLA. FP for the series in general (as experienced so far). And once more: greetings from Oxfordshire, UK!

“You saved my life!” (or: how my kids briefly thought I was a superhero)

This weekend, my friend Liz arranged for some other Abnibbers and I to gather, with our families, for a camping/glamping weekend East of Oxford.

Here’s a story of something that transpired there, presented in three parts:

  1. The fire
  2. The battery pack
  3. “You saved my life!”
Adults and children mill around a firepit, some of them holding marshmallows on skewers.
The campsite provided our large group with an entire field to ourselves, including spaces for socialising, a fire pit (at which the kids enjoyed toasting marshmallows), and a wood-fired hot tub.

The entire weekend would have surely been a memorable experience already, but one particular event will probably stick in the minds of everybody in attendance: the fire.

The fire

The UK’s in its unprecedented third heatwave of the year: the grass is all dying and everything is tinder dry. And so it was that, on Friday night as the kids and I slept in our glamping “dome”, I was woken by the distant beep-beep-beep of a domestic smoke alarm. A few seconds later, I heard a second such alarm with a different tone, and it became clear that this wasn’t just somebody’s toast on fire.

Not recorded: the sound of the occupant of this static caravan/cabin – having jumped through the window to safety as the front door was blocked by flames – on the phone to the fire brigade.

I went back into the dome to check on the children, which is when Penny knocked on my door to ensure I was aware of what was going on. The kids were sound asleep, so I ran out to the car park to move the car (which was parked in such a position that embers were raining down on it!) and to check on the situation.

A static caravan is engulfed in flames behind a dome tent, at night.
The fire intensity of the fire grew particularly intense as the sound of fire engine sirens began to be heard from the valley below. Photo copyright Rory Prior.

I returned to the dome and got the children dressed. We evacuated to a safer distance and watched as the firefighters arrived and began to tackle the blaze. Short of water, they had one pump dousing the flaming building while two others relayed water from the nearest fire hydrant, way down the hill.

Firefighters pull hoses from a fire engine towards the inferno of a flaming cabin.
There was a brief faux pas when one of the Abnib kids exclaimed “this is so cool“… without realising that he was standing right next to the people whose home was being destroyed in front of us.

Eventually the situation came under control and we were all able to return to bed.

The battery pack

I spoke to Mike, whose holiday home was the building that was destroyed. He’d managed to escape with some shorts and his mobile phone, but little else: in particular, his car keys remained inside and were probably destroyed, which rendered him unable to drive back to his regular home.

A group of adults and older children stand out in a field at night, while in the distance thick smoke is illuminated by flashing blue lights.
The firefighters worked quickly, but it still took over three hours before they were able to finish spreading out and drenching everything that had caught light. We watched from a distance, and sheltered all the children (including those of a non-Abnib family on-site) in one of our tents.

Mike had been turning his phone on only in bursts in order to conserve battery for all of the essential calls he’d have to make (e.g. his bank, to extract some money without his cards, and a locksmith, to get him back into his car). His phone charger – an awkward USB-B-Micro one – hadn’t survived the fire.

But conveniently… I happened to have such a cable in my bag. Plus a fully-charged battery pack. So I lent both to Mike, in the hope that it’d make it easier for him to do all of the necessary administration1.

A handful of metal frame struts stick out from an ash pile that was clearly once a static caravan.
It’s got to be a pretty-devastating thing to happen to your holiday home and everything in it. Mike was surprisingly chill about it when I spoke to him, taking soft-of an attitude of “well, there’s no point fretting about it after the fact!”

“You saved my life!”

Anyway: on Saturday night, shortly after the kids and I had turned-in, there was a knock on the door. It was Mike, come to return the battery pack I’d lent him.

The kids didn’t know who he was, so I explained: “This is Mike; he’s the fella who lived in the home that burned down last night.”

Mike handed over the battery pack and charging cable and, grateful for them, used a metaphor that. “Thanks,” he said, passing the hardware to me, “You saved my life!”

Several beds laid-out in a darkened glamping pod.
I hadn’t told Mike which glamping pod was ours, and just figured I’d see him around. Or else if I didn’t get my battery pack back, that’d be fine: it’ll have been more-useful to him than to me in the days to come! But there we were, in our pyjamas, when he appeared at our door.

He turned and left, and both kids sprung out of bed and exclaimed “You saved the life of the guy whose house burned down‽”

I’m sure they had in their minds the idea that, during the period between the fire starting and me waking and evacuating them, I’d singlehandedly dragged this dude out of a burning building. Y’know, instead of just lending him a phone charger after-the-fact.

I only let them hold the misapprehension for a few minutes, but for a moment it lightened the mood.

Footnotes

1 I was already using my phone to call our insurance company before our flood, earlier this year, had finished. I can only imagine how inconvenient it is to suffer a disaster and lose your communications lifeline at the same time!

× × × ×

Your ‘App’ Could Have Been a Webpage (so I fixed it for you…)

Why is this an “app”?

This summer, the kids’ performing arts school are singing and dancing in a show at Disneyland. We’re all very excited, but my excitement, at least, was muted a little when I was told to install the “Travelbound” app in order to get access to the itinerary, travel arrangements, and accommodation details.

Fuck that noise. This should have been a webpage. Why do you want me to install a(nother) shitty app just to tell me something that could have been a (smaller, faster, more universally-accessible) document?

Screenshot of an Android app showing a summary itinerary: times for a 'ferry crossing', 'check in at your hotel', 'coach driver accommodation', 'disney's hotel cheyenne', and 'welcome gala', each with an attractive but generic photo.
I’m not remotely exaggerating. This app is literally text, images, and links to PDF files, delivered via the Web.

There only seem to be two things that this “app” does, that a webpage might not have, and they’re both anti-features:

  1. It reports tracking data associated with your Google Account back to the developers.
  2. It shows you advertisements (which they call “inspirations”) for other trips organised by the same agency.

Fuck. Everything. About. That.

A webpage would have been so much better. Unlike this app, a webpage can be…1

  • Copy-pastable
  • Printable
  • Saveable
  • Bookmarkable
  • Searchable
  • Usable on virtually any device
  • (Potentially) more-accessible

I’m annoyed enough… that I’m going to “fix” this app. Hold my beer.

Intercepting app traffic

It’s been a while since the last time I reverse-engineered an Android app from its network traffic, so I had to brush-up on the best way. Here’s what I ended up doing.

  1. Created a new virtual device in Android Studio’s Virtual Device Manager.
  2. Tested adb shell was working and used rootAVD to root it: ./rootAVD.sh system-images/android-33/google_apis_playstore/x86_64/ramdisk.img.2
  3. Performed a cold boot, ran Magisk, and tweaked its settings to automatically grant su access to any app that asked.3
Screenshot showing the HTTP Toolkit application running on both MacOS and an emulated Android mobile, with User Trust and System Trust enabled.
All your traffic are belong to me. At this point, it’s just like running Wireshark or TCPdump.
  1. Ran HTTP Toolkit and told it to intercept AVD traffic. It installed a (fake) VPN provider, routing the phone’s traffic through the proxy.4
  2. Installed the Travelbound app from the Play Store.
  3. Configured HTTP Toolkit to proxy only the Travelbound app (more signal, less noise).

With only a couple of minutes experimentation I discovered that the app works by concatenating the username and password5 and using it in a URL of the form:

https://travelbound.api.vamoos.com/api/itineraries/{username}-{password}

This returns a pile of JSON which, with a little interpretation, can be seen to represent all of the content the app “shows”. E.g., there’s:

  • an array containing each leg of the itinerary,
  • an array containing all of the “inspirations” advertisements to show you,
  • a cross-referenced array containing all of the files (images etc.) that are referenced by the other sections, etc.
Firefox showing a JSON document, focussing on a section about 'Your Ferry Crossing' with some accompanying HTML.
They’re clearly producing HTML code anyway… so again, I ask: why isn’t this a webpage?

A little experimentation showed me that the S3 image URLs were being delivered with moderately-short expiration times, so the JSON needs re-fetching periodically even if the content hasn’t been changed.6

Turning it into something better

Now I had everything I needed to make something… better. I wrote a Ruby script that runs on a Cron schedule to pull the latest JSON and use it to build a HTML page.

I chose to have it completely skip over the “inspirations” (“overlayRows” in the data schema) and just list:

  1. the items from the itinerary and
  2. all of the files not referenced by the inspirations nor itinerary, (a lazy way to collate the PDF download links).

Then I hosted the page, protected by a password: the same one my tour group were given in the first place. I included the raw JSON it used in <details> elements so it can be checked if e.g. there are bits of the schema I didn’t see but that might appear later.

Screenshot of a simply-styled web page showing the same information about the ferry, along with a photo from its deck.
My web page isn’t as “pretty” as the app from which it “borrows” its information. But it’s a fraction of the size and gets all of the Web’s standard features for free.

Some people like an “app”, and that’s… fine, I guess. But some apps could have been a webpage. And especially where, like this one, the content they deliver is already written in HTML and delivered over HTTP… they should be a webpage, right?

I can’t understand how we got to this place with “app culture”! Software companies are happy to make their lives harder (and more expensive: deploying to the big app stores isn’t free!), in order to deliver HTML content to fewer people and with fewer features7 than if they just published directly to the Web in the first place!

There are (some) tasks for which an “app” is absolutely the right choice of medium. Travelbound is not one of them.

But at least I (and the rest of our group, whom I’ve shared it with) now get the choice about how we access this content. Either a 43MB app (ballooning to 124MB when it’s finished downloading extra content) with tracking and advertisements… or a 0.05MB web page (with an optional extra 35MB of images) that provides more features and works on more devices. I know which one I’ll be using!

Footnotes

1 And these are just the features that everybody can get behind. The webpage I ultimately ended up making to replace the app also has some user-friendly/developer-hostile features, like the fact that it removes the tracking code and doesn’t show advertisements.

2 You need to root the device in order to force applications that use Certificate Pinning to trust your man-in-the-middle proxy server. Without this, some applications – including the one I wanted to reverse-engineer – will recognise your self-signed TLS certificate as invalid and refuse to communicate.

3 Without changing this setting in Magisk, I found that HTTP Toolkit would request su access but not wait for the response, and go on to run in unprivileged mode before I had a chance to grant it!

4 Owing to Android security considerations I needed to manually install the root CA certificate it installed for me, but the instructions “just worked”.

5 The username and password is shared by an entire tour group. I’m guessing they don’t have a plan for if some credentials get leaked? Or possibly they consider all of the data they hold to be low-sensitivity enough that it doesn’t matter if it does… in which case I return to my original point: why the hell wasn’t it just a webpage in the first place?

6 Or else the images need caching locally, which seems to be what the app does, in the bloatiest possible way.

7 And, often, with worse accessibility. I’ve not audited the accessibility of this app, but there are things about it that suggest that it’d be harder to use using accessibility technologies than my plain, simple Web version.

× × × ×

Dan Q found GCBB3J9 Appleton Wharf

This checkin to GCBB3J9 Appleton Wharf reflects a geocaching.com log entry. See more of Dan's cache logs.

What a beautiful spot for a geocache, which the geopup and I quickly found in the second host we checked. Then, we enjoyed a delightful few minutes of peace, sitting on the riverbank, before continuing our morning’s adventure.

A white man with a blue ponytail and a goatee beard sits with a French bulldog alongside a wide, calm river.

TFTC, FP awarded for this amazing hidden gem.

×