Iceland – day 7

Today was much lighter, visits wise, partly because we had a bit of adventures in the morning. Yesterday, the car started complaining about the tire pressure – not something one wants to be sloppy about, especially on these roads. Hence, the first stop this morning was a gas station for, well, gas, and tire pressure. At first, I couldn’t see a tire pressure device anywhere, so I asked the person at the attending shop, who told me “it’s on the side of the building” and gave me a small metallic device.

Somewhat confused, we go to the side of a building, and find a/ a cupboard with a manometer, but locked b/ an air pipe without a manometer. After another confused conversation with a local who didn’t seem to understand why we couldn’t read the tire pressure, we went back in the shop, and the nice lady at the register explained to us that the mysterious metallic device was, indeed, a manometer. Behold:

A metallic tube with a small round end and a plastic looking ruler with PSI graduations sticking out of it

Yes, it’s a manual linear manometer expressed in PSI. We were not expecting that for sure. But once we got that piece of information, we checked the tire pressure and went on our merry way (after giving back the manometer and our thanks to the shop clerk).

We were on our merry way… not for very long, though, because we hadn’t looked well enough at the road condition website (“it’s summer and we’re on the main road of the country, what can possibly go wrong?”) and it turns out that the bridge over the river of the large fall we saw yesterday was closed multiple hours a day for road works.

A white suspension bridge over a river, with a line of cars waiting behind it. The bridge is closed for works.

We arrived there around 11:15, and the closure was planned until 12:00, with no obvious choice of anything else to do than wait. So we did that, the closure ended a bit earlier than expected (surprising the second person in the queue who ran back to their car), and we were on our merry way… again.

Our first “real” stop of the day was at the Stuðlagil Canyon, where we enjoyed the view over the river and the impressive basalt structures. There was a set of paths and platforms on our side of the canyon, with more hiking paths on the other side (there was a bit of regret of not having gone to the other side, but oh well) and the view was super impressive. And not only because the island in the middle looked like a gigantic alligator.

A powerful grey river next to a basalt columns wall; there’s two additional basalt islands in the middle of the river, including one that looks like a gigantic stone alligator

After this, it was already quite later than what we had expected. There was another possible stop on our path to our other main stop, and the words “we’ll time box the waterfall” may have been pronounced today. It was indeed a quick stop along the ring road, but Rjúkandi was a pretty waterfall.

Our last objective for the day was to go see Hafnarhólmi, known for being a breeding ground for puffins and other birds (although it was slightly too late for the season). Mostly, the road to there was supposed to be spectacular, and there was also many hiking paths in the vicinity. We didn’t have time for the hiking paths, but the road was indeed wonderful: the mountain pass next to the see made us stop multiple times and gush with awe all along the way.

Hafnarhólmi was a nice place, with some installations to be able to watch birds from inside. We saw a lot of gulls, but it was definitely not puffin season. We did see one from afar, however! and decided the mission was a success.

Following that, we drove to our hotel in Egilsstaðir, where we settled and had a great dinner and went for a very short stroll around the hotel  to see the lake. We had some hope to see Northern lights tonight, but it seems the cloud layer is disagreeing with that hope. Maybe later!

The photo album for this day is here: Iceland – 2025-08-20.

Iceland – Day 6

We’re staying another night in the hotel we reached last night; and today we didn’t go that far away from our home base, but we still did a lot of things!

We had a few spots we wanted to get to, and we had seen many other possibilities in the region. We had some worries this morning because at first it looked like the road to Dettifoss might not be easily accessible with our small car, but the information that we had first found was outdated, and the road was a beautiful paved road all along.

We left shortly after these breakfast worries to go a few kilometers away to have a look at the Skútustadagrig pseudo-craters – pseudo-craters because they haven’t been created by a magma chamber but by a steam explosion when lava came in contact with the lake. Beautiful area, cool formations, and amazing views on the Mýtavn lake.

A bit further away, Höfði was a small hike in a woody area which, considering the low amount of trees in this country, is somewhat of an oddity. The viewpoint at the end of the wood was lovely, and it was a nice and quiet moment.

An island in the middle of very blue water, with some mountains in the far background

