
Mozambique, Vol. 2
Yesterday I got back from my second work trip to Mozambique. Previously I gave a technical workshop on running an X-Road instance to the folks that would be operating it in Mozambique. This session’s focus was on X-Road members, i.e. the organizations that would actually be using the platform to integrate their APIs. I should probably write a post on what the hell X-Road actually is, but for now the TLDR is that it’s an open-source technology, initially developed and deployed in Estonia in 2001, that is now used by a bunch of governments to enable secure and decentralized peer-to-peer API integrations between organizations.
The flights there weren’t great. For some reason I couldn’t check in online (no reason provided, just “computer says no”) and because of that I got aisle seats on all the flights. I usually prefer window seats so that I could lean my head against the wall to sleep. Additionally, on every flight the person sitting behind me was pretty tall so I didn’t want to recline my seat. This meant no sleep during the almost 24 hours in transit. And then it turned out that my baggage didn’t make it to Maputo. Somehow they had lost the tag on the case and they kept it in Frankfurt. In fact, it is still in Frankfurt, more than a week later even though I submitted the lost baggage claim right after landing. How they dropped the ball this hard is beyond me. I got a few T-shirts and some underwear from a mall near the hotel to make it through the week but I wasn’t able to purchase replacements for all the stuff I wanted.
I spent most of my first day in Maputo at the hotel, dealing with access management issues for our training environment. The list of participants had changed from the initial information we were sent so I had to reconfigure their public keys and I helped debug the VPN configuration issues they ran into while testing access. We had improved our CI/CD system, but I think we goofed up the public key provisioning flow a little. We put the public keys into user_data in Terraform. A key rotation then meant swapping the key in the repo, a terragrunt plan on opening the PR, and a terragrunt apply after merge. Changing user_data on a running instance makes the AWS provider stop and start it. But cloud-init’s ssh module only runs once per instance, and a stop/start keeps the same instance-id, so the new key never got written. Which meant I still had to either replace the instance or push the key over SSM. All of which took quite a bit of time. Will fix it for the next session.
The next day we were driven to a resort about 30 km from Maputo and after spending a little while dealing with the last access issues, the workshop could begin. There were 20 participants from various government institutions plus some folks from the previous training workshop to support them during the session. That was super helpful – the last time I had to run around a lot between participants, debugging issues when they got stuck somewhere. I still had to run around a little this time, but I had five people helping me so it was a lot easier to manage. Often I could just stay at my station and help our supporting team solve more complicated issues, sometimes having to ssh into the participants’ machines to figure out what they had missed.

The resort where we ran the workshop.
The setup overall was pretty similar to the last session – I would share my screen on a projector with the docs and terminal/web UIs open side-by-side and walk through the materials I had prepared. We made some upgrades though. I got a portable monitor so I could have a private screen to debug issues and see the chat and progress tracker without putting them on the projector. And for the chat, we had set up a Haven instance and pre-provisioned the user credentials for the participants. It’s pretty Discord-like and was much better to use than the WhatsApp group that was initially created. And since I had more time to prepare in advance than before the previous session, I was able to spend more time on crafting better documentation. I even included videos for sections that required using web interfaces. I used Open Screen to record and edit the clips, and the UX was great. If you need to create product demos or teaching materials, I would highly recommend it. The workshop spanned three days and we were able to get through all the planned content plus some bonus materials I had prepared in time. I’m still waiting for the feedback but I think it went rather well.

My station for the workshop.

The progress tracker.

Our lunch-time guests.

The beach by the resort.
After the third day, we were driven back to our hotel in Maputo. I had the next day free so even though I slept in, I was able to explore the city a little. I embarked on a mission to get some capulanas for my mom and decided to walk the 5.5 km to the city center. I didn’t pass any slums but was able to see at least some distinct neighbourhoods. Nice houses surrounded by walls and gates contrasted with late-Portuguese-colonial tropical modernism and dirty streets. After purchasing the capulanas from Casa Elefante I took some time to just wander around and then headed back to the hotel. The sun had set during my walk back and I have to admit that at one point it did feel a little sketchy, but never really unsafe. We then had dinner with a local colleague at South Beach, which is right next to the Radisson Blu hotel in Maputo. It was my third time there and I continued working through the seafood section of the menu while a four-piece jazz band played mellow, laid-back takes on familiar songs.

Somewhere near the city center.

Late-colonial tropical modernism.

Avenida Karl Marx.

Casa de Ferro. The old iron house downtown.

Samora Machel presiding over the square, the city hall behind him.
The next day we started flying back. I confirmed with the local baggage inquiry agent at Maputo airport that my case was still in Frankfurt and asked them to instruct the Frankfurt team to send it to Estonia. The flights back were pretty enjoyable. I had downloaded a number of episodes of the Matt Walker Podcast where he talks about the science of sleep, and fittingly managed to sleep through the majority of the trip. We also had a seven-hour layover in Sweden where I managed to get some additional sleep at a lounge. I think somebody’s alarm was playing at some point because I had dreams about trying to snooze an alarm unsuccessfully. Brains are weird. Upon arriving in Tallinn after a brief flight, I confirmed with a baggage inquiry employee that Lufthansa would send my stuff to Estonia and I should expect to receive it within a couple of days. He had also visited Maputo before so we had a brief conversation about Mozambique and the various digital government projects happening in Africa. I then returned home to my eternally hungry cat.
Loading comments…