DISCLAIMER: Title image captured by Salve J. Nilsen
.
Journey to the Event
My journey began at 12 PM
on Wednesday, April 30th
. I took a bus to Heathrow Airport
to catch my flight to Berlin
via Frankfurt
with Lufthansa Airline
.
The entire journey was a pleasant experience, except for one part: I had to exit the Frankfurt
airport and re-enter to catch my connecting flight to Berlin
. I had assumed I could simply switch planes without leaving the airport.
Day 1
I reached the hotel at 6 AM
on Thursday
morning, the first day of the event.


At breakfast, I met many guests, Salve
was the first among them. I also met Ruth
again; it was lovely to see her after the Toronto
conference. I met Todd
for the first time as well.
That day, I had the chance to meet the MetaCPAN
team: Olaf
, Graham
, Mickey
and Shawn
. I’ve always wanted to contribute to MetaCPAN
, and this was finally my opportunity. I had to start from scratch by setting up the local MetaCPAN
web environment.
I was given the link to the MetaCPAN Docker GitHub
repository: https://github.com/metacpan/metacpan-docker.git
It was just a matter of a quick clone
, init
, and docker compose up
. In no time, I had a working local MetaCPAN
web interface on my laptop.
$ git clone https://github.com/metacpan/metacpan-docker.git
$ cd metacpan-docker/
$ bin/metacpan-docker init
$ docker compose up web-server
The local instance of MetaCPAN
was now accessible: http://localhost:5001
I took a quick glance at the codebase and its structure: https://github.com/metacpan/metacpan-web
Two important areas: Library and Template
My first issue of the day: https://github.com/metacpan/metacpan-web/issues/3235
I had to explore the codebase extensively to find the right spot. It was a fun exercise involving both the MetaCPAN
web and API
components.
Unfortunately, I only had the web interface running locally, not the API
, which made debugging the API
side difficult.
In this setup, my local web instance was making API
calls to the production environment.
I spent some time on the issue but didn’t get close to resolving it.
Olaf
suggested I pick another issue in the meantime.
So I chose this one, a pure templating issue with no API
involvement: https://github.com/metacpan/metacpan-web/issues/3079
Understanding the code structure was an enjoyable exercise.
I resolved the issue in my local environment and submitted my first pull request of the day: https://github.com/metacpan/metacpan-web/pull/3326
It was kindly approved and merged by Olaf
.
Lunch was organised at the hotel by the PTS Organiser
. It was great to see so many people in one place.
After lunch, I worked on this issue: https://github.com/metacpan/metacpan-web/issues/3278
This was another front-end-only issue. The BackPAN
link was empty and simply pointed to the current page.
The easy fix was to provide the necessary data to the template.
I did exactly that in this pull request: https://github.com/metacpan/metacpan-web/pull/3327
Graham
quickly suggested that this should be handled in the API
rather than the frontend layer. He even provided an alternate fix.
So this one didn’t go through—but that’s okay. I was learning from every issue.
In the evening, some of us went to a Lebanese
restaurant for dinner. The wait was long, but it was worth it, the food was excellent.
Day 2
I met Stig
from the CPAN Security Group
and had a discussion about CVEs
.
It was reassuring to know there’s a dedicated team handling CVE-related
matters.
My first issue of the day was: https://github.com/metacpan/metacpan-web/issues/3044
Nice and easy, got the pull request ready in no time: https://github.com/metacpan/metacpan-web/pull/3331
Thanks to Olaf
for accepting and quick merge.
It was great to see my change live instantly.
My second issue was: https://github.com/metacpan/metacpan-web/issues/3108
Pull request for the same was ready for review: https://github.com/metacpan/metacpan-web/pull/3332
Once again, Olaf
, approved and merged the changes.
In the evening, Daniel
, one of the organisers, gave us a city tour.