Next was one of our “must do” for the day: the lava field in Dimmuborgir. It was apparently a “must do” for many people, because this may well be the place where we’ve seen the most tourists so far! And it’s not surprising: it’s a really peculiar place. It’s full of lava pillars that were formed as a lava lake drained and steam erupted, and there’s a lot of structures that really feel unique. The site is well developed with multiple paths of various lengths going through the lava field. Walking around these was definitely a great experience (we may or may not have made Astrosmurf references.)

Our next “must see” was Dettifoss, and we decided to go there immediately after that since it was already the beginning of the afternoon. We made a very short stop on the way when we saw a lake with an amazing blue/turquoise color next to a geothermic power plant.

The shore of a very blue lake with, in the background, a triangular mountain and some buildings emitting a thick white smoke

After a few dozens of kilometers in a landscape that I’d qualify as “desolate”, we arrived at the Dentifoss site. Dentifoss is the second largest waterfall (in terms of water volume) of Europe (the first one being the Rhine falls in Switzerland). I’ve been to the Rhine falls, and the weirdest thing about Dentifoss is how long it takes before you actually see water. We saw the rainbow of the fall much before seeing any water at all, and the surrounding area looks very dry (it’s mostly basalt columns everywhere).

A field of rocks ending on a hole, with another rocky wall visible in the background. A rainbow is jumping from the hole, along with a visible mist. No water is visible apart from the mist.

But Dentifoss itself is awe-inspiring. I was speechless when we reached it, and for a while after that I could only make incomprehension noises and gestures.

A large and powerful waterfall in front of a rock wall made of multiple vertical stripes.

It’s powerful, it demands respect, it’s incredibly beautiful. The water is an opaque grey, probably from the rock around, and the swirls before the waterfall are mesmerizing.

We walked to Selfoss as well, which is on the same site; and Selfoss is probably suffering from the comparison with its big sister. It’s still a grandiose waterfall (after all, the water volume is comparable, even if it’s not split exactly in the same way), and the area just before the waterfall is beautiful.

Our initial hope was to be able to reach the canyon in Ásbyrgi, but it was too tight, timing-wise, to be sure to be back in our hotel vicinity for dinner time. Instead, we drove back to where we were coming from, and did a stop in Námafjall – we had seen the site from the road on the way, and it looked interesting. Interesting it was, but beware the smell! It’s a geothermal site with a lot of fumerolles and clay pots, and it’s super impressive to see the gray clay boil. The steam coming out of these was also impressive. A great visit, but the strong smell (more than sulfur in there, we think) can be at times overwhelming.

Multiple small grey smoking craters on a flat grey and yellow ground, with mountains in the background

Finally, we still had a bit of time before we had to go back, so we went to see the Krafla crater that was basically on the other side of the road. It’s also the site of a geothermal power plant, and we were both fascinated by the industrial infrastructure around it, pipes going down the volcano and high pressure steam coming out of the vents. The crater itself was also beautiful, with some water at the bottom, and very cool to see from above.

With that, we reached the end of our day; we had dinner at a hotel next to ours – the food was tasty (I particularly liked my broccoli soup), if not super memorable. And we’re back to the hotel, I’m hurting a bit everywhere (it’s been two fairly intensive walking days!) but I’m incredibly happy with the great day we’ve had today.

The photo album for this day is here: Iceland – 2025-08-19.

Iceland – Day 5

We had a significant amount of road of today’s programme, because the minimum amount of driving was 270km for 3h21. We ended up doing more than that and visited many things along the way: we left the previous hotel around 9h30 and we arrived at today’s hotel at 19h15!

We started with a first stop in Kolugljúfur Canyon, which was, as expected, a canyon. Beautiful place with a waterfall ending in a river flowing inside a canyon.

We then drove to Þingeyraklausturskirkja, which promised a small church with a beautiful panoramic view, and it didn’t disappoint. The church was unfortunately closed (I would have liked to see the inside!), but the panoramic view didn’t disappoint!

Nearby (basically going back to the main road and crossing it), we did a stop at the Vatnsdalshólar view point. Google Maps had a lot of pictures of a dog, and said dog was indeed in the vicinity and very friendly 🙂 There was a small hill with a staircase that had a very nice view over the nearby water and the field of hills behind it.

By that point, we hadn’t moved very far from our departure point towards our goal, so we drove a bit more of the main road, with the goal of stopping at Reykjafoss.

Reykjafoss is a beautiful waterfall, and probably my favorite one of all the ones I saw today. It’s absolutely gorgeous, and the river that feeds it is surprisingly quiet. Of note: there’s also a hot pot on the side of said river, so we crossed paths with a least a pair of people in bathing suits and there was a few more around 🙂 It’s also very close to a stable, so there’s quite a few horses around.

A gorgeous waterfall that splits into several streams over three levels

After Reykjafoss, we aimed for our next stop, but did an extra one near Hörgarsveit, which was a decent parking lot on the Ring Road, where we wanted to switch drivers (I don’t drive that much, but I’m trying to drive a bit more so that Pierre can rest a bit!). That bit didn’t work that well because I had to yield the wheel earlier than I would have liked (but my drowsiness level was becoming dangerous 😦 ), but Hörgarsveit was a nice road stop, with a river flowing down a canyon. Officially there should be hiking trails starting there, but the bit we saw looked frankly too dangerous for us.

Goðafoss was our last planned stop for the day; an impressive waterfall (although carrying a significant amount of particles), with very well organized paths on both sides of it. A very enjoyable site (and sight!).

A wide and powerful waterfall between two rock walls

By then, we were half an hour away from our hotel, which was a good thing as we had a restaurant reservation there 45 minutes later. We arrived in the beautiful area of the Mývatn lake in time for the evening light. We had dinner at the restaurant hotel  (good stuff and well prepared), went outside for a little bit to enjoy the evening view – vaguely spoiled by the amount of insects; this is going to be a problem tomorrow, probably. Still, the area looks amazing.

Back in our hotel room, I realized sunscreen would have been smart today (oops), and Pierre stumbled upon Ghostbusters on the TV (so I watched the end of Ghostbusters, which apparently I know by heart more than I thought), and that’s pretty much it for today!

The photo album for this day is here: Iceland – 2025-08-18.

Iceland – Day 4

We left our friends after breakfast and drove to Víðgelmir, a lava cave, where we enjoyed a guided tour. All caves I had visited so far were caves dug into the rock by water; this one was made by a river of lava whose exterior cooled while the lava inside continued flowing and draining.

It was fascinating to see the differences and similarities of structures – fluid, whether lava or water, will still do similar things, but also leave different patterns – and different colors and geology too. Our guide was also very entertaining, and overall we were delighted with the visit.

Not too far away, there’s also the waterfalls of Barnafoss and Hraunfossar (both on the same site). Barnafoss is a powerful waterfall that goes below a stone arch, it’s impressive and very picturesque. But my heart definitely goes to Hraunfossar and its gazillion of waterfalls coming from the rocks – as far as I understand, the aforementioned lava river flew over the water, but water still had to go somewhere, and that’s Hraunfossar.

A cliff with many many waterfalls spawning from the middle of it and flowing on lower levels

At that point we were both a bit hungry, so we got a couple of slices of cake at the Hraunfossar café – they were much appreciated!

We went back on our tracks to get back to the ring road and continue our way towards Laugarbakki where our next hotel is. We enjoyed the beautiful scenery on the road, stopped a few times for pictures, and arrived there around 5PM.

We made a small break in the room, and I debugged my photography backpack: I had in my mind that it was much easier to put the camera back, and after a few tries in a quiet place with a mirror, I figured out the trick again (I need to lift the camera pocket a bit so that it slides correctly in its place).

We had some time before dinner, so we decided to get out again for a little bit – initially, the plan was “get out, go see the horses nearby, and then we’ll see”. We did end up doing a much larger loop than that, following a path that had indicators but not much of a ground track: small hike, but large adventure 😛 But I managed to not hurt myself despite the fairly challenging terrain: yay me!

To end the day, we had dinner at the hotel restaurant; the selection of “icelandic tapas” and both our mains were excellent; the desserts were good but less memorable. And now we’re just chilling in the room – we have a fairly long road planned for tomorrow!