It was tiring but well worth it. There was so much to see—beautiful buildings and open spaces.
Dinner was sponsored by the PTS Organiser
in a lovely restaurant. I sat with Olaf
and Todd
. The food wasn’t exactly to my taste, but the company made up for it. After dinner, Mickey
, Shawn
and I decided to walk back to the hotel. On the way, I met Doug
, it was my first time meeting him in person, though we had interacted over email in the past. It was nice chatting with him on the way back.
During the city tour, someone suggested I should better create map for Leipzig Railway Network
while I am here.
After the dinner, I couldn’t sleep as the idea was burning inside me. I decided to do quick search if I can get hold of Leipzig Railway Network
data.
Luckily I found one, although I couldn’t cover the entire network, I managed to do just two lines and published it before going to bed: Map::Tube::Leipzig
Day 3
At breakfast, I met Ferenc Erki
and had a very interesting conversation. Garu
also joined us and introduced himself, it was my first time meeting him. He seemed like a very friendly guy.
For lunch, Olaf
, Shawn
, Graham
, Mickey
, Salve
, Jordan
and I went to a nearby Doner kebab place. The food was absolutely delicious.
After lunch, Graham
kindly helped me get the API Docker
container testing successfully locally.
I needed this to investigate the earlier issue: https://github.com/metacpan/metacpan-web/issues/3235
It turned out that the API
was returning the full dataset, but the frontend was limiting the result size. That’s why the complete list wasn’t visible.
The ideal solution would be to implement pagination, rather than showing everything on one page.
For now, Graham
and I increased the limit to 500
items to resolve the issue.
I also learned a few tricks for working with the local API
, thanks to Graham
something that will definitely help me in the future.
This is the pull request that finally resolved the issue: https://github.com/metacpan/metacpan-web/pull/3337
Another quick issue for the day: https://github.com/metacpan/metacpan-web/issues/2912
Corresponding pull request for the same: https://github.com/metacpan/metacpan-web/pull/3340
Daniel
also helped me book the train ticket from Leipzig
to Berlin Airport
.
Day 4
At the breakfast table, I was joined by Todd
. I also met Ruth
again, and we exchanged a warm hug.
This was the last day of the event—time to fly back. My anxiety started to kick in.
I tried to take it slow and worked on this issue after a quick breakfast: https://github.com/metacpan/metacpan-web/issues/2861
And submitted the following pull request: https://github.com/metacpan/metacpan-web/pull/3344
Later it turned out to be throwing warning in the log for some other pages.
I decided to change it to draft
as suggested by Olaf
.
I will look at it at some point in time.


Summary of Issues
2912: Merged
3044: Merged
3079: Merged
3108: Merged
3235: Merged
3278: Closed (alternate solution by HAARG)
2861: Open/Draft
Future Plan
My attendance of PTS 2025
wasn’t planned. It just came as a surprise for me. I didn’t get time to prepare anything for the event. Now that I have experienced and seen how others had planned, I’ll definitely be better prepared if I get invited again.
I am definitely going to continue work on MetaCPAN
project as and when I find spare time. I don’t want to break the continuity. I noticed Elastic Search
is heavily used in MetaCPAN
. I will brush up my Elastic Search
knowledge so that I can contribute in that area too.
Sponsors of PTS 2025
Monetary Sponsors
Booking.com
WebPros
CosmoShop
Datensegler
OpenCage
SUSE
Simplelists Ltd
Ctrl O Ltd
Findus Internet-OPAC
plusW GmbH
In-kind sponsors
Grant Street Group
Fastmail
shift2
Oleeo
Ferenc Erki
Community Sponsors
The Perl and Raku Foundation
Japan Perl Association
Harald Joerg
Alexandros Karelas PerlModules.net
Matthew Persico
Michele Beltrame Sigmafin
Rob Hall
Joel Roth
Richard Leach
Jonathan Kean
Richard Loveland
Bojan Ramsa
Thank You Perl Toolchain Summit 2025!!