The photo album for this day is here: Iceland – 2025-08-17.

Iceland – Day 3

For our 3rd day, we spent the day in the vicinity of our friend’s cabin, and did a few short hikes around.

In the morning, we went for a hike around the Hreðavatn lake, uphill to get a view of the lake and the surroundings, and then up to a cascade between basalt columns, very pretty.

Not far from there, there’s the Glanni waterfall, which we had seen 9 years ago, and which is still very pretty and impressive too!

By then it was lunch time, we made some pizzas (and saw our first Ooni oven in the wild 😀 ), played a game of SCOUT, and then everyone was feeling kind of in the mood for a nap, so we took some quiet time (I read a bit, I caught up on Mastodon, that sort of things.)

After the nap, we went for another stroll to the nearest lake, picking some flat stones on the way to skip stones there (which did happen, but not for me, because I don’t know how to skip stones 😛 )

We walked back to the cabin, had dinner, played a few more games (Innovation, Decrypto and Skull King – Decrypto was really good!), and then we put a map on the table, explained our itinerary and where we were stopping, and got all the places we could and should see along the road.

Another good day – and the weather was far more pleasant than yesterday, there was some sun and a much clearer view on everything!

The photo album for this day is here: Iceland – 2025-08-16.

Iceland – Day 2

We didn’t have a very precise plan for the beginning of the day today; we had plans for the middle/late afternoon, though, but we kind of made plans as we went before then.

Pierre went for a run before breakfast; he came back and pondered whether he wanted to have something more than his shorts in the current weather. We decided we’d go have a look and that it would be one of our morning missions.

But first, breakfast – fairly unremarkable (quite good though, and surprisingly good bread), apart from the tiny shelf of board games that Pierre noticed:

A Fortnite Monopoly and an Axis&Allies box: some choices have been made, but it’s unclear how 😛

After breakfast, we went to Ice Wear to try to find running leggings for Pierre, and we found something! Interestingly, this is the same shop chain where he had bought a beanie hat 9 years ago (and he’s still traveling with this hat 🙂 )

Then it was time to go and explore. We knew there was a lighthouse not very far, so we went to see the lighthouse; however, we didn’t know that the lighthouse wasn’t accessible at high tide, and… low tide was 5 hours before we arrived.

We still got our first selfie, and it’s a lighthouse selfie, as it should be, even if the lighthouse is a bit far away.

We could have gone for a walk from there, but we decided to start from a bit further away as I’m not entirely confident in my right knee these days (so let’s not fuck it up from the start…); we drove a bit further away to go for a small loop around the nearby golf. It was pretty nice, some sea all around, flat terrain, good stuff. And a hilarious sign at the beginning of the loop, saying essentially “you can relax here, you should hurry here because golf balls fly in this and that direction” 🙂

After that walk, we decided to go to the open air museum on the other side of Reykjavik: it’s a museum where they moved old houses and made a few exhibitions around, mostly, “life in Iceland from the 19th century to now” – there was a lot of neat stuff, and the work on the museum  and the exhibitions was very well done.We also saw one of the (as far as we understand) two locomotives that ever were in Iceland (there are no trains here), which was an unexpected bonus!

We had plans to go see the nearby park/canyon/river, but eventually decided against it as we were quite tired already and the rain started pouring quite heavily.

But, this is where our mid-afternoon plans were starting too! We’re spending a couple of days at our friends’ summer house an hour away from Reykjavik 🙂 We made plans to meet around the local board game shop, Nexus (very nice shop, by the way – good and diverse selection), we went for a bit of grocery shopping (and we got some travel snacks for ourselves), and we arrived in the early evening at said summer house.

We chatted a bit, had dinner, played a couple of board games (Harmonies and Forest Shuffle, both good in different ways!), and it’s now time for bed, for more adventures in the area tomorrow!

The photo album for this day is here: Iceland – 2025-08-15.

Iceland – Day 1

Last year I wrote my Denmark travel log as I was traveling, and it was a pretty good experience – apart from the fact that writing on a phone is miserable. I’m still writing on a phone, but I added a BlueTooth keyboard to the mix – this should help!

Do not necessarily expect pictures in these posts, as I’m mostly using my DSLR and I’ll process stuff when I come home; but maybe the occasional selfie will still happen here 🙂

Anyway, the first day was mostly a travel day – we left home at 11, spent significant time in the airport because our flight was at 2PM and security was a breeze (the security person made appreciative noises at my camera 😁). We had lunch, we boarded the plane, and we landed in Keflavik after what felt like a long (4 hours) but completely uneventful flight.

Last time we were in Iceland was 9 years ago and we remember the feeling that the airport was under strain, especially in the car renting area; this time around it felt far more streamlined. We had the bad surprise to see that our car had been reserved for 2 days rather than 12; we decided to pay for the difference and handle it with our travel agency (which handled it swiftly) – good thing we could actually do this, it wasn’t a trivial amount of money!

After this small kerfuffle, we took the car from Keflavik to Reykjavik, where we had our first hotel. And, it turns out we have friends in Reykjavik, so we met with them for a small stroll in the city center, followed by an excellent dinner at Monkeys – great food and great company, what more can you ask for!

We ended the day with another stroll around the water, with the hope of digesting a bit (food was great, I had a bit too much of it ˆˆ;). It didn’t completely work – I had a fairly hard time falling asleep after that, and the couple of leg cramps that I attributed to plane and dehydration didn’t help either. But, overall, for a travel day, it worked well, and we did take advantage of our first few hours in Iceland!

Some Hugo-related Balisebooks

I’m not writing much about books anymore, but I’m taking the excuse of “I just read all of the Hugo-nominated novels for this year” to talk a bit about, well, books. The selection for the Hugo Awards for Best Novel 2025 had the interesting property of having two books by the same author, Adrian Tchaikovsky. I had heard from him but hadn’t read any of his work, so that was a good opportunity for an introduction.

I had read only one book from the selection before the nominations were announced, so I was fairly excited to see a lot of stuff that had escaped my radar so far! I was a bit less excited to realize that it looked like a fairly heavily body-horror-skewed list, but I also realized during this reading adventure that it was less of a deal-breaker than I thought it was.

I have not made final decisions on my ballot yet, apart from knowing what’s lower half, what’s upper half, and what will probably be on top of my ballot, but I don’t have the exact ranking yet. So, instead of going by rank, I’m just going to do like the WorldCon announcement and go by title alphabetical order.

Alien Clay – Adrian Tchaikovsky

Alien Clay is told from the perspective of Professor Daghdev, an academic whose dream of visiting alien worlds just got granted. But, in the vast “be careful what you wish for” tradition, it’s been granted by his exile to a penal colony on a very unhospitable planet, Kiln. Kiln has a very enthusiastic ecosystem, which tends to combine together and with everything, including alien-to-them life forms. It does not help with the planet hospitality, and the authoritarian penal colony conditions do not help either.

I was not super convinced by Alien Clay, maybe because I expected more of it. The world-building is honestly great, the whole biology stuff is very cool (albeit very creepy)… but the rest fell somewhat flat for me. My general impression was one of “you fell in love with your setting and the plot fell a bit short”. This is lower half of my ballot.

The Ministry of Time – Kaliane Bradley

The Ministry of Time is the only novel I had read before the nominations. It’s a story that stems from the question “what if we could extract people from their time just before their death, and bring them to our contemporary era?”. It follow an unnamed character who becomes a civil servant tasked with helping these extracted people integrate into society, and it devolves from there into a time travel romance and a spy novel.

I remember highly enjoying this when I read it back in November. I liked the premise of extracting people from their time rather than traveling through time, and I found the idea of having that handled by British civil servants tickling. I was not super convinced by the ending, which felt rushed, but not obnoxiously so either. But, to me, it does not read as genre/SFF fiction. It reads as literary fiction with some time travel sprinkled on top. Because of that, this will be lower half of my ballot – I believe that the Hugos should award a novel that’s more firmly inside the genre.

Service Model – Adrian Tchaikovsky

Service Model follows Charles (it’s complicated), a robot valet who suddenly found himself out of a job because of the unfortunate demise of his human owner. And it turns out that it’s getting very, very difficult to find another human in need of a robot valet. Thankfully, he encounters The Wonk, who will endeavor to convince him that he shouldn’t feel constrained by his programming, and that probably he already already isn’t anymore.

I enjoyed the characters and the situations, it was a very funny book, but somehow I do not remember the ending – I think it may have been quicker-paced than the rest of the novel and that it kind of confused me. It does end on the lower half of my ballot, but only because the other three books are stronger, as far as I’m concerned 🙂

Someone You Can Build A Nest In – John Wiswell

Someone You Can Build A Nest In was maybe the best surprise of this round of nominations. It is described by the publisher as a “creepy, charming monster-slaying fantasy romance—from the perspective of the monster”, and it is indeed exactly that. I was expecting to bounce off that one hard, especially since the monster, Shesheshen, is a blob that steals pieces from her human meals to build her own body in order to pass as human when needed. Charming indeed. Definitely HEAVILY full of body horror, that one.

And yet, I enjoyed it a lot. It’s funny, it’s queer, Shesheshen is oddly relatable apart from the people-eating issue, the romance is sweet, and it worked very well. I read it before it won the Nebula, and I’m very happy it got that award; definitely first half of my ballot.

A Sorceress Comes to Call – T. Kingfisher

A Sorceress Comes to Call is told from the point of view of Cordelia, 14 years old, who lives with her controlling mother, who is determined to remarry and have Cordelia find a rich spouse too. And by “controlling”, I mean “literally magically mind-controlling”. One night, Cordelia’s mother wakes her up and they flee to the estate of the Squire, a man that she has set in her sights as acceptable. The Squire is a nice man, his sister Hester even more so, and it becomes Cordelia’s goal to prevent her mother to wreck havoc on that family. Oh, and of course, there’s a horse.

I wouldn’t call this book “a delightful read” because the amount of family abuse and trauma around Cordelia is heart-wrenching and it does hurt. But the cast of secondary characters is fantastic, the book was hard to put down, and it fits solidly in the first half of my ballot too.

The Tainted Cup – Robert Jackson Bennett

I almost didn’t read The Tainted Cup, because it was provided in the Hugo voting package as watermarked PDF, but I sighed and bought another copy and I’m very glad that I did. In The Tainted Cup, we follow Din, the young assistant to Ana, a brilliant and eccentric detective. Din is an engraver: he got augmented to be able to have perfect recall of the memories he anchors by smell. It comes handy as Ana mostly refuses to go outside of her home and wears a blindfold most of the time to avoid over-stimulation. For their latest case, they investigate the death of an Imperial officer, who apparently died when a tree spontaneously sprouted out of him. Not an uncommon occurrence in Din and Ana’s world, where plant contagion does happen (and where plants and people can be manipulated to fulfill certain tasks), but still somewhat suspicious.

I loved The Tainted Cup and it has a high chance to finish on top of my ballot. I was faulting Alien Clay for “having a cool setting but lacking on the plot”; The Tainted Cup also has tremendous world-building (one that I’ll be happy to revisit in later books of the series) and I found the plot and story far more engaging. I’m definitely happy I read that book.

There, these were my thoughts on the Novel finalists. The Hugo Awards have many more categories, and I do try to vote on as many categories as I can, so I still have some reading to do before July 23rd 🙂

Fun with maps

My AlphabeticalZürich project may not be very active when it comes to content, but it’s been an interesting source of tinkering lately. I’ve moved it out of WordPress to a statically-generated set of pages (that’s a story for another blog post, which I should write before I forget everything) and, in the past couple of days, I’ve added a progress map.

The idea of a progress map has been around since the early days of the project – I’m pretty sure Matthias was the one suggesting it in the first place, and it stayed in a corner of my brain. At the time, it felt somewhat overwhelming; I had explored stuff around the OpenStreetMap ecosystem, but had not dug that rabbit hole deep enough to get anywhere interesting.

And then, a few days ago, a few stars aligned in the form of “having a few days off”, seeing a Mastodon post about custom maps, remembering that the person in question DOES have custom maps on her website, digging around source code to see how that kind of things could possibly work, and finding the right resources at the right time.

First thing first: displaying map tiles

The data I want to display are lines representing streets of Zürich. And technically I could probably display a set of lines of different colors and be done with it, but a map is nicer with stuff like context and labels, so I needed a base map. The canonical way of displaying a map is to use tiles, so I knew this was one of the building bricks of my project.

The fact that I found Protomaps early in my “okay, how would I do this”-research was instrumental in the existence of this project, because the rest felt far more achievable on my own. Protomaps has a free tier that should be more than enough for the needs of my tiny website, and it looked easy enough to integrate. Its main feature is also to provide the tiles in a single file, so if I wanted to move that to my own storage, that’s a possibility. I went for the Leaflet integration because the doc promised me it was simple, and indeed it was.

Add centering coordinates, decide for a color scheme (I’m cheating, this came a bit later 🙂 ), and I have map tiles, which is one problem solved.

Adding progress data

To my map tiles, I wanted to add colored lines for “streets that I have published”, “streets that I have visited but not yet published” and “streets that I have planned to visit next”. I have this information in a spreadsheet, so that’s easy enough to exploit; but to be able to add lines to the map, I needed coordinates. The one format I’m vaguely familiar with (because I have written some code for Kartographer, the map extension of MediaWiki) is GeoJSON, and Leaflet supports that, so GO, GO, GO! I first started playing with the idea of making my own geometries with geojson.io and promptly decided against it (“this is going to make my publication process more complicated, how about no”) and remembered that Zürich has a lot of open data, and in particular the Strassennamenverzeichnis (“street name directory”) that does have line geometries in there.

So I wrote a small script to merge my spreadsheet (exported to CSV) and the Zürich open data source into a custom GeoJSON, and added it as a layer to my map. As a first test, I copied the whole thing in geojson.io, and for the first time I had a map of “where did I go already”, which felt pretty good!

It required some tweaking to get it to work on Leaflet, because, as it turns out, while the geometry definition is well-specified by GeoJSON, there doesn’t seem to be a standard for their display. The styles are typically defined as properties stuffed along the geometry, and these properties do not have consistent naming or schema depending on the display software. Still, eventually, I did manage what I wanted, and so at that point I had, on my local machine, a map base enriched with progress information. Wonderful.

That said, I had colors, but no legend whatsoever, and a map without a legend isn’t very useful. Thankfully, Leaflet has a way to add a “control”, which can contain arbitrary DOM – so I added a small legend in a very ugly but hopefully still vaguely reasonable way. (I’ll need to fix that at some point.)

Interlude: limiting the access to the API

So I had all my stuff still on my local machine, and the goal was still to have that map somewhere on AlphabeticalZürich. And there came something that kind of bothered me: the access to Protomaps puts the API key in the URL, and provides a way to define CORS limitations (which are client-side, not server side – although in that case there is some validation on the server side too). I am reading this as “API keys are not secret”, and the usage policy made me believe that, if my key was used by someone else that would mess up with my free quota, I could recover from that, but I took it as a challenge to try to not leak that key. Turns out, it was a bad idea, as I realized when writing that post.

Additionally, I’m trying to be a good citizen, and to not hit my wonderful tiles API more than I should. In particular, if I can avoid accessing tiles from any other area than Zürich, it feels like a good idea.

Some reverse proxying fun (and learning some lessons)

Now for the “let’s avoid leaking the key” part. It was pretty obvious that anything client-side would leak, so my goal was to send requests to my own stuff, inject the key there, transfer the request and get the result back. That’s the job of a reverse proxy, so I played with my Apache config until it worked (and I didn’t mess up Apache restart once in the process, proud of myself there).

Now, obviously, I do have an open URL on my website (because client-side Javascript needs to be able to access it), which doesn’t have an API key, that gets transformed behind the scenes to an url with said API key. Which means that anything can use my public URL to hit the Protomaps API without a key. Somewhat counter-productive.

The following train of thought was to add a filtering on the HTTP referrer of the URL, which does work, but which is also trivial to bypass by injecting the same header. That kind of made the whole process useless overall, but it felt “well, not worse than having an API key on the page, because the potential abuse mechanism I can see also basically is “add a HTTP header and be happy”.

Except, it actually *is* worse, which I realized when writing this blog post and feeling uncomfortable writing this down. It is actually worse for two reasons:

  • All the requests in the reverse proxy abuse scenario are eventually made from *my* machine – I’m basically running an open proxy for which I’d be responsible to shut down bad traffic (oops)
  • More importantly: it makes “changing the API key in case something goes wrong” COMPLETELY useless (large oops).

So all in all, I was feeling very smart when I made Apache do what I wanted to do, and very stupid when I realized that what I wanted to do was utterly counterproductive and actually actively harmful. Lesson learnt: if your client is supposed to access the key, so be it, and don’t try to outsmart documentation to deal with imaginary dangers. And yes, I suppose I could have gone the route of making a proper back-end and running things server-side and be happy, but I really don’t want to have a back-end on this website. This thing is made to be integrated to a web page, this is the way.

I’m probably still going to want to avoid putting that key on a public git repository, because there’s a difference between “it’s in a JS somewhere on a low-traffic website” and “it’s on GitHub open to anyone searching for ‘key='”, but that’s a problem for future me, probably (and actually an easy enough problem, since I’m already adding menus to that page programmatically.)

Handling map boundaries

I still wanted to handle map boundaries correctly, because that just felt nicer. It was an interesting problem, because for a while I thought it just wasn’t working – but, in fact, it wasn’t working *as I expected*. What ended up working was a combination of three settings on Leaflet.

  • Setting maxBounds to “area around Zürich” – this is what I expected to need to do, so far, so good.
  • Setting maxBoundViscosity to 1 – that’s a setting on Leaflet that defines how much the maxBounds are actually enforced; by default it’s 0; 1 bounces the display back into the bounds if the user pans out of the map
  • Setting minZoom to 12 – that’s the thing that required me to think most. I was very confused at the beginning, because I could zoom out to the world and then zoom back in to any place in the world outside of maxBounds, and I wasn’t sure why – until I noticed that the maxBounds documentation was explicitly talking about panning. Hence, setting a minZoom to “some value that will allow to see the whole map but would not allow to zoom in to something wildly outside of the chosen bounds” seems to work decently enough. I was happy to have a tiny bit of a sense of how tiles are structured, because it made me connect a few dots in my head quicker than it would have otherwise.

Bells and whistles: Zürich city boundary

For the finishing touch, I also wanted to add the Zürich city boundary to the map. It was somewhat more annoying to get the correct data – I didn’t find it on the Zürich-city level (because everything I had was defining multiple areas, for which I would have needed to get the outer polygon – feasible, but annoying), and finally found it on the Zürich-canton level. Note to self, as it took me a while to find how to do this (and a while to find AGAIN how to do this): click on the “Datenbezug” download arrow, and then on the first question instead of “OGD Produkte” choose “WFS-Datenquelle”, and then the rest is relatively straightforward.

RELATIVELY, because there’s a final trap: the default coordinate system is in the Swiss coordinate system, and it took me a bit of time to understand why I wouldn’t get a polygon on my map. Once that was fixed, I fought a bit with the styling definition, but I finally got the map I wanted to have.

Conclusion

I’m happy that I started with “okay, how would I do this” and managed to get through the whole project, which was not that large, but on which I had given up previously, and that connected quite a few points and a couple of rabbit holes. I’ve learnt stuff and I have something to show for it, so all in all that was very satisfying 🙂

Essen SPIEL 2024

A table with board game boxes, three t-shirts, a bottle of wine and a yellow rubber duck

There, SPIEL Essen 2024 is behind us, and it was another great edition. It was slightly awkward when we saw “by the way, the 4-day tickets are sold out” before we got ours; thankfully we managed to get daily tickets before they ran out as well. This is the first year that they have contingents, and they hit them every day, so it was, well, a busy fair. Anyway, let’s go for the (by now) traditional back-from-Essen post! I counted 37 games in this post, so brace yourselves, it’s a long one 😉

Continue reading “Essen SPIEL 2024”